MIPSel: remove unneeded gcc arguments in tools/configure
[kugel-rb.git] / apps / plugins / chessclock.c
blobf3210f29c854ae674ca0b152abd8f94fca2c8e55
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2002 Kjell Ericson
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #include "plugin.h"
23 PLUGIN_HEADER
25 /* variable button definitions */
26 #if CONFIG_KEYPAD == RECORDER_PAD
27 #define CHC_QUIT BUTTON_OFF
28 #define CHC_STARTSTOP BUTTON_PLAY
29 #define CHC_RESET BUTTON_LEFT
30 #define CHC_MENU BUTTON_F1
31 #define CHC_SETTINGS_INC BUTTON_UP
32 #define CHC_SETTINGS_DEC BUTTON_DOWN
33 #define CHC_SETTINGS_OK BUTTON_PLAY
34 #define CHC_SETTINGS_OK2 BUTTON_LEFT
35 #define CHC_SETTINGS_CANCEL BUTTON_OFF
37 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
38 #define CHC_QUIT BUTTON_OFF
39 #define CHC_STARTSTOP BUTTON_SELECT
40 #define CHC_RESET BUTTON_LEFT
41 #define CHC_MENU BUTTON_F1
42 #define CHC_SETTINGS_INC BUTTON_UP
43 #define CHC_SETTINGS_DEC BUTTON_DOWN
44 #define CHC_SETTINGS_OK BUTTON_SELECT
45 #define CHC_SETTINGS_OK2 BUTTON_LEFT
46 #define CHC_SETTINGS_CANCEL BUTTON_OFF
48 #elif CONFIG_KEYPAD == ONDIO_PAD
49 #define CHC_QUIT BUTTON_OFF
50 #define CHC_STARTSTOP BUTTON_RIGHT
51 #define CHC_RESET BUTTON_LEFT
52 #define CHC_MENU BUTTON_MENU
53 #define CHC_SETTINGS_INC BUTTON_UP
54 #define CHC_SETTINGS_DEC BUTTON_DOWN
55 #define CHC_SETTINGS_OK BUTTON_RIGHT
56 #define CHC_SETTINGS_OK2 BUTTON_LEFT
57 #define CHC_SETTINGS_CANCEL BUTTON_MENU
59 #elif CONFIG_KEYPAD == PLAYER_PAD
60 #define CHC_QUIT BUTTON_ON
61 #define CHC_STARTSTOP BUTTON_PLAY
62 #define CHC_RESET BUTTON_STOP
63 #define CHC_MENU BUTTON_MENU
64 #define CHC_SETTINGS_INC BUTTON_RIGHT
65 #define CHC_SETTINGS_DEC BUTTON_LEFT
66 #define CHC_SETTINGS_OK BUTTON_PLAY
67 #define CHC_SETTINGS_CANCEL BUTTON_STOP
68 #define CHC_SETTINGS_CANCEL2 BUTTON_MENU
70 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
71 (CONFIG_KEYPAD == IRIVER_H300_PAD)
72 #define CHC_QUIT BUTTON_SELECT
73 #define CHC_STARTSTOP BUTTON_ON
74 #define CHC_RESET BUTTON_OFF
75 #define CHC_MENU BUTTON_REC
76 #define CHC_SETTINGS_INC BUTTON_RIGHT
77 #define CHC_SETTINGS_DEC BUTTON_LEFT
78 #define CHC_SETTINGS_OK BUTTON_ON
79 #define CHC_SETTINGS_CANCEL BUTTON_OFF
80 #define CHC_SETTINGS_CANCEL2 BUTTON_REC
82 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
83 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
84 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
85 #define CHC_QUIT BUTTON_PLAY
86 #define CHC_STARTSTOP BUTTON_SELECT
87 #define CHC_RESET BUTTON_LEFT
88 #define CHC_MENU BUTTON_MENU
89 #define CHC_SETTINGS_INC BUTTON_SCROLL_FWD
90 #define CHC_SETTINGS_DEC BUTTON_SCROLL_BACK
91 #define CHC_SETTINGS_OK BUTTON_SELECT
92 #define CHC_SETTINGS_CANCEL BUTTON_MENU
94 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
95 #define CHC_QUIT BUTTON_PLAY
96 #define CHC_STARTSTOP BUTTON_MODE
97 #define CHC_RESET BUTTON_EQ
98 #define CHC_MENU BUTTON_SELECT
99 #define CHC_SETTINGS_INC BUTTON_RIGHT
100 #define CHC_SETTINGS_DEC BUTTON_LEFT
101 #define CHC_SETTINGS_OK BUTTON_SELECT
102 #define CHC_SETTINGS_CANCEL BUTTON_PLAY
104 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
105 #define CHC_QUIT BUTTON_REC
106 #define CHC_STARTSTOP BUTTON_PLAY
107 #define CHC_RESET BUTTON_POWER
108 #define CHC_MENU BUTTON_SELECT
109 #define CHC_SETTINGS_INC BUTTON_RIGHT
110 #define CHC_SETTINGS_DEC BUTTON_LEFT
111 #define CHC_SETTINGS_OK BUTTON_SELECT
112 #define CHC_SETTINGS_CANCEL BUTTON_REC
114 #elif CONFIG_KEYPAD == GIGABEAT_PAD
115 #define CHC_QUIT BUTTON_POWER
116 #define CHC_STARTSTOP BUTTON_SELECT
117 #define CHC_RESET BUTTON_A
118 #define CHC_MENU BUTTON_MENU
119 #define CHC_SETTINGS_INC BUTTON_UP
120 #define CHC_SETTINGS_DEC BUTTON_DOWN
121 #define CHC_SETTINGS_OK BUTTON_SELECT
122 #define CHC_SETTINGS_CANCEL BUTTON_POWER
124 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
125 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
126 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
127 (CONFIG_KEYPAD == SANSA_M200_PAD)
128 #define CHC_QUIT BUTTON_POWER
129 #define CHC_STARTSTOP BUTTON_SELECT
130 #define CHC_RESET BUTTON_DOWN
131 #define CHC_MENU BUTTON_UP
132 #define CHC_SETTINGS_INC BUTTON_RIGHT
133 #define CHC_SETTINGS_DEC BUTTON_LEFT
134 #define CHC_SETTINGS_OK BUTTON_SELECT
135 #define CHC_SETTINGS_CANCEL BUTTON_POWER
137 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
138 #define CHC_QUIT BUTTON_POWER
139 #define CHC_STARTSTOP BUTTON_SELECT
140 #define CHC_RESET BUTTON_DOWN
141 #define CHC_MENU BUTTON_UP
142 #define CHC_SETTINGS_INC BUTTON_RIGHT
143 #define CHC_SETTINGS_DEC BUTTON_LEFT
144 #define CHC_SETTINGS_OK BUTTON_SELECT
145 #define CHC_SETTINGS_CANCEL (BUTTON_HOME|BUTTON_REPEAT)
147 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
148 #define CHC_QUIT BUTTON_POWER
149 #define CHC_STARTSTOP BUTTON_PLAY
150 #define CHC_RESET BUTTON_FF
151 #define CHC_MENU BUTTON_REW
152 #define CHC_SETTINGS_INC BUTTON_RIGHT
153 #define CHC_SETTINGS_DEC BUTTON_LEFT
154 #define CHC_SETTINGS_OK BUTTON_PLAY
155 #define CHC_SETTINGS_CANCEL BUTTON_POWER
157 #elif CONFIG_KEYPAD == MROBE500_PAD
158 #define CHC_QUIT BUTTON_POWER
159 #define CHC_STARTSTOP BUTTON_RC_PLAY
160 #define CHC_RESET BUTTON_RC_HEART
161 #define CHC_MENU BUTTON_RC_MODE
162 #define CHC_SETTINGS_INC BUTTON_RC_VOL_UP
163 #define CHC_SETTINGS_DEC BUTTON_RC_VOL_DOWN
164 #define CHC_SETTINGS_OK BUTTON_RC_PLAY
165 #define CHC_SETTINGS_CANCEL BUTTON_POWER
167 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
168 #define CHC_QUIT BUTTON_BACK
169 #define CHC_STARTSTOP BUTTON_PLAY
170 #define CHC_RESET BUTTON_PREV
171 #define CHC_MENU BUTTON_MENU
172 #define CHC_SETTINGS_INC BUTTON_UP
173 #define CHC_SETTINGS_DEC BUTTON_DOWN
174 #define CHC_SETTINGS_OK BUTTON_SELECT
175 #define CHC_SETTINGS_CANCEL BUTTON_BACK
177 #elif CONFIG_KEYPAD == MROBE100_PAD
178 #define CHC_QUIT BUTTON_POWER
179 #define CHC_STARTSTOP BUTTON_SELECT
180 #define CHC_RESET BUTTON_DISPLAY
181 #define CHC_MENU BUTTON_MENU
182 #define CHC_SETTINGS_INC BUTTON_UP
183 #define CHC_SETTINGS_DEC BUTTON_DOWN
184 #define CHC_SETTINGS_OK BUTTON_SELECT
185 #define CHC_SETTINGS_CANCEL BUTTON_POWER
187 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
188 #define CHC_QUIT BUTTON_RC_REC
189 #define CHC_STARTSTOP BUTTON_RC_PLAY
190 #define CHC_RESET BUTTON_RC_REW
191 #define CHC_MENU BUTTON_RC_MENU
192 #define CHC_SETTINGS_INC BUTTON_RC_VOL_UP
193 #define CHC_SETTINGS_DEC BUTTON_RC_VOL_DOWN
194 #define CHC_SETTINGS_OK BUTTON_RC_PLAY
195 #define CHC_SETTINGS_CANCEL BUTTON_RC_REC
197 #elif CONFIG_KEYPAD == COWOND2_PAD
198 #define CHC_QUIT BUTTON_POWER
199 #define CHC_RESET (BUTTON_CENTER|BUTTON_MENU)
200 #define CHC_MENU BUTTON_MENU
201 #define CHC_SETTINGS_INC BUTTON_PLUS
202 #define CHC_SETTINGS_DEC BUTTON_MINUS
203 #define CHC_SETTINGS_CANCEL BUTTON_POWER
205 #elif CONFIG_KEYPAD == IAUDIO67_PAD
206 #define CHC_QUIT BUTTON_POWER
207 #define CHC_STARTSTOP BUTTON_PLAY
208 #define CHC_RESET BUTTON_LEFT
209 #define CHC_MENU BUTTON_MENU
210 #define CHC_SETTINGS_INC BUTTON_VOLUP
211 #define CHC_SETTINGS_DEC BUTTON_VOLDOWN
212 #define CHC_SETTINGS_OK BUTTON_PLAY
213 #define CHC_SETTINGS_OK2 BUTTON_LEFT
214 #define CHC_SETTINGS_CANCEL BUTTON_POWER
216 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
217 #define CHC_QUIT BUTTON_BACK
218 #define CHC_STARTSTOP BUTTON_PLAY
219 #define CHC_RESET BUTTON_CUSTOM
220 #define CHC_MENU BUTTON_MENU
221 #define CHC_SETTINGS_INC BUTTON_UP
222 #define CHC_SETTINGS_DEC BUTTON_DOWN
223 #define CHC_SETTINGS_OK BUTTON_SELECT
224 #define CHC_SETTINGS_CANCEL BUTTON_BACK
226 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
227 #define CHC_QUIT BUTTON_POWER
228 #define CHC_STARTSTOP BUTTON_SELECT
229 #define CHC_RESET BUTTON_VIEW
230 #define CHC_MENU BUTTON_MENU
231 #define CHC_SETTINGS_INC BUTTON_RIGHT
232 #define CHC_SETTINGS_DEC BUTTON_LEFT
233 #define CHC_SETTINGS_OK BUTTON_SELECT
234 #define CHC_SETTINGS_CANCEL BUTTON_POWER
236 #elif CONFIG_KEYPAD == ONDAVX747_PAD
237 #define CHC_QUIT BUTTON_POWER
238 #define CHC_RESET (BUTTON_VOL_UP|BUTTON_VOL_DOWN)
239 #define CHC_MENU BUTTON_MENU
240 #define CHC_SETTINGS_INC BUTTON_VOL_UP
241 #define CHC_SETTINGS_DEC BUTTON_VOL_DOWN
242 #define CHC_SETTINGS_CANCEL BUTTON_POWER
244 #else
245 #error No keymap defined!
246 #endif
248 #ifdef HAVE_TOUCHSCREEN
249 #ifndef CHC_SETTINGS_OK
250 #define CHC_SETTINGS_OK BUTTON_CENTER
251 #endif
252 #ifndef CHC_STARTSTOP
253 #define CHC_STARTSTOP BUTTON_CENTER
254 #endif
255 #ifndef CHC_SETTINGS_INC
256 #define CHC_SETTINGS_INC BUTTON_TOPMIDDLE
257 #endif
258 #ifndef CHC_SETTINGS_DEC
259 #define CHC_SETTINGS_DEC BUTTON_BOTTOMMIDDLE
260 #endif
261 #ifndef CHC_RESET
262 #define CHC_RESET BUTTON_TOPLEFT
263 #endif
264 #ifndef CHC_MENU
265 #define CHC_MENU BUTTON_TOPRIGHT
266 #endif
267 #endif
270 /* leave first line blank on bitmap display, for pause icon */
271 #ifdef HAVE_LCD_BITMAP
272 #define FIRST_LINE 1
273 #else
274 #define FIRST_LINE 0
275 #endif
277 #define MAX_PLAYERS 10
279 static struct {
280 int nr_timers;
281 int total_time;
282 int round_time;
283 } settings;
285 static struct {
286 int total_time;
287 int used_time;
288 bool hidden;
289 } timer_holder[MAX_PLAYERS];
291 static int run_timer(int nr);
292 static int chessclock_set_int(char* string,
293 int* variable,
294 int step,
295 int min,
296 int max,
297 int flags);
298 #define FLAGS_SET_INT_SECONDS 1
300 static char * show_time(int secs);
301 static int simple_menu(int nr, unsigned char **strarr);
303 static bool pause;
305 #define MAX_TIME 7200
307 /* this is the plugin entry point */
308 enum plugin_status plugin_start(const void* parameter)
310 int i;
311 bool done;
312 int nr;
314 (void)parameter;
315 rb->memset(&settings, 0, sizeof(settings));
317 /* now go ahead and have fun! */
318 rb->splash(HZ, "Chess Clock");
320 rb->lcd_clear_display();
321 i=0;
322 while (i>=0) {
323 int res;
324 switch (i) {
325 case 0:
326 res=chessclock_set_int("Number of players",
327 &settings.nr_timers, 1, 1,
328 MAX_PLAYERS, 0);
329 break;
330 case 1:
331 res=chessclock_set_int("Total time",
332 &settings.total_time, 10, 0, MAX_TIME,
333 FLAGS_SET_INT_SECONDS);
334 settings.round_time=settings.total_time;
335 break;
336 case 2:
337 res=chessclock_set_int("Max round time", &settings.round_time,
338 10, 0, settings.round_time,
339 FLAGS_SET_INT_SECONDS);
340 break;
341 default:
342 i=-1; /* done */
343 res=-2;
344 break;
346 if (res==-1) {
347 return PLUGIN_USB_CONNECTED;
349 if (res==0) {
350 i--;
351 if (i<0) {
352 return PLUGIN_OK;
355 if (res>0) {
356 i++;
359 for (i=0; i<settings.nr_timers; i++) {
360 timer_holder[i].total_time=settings.total_time;
361 timer_holder[i].used_time=0;
362 timer_holder[i].hidden=false;
365 pause=true; /* We start paused */
367 nr=0;
368 do {
369 int ret=0;
370 done=true;
371 for (i=0; done && i<settings.nr_timers; i++) {
372 if (!timer_holder[i].hidden)
373 done=false;
375 if (done) {
376 return PLUGIN_OK;
378 if (!timer_holder[nr].hidden) {
379 done=false;
380 ret=run_timer(nr);
382 switch (ret) {
383 case -1: /* exit */
384 done=true;
385 break;
386 case 3:
387 return PLUGIN_USB_CONNECTED;
388 case 1:
389 nr++;
390 if (nr>=settings.nr_timers)
391 nr=0;
392 break;
393 case 2:
394 nr--;
395 if (nr<0)
396 nr=settings.nr_timers-1;
397 break;
399 } while (!done);
400 return PLUGIN_OK;
403 #ifdef HAVE_LCD_BITMAP
404 static void show_pause_mode(bool enabled)
406 static const char pause_icon[] = {0x00,0x7f,0x7f,0x00,0x7f,0x7f,0x00};
408 if (enabled)
409 rb->lcd_mono_bitmap((unsigned char *)pause_icon, 52, 0, 7, 8);
410 else
412 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
413 rb->lcd_fillrect(52, 0, 7, 8);
414 rb->lcd_set_drawmode(DRMODE_SOLID);
417 #endif
420 -1= exit
421 1 = next player
422 2 = prev player
423 3 = usb connected
425 static int run_timer(int nr)
427 char buf[40];
428 char player_info[13];
429 long last_tick;
430 bool done=false;
431 int retval=0;
432 long max_ticks=timer_holder[nr].total_time*HZ-timer_holder[nr].used_time;
433 long ticks=0;
434 bool round_time=false;
436 #ifdef HAVE_LCD_CHARCELLS
437 rb->lcd_icon(ICON_PAUSE, pause);
438 #else
439 show_pause_mode(pause);
440 #endif
442 if (settings.round_time*HZ<max_ticks) {
443 max_ticks=settings.round_time*HZ;
444 round_time=true;
446 rb->snprintf(player_info, sizeof(player_info), "Player %d", nr+1);
447 rb->lcd_puts(0, FIRST_LINE, (unsigned char *)player_info);
448 last_tick=*rb->current_tick;
450 while (!done) {
451 int button;
452 long now;
453 if (ticks>max_ticks) {
454 if (round_time)
455 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)"ROUND UP!");
456 else
457 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)"TIME OUT!");
458 rb->backlight_on();
459 } else {
461 if (((int)(rb->current_tick - start_ticks)/HZ)&1) {
462 rb->lcd_puts(0, FIRST_LINE, player_info);
463 } else {
464 rb->lcd_puts(0, FIRST_LINE, player_info);
467 rb->lcd_puts(0, FIRST_LINE, (unsigned char *)player_info);
468 now=*rb->current_tick;
469 if (!pause) {
470 ticks+=now-last_tick;
471 if ((max_ticks-ticks)/HZ == 10) {
472 /* Backlight on if 10 seconds remain */
473 rb->backlight_on();
476 last_tick=now;
477 if (round_time) {
478 rb->snprintf(buf, sizeof(buf), "%s/",
479 show_time((max_ticks-ticks+HZ-1)/HZ));
480 /* Append total time */
481 rb->strcpy(&buf[rb->strlen(buf)],
482 show_time((timer_holder[nr].total_time*HZ-
483 timer_holder[nr].used_time-
484 ticks+HZ-1)/HZ));
485 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)buf);
486 } else {
487 rb->lcd_puts(0, FIRST_LINE+1,
488 (unsigned char *)show_time((max_ticks-ticks+HZ-1)/HZ));
491 rb->lcd_update();
493 button = rb->button_get(false);
494 switch (button) {
495 /* OFF/ON key to exit */
496 case CHC_QUIT:
497 return -1; /* Indicate exit */
499 /* PLAY = Stop/Start toggle */
500 case CHC_STARTSTOP:
501 pause=!pause;
502 #ifdef HAVE_LCD_CHARCELLS
503 rb->lcd_icon(ICON_PAUSE, pause);
504 #else
505 show_pause_mode(pause);
506 #endif
507 break;
509 /* LEFT = Reset timer */
510 case CHC_RESET:
511 ticks=0;
512 break;
514 /* MENU */
515 case CHC_MENU:
517 int ret;
518 char *menu[]={"Delete player", "Restart round",
519 "Set round time", "Set total time"};
520 ret=simple_menu(4, (unsigned char **)menu);
521 if (ret==-1) {
522 retval = 3;
523 done=true;
524 } else if (ret==-2) {
525 } else if (ret==0) {
526 /* delete timer */
527 timer_holder[nr].hidden=true;
528 retval=1;
529 done=true;
530 break;
531 } else if (ret==1) {
532 /* restart */
533 ticks=0;
534 break;
535 } else if (ret==2) {
536 /* set round time */
537 int res;
538 int val=(max_ticks-ticks)/HZ;
539 res=chessclock_set_int("Round time",
540 &val,
541 10, 0, MAX_TIME,
542 FLAGS_SET_INT_SECONDS);
543 if (res==-1) { /*usb*/
544 retval = 3;
545 done=true;
546 } else if (res==1) {
547 ticks=max_ticks-val*HZ;
549 } else if (ret==3) {
550 /* set total time */
551 int res;
552 int val=timer_holder[nr].total_time;
553 res=chessclock_set_int("Total time",
554 &val,
555 10, 0, MAX_TIME,
556 FLAGS_SET_INT_SECONDS);
557 if (res==-1) { /*usb*/
558 retval = 3;
559 done=true;
560 } else if (res==1) {
561 timer_holder[nr].total_time=val;
565 break;
567 /* UP (RIGHT/+) = Scroll Lap timer up */
568 case CHC_SETTINGS_INC:
569 retval = 1;
570 done = true;
571 break;
573 /* DOWN (LEFT/-) = Scroll Lap timer down */
574 case CHC_SETTINGS_DEC:
575 retval = 2;
576 done = true;
577 break;
579 default:
580 if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
581 retval = 3; /* been in usb mode */
582 done = true;
584 break;
586 rb->sleep(HZ/4); /* Sleep 1/4 of a second */
589 timer_holder[nr].used_time+=ticks;
591 return retval;
594 static int chessclock_set_int(char* string,
595 int* variable,
596 int step,
597 int min,
598 int max,
599 int flags)
601 bool done = false;
602 int button;
604 rb->lcd_clear_display();
605 rb->lcd_puts_scroll(0, FIRST_LINE, (unsigned char *)string);
607 while (!done) {
608 char str[32];
609 if (flags & FLAGS_SET_INT_SECONDS)
610 rb->snprintf(str, sizeof str,"%s (m:s)", show_time(*variable));
611 else
612 rb->snprintf(str, sizeof str,"%d", *variable);
613 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)str);
614 rb->lcd_update();
616 button = rb->button_get(true);
617 switch(button) {
618 case CHC_SETTINGS_INC:
619 case CHC_SETTINGS_INC | BUTTON_REPEAT:
620 *variable += step;
621 break;
623 case CHC_SETTINGS_DEC:
624 case CHC_SETTINGS_DEC | BUTTON_REPEAT:
625 *variable -= step;
626 break;
628 case CHC_SETTINGS_OK:
629 #ifdef CHC_SETTINGS_OK2
630 case CHC_SETTINGS_OK2:
631 #endif
632 done = true;
633 break;
635 case CHC_SETTINGS_CANCEL:
636 #ifdef CHC_SETTINGS_CANCEL2
637 case CHC_SETTINGS_CANCEL2:
638 #endif
639 return 0; /* cancel */
640 break;
642 default:
643 if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
644 return -1; /* been in usb mode */
645 break;
648 if(*variable > max )
649 *variable = max;
651 if(*variable < min )
652 *variable = min;
655 rb->lcd_stop_scroll();
657 return 1;
660 static char * show_time(int seconds)
662 static char buf[]="00:00";
663 rb->snprintf(buf, sizeof(buf), "%02d:%02d", seconds/60, seconds%60);
664 return buf;
667 /* -1 = USB
668 -2 = cancel
670 static int simple_menu(int nr, unsigned char **strarr)
672 int show=0;
673 int button;
674 rb->lcd_clear_display();
676 while (1) {
677 if (show>=nr)
678 show=0;
679 if (show<0)
680 show=nr-1;
681 rb->lcd_puts_scroll(0, FIRST_LINE, strarr[show]);
682 rb->lcd_update();
684 button = rb->button_get(true);
685 switch(button) {
686 case CHC_SETTINGS_INC:
687 case CHC_SETTINGS_INC | BUTTON_REPEAT:
688 show++;
689 break;
691 case CHC_SETTINGS_DEC:
692 case CHC_SETTINGS_DEC | BUTTON_REPEAT:
693 show--;
694 break;
696 case CHC_SETTINGS_OK:
697 #ifdef CHC_SETTINGS_OK2
698 case CHC_SETTINGS_OK2:
699 #endif
700 return show;
701 break;
703 case CHC_SETTINGS_CANCEL:
704 #ifdef CHC_SETTINGS_CANCEL2
705 case CHC_SETTINGS_CANCEL2:
706 #endif
707 return -2; /* cancel */
708 break;
710 default:
711 if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
712 return -1; /* been in usb mode */
713 break;