summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2004-10-17 00:54:09 +0000
committerJens Arnold <amiconn@rockbox.org>2004-10-17 00:54:09 +0000
commit79afbafa669bee52059d980ae887dfa06948c252 (patch)
treeb359f4cb336fbd477ec990a37b86a73f8266e455
parent7c2496d35a1046d6383a7df8a78a1e9ba5cf7607 (diff)
downloadrockbox-79afbafa669bee52059d980ae887dfa06948c252.tar.gz
rockbox-79afbafa669bee52059d980ae887dfa06948c252.zip
Plugin rework 2: (most) Compile-time keyboard configuration, for Ondio adaption. (all) Now using the default event handler, standard placement is now in switch() default case. (calendar, chip8) Fixed usb handling.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5295 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/SOURCES22
-rw-r--r--apps/plugins/bounce.c27
-rw-r--r--apps/plugins/calculator.c84
-rw-r--r--apps/plugins/calendar.c4
-rw-r--r--apps/plugins/chip8.c87
-rw-r--r--apps/plugins/clock.c46
-rw-r--r--apps/plugins/cube.c58
7 files changed, 236 insertions, 92 deletions
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index 80a6fde2e0..b2f632032c 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -1,4 +1,4 @@
1/* plugins common to both Player+Recorder model */ 1/* plugins common to all models */
2battery_test.c 2battery_test.c
3favorites.c 3favorites.c
4firmware_flash.c 4firmware_flash.c
@@ -11,20 +11,24 @@ stopwatch.c
11vbrfix.c 11vbrfix.c
12viewer.c 12viewer.c
13 13
14#ifdef HAVE_LCD_BITMAP /* recorder model only */ 14#ifdef HAVE_LCD_BITMAP /* Recorder/Ondio models only */
15bounce.c
16calculator.c
17chip8.c
18cube.c
15grayscale.c 19grayscale.c
16jpeg.c 20jpeg.c
17rockblox.c 21rockblox.c
18snow.c 22snow.c
19video.c 23video.c
20#if CONFIG_KEYPAD != ONDIO_PAD 24
21/* gradually bring in the ones not working yet */ 25#ifdef HAVE_RTC /* Recorder models only */
22bounce.c
23calculator.c
24calendar.c 26calendar.c
25chip8.c
26clock.c 27clock.c
27cube.c 28#endif
29
30#if CONFIG_KEYPAD != ONDIO_PAD
31/* gradually bring in the ones not working yet */
28flipit.c 32flipit.c
29mandelbrot.c 33mandelbrot.c
30minesweeper.c 34minesweeper.c
diff --git a/apps/plugins/bounce.c b/apps/plugins/bounce.c
index d4244745bc..9cf1ccf341 100644
--- a/apps/plugins/bounce.c
+++ b/apps/plugins/bounce.c
@@ -30,6 +30,17 @@
30#define XSPEED 3 30#define XSPEED 3
31#define YADD -4 31#define YADD -4
32 32
33/* variable button definitions */
34#if CONFIG_KEYPAD == RECORDER_PAD
35#define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
36#define BOUNCE_MODE (BUTTON_ON | BUTTON_REL)
37
38#elif CONFIG_KEYPAD == ONDIO_PAD
39#define BOUNCE_QUIT (BUTTON_OFF | BUTTON_REL)
40#define BOUNCE_MODE (BUTTON_MENU | BUTTON_REL)
41
42#endif
43
33static struct plugin_api* rb; 44static struct plugin_api* rb;
34 45
35static unsigned char table[]={ 46static unsigned char table[]={
@@ -172,6 +183,7 @@ struct counter values[]={
172 {"ydistt", -6}, 183 {"ydistt", -6},
173}; 184};
174 185
186#ifdef HAVE_RTC
175static unsigned char yminute[]={ 187static unsigned char yminute[]={
17653,53,52,52,51,50,49,47,46,44,42,40,38,36,34,32,29,27,25,23,21,19,17,16,14,13,12,11,11,10,10,10,11,11,12,13,14,16,17,19,21,23,25,27,29,31,34,36,38,40,42,44,46,47,49,50,51,52,52,53, 18853,53,52,52,51,50,49,47,46,44,42,40,38,36,34,32,29,27,25,23,21,19,17,16,14,13,12,11,11,10,10,10,11,11,12,13,14,16,17,19,21,23,25,27,29,31,34,36,38,40,42,44,46,47,49,50,51,52,52,53,
177}; 189};
@@ -218,6 +230,7 @@ static void addclock(void)
218 yminute[(i+1)%60]); 230 yminute[(i+1)%60]);
219 } 231 }
220} 232}
233#endif /* HAVE_RTC */
221 234
222static int scrollit(void) 235static int scrollit(void)
223{ 236{
@@ -236,10 +249,10 @@ static int scrollit(void)
236 while(1) 249 while(1)
237 { 250 {
238 b = rb->button_get_w_tmo(HZ/10); 251 b = rb->button_get_w_tmo(HZ/10);
239 if ( b == (BUTTON_OFF|BUTTON_REL) ) 252 if ( b == BOUNCE_QUIT )
240 return 0; 253 return 0;
241 254
242 if ( b == (BUTTON_ON|BUTTON_REL) ) 255 if ( b == BOUNCE_MODE )
243 return 1; 256 return 1;
244 257
245 if ( rb->default_event_handler(b) == SYS_USB_CONNECTED ) 258 if ( rb->default_event_handler(b) == SYS_USB_CONNECTED )
@@ -256,7 +269,9 @@ static int scrollit(void)
256 yy += YADD; 269 yy += YADD;
257 xx+= LCD_WIDTH/LETTERS_ON_SCREEN; 270 xx+= LCD_WIDTH/LETTERS_ON_SCREEN;
258 } 271 }
272#ifdef HAVE_RTC
259 addclock(); 273 addclock();
274#endif
260 rb->lcd_update(); 275 rb->lcd_update();
261 276
262 x-= XSPEED; 277 x-= XSPEED;
@@ -293,10 +308,10 @@ static int loopit(void)
293 while(1) 308 while(1)
294 { 309 {
295 b = rb->button_get_w_tmo(HZ/10); 310 b = rb->button_get_w_tmo(HZ/10);
296 if ( b == (BUTTON_OFF|BUTTON_REL) ) 311 if ( b == BOUNCE_QUIT )
297 return 0; 312 return 0;
298 313
299 if ( b == (BUTTON_ON|BUTTON_REL) ) 314 if ( b == BOUNCE_MODE )
300 return 1; 315 return 1;
301 316
302 if ( rb->default_event_handler(b) == SYS_USB_CONNECTED ) 317 if ( rb->default_event_handler(b) == SYS_USB_CONNECTED )
@@ -309,7 +324,9 @@ static int loopit(void)
309 x+= speed[xsanke&15] + values[NUM_XADD].num; 324 x+= speed[xsanke&15] + values[NUM_XADD].num;
310 325
311 rb->lcd_clear_display(); 326 rb->lcd_clear_display();
327#ifdef HAVE_RTC
312 addclock(); 328 addclock();
329#endif
313 if(timeout) { 330 if(timeout) {
314 switch(b) { 331 switch(b) {
315 case BUTTON_LEFT: 332 case BUTTON_LEFT:
@@ -402,7 +419,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
402 419
403 rb->lcd_setfont(FONT_UI); 420 rb->lcd_setfont(FONT_UI);
404 421
405 return h = 0 ? PLUGIN_OK : PLUGIN_USB_CONNECTED; 422 return (h == 0) ? PLUGIN_OK : PLUGIN_USB_CONNECTED;
406} 423}
407 424
408#endif 425#endif
diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c
index 35ebea6e70..5e8c31aa0f 100644
--- a/apps/plugins/calculator.c
+++ b/apps/plugins/calculator.c
@@ -104,6 +104,22 @@ F3: equal to "="
104#define SIGN(x) ((x)<0?-1:1) 104#define SIGN(x) ((x)<0?-1:1)
105#define ABS(x) ((x)<0?-(x):(x)) 105#define ABS(x) ((x)<0?-(x):(x))
106 106
107/* variable button definitions */
108#if CONFIG_KEYPAD == RECORDER_PAD
109#define CALCULATOR_QUIT BUTTON_OFF
110#define CALCULATOR_INPUT BUTTON_PLAY
111#define CALCULATOR_CALC BUTTON_F3
112#define CALCULATOR_OPERATORS BUTTON_F2
113#define CALCULATOR_CLEAR BUTTON_F1
114
115#elif CONFIG_KEYPAD == ONDIO_PAD
116#define CALCULATOR_QUIT BUTTON_OFF
117#define CALCULATOR_INPUT_CALC_PRE BUTTON_MENU
118#define CALCULATOR_INPUT (BUTTON_MENU | BUTTON_REL)
119#define CALCULATOR_CALC (BUTTON_MENU | BUTTON_REPEAT)
120
121#endif
122
107static struct plugin_api* rb; 123static struct plugin_api* rb;
108 124
109enum { 125enum {
@@ -187,6 +203,7 @@ int m, n, prev_m, prev_n; /* position index for button */
187#define CAL_BUTTON (m*5+n) 203#define CAL_BUTTON (m*5+n)
188 204
189int btn = BUTTON_NONE; 205int btn = BUTTON_NONE;
206int lastbtn = BUTTON_NONE;
190 207
191/* Status of calculator */ 208/* Status of calculator */
192enum {cal_normal, /* 0, normal status, display result */ 209enum {cal_normal, /* 0, normal status, display result */
@@ -1090,7 +1107,7 @@ Handle buttons on basic screen
1090----------------------------------------------------------------------- */ 1107----------------------------------------------------------------------- */
1091void basicButtonsProcess(void){ 1108void basicButtonsProcess(void){
1092 switch (btn) { 1109 switch (btn) {
1093 case BUTTON_PLAY: 1110 case CALCULATOR_INPUT:
1094 if (calStatus == cal_error && (CAL_BUTTON != btn_C) ) break; 1111 if (calStatus == cal_error && (CAL_BUTTON != btn_C) ) break;
1095 flashButton(CAL_BUTTON); 1112 flashButton(CAL_BUTTON);
1096 switch( CAL_BUTTON ){ 1113 switch( CAL_BUTTON ){
@@ -1143,7 +1160,9 @@ void basicButtonsProcess(void){
1143 case btn_add: 1160 case btn_add:
1144 if(!operInputted) {twoOperands(); operInputted = true;} 1161 if(!operInputted) {twoOperands(); operInputted = true;}
1145 oper = buttonChar[basicButtons][m][n][0]; 1162 oper = buttonChar[basicButtons][m][n][0];
1146 case_BUTTON_F2: /* F2 shortkey entrance */ 1163#ifdef CALCULATOR_OPERATORS
1164 case_cycle_operators: /* F2 shortkey entrance */
1165#endif
1147 calStatus = cal_normal; 1166 calStatus = cal_normal;
1148 formatResult(); 1167 formatResult();
1149 operand = result; 1168 operand = result;
@@ -1159,7 +1178,8 @@ void basicButtonsProcess(void){
1159 } /* switch (CAL_BUTTON) */ 1178 } /* switch (CAL_BUTTON) */
1160 break; 1179 break;
1161 1180
1162 case BUTTON_F2: 1181#ifdef CALCULATOR_OPERATORS
1182 case CALCULATOR_OPERATORS:
1163 if (calStatus == cal_error) break; 1183 if (calStatus == cal_error) break;
1164 if (!operInputted) {twoOperands(); operInputted = true;} 1184 if (!operInputted) {twoOperands(); operInputted = true;}
1165 switch (oper){ 1185 switch (oper){
@@ -1169,9 +1189,11 @@ void basicButtonsProcess(void){
1169 case '-': oper = '*'; flashButton(btn_time); break; 1189 case '-': oper = '*'; flashButton(btn_time); break;
1170 case '*': oper = '/'; flashButton(btn_div); break; 1190 case '*': oper = '/'; flashButton(btn_div); break;
1171 } 1191 }
1172 goto case_BUTTON_F2; 1192 goto case_cycle_operators;
1173 break; 1193 break;
1174 case BUTTON_F3: 1194#endif
1195
1196 case CALCULATOR_CALC:
1175 if (calStatus == cal_error) break; 1197 if (calStatus == cal_error) break;
1176 flashButton(btn_equal); 1198 flashButton(btn_equal);
1177 goto case_btn_equal; 1199 goto case_btn_equal;
@@ -1186,7 +1208,7 @@ Handle buttons on scientific screen
1186----------------------------------------------------------------------- */ 1208----------------------------------------------------------------------- */
1187void sciButtonsProcess(void){ 1209void sciButtonsProcess(void){
1188 switch (btn) { 1210 switch (btn) {
1189 case BUTTON_PLAY: 1211 case CALCULATOR_INPUT:
1190 if (calStatus == cal_error && (CAL_BUTTON != sci_sci) ) break; 1212 if (calStatus == cal_error && (CAL_BUTTON != sci_sci) ) break;
1191 flashButton(CAL_BUTTON); 1213 flashButton(CAL_BUTTON);
1192 switch( CAL_BUTTON ){ 1214 switch( CAL_BUTTON ){
@@ -1225,7 +1247,8 @@ void sciButtonsProcess(void){
1225 } /* switch (CAL_BUTTON) */ 1247 } /* switch (CAL_BUTTON) */
1226 break; 1248 break;
1227 1249
1228 case BUTTON_F2: 1250#ifdef CALCULATOR_OPERATORS
1251 case CALCULATOR_OPERATORS:
1229 if (calStatus == cal_error) break; 1252 if (calStatus == cal_error) break;
1230 if (!operInputted) {twoOperands(); operInputted = true;} 1253 if (!operInputted) {twoOperands(); operInputted = true;}
1231 switch (oper){ 1254 switch (oper){
@@ -1240,7 +1263,9 @@ void sciButtonsProcess(void){
1240 operand = result; 1263 operand = result;
1241 operandPower = power; 1264 operandPower = power;
1242 break; 1265 break;
1243 case BUTTON_F3: 1266#endif
1267
1268 case CALCULATOR_CALC:
1244 if (calStatus == cal_error) break; 1269 if (calStatus == cal_error) break;
1245 formatResult(); 1270 formatResult();
1246 calStatus = cal_normal; 1271 calStatus = cal_normal;
@@ -1268,9 +1293,16 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1268 while (calStatus != cal_exit ) { 1293 while (calStatus != cal_exit ) {
1269 btn = rb->button_get_w_tmo(HZ/2); 1294 btn = rb->button_get_w_tmo(HZ/2);
1270 switch (btn) { 1295 switch (btn) {
1271 case BUTTON_PLAY: 1296 case CALCULATOR_INPUT:
1272 case BUTTON_F2: 1297 case CALCULATOR_CALC:
1273 case BUTTON_F3: 1298#ifdef CALCULATOR_INPUT_CALC_PRE
1299 if (lastbtn != CALCULATOR_INPUT_CALC_PRE)
1300 break;
1301 /* no unconditional break; here! */
1302#endif
1303#ifdef CALCULATOR_OPERATORS
1304 case CALCULATOR_OPERATORS:
1305#endif
1274 switch(buttonGroup){ 1306 switch(buttonGroup){
1275 case basicButtons: 1307 case basicButtons:
1276 basicButtonsProcess(); 1308 basicButtonsProcess();
@@ -1281,18 +1313,20 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1281 } 1313 }
1282 break; 1314 break;
1283 1315
1284 case BUTTON_F1: 1316#ifdef CALCULATOR_CLEAR
1285 switch(calStatus){ 1317 case CALCULATOR_CLEAR:
1286 case cal_typing: 1318 switch(calStatus){
1287 case cal_dotted: 1319 case cal_typing:
1288 doDelete(); 1320 case cal_dotted:
1289 break; 1321 doDelete();
1290 default: /* cal_normal, cal_error, cal_exit */ 1322 break;
1291 clearMem(); 1323 default: /* cal_normal, cal_error, cal_exit */
1292 break; 1324 clearMem();
1293 } 1325 break;
1294 printResult(); 1326 }
1295 break; 1327 printResult();
1328 break;
1329#endif
1296 1330
1297 case BUTTON_LEFT: 1331 case BUTTON_LEFT:
1298 case BUTTON_LEFT | BUTTON_REPEAT: 1332 case BUTTON_LEFT | BUTTON_REPEAT:
@@ -1304,7 +1338,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1304 case BUTTON_DOWN | BUTTON_REPEAT: 1338 case BUTTON_DOWN | BUTTON_REPEAT:
1305 moveButton(); 1339 moveButton();
1306 break; 1340 break;
1307 case BUTTON_OFF: 1341 case CALCULATOR_QUIT:
1308 calStatus = cal_exit; 1342 calStatus = cal_exit;
1309 printResult(); 1343 printResult();
1310 break; 1344 break;
@@ -1313,6 +1347,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
1313 return PLUGIN_USB_CONNECTED; 1347 return PLUGIN_USB_CONNECTED;
1314 break; 1348 break;
1315 } /* switch (btn) */ 1349 } /* switch (btn) */
1350 if (btn != BUTTON_NONE)
1351 lastbtn = btn;
1316 } /* while (calStatus != cal_exit ) */ 1352 } /* while (calStatus != cal_exit ) */
1317 1353
1318 /* rb->splash(HZ*2, true, "Hello world!"); */ 1354 /* rb->splash(HZ*2, true, "Hello world!"); */
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index b501115618..8870554290 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -592,6 +592,7 @@ static bool any_events(struct shown *shown, bool force)
592 if(rb->default_event_handler(button) == SYS_USB_CONNECTED) 592 if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
593 been_in_usb_mode = true; 593 been_in_usb_mode = true;
594 show_lines(lines_displayed,shown); 594 show_lines(lines_displayed,shown);
595 rb->lcd_update();
595 break; 596 break;
596 } 597 }
597 } 598 }
@@ -707,8 +708,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
707 break; 708 break;
708 709
709 case BUTTON_PLAY: 710 case BUTTON_PLAY:
710 if (any_events(&shown, true)) 711 any_events(&shown, true);
711 rb->usb_screen();
712 draw_calendar(&shown); 712 draw_calendar(&shown);
713 break; 713 break;
714 714
diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c
index 91c25302dd..aa81b263dc 100644
--- a/apps/plugins/chip8.c
+++ b/apps/plugins/chip8.c
@@ -23,6 +23,27 @@
23#ifdef HAVE_LCD_BITMAP 23#ifdef HAVE_LCD_BITMAP
24#ifndef SIMULATOR /* not unless lcd_blit() is implemented and mp3_xx stubbed */ 24#ifndef SIMULATOR /* not unless lcd_blit() is implemented and mp3_xx stubbed */
25 25
26/* variable button definitions */
27#if CONFIG_KEYPAD == RECORDER_PAD /* only 9 out of 16 chip8 buttons */
28#define CHIP8_KEY1 BUTTON_F1
29#define CHIP8_KEY2 BUTTON_UP
30#define CHIP8_KEY3 BUTTON_F3
31#define CHIP8_KEY4 BUTTON_LEFT
32#define CHIP8_KEY5 BUTTON_PLAY
33#define CHIP8_KEY6 BUTTON_RIGHT
34#define CHIP8_KEY7 BUTTON_F2
35#define CHIP8_KEY8 BUTTON_DOWN
36#define CHIP8_KEY9 BUTTON_ON
37
38#elif CONFIG_KEYPAD == ONDIO_PAD /* even more limited */
39#define CHIP8_KEY2 BUTTON_UP
40#define CHIP8_KEY4 BUTTON_LEFT
41#define CHIP8_KEY5 BUTTON_MENU
42#define CHIP8_KEY6 BUTTON_RIGHT
43#define CHIP8_KEY8 BUTTON_DOWN
44
45#endif
46
26static struct plugin_api* rb; /* here is a global api struct pointer */ 47static struct plugin_api* rb; /* here is a global api struct pointer */
27unsigned char lcd_framebuf[8][64]; /* frame buffer in hardware fomat */ 48unsigned char lcd_framebuf[8][64]; /* frame buffer in hardware fomat */
28 49
@@ -407,33 +428,43 @@ static void chip8_update_display(void)
407 428
408static void chip8_keyboard(void) 429static void chip8_keyboard(void)
409{ 430{
410 switch (rb->button_get(false)) 431 int button = rb->button_get(false);
432 switch (button)
411 { 433 {
412 case BUTTON_OFF: /* Abort Emulator */ 434 case BUTTON_OFF: /* Abort Emulator */
413 chip8_running = false; 435 chip8_running = 0;
414 break; 436 break;
415 437
416 case BUTTON_UP: chip8_keys[2] = 1; break; 438 case CHIP8_KEY2: chip8_keys[2] = 1; break;
417 case BUTTON_UP | BUTTON_REL: chip8_keys[2] = 0; break; 439 case CHIP8_KEY2 | BUTTON_REL: chip8_keys[2] = 0; break;
418 case BUTTON_LEFT: chip8_keys[4] = 1; break; 440 case CHIP8_KEY4: chip8_keys[4] = 1; break;
419 case BUTTON_LEFT | BUTTON_REL: chip8_keys[4] = 0; break; 441 case CHIP8_KEY4 | BUTTON_REL: chip8_keys[4] = 0; break;
420 case BUTTON_RIGHT: chip8_keys[6] = 1; break; 442 case CHIP8_KEY6: chip8_keys[6] = 1; break;
421 case BUTTON_RIGHT | BUTTON_REL: chip8_keys[6] = 0; break; 443 case CHIP8_KEY6 | BUTTON_REL: chip8_keys[6] = 0; break;
422 case BUTTON_DOWN: chip8_keys[8] = 1; break; 444 case CHIP8_KEY8: chip8_keys[8] = 1; break;
423 case BUTTON_DOWN | BUTTON_REL: chip8_keys[8] = 0; break; 445 case CHIP8_KEY8 | BUTTON_REL: chip8_keys[8] = 0; break;
424 case BUTTON_PLAY: chip8_keys[5] = 1; break; 446 case CHIP8_KEY5: chip8_keys[5] = 1; break;
425 case BUTTON_PLAY | BUTTON_REL: chip8_keys[5] = 0; break; 447 case CHIP8_KEY5 | BUTTON_REL: chip8_keys[5] = 0; break;
426 case BUTTON_F1: chip8_keys[1] = 1; break; 448#ifdef CHIP8_KEY1
427 case BUTTON_F1 | BUTTON_REL: chip8_keys[1] = 0; break; 449 case CHIP8_KEY1: chip8_keys[1] = 1; break;
428 case BUTTON_F2: chip8_keys[7] = 1; break; 450 case CHIP8_KEY1 | BUTTON_REL: chip8_keys[1] = 0; break;
429 case BUTTON_F2 | BUTTON_REL: chip8_keys[7] = 0; break; 451#endif
430 case BUTTON_F3: chip8_keys[3] = 1; break; 452#ifdef CHIP8_KEY3
431 case BUTTON_F3 | BUTTON_REL: chip8_keys[3] = 0; break; 453 case CHIP8_KEY3: chip8_keys[3] = 1; break;
432 case BUTTON_ON: chip8_keys[9] = 1; break; 454 case CHIP8_KEY3 | BUTTON_REL: chip8_keys[3] = 0; break;
433 case BUTTON_ON | BUTTON_REL: chip8_keys[9] = 0; break; 455#endif
434 456#ifdef CHIP8_KEY7
435 case SYS_USB_CONNECTED: 457 case CHIP8_KEY7: chip8_keys[7] = 1; break;
436 chip8_running = false; 458 case CHIP8_KEY7 | BUTTON_REL: chip8_keys[7] = 0; break;
459#endif
460#ifdef CHIP8_KEY9
461 case CHIP8_KEY9: chip8_keys[9] = 1; break;
462 case CHIP8_KEY9 | BUTTON_REL: chip8_keys[9] = 0; break;
463#endif
464
465 default:
466 if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
467 chip8_running = 2; /* indicates stopped because of USB */
437 break; 468 break;
438 } 469 }
439} 470}
@@ -556,7 +587,7 @@ bool chip8_run(char* file)
556 } 587 }
557 588
558 chip8_reset(); 589 chip8_reset();
559 while (chip8_running) chip8_execute(); 590 while (chip8_running == 1) chip8_execute();
560 591
561 if (!is_playing) 592 if (!is_playing)
562 { /* stop it if we used audio */ 593 { /* stop it if we used audio */
@@ -592,7 +623,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
592 } 623 }
593 624
594 /* now go ahead and have fun! */ 625 /* now go ahead and have fun! */
595 return chip8_run(filename) ? PLUGIN_OK : PLUGIN_ERROR; 626 if (chip8_run(filename))
627 if (chip8_running == 0)
628 return PLUGIN_OK;
629 else
630 return PLUGIN_USB_CONNECTED;
631 else
632 return PLUGIN_ERROR;
596} 633}
597 634
598#endif /* #ifndef SIMULATOR */ 635#endif /* #ifndef SIMULATOR */
diff --git a/apps/plugins/clock.c b/apps/plugins/clock.c
index 9886eb8d6f..2695bab26d 100644
--- a/apps/plugins/clock.c
+++ b/apps/plugins/clock.c
@@ -1276,11 +1276,27 @@ bool show_credits(void)
1276 return false; 1276 return false;
1277} 1277}
1278 1278
1279/**********************************************************************
1280 * Cleanup on plugin return
1281 **********************************************************************/
1282
1283void cleanup(void *parameter)
1284{
1285 (void)parameter; /* unused */
1286
1287 if(settings.save_mode == 1)
1288 save_settings(true);
1289
1290 /* restore set backlight timeout */
1291 rb->backlight_set_timeout(rb->global_settings->backlight_timeout);
1292}
1293
1279/****************** 1294/******************
1280 * F1 Screen - HELP 1295 * F1 Screen - HELP
1281 *****************/ 1296 *****************/
1282bool f1_screen(void) 1297bool f1_screen(void)
1283{ 1298{
1299 int button;
1284 int screen = 1; 1300 int screen = 1;
1285 done = false; 1301 done = false;
1286 1302
@@ -1401,7 +1417,8 @@ bool f1_screen(void)
1401 1417
1402 rb->lcd_update(); 1418 rb->lcd_update();
1403 1419
1404 switch(rb->button_get_w_tmo(HZ/4)) 1420 button = rb->button_get_w_tmo(HZ/4);
1421 switch(button)
1405 { 1422 {
1406 case BUTTON_F1: /* exit */ 1423 case BUTTON_F1: /* exit */
1407 case BUTTON_OFF: 1424 case BUTTON_OFF:
@@ -1418,9 +1435,10 @@ bool f1_screen(void)
1418 screen++; 1435 screen++;
1419 break; 1436 break;
1420 1437
1421 case SYS_USB_CONNECTED: /* leave for usb */ 1438 default:
1422 return PLUGIN_USB_CONNECTED; 1439 if(rb->default_event_handler_ex(button, cleanup, NULL)
1423 rb->usb_screen(); 1440 == SYS_USB_CONNECTED)
1441 return PLUGIN_USB_CONNECTED;
1424 break; 1442 break;
1425 } 1443 }
1426 } 1444 }
@@ -2546,6 +2564,8 @@ void counter_options(void)
2546 **********************************************************************/ 2564 **********************************************************************/
2547enum plugin_status plugin_start(struct plugin_api* api, void* parameter) 2565enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2548{ 2566{
2567 int button;
2568
2549 /* time ints */ 2569 /* time ints */
2550 int i; 2570 int i;
2551 int hour; 2571 int hour;
@@ -2802,16 +2822,11 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2802 /************************* 2822 /*************************
2803 * Scan for button presses 2823 * Scan for button presses
2804 ************************/ 2824 ************************/
2805 switch (rb->button_get_w_tmo(HZ/10)) 2825 button = rb->button_get_w_tmo(HZ/10);
2826 switch (button)
2806 { 2827 {
2807 case BUTTON_OFF: /* save and exit */ 2828 case BUTTON_OFF: /* save and exit */
2808 if(settings.save_mode == 1) 2829 cleanup(NULL);
2809 save_settings(true);
2810
2811 /* restore set backlight timeout */
2812 rb->backlight_set_timeout(
2813 rb->global_settings->backlight_timeout);
2814
2815 return PLUGIN_OK; 2830 return PLUGIN_OK;
2816 2831
2817 case BUTTON_ON | BUTTON_REL: /* credit roll */ 2832 case BUTTON_ON | BUTTON_REL: /* credit roll */
@@ -2889,9 +2904,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2889 select_mode(); 2904 select_mode();
2890 break; 2905 break;
2891 2906
2892 case SYS_USB_CONNECTED: /* usb plugged? */ 2907 default:
2893 rb->usb_screen(); 2908 if(rb->default_event_handler_ex(button, cleanup, NULL)
2894 return PLUGIN_USB_CONNECTED; 2909 == SYS_USB_CONNECTED)
2910 return PLUGIN_USB_CONNECTED;
2895 break; 2911 break;
2896 } 2912 }
2897 } 2913 }
diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c
index 17440ad496..b0c6daa656 100644
--- a/apps/plugins/cube.c
+++ b/apps/plugins/cube.c
@@ -24,6 +24,30 @@
24/* Loops that the values are displayed */ 24/* Loops that the values are displayed */
25#define DISP_TIME 30 25#define DISP_TIME 30
26 26
27/* variable button definitions */
28#if CONFIG_KEYPAD == RECORDER_PAD
29#define CUBE_QUIT (BUTTON_OFF | BUTTON_REL)
30#define CUBE_X_INC BUTTON_RIGHT
31#define CUBE_X_DEC BUTTON_LEFT
32#define CUBE_Y_INC BUTTON_UP
33#define CUBE_Y_DEC BUTTON_DOWN
34#define CUBE_Z_INC BUTTON_F2
35#define CUBE_Z_DEC BUTTON_F1
36#define CUBE_HIGHSPEED BUTTON_PLAY
37
38#elif CONFIG_KEYPAD == ONDIO_PAD
39#define CUBE_QUIT (BUTTON_OFF | BUTTON_REL)
40#define CUBE_X_INC BUTTON_RIGHT
41#define CUBE_X_DEC BUTTON_LEFT
42#define CUBE_Y_INC BUTTON_UP
43#define CUBE_Y_DEC BUTTON_DOWN
44#define CUBE_Z_INC (BUTTON_MENU | BUTTON_UP)
45#define CUBE_Z_DEC (BUTTON_MENU | BUTTON_DOWN)
46#define CUBE_HIGHSPEED_PRE BUTTON_MENU
47#define CUBE_HIGHSPEED (BUTTON_MENU | BUTTON_REL)
48
49#endif
50
27struct point_3D { 51struct point_3D {
28 long x, y, z; 52 long x, y, z;
29}; 53};
@@ -230,6 +254,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
230 int t_disp=0; 254 int t_disp=0;
231 char buffer[30]; 255 char buffer[30];
232 256
257 int button;
258 int lastbutton=0;
233 int xa=0; 259 int xa=0;
234 int ya=0; 260 int ya=0;
235 int za=0; 261 int za=0;
@@ -282,56 +308,64 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
282 if (za<0) 308 if (za<0)
283 za+=360; 309 za+=360;
284 310
285 switch(rb->button_get(false)) 311 button = rb->button_get(false);
312 switch(button)
286 { 313 {
287 case BUTTON_RIGHT: 314 case CUBE_X_INC:
288 xs+=1; 315 xs+=1;
289 if (xs>10) 316 if (xs>10)
290 xs=10; 317 xs=10;
291 t_disp=DISP_TIME; 318 t_disp=DISP_TIME;
292 break; 319 break;
293 case BUTTON_LEFT: 320 case CUBE_X_DEC:
294 xs-=1; 321 xs-=1;
295 if (xs<-10) 322 if (xs<-10)
296 xs=-10; 323 xs=-10;
297 t_disp=DISP_TIME; 324 t_disp=DISP_TIME;
298 break; 325 break;
299 case BUTTON_UP: 326 case CUBE_Y_INC:
300 ys+=1; 327 ys+=1;
301 if (ys>10) 328 if (ys>10)
302 ys=10; 329 ys=10;
303 t_disp=DISP_TIME; 330 t_disp=DISP_TIME;
304 break; 331 break;
305 case BUTTON_DOWN: 332 case CUBE_Y_DEC:
306 ys-=1; 333 ys-=1;
307 if (ys<-10) 334 if (ys<-10)
308 ys=-10; 335 ys=-10;
309 t_disp=DISP_TIME; 336 t_disp=DISP_TIME;
310 break; 337 break;
311 case BUTTON_F2: 338 case CUBE_Z_INC:
312 zs+=1; 339 zs+=1;
313 if (zs>10) 340 if (zs>10)
314 zs=10; 341 zs=10;
315 t_disp=DISP_TIME; 342 t_disp=DISP_TIME;
316 break; 343 break;
317 case BUTTON_F1: 344 case CUBE_Z_DEC:
318 zs-=1; 345 zs-=1;
319 if (zs<-10) 346 if (zs<-10)
320 zs=-10; 347 zs=-10;
321 t_disp=DISP_TIME; 348 t_disp=DISP_TIME;
322 break; 349 break;
323 case BUTTON_PLAY: 350 case CUBE_HIGHSPEED:
351#ifdef CUBE_HIGHSPEED_PRE
352 if (lastbutton!=CUBE_HIGHSPEED_PRE)
353 break;
354#endif
324 highspeed=!highspeed; 355 highspeed=!highspeed;
325 t_disp=DISP_TIME; 356 t_disp=DISP_TIME;
326 break; 357 break;
327 case BUTTON_OFF|BUTTON_REL: 358 case CUBE_QUIT:
328 exit=1; 359 exit=1;
329 break; 360 break;
330 361
331 case SYS_USB_CONNECTED: 362 default:
332 rb->usb_screen(); 363 if(rb->default_event_handler(button) == SYS_USB_CONNECTED)
333 return PLUGIN_USB_CONNECTED; 364 return PLUGIN_USB_CONNECTED;
365 break;
334 } 366 }
367 if (button!=BUTTON_NONE)
368 lastbutton=button;
335 } 369 }
336 370
337 return PLUGIN_OK; 371 return PLUGIN_OK;