Update the french translation regarding the previous revision.
[kugel-rb.git] / apps / plugins / chessclock.c
blob8711308fc11b5515c86c402a215339bf0d92324f
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"
22 #include "lib/playback_control.h"
26 /* variable button definitions */
27 #if CONFIG_KEYPAD == RECORDER_PAD
28 #define CHC_QUIT BUTTON_OFF
29 #define CHC_STARTSTOP BUTTON_PLAY
30 #define CHC_RESET BUTTON_LEFT
31 #define CHC_MENU BUTTON_F1
32 #define CHC_SETTINGS_INC BUTTON_UP
33 #define CHC_SETTINGS_DEC BUTTON_DOWN
34 #define CHC_SETTINGS_OK BUTTON_PLAY
35 #define CHC_SETTINGS_OK2 BUTTON_LEFT
36 #define CHC_SETTINGS_CANCEL BUTTON_OFF
38 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
39 #define CHC_QUIT BUTTON_OFF
40 #define CHC_STARTSTOP BUTTON_SELECT
41 #define CHC_RESET BUTTON_LEFT
42 #define CHC_MENU BUTTON_F1
43 #define CHC_SETTINGS_INC BUTTON_UP
44 #define CHC_SETTINGS_DEC BUTTON_DOWN
45 #define CHC_SETTINGS_OK BUTTON_SELECT
46 #define CHC_SETTINGS_OK2 BUTTON_LEFT
47 #define CHC_SETTINGS_CANCEL BUTTON_OFF
49 #elif CONFIG_KEYPAD == ONDIO_PAD
50 #define CHC_QUIT BUTTON_OFF
51 #define CHC_STARTSTOP BUTTON_RIGHT
52 #define CHC_RESET BUTTON_LEFT
53 #define CHC_MENU BUTTON_MENU
54 #define CHC_SETTINGS_INC BUTTON_UP
55 #define CHC_SETTINGS_DEC BUTTON_DOWN
56 #define CHC_SETTINGS_OK BUTTON_RIGHT
57 #define CHC_SETTINGS_OK2 BUTTON_LEFT
58 #define CHC_SETTINGS_CANCEL BUTTON_MENU
60 #elif CONFIG_KEYPAD == PLAYER_PAD
61 #define CHC_QUIT BUTTON_ON
62 #define CHC_STARTSTOP BUTTON_PLAY
63 #define CHC_RESET BUTTON_STOP
64 #define CHC_MENU BUTTON_MENU
65 #define CHC_SETTINGS_INC BUTTON_RIGHT
66 #define CHC_SETTINGS_DEC BUTTON_LEFT
67 #define CHC_SETTINGS_OK BUTTON_PLAY
68 #define CHC_SETTINGS_CANCEL BUTTON_STOP
69 #define CHC_SETTINGS_CANCEL2 BUTTON_MENU
71 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
72 (CONFIG_KEYPAD == IRIVER_H300_PAD)
73 #define CHC_QUIT BUTTON_SELECT
74 #define CHC_STARTSTOP BUTTON_ON
75 #define CHC_RESET BUTTON_OFF
76 #define CHC_MENU BUTTON_REC
77 #define CHC_SETTINGS_INC BUTTON_RIGHT
78 #define CHC_SETTINGS_DEC BUTTON_LEFT
79 #define CHC_SETTINGS_OK BUTTON_ON
80 #define CHC_SETTINGS_CANCEL BUTTON_OFF
81 #define CHC_SETTINGS_CANCEL2 BUTTON_REC
83 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
84 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
85 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
86 #define CHC_QUIT BUTTON_PLAY
87 #define CHC_STARTSTOP BUTTON_SELECT
88 #define CHC_RESET BUTTON_LEFT
89 #define CHC_MENU BUTTON_MENU
90 #define CHC_SETTINGS_INC BUTTON_SCROLL_FWD
91 #define CHC_SETTINGS_DEC BUTTON_SCROLL_BACK
92 #define CHC_SETTINGS_OK BUTTON_SELECT
93 #define CHC_SETTINGS_CANCEL BUTTON_MENU
95 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
96 #define CHC_QUIT BUTTON_PLAY
97 #define CHC_STARTSTOP BUTTON_MODE
98 #define CHC_RESET BUTTON_EQ
99 #define CHC_MENU BUTTON_SELECT
100 #define CHC_SETTINGS_INC BUTTON_RIGHT
101 #define CHC_SETTINGS_DEC BUTTON_LEFT
102 #define CHC_SETTINGS_OK BUTTON_SELECT
103 #define CHC_SETTINGS_CANCEL BUTTON_PLAY
105 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
106 #define CHC_QUIT BUTTON_REC
107 #define CHC_STARTSTOP BUTTON_PLAY
108 #define CHC_RESET BUTTON_POWER
109 #define CHC_MENU BUTTON_SELECT
110 #define CHC_SETTINGS_INC BUTTON_RIGHT
111 #define CHC_SETTINGS_DEC BUTTON_LEFT
112 #define CHC_SETTINGS_OK BUTTON_SELECT
113 #define CHC_SETTINGS_CANCEL BUTTON_REC
115 #elif CONFIG_KEYPAD == GIGABEAT_PAD
116 #define CHC_QUIT BUTTON_POWER
117 #define CHC_STARTSTOP BUTTON_SELECT
118 #define CHC_RESET BUTTON_A
119 #define CHC_MENU BUTTON_MENU
120 #define CHC_SETTINGS_INC BUTTON_UP
121 #define CHC_SETTINGS_DEC BUTTON_DOWN
122 #define CHC_SETTINGS_OK BUTTON_SELECT
123 #define CHC_SETTINGS_CANCEL BUTTON_POWER
125 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
126 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
127 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
128 (CONFIG_KEYPAD == SANSA_M200_PAD)
129 #define CHC_QUIT BUTTON_POWER
130 #define CHC_STARTSTOP BUTTON_SELECT
131 #define CHC_RESET BUTTON_DOWN
132 #define CHC_MENU BUTTON_UP
133 #define CHC_SETTINGS_INC BUTTON_RIGHT
134 #define CHC_SETTINGS_DEC BUTTON_LEFT
135 #define CHC_SETTINGS_OK BUTTON_SELECT
136 #define CHC_SETTINGS_CANCEL BUTTON_POWER
138 #elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
139 #define CHC_QUIT BUTTON_POWER
140 #define CHC_STARTSTOP BUTTON_SELECT
141 #define CHC_RESET BUTTON_DOWN
142 #define CHC_MENU BUTTON_UP
143 #define CHC_SETTINGS_INC BUTTON_RIGHT
144 #define CHC_SETTINGS_DEC BUTTON_LEFT
145 #define CHC_SETTINGS_OK BUTTON_SELECT
146 #define CHC_SETTINGS_CANCEL (BUTTON_HOME|BUTTON_REPEAT)
148 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
149 #define CHC_QUIT BUTTON_POWER
150 #define CHC_STARTSTOP BUTTON_PLAY
151 #define CHC_RESET BUTTON_FF
152 #define CHC_MENU BUTTON_REW
153 #define CHC_SETTINGS_INC BUTTON_RIGHT
154 #define CHC_SETTINGS_DEC BUTTON_LEFT
155 #define CHC_SETTINGS_OK BUTTON_PLAY
156 #define CHC_SETTINGS_CANCEL BUTTON_POWER
158 #elif CONFIG_KEYPAD == MROBE500_PAD
159 #define CHC_QUIT BUTTON_POWER
160 #define CHC_STARTSTOP BUTTON_RC_PLAY
161 #define CHC_RESET BUTTON_RC_HEART
162 #define CHC_MENU BUTTON_RC_MODE
163 #define CHC_SETTINGS_INC BUTTON_RC_VOL_UP
164 #define CHC_SETTINGS_DEC BUTTON_RC_VOL_DOWN
165 #define CHC_SETTINGS_OK BUTTON_RC_PLAY
166 #define CHC_SETTINGS_CANCEL BUTTON_POWER
168 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
169 #define CHC_QUIT BUTTON_BACK
170 #define CHC_STARTSTOP BUTTON_PLAY
171 #define CHC_RESET BUTTON_PREV
172 #define CHC_MENU BUTTON_MENU
173 #define CHC_SETTINGS_INC BUTTON_UP
174 #define CHC_SETTINGS_DEC BUTTON_DOWN
175 #define CHC_SETTINGS_OK BUTTON_SELECT
176 #define CHC_SETTINGS_CANCEL BUTTON_BACK
178 #elif CONFIG_KEYPAD == MROBE100_PAD
179 #define CHC_QUIT BUTTON_POWER
180 #define CHC_STARTSTOP BUTTON_SELECT
181 #define CHC_RESET BUTTON_DISPLAY
182 #define CHC_MENU BUTTON_MENU
183 #define CHC_SETTINGS_INC BUTTON_UP
184 #define CHC_SETTINGS_DEC BUTTON_DOWN
185 #define CHC_SETTINGS_OK BUTTON_SELECT
186 #define CHC_SETTINGS_CANCEL BUTTON_POWER
188 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
189 #define CHC_QUIT BUTTON_RC_REC
190 #define CHC_STARTSTOP BUTTON_RC_PLAY
191 #define CHC_RESET BUTTON_RC_REW
192 #define CHC_MENU BUTTON_RC_MENU
193 #define CHC_SETTINGS_INC BUTTON_RC_VOL_UP
194 #define CHC_SETTINGS_DEC BUTTON_RC_VOL_DOWN
195 #define CHC_SETTINGS_OK BUTTON_RC_PLAY
196 #define CHC_SETTINGS_CANCEL BUTTON_RC_REC
198 #elif CONFIG_KEYPAD == COWON_D2_PAD
199 #define CHC_QUIT BUTTON_POWER
200 #define CHC_RESET (BUTTON_CENTER|BUTTON_MENU)
201 #define CHC_MENU BUTTON_MENU
202 #define CHC_SETTINGS_INC BUTTON_PLUS
203 #define CHC_SETTINGS_DEC BUTTON_MINUS
204 #define CHC_SETTINGS_CANCEL BUTTON_POWER
206 #elif CONFIG_KEYPAD == IAUDIO67_PAD
207 #define CHC_QUIT BUTTON_POWER
208 #define CHC_STARTSTOP BUTTON_PLAY
209 #define CHC_RESET BUTTON_LEFT
210 #define CHC_MENU BUTTON_MENU
211 #define CHC_SETTINGS_INC BUTTON_VOLUP
212 #define CHC_SETTINGS_DEC BUTTON_VOLDOWN
213 #define CHC_SETTINGS_OK BUTTON_PLAY
214 #define CHC_SETTINGS_OK2 BUTTON_LEFT
215 #define CHC_SETTINGS_CANCEL BUTTON_POWER
217 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
218 #define CHC_QUIT BUTTON_BACK
219 #define CHC_STARTSTOP BUTTON_PLAY
220 #define CHC_RESET BUTTON_CUSTOM
221 #define CHC_MENU BUTTON_MENU
222 #define CHC_SETTINGS_INC BUTTON_UP
223 #define CHC_SETTINGS_DEC BUTTON_DOWN
224 #define CHC_SETTINGS_OK BUTTON_SELECT
225 #define CHC_SETTINGS_CANCEL BUTTON_BACK
227 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
228 #define CHC_QUIT BUTTON_POWER
229 #define CHC_STARTSTOP BUTTON_SELECT
230 #define CHC_RESET BUTTON_VIEW
231 #define CHC_MENU BUTTON_MENU
232 #define CHC_SETTINGS_INC BUTTON_RIGHT
233 #define CHC_SETTINGS_DEC BUTTON_LEFT
234 #define CHC_SETTINGS_OK BUTTON_SELECT
235 #define CHC_SETTINGS_CANCEL BUTTON_POWER
237 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
238 #define CHC_QUIT BUTTON_POWER
239 #define CHC_STARTSTOP BUTTON_PLAY
240 #define CHC_RESET BUTTON_RIGHT
241 #define CHC_MENU BUTTON_MENU
242 #define CHC_SETTINGS_INC BUTTON_NEXT
243 #define CHC_SETTINGS_DEC BUTTON_PREV
244 #define CHC_SETTINGS_OK BUTTON_PLAY
245 #define CHC_SETTINGS_CANCEL BUTTON_POWER
247 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
248 #define CHC_QUIT BUTTON_POWER
249 #define CHC_STARTSTOP BUTTON_PLAY
250 #define CHC_RESET BUTTON_RIGHT
251 #define CHC_MENU BUTTON_MENU
252 #define CHC_SETTINGS_INC BUTTON_NEXT
253 #define CHC_SETTINGS_DEC BUTTON_PREV
254 #define CHC_SETTINGS_OK BUTTON_PLAY
255 #define CHC_SETTINGS_CANCEL BUTTON_POWER
257 #elif CONFIG_KEYPAD == ONDAVX747_PAD
258 #define CHC_QUIT BUTTON_POWER
259 #define CHC_RESET (BUTTON_VOL_UP|BUTTON_VOL_DOWN)
260 #define CHC_MENU BUTTON_MENU
261 #define CHC_SETTINGS_INC BUTTON_VOL_UP
262 #define CHC_SETTINGS_DEC BUTTON_VOL_DOWN
263 #define CHC_SETTINGS_CANCEL BUTTON_POWER
265 #elif CONFIG_KEYPAD == ONDAVX777_PAD
266 #define CHC_QUIT BUTTON_POWER
267 #define CHC_SETTINGS_CANCEL BUTTON_POWER
269 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
270 #define CHC_QUIT BUTTON_REC
271 #define CHC_STARTSTOP BUTTON_PLAY
272 #define CHC_RESET BUTTON_FFWD
273 #define CHC_MENU BUTTON_LEFT
274 #define CHC_SETTINGS_INC BUTTON_UP
275 #define CHC_SETTINGS_DEC BUTTON_DOWN
276 #define CHC_SETTINGS_OK BUTTON_PLAY
277 #define CHC_SETTINGS_CANCEL BUTTON_REW
279 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
280 #define CHC_QUIT BUTTON_REC
281 #define CHC_STARTSTOP BUTTON_PLAY
282 #define CHC_RESET BUTTON_PREV
283 #define CHC_MENU BUTTON_MENU
284 #define CHC_SETTINGS_INC BUTTON_UP
285 #define CHC_SETTINGS_DEC BUTTON_DOWN
286 #define CHC_SETTINGS_OK BUTTON_OK
287 #define CHC_SETTINGS_CANCEL BUTTON_CANCEL
289 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
290 #define CHC_QUIT (BUTTON_REC|BUTTON_PLAY)
291 #define CHC_STARTSTOP BUTTON_PLAY
292 #define CHC_RESET BUTTON_REW
293 #define CHC_MENU BUTTON_FUNC
294 #define CHC_SETTINGS_INC BUTTON_VOL_UP
295 #define CHC_SETTINGS_DEC BUTTON_VOL_DOWN
296 #define CHC_SETTINGS_OK BUTTON_FUNC
297 #define CHC_SETTINGS_CANCEL BUTTON_REC
299 #else
300 #error No keymap defined!
301 #endif
303 #ifdef HAVE_TOUCHSCREEN
304 #ifndef CHC_SETTINGS_OK
305 #define CHC_SETTINGS_OK BUTTON_CENTER
306 #endif
307 #ifndef CHC_STARTSTOP
308 #define CHC_STARTSTOP BUTTON_CENTER
309 #endif
310 #ifndef CHC_SETTINGS_INC
311 #define CHC_SETTINGS_INC BUTTON_TOPMIDDLE
312 #endif
313 #ifndef CHC_SETTINGS_DEC
314 #define CHC_SETTINGS_DEC BUTTON_BOTTOMMIDDLE
315 #endif
316 #ifndef CHC_RESET
317 #define CHC_RESET BUTTON_TOPLEFT
318 #endif
319 #ifndef CHC_MENU
320 #define CHC_MENU BUTTON_TOPRIGHT
321 #endif
322 #endif
325 /* leave first line blank on bitmap display, for pause icon */
326 #ifdef HAVE_LCD_BITMAP
327 #define FIRST_LINE 1
328 #else
329 #define FIRST_LINE 0
330 #endif
332 #define MAX_PLAYERS 10
334 enum {
335 CHCL_OK,
336 CHCL_CANCEL,
337 CHCL_USB,
338 CHCL_NEXT,
339 CHCL_PREV,
342 static struct {
343 int nr_timers;
344 int total_time;
345 int round_time;
346 } settings;
348 static struct {
349 int total_time;
350 int used_time;
351 bool hidden;
352 } timer_holder[MAX_PLAYERS];
354 static int run_timer(int nr);
355 static int chessclock_set_int(char* string,
356 int* variable,
357 int step,
358 int min,
359 int max,
360 int flags);
361 #define FLAGS_SET_INT_SECONDS 1
363 static char * show_time(int secs);
365 static bool pause;
367 #define MAX_TIME 7200
369 /* this is the plugin entry point */
370 enum plugin_status plugin_start(const void* parameter)
372 int i;
373 bool done;
374 int nr;
376 (void)parameter;
378 settings.nr_timers = 1;
379 settings.total_time = 10;
380 settings.round_time = 10;
382 /* now go ahead and have fun! */
383 rb->splash(HZ, "Chess Clock");
385 rb->lcd_clear_display();
386 i=0;
387 while (1) {
388 int res;
389 switch (i) {
390 case 0:
391 res=chessclock_set_int("Number of players",
392 &settings.nr_timers, 1, 1,
393 MAX_PLAYERS, 0);
394 break;
395 case 1:
396 res=chessclock_set_int("Total time",
397 &settings.total_time, 10, 10, MAX_TIME,
398 FLAGS_SET_INT_SECONDS);
399 settings.round_time=settings.total_time;
400 break;
401 case 2:
402 res=chessclock_set_int("Max round time", &settings.round_time,
403 10, 10, settings.round_time,
404 FLAGS_SET_INT_SECONDS);
405 break;
406 default:
407 res=-2; /* done */
408 break;
410 if (res==CHCL_USB) {
411 return PLUGIN_USB_CONNECTED;
412 } else if (res==CHCL_CANCEL) {
413 i--;
414 if (i<0) {
415 return PLUGIN_OK;
417 } else if (res==CHCL_OK) {
418 i++;
419 } else if (res==-2) { /* done */
420 break;
423 for (i=0; i<settings.nr_timers; i++) {
424 timer_holder[i].total_time=settings.total_time;
425 timer_holder[i].used_time=0;
426 timer_holder[i].hidden=false;
429 pause=true; /* We start paused */
431 nr=0;
432 do {
433 int ret=0;
434 done=true;
435 i = nr;
436 do {
437 if (!timer_holder[i].hidden)
439 nr = i;
440 done = false;
441 break;
443 if (++i == settings.nr_timers)
444 i = 0;
445 } while (i != nr);
447 if (done) {
448 return PLUGIN_OK;
451 ret = run_timer(nr);
452 switch (ret) {
453 case CHCL_CANCEL: /* exit */
454 done=true;
455 break;
456 case CHCL_USB:
457 return PLUGIN_USB_CONNECTED;
458 case CHCL_NEXT:
459 nr++;
460 if (nr>=settings.nr_timers)
461 nr=0;
462 break;
463 case CHCL_PREV:
464 do {
465 nr--;
466 if (nr<0)
467 nr=settings.nr_timers-1;
468 } while (timer_holder[nr].hidden);
469 break;
471 } while (!done);
472 return PLUGIN_OK;
475 #ifdef HAVE_LCD_BITMAP
476 static void show_pause_mode(bool enabled)
478 static const char pause_icon[] = {0x00,0x7f,0x7f,0x00,0x7f,0x7f,0x00};
480 if (enabled)
481 rb->lcd_mono_bitmap((unsigned char *)pause_icon, 52, 0, 7, 8);
482 else
484 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
485 rb->lcd_fillrect(52, 0, 7, 8);
486 rb->lcd_set_drawmode(DRMODE_SOLID);
489 #else
490 #define show_pause_mode(enabled) rb->lcd_icon(ICON_PAUSE, enabled)
491 #endif
493 static int run_timer(int nr)
495 char buf[40];
496 char player_info[13];
497 long last_tick;
498 bool done=false;
499 int retval=CHCL_OK;
500 long max_ticks=timer_holder[nr].total_time*HZ-timer_holder[nr].used_time;
501 long ticks=0;
502 bool round_time=false;
504 show_pause_mode(pause);
506 if (settings.round_time*HZ<max_ticks) {
507 max_ticks=settings.round_time*HZ;
508 round_time=true;
510 rb->snprintf(player_info, sizeof(player_info), "Player %d", nr+1);
511 rb->lcd_puts(0, FIRST_LINE, (unsigned char *)player_info);
512 last_tick=*rb->current_tick;
514 while (!done) {
515 int button;
516 long now;
517 if (ticks>=max_ticks) {
518 if (round_time)
519 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)"ROUND UP!");
520 else
521 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)"TIME OUT!");
522 rb->backlight_on();
523 ticks = max_ticks;
524 } else {
525 now=*rb->current_tick;
526 if (!pause) {
527 ticks+=now-last_tick;
528 if ((max_ticks-ticks)/HZ == 10) {
529 /* Backlight on if 10 seconds remain */
530 rb->backlight_on();
533 last_tick=now;
534 if (round_time) {
535 rb->snprintf(buf, sizeof(buf), "%s/",
536 show_time((max_ticks-ticks+HZ-1)/HZ));
537 /* Append total time */
538 rb->strcpy(&buf[rb->strlen(buf)],
539 show_time((timer_holder[nr].total_time*HZ-
540 timer_holder[nr].used_time-
541 ticks+HZ-1)/HZ));
542 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)buf);
543 } else {
544 rb->lcd_puts(0, FIRST_LINE+1,
545 (unsigned char *)show_time((max_ticks-ticks+HZ-1)/HZ));
548 rb->lcd_update();
550 button = rb->button_get(false);
551 switch (button) {
552 /* OFF/ON key to exit */
553 case CHC_QUIT:
554 return CHCL_CANCEL; /* Indicate exit */
556 /* PLAY = Stop/Start toggle */
557 case CHC_STARTSTOP:
558 pause=!pause;
559 show_pause_mode(pause);
560 break;
562 /* LEFT = Reset timer */
563 case CHC_RESET:
564 ticks=0;
565 break;
567 /* MENU */
568 case CHC_MENU:
570 MENUITEM_STRINGLIST(menu, "Menu", NULL,
571 "Delete player", "Restart round",
572 "Set round time", "Set total time",
573 "Playback Control");
575 int val, res;
576 switch(rb->do_menu(&menu, NULL, NULL, false))
578 case 0:
579 /* delete player */
580 timer_holder[nr].hidden=true;
581 retval = CHCL_NEXT;
582 done=true;
583 break;
584 case 1:
585 /* restart */
586 ticks=0;
587 last_tick=*rb->current_tick;
588 break;
589 case 2:
590 /* set round time */
591 val=(max_ticks-ticks)/HZ;
592 res=chessclock_set_int("Round time",
593 &val, 10, 0, MAX_TIME,
594 FLAGS_SET_INT_SECONDS);
595 if (res==CHCL_USB) {
596 retval = CHCL_USB;
597 done=true;
598 } else if (res==CHCL_OK) {
599 ticks=max_ticks-val*HZ;
600 last_tick=*rb->current_tick;
602 break;
603 case 3:
604 /* set total time */
605 val=timer_holder[nr].total_time;
606 res=chessclock_set_int("Total time",
607 &val,
608 10, 0, MAX_TIME,
609 FLAGS_SET_INT_SECONDS);
610 if (res==CHCL_USB) {
611 retval = CHCL_USB;
612 done=true;
613 } else if (res==CHCL_OK) {
614 timer_holder[nr].total_time=val;
616 break;
617 case 4:
618 playback_control(NULL);
619 break;
620 case MENU_ATTACHED_USB:
621 retval = CHCL_USB;
622 done=true;
623 break;
625 rb->lcd_clear_display();
626 show_pause_mode(pause);
627 rb->lcd_puts(0, FIRST_LINE, (unsigned char *)player_info);
629 break;
631 /* UP (RIGHT/+) = Scroll Lap timer up */
632 case CHC_SETTINGS_INC:
633 retval = CHCL_NEXT;
634 done = true;
635 break;
637 /* DOWN (LEFT/-) = Scroll Lap timer down */
638 case CHC_SETTINGS_DEC:
639 retval = CHCL_PREV;
640 done = true;
641 break;
643 default:
644 if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
645 retval = CHCL_USB;
646 done = true;
648 break;
650 rb->sleep(HZ/4); /* Sleep 1/4 of a second */
653 timer_holder[nr].used_time+=ticks;
655 return retval;
658 static int chessclock_set_int(char* string,
659 int* variable,
660 int step,
661 int min,
662 int max,
663 int flags)
665 bool done = false;
666 int button;
668 rb->lcd_clear_display();
669 rb->lcd_puts_scroll(0, FIRST_LINE, (unsigned char *)string);
671 while (!done) {
672 char str[32];
673 if (flags & FLAGS_SET_INT_SECONDS)
674 rb->snprintf(str, sizeof str,"%s (m:s)", show_time(*variable));
675 else
676 rb->snprintf(str, sizeof str,"%d", *variable);
677 rb->lcd_puts(0, FIRST_LINE+1, (unsigned char *)str);
678 rb->lcd_update();
680 button = rb->button_get(true);
681 switch(button) {
682 case CHC_SETTINGS_INC:
683 case CHC_SETTINGS_INC | BUTTON_REPEAT:
684 *variable += step;
685 break;
687 case CHC_SETTINGS_DEC:
688 case CHC_SETTINGS_DEC | BUTTON_REPEAT:
689 *variable -= step;
690 break;
692 case CHC_SETTINGS_OK:
693 #ifdef CHC_SETTINGS_OK2
694 case CHC_SETTINGS_OK2:
695 #endif
696 done = true;
697 break;
699 case CHC_SETTINGS_CANCEL:
700 #ifdef CHC_SETTINGS_CANCEL2
701 case CHC_SETTINGS_CANCEL2:
702 #endif
703 return CHCL_CANCEL;
704 break;
706 default:
707 if (rb->default_event_handler(button) == SYS_USB_CONNECTED)
708 return CHCL_USB;
709 break;
712 if(*variable > max )
713 *variable = max;
715 if(*variable < min )
716 *variable = min;
719 rb->lcd_stop_scroll();
721 return CHCL_OK;
724 static char * show_time(int seconds)
726 static char buf[]="00:00";
727 rb->snprintf(buf, sizeof(buf), "%02d:%02d", seconds/60, seconds%60);
728 return buf;