summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/clock.c651
1 files changed, 407 insertions, 244 deletions
diff --git a/apps/plugins/clock.c b/apps/plugins/clock.c
index 612f283e33..227295b6cc 100644
--- a/apps/plugins/clock.c
+++ b/apps/plugins/clock.c
@@ -19,6 +19,11 @@
19 19
20/***************************** 20/*****************************
21 * RELEASE NOTES 21 * RELEASE NOTES
22
23***** VERSION 2.50 **
24-New general settings mode added, -reworked options screen,
25-cleaned up a few things and removed redundant code, -faster
26load_settings(), fixed a help-screen bug (thanks to zeekoe)
22 27
23***** VERSION 2.40 ** 28***** VERSION 2.40 **
24-Cleaned and optimized code, -removed unused code and bitmaps, 29-Cleaned and optimized code, -removed unused code and bitmaps,
@@ -68,17 +73,18 @@ Original release, featuring analog / digital modes and a few options.
68 73
69#ifdef HAVE_LCD_BITMAP 74#ifdef HAVE_LCD_BITMAP
70 75
71#define CLOCK_VERSION "2.40" 76#define CLOCK_VERSION "2.50"
72 77
73/* prototypes */ 78/************
79 * Prototypes
80 ***********/
74void show_logo(bool animate, bool show_clock_text); 81void show_logo(bool animate, bool show_clock_text);
75void exit_logo(void); 82void exit_logo(void);
76void save_settings(void); 83void save_settings(bool interface);
77 84
78/* used in help screen */ 85/********************
79int screen = 1; 86 * Misc counter stuff
80 87 *******************/
81/* counter misc */
82int start_tick = 0; 88int start_tick = 0;
83int passed_time = 0; 89int passed_time = 0;
84int counter = 0; 90int counter = 0;
@@ -92,43 +98,55 @@ int remaining_h=0, remaining_m=0, remaining_s=0;
92bool editing_target = false; 98bool editing_target = false;
93bool display_counter = true; 99bool display_counter = true;
94 100
95/* used for centering of text all over */ 101/*********************
102 * Used to center text
103 ********************/
96char buf[20]; 104char buf[20];
97int buf_w, buf_h; 105int buf_w, buf_h;
98 106
107/* This bool is used for most of the while loops */
108bool done = false;
109
99static struct plugin_api* rb; 110static struct plugin_api* rb;
100 111
101/*********************************************************** 112/***********************************************************
102 * Used for hands to define lengths at a given time - ANALOG 113 * Used for hands to define lengths at a given time - ANALOG
103 **********************************************************/ 114 **********************************************************/
104static unsigned char xminute[] = { 115static const unsigned char xminute[] = {
10556,59,61,64,67,70,72,75,77,79,80,82,83,84,84,84,84,84,83,82,80,79,77,75,72,70,67,64,61,59,56,53,51,48,45,42,40,37,35,33,32,30,29,28,28,28,28,28,29,30,32,33,35,37,40,42,45,48,51,53, 11656,59,61,64,67,70,72,75,77,79,80,82,83,84,84,84,84,84,83,82,80,79,77,75,72,70,
106}; 11767,64,61,59,56,53,51,48,45,42,40,37,35,33,32,30,29,28,28,28,28,28,29,30,32,33,
107static unsigned char yminute[] = { 11835,37,40,42,45,48,51,53 };
10855,54,54,53,53,51,50,49,47,45,43,41,39,36,34,32,30,28,25,23,21,19,17,15,14,13,11,11,10,10,9,10,10,11,11,13,14,15,17,19,21,23,25,28,30,32,34,36,39,41,43,45,47,49,50,51,53,53,54,54, 119static const unsigned char yminute[] = {
109}; 12055,54,54,53,53,51,50,49,47,45,43,41,39,36,34,32,30,28,25,23,21,19,17,15,14,13,
110static unsigned char yhour[] = { 12111,11,10,10, 9,10,10,11,11,13,14,15,17,19,21,23,25,28,30,32,34,36,39,41,43,45,
11147,47,46,46,46,45,44,43,42,41,39,38,36,35,33,32,31,29,28,26,25,23,22,21,20,19,18,18,18,17,17,17,18,18,18,19,20,21,22,23,25,26,28,29,31,32,33,35,36,38,39,41,42,43,44,45,46,46,46,47, 12247,49,50,51,53,53,54,54 };
112}; 123static const unsigned char yhour[] = {
113static unsigned char xhour[] = { 12447,47,46,46,46,45,44,43,42,41,39,38,36,35,33,32,31,29,28,26,25,23,22,21,20,19,
11456,58,59,61,63,65,67,68,70,71,72,73,74,74,75,75,75,74,74,73,72,71,70,68,67,65,63,61,59,58,56,54,53,51,49,47,45,44,42,41,40,39,38,38,37,37,37,38,38,39,40,41,42,44,45,47,49,51,53,54, 12518,18,18,17,17,17,18,18,18,19,20,21,22,23,25,26,28,29,31,32,33,35,36,38,39,41,
115}; 12642,43,44,45,46,46,46,47 };
127static const unsigned char xhour[] = {
12856,58,59,61,63,65,67,68,70,71,72,73,74,74,75,75,75,74,74,73,72,71,70,68,67,65,
12963,61,59,58,56,54,53,51,49,47,45,44,42,41,40,39,38,38,37,37,37,38,38,39,40,41,
13042,44,45,47,49,51,53,54 };
116 131
117/************************************************************** 132/**************************************************************
118 * Used for hands to define lengths at a give time - FULLSCREEN 133 * Used for hands to define lengths at a give time - FULLSCREEN
119 *************************************************************/ 134 *************************************************************/
120static unsigned char xminute_full[] = { 135static const unsigned char xminute_full[] = {
12156,58,61,65,69,74,79,84,91,100,110,110,110,110,110,110,110,110,110,110,110,100,91,84,79,74,69,65,61,58,56,54,51,47,43,38,33,28,21,12,1,1,1,1,1,1,1,1,1,1,1,12,21,28,33,38,43,47,51,54 13656,58,61,65,69,74,79,84,91,100,110,110,110,110,110,110,110,110,110,110,110,100,
122}; 13791,84,79,74,69,65,61,58,56,54,51,47,43,38,33,28,21,12,1,1,1,1,1,1,1,1,1,1,1,12,
123static unsigned char yminute_full[] = { 13821,28,33,38,43,47,51,54 };
12462,62,62,62,62,62,62,62,62,62,62,53,45,40,36,32,28,24,19,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,19,24,28,32,36,40,45,53,62,62,62,62,62,62,62,62,62,62 139static const unsigned char yminute_full[] = {
125}; 14062,62,62,62,62,62,62,62,62,62,62,53,45,40,36,32,28,24,19,11,1,1,1,1,1,1,1,1,1,1,
126static unsigned char xhour_full[] = { 1411,1,1,1,1,1,1,1,1,1,1,11,19,24,28,32,36,40,45,53,62,62,62,62,62,62,62,62,62,62 };
12756,58,60,63,66,69,73,78,84,91,100,100,100,100,100,100,100,100,100,100,100,91,84,78,73,69,66,63,60,58,56,54,52,49,46,43,39,34,28,21,12,12,12,12,12,12,12,12,12,12,12,21,28,34,39,43,46,49,52,54 142static const unsigned char xhour_full[] = {
128}; 14356,58,60,63,66,69,73,78,84,91,100,100,100,100,100,100,100,100,100,100,100,91,84,
129static unsigned char yhour_full[] = { 14478,73,69,66,63,60,58,56,54,52,49,46,43,39,34,28,21,12,12,12,12,12,12,12,12,12,
13052,52,52,52,52,52,52,52,52,52,52,46,41,37,34,32,30,27,23,18,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,18,23,27,30,32,34,37,41,46,52,52,52,52,52,52,52,52,52,52 14512,12,21,28,34,39,43,46,49,52,54 };
131}; 146static const unsigned char yhour_full[] = {
14752,52,52,52,52,52,52,52,52,52,52,46,41,37,34,32,30,27,23,18,12,12,12,12,12,12,
14812,12,12,12,12,12,12,12,12,12,12,12,12,12,12,18,23,27,30,32,34,37,41,46,52,52,
14952,52,52,52,52,52,52,52 };
132 150
133/**************************** 151/****************************
134 * BITMAPS 152 * BITMAPS
@@ -136,35 +154,62 @@ static unsigned char yhour_full[] = {
136/************************* 154/*************************
137 * "0" bitmap - for binary 155 * "0" bitmap - for binary
138 ************************/ 156 ************************/
139static unsigned char bitmap_0[] = { 157static const unsigned char bitmap_0[] = {
1400xc0, 0xf0, 0x3c, 0x0e, 0x06, 0x03, 0x03, 0x03, 0x03, 0x06, 0x0e, 0x3c, 0xf0, 1580xc0, 0xf0, 0x3c, 0x0e, 0x06, 0x03, 0x03, 0x03, 0x03, 0x06, 0x0e, 0x3c, 0xf0,
1410xc0, 0x00, 1590xc0, 0x00, 0x1f, 0x7f, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1420x1f, 0x7f, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe0, 0x7f, 1600xe0, 0x7f, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06,
1430x1f, 0x00, 1610x03, 0x03, 0x01, 0x00, 0x00, 0x00 };
1440x00, 0x00, 0x01, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0x01, 0x00,
1450x00, 0x00 };
146/************************* 162/*************************
147 * "1" bitmap - for binary 163 * "1" bitmap - for binary
148 ************************/ 164 ************************/
149static unsigned char bitmap_1[] = { 165static const unsigned char bitmap_1[] = {
1500xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 1660xe0, 0x70, 0x38, 0x1c, 0x0e, 0x07, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
1510x00, 0x00, 1670x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
1520x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 1680x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06,
1530x00, 0x00, 1690x06, 0x06, 0x06, 0x06, 0x06, 0x00 };
1540x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 170
1550x06, 0x00 }; 171/**************
156/**************************** 172 * PM indicator
157 * PM indicator (moon + text) 173 *************/
158 ***************************/ 174static const unsigned char pm[] = {
159static unsigned char pm[] = { 0xFF,0xFF,0x33,0x33,0x33,0x1E,0x0C,0x00,0xFF,0xFF,0x06,0x0C,0x06,0xFF,0xFF }; 1750xFF,0xFF,0x33,0x33,0x33,0x1E,0x0C,0x00,0xFF,0xFF,0x06,0x0C,0x06,0xFF,0xFF };
160/**************************** 176/**************
161 * AM Indicator (sun and text 177 * AM Indicator
162 ***************************/ 178 *************/
163static unsigned char am[] = { 0xFE,0xFF,0x1B,0x1B,0xFF,0xFE,0x00,0x00,0xFF,0xFF,0x06,0x0C,0x06,0xFF,0xFF }; 179static const unsigned char am[] = {
1800xFE,0xFF,0x1B,0x1B,0xFF,0xFE,0x00,0x00,0xFF,0xFF,0x06,0x0C,0x06,0xFF,0xFF };
181
164/************** 182/**************
165 * Arrow bitmap 183 * Arrow bitmap
166 *************/ 184 *************/
167static unsigned char arrow[] = { 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x1E, 0x0C }; 185static const unsigned char arrow[] = {
1860x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x1E, 0x0C };
187
188/***************************
189 * Unchecked checkbox bitmap
190 **************************/
191const unsigned char checkbox_empty[] = {
1920x3F, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x3F };
193/*****************************
194 * 1/3 checked checkbox bitmap
195 ****************************/
196const unsigned char checkbox_onethird[] = {
1970x3F, 0x2B, 0x35, 0x21, 0x21, 0x21, 0x21, 0x3F };
198/*****************************
199 * 1/2 checked checkbox bitmap
200 ****************************/
201const unsigned char checkbox_half[] = {
2020x3F, 0x2B, 0x35, 0x2B, 0x21, 0x21, 0x21, 0x3F };
203/*****************************
204 * 2/3 checked checkbox bitmap
205 ****************************/
206const unsigned char checkbox_twothird[] = {
2070x3F, 0x2B, 0x35, 0x2B, 0x35, 0x21, 0x21, 0x3F };
208/*************************
209 * Checked checkbox bitmap
210 ************************/
211const unsigned char checkbox_full[] = {
2120x3F, 0x2B, 0x35, 0x2B, 0x35, 0x2B, 0x35, 0x3F };
168 213
169/************************************ 214/************************************
170 * "Clockbox" clock logo - by Adam S. 215 * "Clockbox" clock logo - by Adam S.
@@ -219,7 +264,7 @@ const unsigned char clocklogo[] = {
219/****************** 264/******************
220 * Time's Up bitmap 265 * Time's Up bitmap
221 *****************/ 266 *****************/
222const unsigned char timesup[] = { 267const const unsigned char timesup[] = {
2230x78, 0x78, 0x78, 0x38, 0x08, 0x08, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x04, 2680x78, 0x78, 0x78, 0x38, 0x08, 0x08, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0x04,
2240x04, 0x04, 0x0c, 0x3c, 0x3c, 0x3c, 0x04, 0x04, 0x04, 0xfc, 0xfc, 0xfc, 0xfc, 2690x04, 0x04, 0x0c, 0x3c, 0x3c, 0x3c, 0x04, 0x04, 0x04, 0xfc, 0xfc, 0xfc, 0xfc,
2250xfe, 0xfe, 0x06, 0x03, 0x03, 0x05, 0x05, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 2700xfe, 0xfe, 0x06, 0x03, 0x03, 0x05, 0x05, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff,
@@ -285,10 +330,10 @@ const unsigned char timesup[] = {
2850x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 3300x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
286 331
287/* settings saved to this location */ 332/* settings saved to this location */
288static char default_filename[] = "/.rockbox/rocks/.clock_settings"; 333static const char default_filename[] = "/.rockbox/rocks/.clock_settings";
289 334
290/* names of contributors */ 335/* names of contributors */
291char* credits[] = { 336const char* credits[] = {
292"Zakk Roberts", 337"Zakk Roberts",
293"Linus N. Feltzing", 338"Linus N. Feltzing",
294"BlueChip", 339"BlueChip",
@@ -304,7 +349,7 @@ char* credits[] = {
304}; 349};
305 350
306/* ...and how they helped */ 351/* ...and how they helped */
307char* jobs[] = { 352const char* jobs[] = {
308"Code", 353"Code",
309"Code", 354"Code",
310"Code", 355"Code",
@@ -319,8 +364,6 @@ char* jobs[] = {
319"Design" 364"Design"
320}; 365};
321 366
322bool done = false; /* This bool is used for most of the while loops */
323
324/*********************************** 367/***********************************
325 * This is saved to default_filename 368 * This is saved to default_filename
326 **********************************/ 369 **********************************/
@@ -329,6 +372,7 @@ struct saved_settings
329 /* general */ 372 /* general */
330 int clock; /* 1: analog, 2: digital led, 3: digital lcd, 4: full, 5: binary */ 373 int clock; /* 1: analog, 2: digital led, 3: digital lcd, 4: full, 5: binary */
331 bool backlight_on; 374 bool backlight_on;
375 int save_mode; /* 1: on exit, 2: automatically, 3: manually */
332 376
333 /* analog */ 377 /* analog */
334 bool analog_digits; 378 bool analog_digits;
@@ -362,6 +406,7 @@ void reset_settings(void)
362 /* general */ 406 /* general */
363 settings.clock = 1; /* 1: analog, 2: digital led, 3: digital lcd, 4: full, 5: binary */ 407 settings.clock = 1; /* 1: analog, 2: digital led, 3: digital lcd, 4: full, 5: binary */
364 settings.backlight_on = true; 408 settings.backlight_on = true;
409 settings.save_mode = 1; /* 1: on exit, 2: automatically, 3: manually */
365 410
366 /* analog */ 411 /* analog */
367 settings.analog_digits = false; 412 settings.analog_digits = false;
@@ -390,19 +435,22 @@ void reset_settings(void)
390/******************************** 435/********************************
391 * Saves "saved_settings" to disk 436 * Saves "saved_settings" to disk
392 *******************************/ 437 *******************************/
393void save_settings(void) 438void save_settings(bool interface)
394{ 439{
395 int fd; 440 int fd;
396 441
397 rb->lcd_clear_display(); 442 if(interface)
443 {
444 rb->lcd_clear_display();
398 445
399 /* display information */ 446 /* display information */
400 rb->snprintf(buf, sizeof(buf), "Saving Settings"); 447 rb->snprintf(buf, sizeof(buf), "Saving Settings");
401 rb->lcd_getstringsize(buf, &buf_w, &buf_h); 448 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
402 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf); 449 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf);
403 show_logo(true, true); 450 show_logo(true, true);
404 451
405 rb->lcd_update(); 452 rb->lcd_update();
453 }
406 454
407 /* create the settings file and write the settings to it */ 455 /* create the settings file and write the settings to it */
408 fd = rb->creat(default_filename, O_WRONLY); 456 fd = rb->creat(default_filename, O_WRONLY);
@@ -412,24 +460,33 @@ void save_settings(void)
412 rb->write (fd, &settings, sizeof(struct saved_settings)); 460 rb->write (fd, &settings, sizeof(struct saved_settings));
413 rb->close(fd); 461 rb->close(fd);
414 462
415 rb->lcd_clearrect(0, 56, 112, 8); 463 if(interface)
416 rb->snprintf(buf, sizeof(buf), "Saved Settings"); 464 {
417 rb->lcd_getstringsize(buf, &buf_w, &buf_h); 465 rb->lcd_clearrect(0, 56, 112, 8);
418 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf); 466 rb->snprintf(buf, sizeof(buf), "Saved Settings");
467 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
468 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf);
469 }
419 } 470 }
420 else 471 else
421 { 472 {
422 rb->lcd_clearrect(0, 56, 112, 8); 473 if(interface)
423 rb->snprintf(buf, sizeof(buf), "Save Failed"); 474 {
424 rb->lcd_getstringsize(buf, &buf_w, &buf_h); 475 rb->lcd_clearrect(0, 56, 112, 8);
425 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf); 476 rb->snprintf(buf, sizeof(buf), "Save Failed");
477 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
478 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf);
479 }
426 } 480 }
427 481
428 rb->lcd_update(); 482 if(interface)
429 483 {
430 rb->sleep(HZ); 484 rb->lcd_update();
431 485
432 exit_logo(); 486 rb->sleep(HZ);
487
488 exit_logo();
489 }
433} 490}
434 491
435/********************************** 492/**********************************
@@ -441,8 +498,6 @@ void load_settings(void)
441 int fd; 498 int fd;
442 fd = rb->open(default_filename, O_RDONLY); 499 fd = rb->open(default_filename, O_RDONLY);
443 500
444 rb->lcd_setfont(FONT_SYSFIXED);
445
446 rb->snprintf(buf, sizeof(buf), "Clock %s", CLOCK_VERSION); 501 rb->snprintf(buf, sizeof(buf), "Clock %s", CLOCK_VERSION);
447 rb->lcd_getstringsize(buf, &buf_w, &buf_h); 502 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
448 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 48, buf); 503 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 48, buf);
@@ -491,7 +546,7 @@ void load_settings(void)
491 rb->ata_sleep(); 546 rb->ata_sleep();
492#endif 547#endif
493 548
494 rb->sleep(HZ*2); 549 rb->sleep(HZ);
495 550
496 /* make the logo fly out */ 551 /* make the logo fly out */
497 exit_logo(); 552 exit_logo();
@@ -955,7 +1010,7 @@ void show_logo(bool animate, bool show_clock_text)
955 if(animate) 1010 if(animate)
956 { 1011 {
957 /* move down the screen */ 1012 /* move down the screen */
958 for(y_position = 0; y_position <= 25; y_position++) 1013 for(y_position = 0; y_position <= 26; y_position++)
959 { 1014 {
960 rb->lcd_clearline(0, y_position/2-1, 111, y_position/2-1); 1015 rb->lcd_clearline(0, y_position/2-1, 111, y_position/2-1);
961 rb->lcd_clearline(0, y_position/2+38, 111, y_position/2+38); 1016 rb->lcd_clearline(0, y_position/2+38, 111, y_position/2+38);
@@ -965,7 +1020,7 @@ void show_logo(bool animate, bool show_clock_text)
965 rb->lcd_update(); 1020 rb->lcd_update();
966 } 1021 }
967 /* bounce back up a little */ 1022 /* bounce back up a little */
968 for(y_position = 25; y_position >= 18; y_position--) 1023 for(y_position = 26; y_position >= 16; y_position--)
969 { 1024 {
970 rb->lcd_clearline(0, y_position/2-1, 111, y_position/2-1); 1025 rb->lcd_clearline(0, y_position/2-1, 111, y_position/2-1);
971 rb->lcd_clearline(0, y_position/2+38, 111, y_position/2+38); 1026 rb->lcd_clearline(0, y_position/2+38, 111, y_position/2+38);
@@ -975,7 +1030,7 @@ void show_logo(bool animate, bool show_clock_text)
975 rb->lcd_update(); 1030 rb->lcd_update();
976 } 1031 }
977 /* and go back down again */ 1032 /* and go back down again */
978 for(y_position = 18; y_position <= 20; y_position++) 1033 for(y_position = 16; y_position <= 20; y_position++)
979 { 1034 {
980 rb->lcd_clearline(0, y_position/2-1, 111, y_position/2-1); 1035 rb->lcd_clearline(0, y_position/2-1, 111, y_position/2-1);
981 rb->lcd_clearline(0, y_position/2+38, 111, y_position/2+38); 1036 rb->lcd_clearline(0, y_position/2+38, 111, y_position/2+38);
@@ -1222,11 +1277,31 @@ bool show_credits(void)
1222 *****************/ 1277 *****************/
1223bool f1_screen(void) 1278bool f1_screen(void)
1224{ 1279{
1280 int screen = 1;
1225 done = false; 1281 done = false;
1226 1282
1227 while (!done) 1283 while (!done)
1228 { 1284 {
1229 rb->lcd_clear_display(); 1285 rb->lcd_clear_display();
1286
1287 if(screen == 1)
1288 {
1289 rb->snprintf(buf, sizeof(buf), "<<---- 1/9 NEXT>>");
1290 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
1291 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf);
1292 }
1293 else if(screen == 9)
1294 {
1295 rb->snprintf(buf, sizeof(buf), "<<BACK 9/9 ---->>");
1296 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
1297 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf);
1298 }
1299 else
1300 {
1301 rb->snprintf(buf, sizeof(buf), "<<BACK %d/9 NEXT>>", screen);
1302 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
1303 rb->lcd_putsxy(LCD_WIDTH/2-buf_w/2, 56, buf);
1304 }
1230 1305
1231 /* page one */ 1306 /* page one */
1232 if(screen == 1) 1307 if(screen == 1)
@@ -1238,7 +1313,6 @@ bool f1_screen(void)
1238 rb->lcd_puts(0, 4, "you to the clock."); 1313 rb->lcd_puts(0, 4, "you to the clock.");
1239 rb->lcd_puts(0, 5, "At any mode, [F1]"); 1314 rb->lcd_puts(0, 5, "At any mode, [F1]");
1240 rb->lcd_puts(0, 6, "will show you this"); 1315 rb->lcd_puts(0, 6, "will show you this");
1241 rb->lcd_puts(0, 7, "<< ---- 1/9 NEXT >>");
1242 } 1316 }
1243 else if(screen == 2) 1317 else if(screen == 2)
1244 { 1318 {
@@ -1249,7 +1323,6 @@ bool f1_screen(void)
1249 rb->lcd_puts(0, 4, "Counter. [ON+F2]"); 1323 rb->lcd_puts(0, 4, "Counter. [ON+F2]");
1250 rb->lcd_puts(0, 5, "gives you counting"); 1324 rb->lcd_puts(0, 5, "gives you counting");
1251 rb->lcd_puts(0, 6, "options."); 1325 rb->lcd_puts(0, 6, "options.");
1252 rb->lcd_puts(0, 7, "<< BACK 2/9 NEXT >>");
1253 } 1326 }
1254 else if(screen == 3) 1327 else if(screen == 3)
1255 { 1328 {
@@ -1260,7 +1333,6 @@ bool f1_screen(void)
1260 rb->lcd_puts(0, 4, "and PLAY to toggle."); 1333 rb->lcd_puts(0, 4, "and PLAY to toggle.");
1261 rb->lcd_puts(0, 5, "[ON+F3] shows you"); 1334 rb->lcd_puts(0, 5, "[ON+F3] shows you");
1262 rb->lcd_puts(0, 6, "General Settings."); 1335 rb->lcd_puts(0, 6, "General Settings.");
1263 rb->lcd_puts(0, 7, "<< BACK 3/9 NEXT >>");
1264 } 1336 }
1265 else if(screen == 4) 1337 else if(screen == 4)
1266 { 1338 {
@@ -1271,7 +1343,6 @@ bool f1_screen(void)
1271 rb->lcd_puts(0, 4, "mode will show the"); 1343 rb->lcd_puts(0, 4, "mode will show the");
1272 rb->lcd_puts(0, 5, "MODE SELECTOR. Use"); 1344 rb->lcd_puts(0, 5, "MODE SELECTOR. Use");
1273 rb->lcd_puts(0, 6, "UP/DOWN to select"); 1345 rb->lcd_puts(0, 6, "UP/DOWN to select");
1274 rb->lcd_puts(0, 7, "<< BACK 4/9 NEXT >>");
1275 } 1346 }
1276 else if(screen == 5) 1347 else if(screen == 5)
1277 { 1348 {
@@ -1282,7 +1353,6 @@ bool f1_screen(void)
1282 rb->lcd_puts(0, 4, "small round clock"); 1353 rb->lcd_puts(0, 4, "small round clock");
1283 rb->lcd_puts(0, 5, "in the center of"); 1354 rb->lcd_puts(0, 5, "in the center of");
1284 rb->lcd_puts(0, 6, "LCD. Options appear"); 1355 rb->lcd_puts(0, 6, "LCD. Options appear");
1285 rb->lcd_puts(0, 7, "<< BACK 5/9 NEXT >>");
1286 } 1356 }
1287 else if(screen == 6) 1357 else if(screen == 6)
1288 { 1358 {
@@ -1293,7 +1363,6 @@ bool f1_screen(void)
1293 rb->lcd_puts(0, 4, "*LCD: Shows another"); 1363 rb->lcd_puts(0, 4, "*LCD: Shows another");
1294 rb->lcd_puts(0, 5, "imitation of an"); 1364 rb->lcd_puts(0, 5, "imitation of an");
1295 rb->lcd_puts(0, 6, "LCD display."); 1365 rb->lcd_puts(0, 6, "LCD display.");
1296 rb->lcd_puts(0, 7, "<< BACK 6/9 NEXT >>");
1297 } 1366 }
1298 else if(screen == 7) 1367 else if(screen == 7)
1299 { 1368 {
@@ -1304,7 +1373,6 @@ bool f1_screen(void)
1304 rb->lcd_puts(0, 4, "available in this"); 1373 rb->lcd_puts(0, 4, "available in this");
1305 rb->lcd_puts(0, 5, "mode."); 1374 rb->lcd_puts(0, 5, "mode.");
1306 rb->lcd_puts(0, 6, "*BINARY: Shows a"); 1375 rb->lcd_puts(0, 6, "*BINARY: Shows a");
1307 rb->lcd_puts(0, 7, "<< BACK 7/9 NEXT >>");
1308 } 1376 }
1309 else if(screen == 8) 1377 else if(screen == 8)
1310 { 1378 {
@@ -1315,7 +1383,6 @@ bool f1_screen(void)
1315 rb->lcd_puts(0, 4, "_-=OTHER KEYS=-_"); 1383 rb->lcd_puts(0, 4, "_-=OTHER KEYS=-_");
1316 rb->lcd_puts(0, 5, "[DWN] will disable"); 1384 rb->lcd_puts(0, 5, "[DWN] will disable");
1317 rb->lcd_puts(0, 6, "Rockbox's idle"); 1385 rb->lcd_puts(0, 6, "Rockbox's idle");
1318 rb->lcd_puts(0, 7, "<< BACK 8/9 NEXT >>");
1319 } 1386 }
1320 else if(screen == 9) 1387 else if(screen == 9)
1321 { 1388 {
@@ -1326,12 +1393,11 @@ bool f1_screen(void)
1326 rb->lcd_puts(0, 4, " light, [RIGHT]"); 1393 rb->lcd_puts(0, 4, " light, [RIGHT]");
1327 rb->lcd_puts(0, 5, "will turn it on."); 1394 rb->lcd_puts(0, 5, "will turn it on.");
1328 rb->lcd_puts(0, 6, "[OFF] exits plugin."); 1395 rb->lcd_puts(0, 6, "[OFF] exits plugin.");
1329 rb->lcd_puts(0, 7, "<< BACK 9/9 ---- >>");
1330 } 1396 }
1331 1397
1332 rb->lcd_update(); 1398 rb->lcd_update();
1333 1399
1334 switch (rb->button_get(true)) 1400 switch(rb->button_get_w_tmo(HZ/4))
1335 { 1401 {
1336 case BUTTON_F1: /* exit */ 1402 case BUTTON_F1: /* exit */
1337 case BUTTON_OFF: 1403 case BUTTON_OFF:
@@ -1357,11 +1423,23 @@ bool f1_screen(void)
1357 return true; 1423 return true;
1358} 1424}
1359 1425
1426/*************************
1427 * Draws a checkbox bitmap
1428 ************************/
1429void draw_checkbox(bool setting, int x, int y)
1430{
1431 if(setting) /* checkbox is on */
1432 rb->lcd_bitmap(checkbox_full, x, y, 8, 6, true);
1433 else /* checkbox is off */
1434 rb->lcd_bitmap(checkbox_empty, x, y, 8, 6, true);
1435}
1436
1360/********************* 1437/*********************
1361 * F3 Screen - OPTIONS 1438 * F3 Screen - OPTIONS
1362 ********************/ 1439 ********************/
1363bool f3_screen(void) 1440bool f3_screen(void)
1364{ 1441{
1442 /* cursor positions */
1365 int invert_analog = 1; 1443 int invert_analog = 1;
1366 int invert_digital = 1; 1444 int invert_digital = 1;
1367 int invert_lcd = 1; 1445 int invert_lcd = 1;
@@ -1372,53 +1450,58 @@ bool f3_screen(void)
1372 while (!done) 1450 while (!done)
1373 { 1451 {
1374 rb->lcd_clear_display(); 1452 rb->lcd_clear_display();
1453
1454 rb->lcd_puts(0, 1, "UP/DN: move, L/R:");
1455 rb->lcd_puts(0, 2, "change, OFF: done");
1375 1456
1376 if(settings.clock == 1) 1457 if(settings.clock == 1)
1377 { 1458 {
1378 rb->lcd_puts(0, 0, "OPTIONS (Analog)"); 1459 rb->lcd_puts(0, 0, "OPTIONS (Analog)");
1379 rb->lcd_puts(0, 1, "UP/DOWN & PLAY"); 1460
1380 rb->lcd_puts(0, 2, "F3/OFF: Done");
1381 rb->lcd_puts(2, 4, "Digits"); 1461 rb->lcd_puts(2, 4, "Digits");
1382 1462
1383 if(settings.analog_date == 0) 1463 if(settings.analog_date == 0)
1384 rb->lcd_puts(2, 5, "Date"); 1464 rb->lcd_puts(2, 5, "Date: Off");
1385 else if(settings.analog_date == 1) 1465 else if(settings.analog_date == 1)
1386 rb->lcd_puts(2, 5, "Date: American"); 1466 rb->lcd_puts(2, 5, "Date: American");
1387 else 1467 else
1388 rb->lcd_puts(2, 5, "Date: European"); 1468 rb->lcd_puts(2, 5, "Date: European");
1389 1469
1390 if(settings.analog_time == 0) 1470 if(settings.analog_time == 0)
1391 rb->lcd_puts(2, 6, "Time Readout"); 1471 rb->lcd_puts(2, 6, "Time Readout:Off");
1392 else if(settings.analog_time == 1) 1472 else if(settings.analog_time == 1)
1393 rb->lcd_puts(2, 6, "Time Readout 24h"); 1473 rb->lcd_puts(2, 6, "Time Readout:24h");
1394 else 1474 else
1395 rb->lcd_puts(2, 6, "Time Readout 12h"); 1475 rb->lcd_puts(2, 6, "Time Readout:12h");
1396 1476
1397 rb->lcd_puts(2, 7, "Second Hand"); 1477 rb->lcd_puts(2, 7, "Second Hand");
1398 1478
1399 /* Draw checkboxes using the new checkbox() function */ 1479 /* Draw checkboxes */
1400 rb->checkbox(1, 33, 8, 6, settings.analog_digits); 1480 draw_checkbox(settings.analog_digits, 1, 33);
1401 if(settings.analog_date != 0) 1481
1402 rb->checkbox(1, 41, 8, 6, true); 1482 if(settings.analog_date == 0)
1483 rb->lcd_bitmap(checkbox_empty, 1, 41, 8, 6, true);
1484 else if(settings.analog_date == 1)
1485 rb->lcd_bitmap(checkbox_half, 1, 41, 8, 6, true);
1486 else
1487 rb->lcd_bitmap(checkbox_full, 1, 41, 8, 6, true);
1488
1489 if(settings.analog_time == 0)
1490 rb->lcd_bitmap(checkbox_empty, 1, 49, 8, 6, true);
1491 else if(settings.analog_time == 1)
1492 rb->lcd_bitmap(checkbox_half, 1, 49, 8, 6, true);
1403 else 1493 else
1404 rb->checkbox(1, 41, 8, 6, false); 1494 rb->lcd_bitmap(checkbox_full, 1, 49, 8, 6, true);
1405 rb->checkbox(1, 49, 8, 6, settings.analog_time); 1495
1406 rb->checkbox(1, 57, 8, 6, settings.analog_secondhand); 1496 draw_checkbox(settings.analog_secondhand, 1, 57);
1407 1497
1408 /* Draw line selector */ 1498 /* Draw line selector */
1409 switch(invert_analog) 1499 switch(invert_analog)
1410 { 1500 {
1411 case 1: 1501 case 1: rb->lcd_invertrect(0, 32, 112, 8); break;
1412 rb->lcd_invertrect(0, 32, 112, 8); break; 1502 case 2: rb->lcd_invertrect(0, 40, 112, 8); break;
1413 1503 case 3: rb->lcd_invertrect(0, 48, 112, 8); break;
1414 case 2: 1504 case 4: rb->lcd_invertrect(0, 56, 112, 8); break;
1415 rb->lcd_invertrect(0, 40, 112, 8); break;
1416
1417 case 3:
1418 rb->lcd_invertrect(0, 48, 112, 8); break;
1419
1420 case 4:
1421 rb->lcd_invertrect(0, 56, 112, 8); break;
1422 } 1505 }
1423 1506
1424 rb->lcd_update(); 1507 rb->lcd_update();
@@ -1438,30 +1521,45 @@ bool f3_screen(void)
1438 else 1521 else
1439 invert_analog = 1; 1522 invert_analog = 1;
1440 break; 1523 break;
1441 1524
1442 case BUTTON_PLAY: 1525 case BUTTON_LEFT:
1526 if(invert_analog == 1)
1527 settings.analog_digits = false;
1528 else if(invert_analog == 2)
1529 {
1530 if(settings.analog_date > 0)
1531 settings.analog_date--;
1532 }
1533 else if(invert_analog == 3)
1534 {
1535 if(settings.analog_time > 0)
1536 settings.analog_time--;
1537 }
1538 else
1539 settings.analog_secondhand = false;
1540 break;
1541
1542 case BUTTON_RIGHT:
1443 if(invert_analog == 1) 1543 if(invert_analog == 1)
1444 settings.analog_digits = !settings.analog_digits; 1544 settings.analog_digits = true;
1445 else if(invert_analog == 2) 1545 else if(invert_analog == 2)
1446 { 1546 {
1447 if(settings.analog_date < 2) 1547 if(settings.analog_date < 2)
1448 settings.analog_date++; 1548 settings.analog_date++;
1449 else
1450 settings.analog_date = 0;
1451 } 1549 }
1452 else if(invert_analog == 3) 1550 else if(invert_analog == 3)
1453 { 1551 {
1454 if(settings.analog_time < 2) 1552 if(settings.analog_time < 2)
1455 settings.analog_time++; 1553 settings.analog_time++;
1456 else
1457 settings.analog_time = 0;
1458 } 1554 }
1459 else 1555 else
1460 settings.analog_secondhand = !settings.analog_secondhand; 1556 settings.analog_secondhand = true;
1461 break; 1557 break;
1462 1558
1463 case BUTTON_F3: 1559 case BUTTON_F3:
1464 case BUTTON_OFF: 1560 case BUTTON_OFF:
1561 if(settings.save_mode == 2)
1562 save_settings(false);
1465 done = true; 1563 done = true;
1466 break; 1564 break;
1467 } 1565 }
@@ -1469,54 +1567,53 @@ bool f3_screen(void)
1469 else if(settings.clock == 2) 1567 else if(settings.clock == 2)
1470 { 1568 {
1471 rb->lcd_puts(0, 0, "OPTIONS (Digital)"); 1569 rb->lcd_puts(0, 0, "OPTIONS (Digital)");
1472 rb->lcd_puts(0, 1, "UP/DOWN & PLAY");
1473 rb->lcd_puts(0, 2, "F3/OFF: Done");
1474 1570
1475 if(settings.digital_date == 0) 1571 if(settings.digital_date == 0)
1476 rb->lcd_puts(2, 4, "Date"); 1572 rb->lcd_puts(2, 4, "Date: Off");
1477 else if(settings.digital_date == 1) 1573 else if(settings.digital_date == 1)
1478 rb->lcd_puts(2, 4, "Date: American"); 1574 rb->lcd_puts(2, 4, "Date: American");
1479 else 1575 else
1480 rb->lcd_puts(2, 4, "Date: European"); 1576 rb->lcd_puts(2, 4, "Date: European");
1481 1577
1482 if(settings.digital_seconds == 0) 1578 if(settings.digital_seconds == 0)
1483 rb->lcd_puts(2, 5, "Seconds"); 1579 rb->lcd_puts(2, 5, "Seconds: Off");
1484 else if(settings.digital_seconds == 1) 1580 else if(settings.digital_seconds == 1)
1485 rb->lcd_puts(2, 5, "Seconds: DIGITAL"); 1581 rb->lcd_puts(2, 5, "Seconds: Text");
1486 else if(settings.digital_seconds == 2) 1582 else if(settings.digital_seconds == 2)
1487 rb->lcd_puts(2, 5, "Seconds: BAR"); 1583 rb->lcd_puts(2, 5, "Seconds: Bar");
1488 else 1584 else
1489 rb->lcd_puts(2, 5, "Seconds: INVERSE"); 1585 rb->lcd_puts(2, 5, "Seconds: Inverse");
1490 1586
1491 rb->lcd_puts(2, 6, "Blinking Colon"); 1587 rb->lcd_puts(2, 6, "Blinking Colon");
1492 rb->lcd_puts(2, 7, "12-Hour Format"); 1588 rb->lcd_puts(2, 7, "12-Hour Format");
1493 1589
1494 /* Draw checkboxes */ 1590 /* Draw checkboxes */
1495 if(settings.digital_date != 0) 1591 if(settings.digital_date == 0)
1496 rb->checkbox(1, 33, 8, 6, true); 1592 rb->lcd_bitmap(checkbox_empty, 1, 33, 8, 6, true);
1593 else if(settings.digital_date == 1)
1594 rb->lcd_bitmap(checkbox_half, 1, 33, 8, 6, true);
1497 else 1595 else
1498 rb->checkbox(1, 33, 8, 6, false); 1596 rb->lcd_bitmap(checkbox_full, 1, 33, 8, 6, true);
1499 if(settings.digital_seconds != 0) 1597
1500 rb->checkbox(1, 41, 8, 6, true); 1598 if(settings.digital_seconds == 0)
1599 rb->lcd_bitmap(checkbox_empty, 1, 41, 8, 6, true);
1600 else if(settings.digital_seconds == 1)
1601 rb->lcd_bitmap(checkbox_onethird, 1, 41, 8, 6, true);
1602 else if(settings.digital_seconds == 2)
1603 rb->lcd_bitmap(checkbox_twothird, 1, 41, 8, 6, true);
1501 else 1604 else
1502 rb->checkbox(1, 41, 8, 6, false); 1605 rb->lcd_bitmap(checkbox_full, 1, 41, 8, 6, true);
1503 rb->checkbox(1, 49, 8, 6, settings.digital_blinkcolon); 1606
1504 rb->checkbox(1, 57, 8, 6, settings.digital_12h); 1607 draw_checkbox(settings.digital_blinkcolon, 1, 49);
1608 draw_checkbox(settings.digital_12h, 1, 57);
1505 1609
1506 /* Draw a line selector */ 1610 /* Draw a line selector */
1507 switch(invert_digital) 1611 switch(invert_digital)
1508 { 1612 {
1509 case 1: 1613 case 1: rb->lcd_invertrect(0, 32, 112, 8); break;
1510 rb->lcd_invertrect(0, 32, 112, 8); break; 1614 case 2: rb->lcd_invertrect(0, 40, 112, 8); break;
1511 1615 case 3: rb->lcd_invertrect(0, 48, 112, 8); break;
1512 case 2: 1616 case 4: rb->lcd_invertrect(0, 56, 112, 8); break;
1513 rb->lcd_invertrect(0, 40, 112, 8); break;
1514
1515 case 3:
1516 rb->lcd_invertrect(0, 48, 112, 8); break;
1517
1518 case 4:
1519 rb->lcd_invertrect(0, 56, 112, 8); break;
1520 } 1617 }
1521 1618
1522 rb->lcd_update(); 1619 rb->lcd_update();
@@ -1536,30 +1633,45 @@ bool f3_screen(void)
1536 else 1633 else
1537 invert_digital++; 1634 invert_digital++;
1538 break; 1635 break;
1539 1636
1540 case BUTTON_PLAY: 1637 case BUTTON_LEFT:
1638 if(invert_digital == 1)
1639 {
1640 if(settings.digital_date > 0)
1641 settings.digital_date--;
1642 }
1643 else if(invert_digital == 2)
1644 {
1645 if(settings.digital_seconds > 0)
1646 settings.digital_seconds--;
1647 }
1648 else if(invert_digital == 3)
1649 settings.digital_blinkcolon = false;
1650 else
1651 settings.digital_12h = false;
1652 break;
1653
1654 case BUTTON_RIGHT:
1541 if(invert_digital == 1) 1655 if(invert_digital == 1)
1542 { 1656 {
1543 if(settings.digital_date < 2) 1657 if(settings.digital_date < 2)
1544 settings.digital_date++; 1658 settings.digital_date++;
1545 else
1546 settings.digital_date = 0;
1547 } 1659 }
1548 else if(invert_digital == 2) 1660 else if(invert_digital == 2)
1549 { 1661 {
1550 if(settings.digital_seconds < 3) 1662 if(settings.digital_seconds < 3)
1551 settings.digital_seconds++; 1663 settings.digital_seconds++;
1552 else
1553 settings.digital_seconds = 0;
1554 } 1664 }
1555 else if(invert_digital == 3) 1665 else if(invert_digital == 3)
1556 settings.digital_blinkcolon = !settings.digital_blinkcolon; 1666 settings.digital_blinkcolon = true;
1557 else 1667 else
1558 settings.digital_12h = !settings.digital_12h; 1668 settings.digital_12h = true;
1559 break; 1669 break;
1560 1670
1561 case BUTTON_F3: 1671 case BUTTON_F3:
1562 case BUTTON_OFF: 1672 case BUTTON_OFF:
1673 if(settings.save_mode == 2)
1674 save_settings(false);
1563 done = true; 1675 done = true;
1564 break; 1676 break;
1565 } 1677 }
@@ -1567,56 +1679,54 @@ bool f3_screen(void)
1567 else if(settings.clock == 3) 1679 else if(settings.clock == 3)
1568 { 1680 {
1569 rb->lcd_puts(0, 0, "OPTIONS (LCD)"); 1681 rb->lcd_puts(0, 0, "OPTIONS (LCD)");
1570 rb->lcd_puts(0, 1, "UP/DOWN & PLAY");
1571 rb->lcd_puts(0, 2, "F3/OFF: Done");
1572 1682
1573 if(settings.lcd_date == 0) 1683 if(settings.lcd_date == 0)
1574 rb->lcd_puts(2, 4, "Date"); 1684 rb->lcd_puts(2, 4, "Date: Off");
1575 else if(settings.lcd_date == 1) 1685 else if(settings.lcd_date == 1)
1576 rb->lcd_puts(2, 4, "Date: American"); 1686 rb->lcd_puts(2, 4, "Date: American");
1577 else 1687 else
1578 rb->lcd_puts(2, 4, "Date: European"); 1688 rb->lcd_puts(2, 4, "Date: European");
1579 1689
1580 if(settings.lcd_seconds == 0) 1690 if(settings.lcd_seconds == 0)
1581 rb->lcd_puts(2, 5, "Seconds"); 1691 rb->lcd_puts(2, 5, "Seconds: Off");
1582 else if(settings.lcd_seconds == 1) 1692 else if(settings.lcd_seconds == 1)
1583 rb->lcd_puts(2, 5, "Seconds: DIGITAL"); 1693 rb->lcd_puts(2, 5, "Seconds: Text");
1584 else if(settings.lcd_seconds == 2) 1694 else if(settings.lcd_seconds == 2)
1585 rb->lcd_puts(2, 5, "Seconds: BAR"); 1695 rb->lcd_puts(2, 5, "Seconds: Bar");
1586 else 1696 else
1587 rb->lcd_puts(2, 5, "Seconds: INVERSE"); 1697 rb->lcd_puts(2, 5, "Seconds: Inverse");
1588 1698
1589 rb->lcd_puts(2, 6, "Blinking Colon"); 1699 rb->lcd_puts(2, 6, "Blinking Colon");
1590 rb->lcd_puts(2, 7, "12-Hour Format"); 1700 rb->lcd_puts(2, 7, "12-Hour Format");
1591 1701
1592 /* Draw checkboxes */ 1702 /* Draw checkboxes */
1593 if(settings.lcd_date != 0) 1703 if(settings.lcd_date == 0)
1594 rb->checkbox(1, 33, 8, 6, true); 1704 rb->lcd_bitmap(checkbox_empty, 1, 33, 8, 6, true);
1705 else if(settings.lcd_date == 1)
1706 rb->lcd_bitmap(checkbox_half, 1, 33, 8, 6, true);
1595 else 1707 else
1596 rb->checkbox(1, 33, 8, 6, false); 1708 rb->lcd_bitmap(checkbox_full, 1, 33, 8, 6, true);
1597 if(settings.lcd_seconds != 0) 1709
1598 rb->checkbox(1, 41, 8, 6, true); 1710 if(settings.lcd_seconds == 0)
1711 rb->lcd_bitmap(checkbox_empty, 1, 41, 8, 6, true);
1712 else if(settings.lcd_seconds == 1)
1713 rb->lcd_bitmap(checkbox_onethird, 1, 41, 8, 6, true);
1714 else if(settings.lcd_seconds == 2)
1715 rb->lcd_bitmap(checkbox_twothird, 1, 41, 8, 6, true);
1599 else 1716 else
1600 rb->checkbox(1, 41, 8, 6, false); 1717 rb->lcd_bitmap(checkbox_full, 1, 41, 8, 6, true);
1601 rb->checkbox(1, 49, 8, 6, settings.lcd_blinkcolon); 1718
1602 rb->checkbox(1, 57, 8, 6, settings.lcd_12h); 1719 draw_checkbox(settings.lcd_blinkcolon, 1, 49);
1720 draw_checkbox(settings.lcd_12h, 1, 57);
1603 1721
1604 /* Draw a line selector */ 1722 /* Draw a line selector */
1605 switch(invert_lcd) 1723 switch(invert_lcd)
1606 { 1724 {
1607 case 1: 1725 case 1: rb->lcd_invertrect(0, 32, 112, 8); break;
1608 rb->lcd_invertrect(0, 32, 112, 8); break; 1726 case 2: rb->lcd_invertrect(0, 40, 112, 8); break;
1609 1727 case 3: rb->lcd_invertrect(0, 48, 112, 8); break;
1610 case 2: 1728 case 4: rb->lcd_invertrect(0, 56, 112, 8); break;
1611 rb->lcd_invertrect(0, 40, 112, 8); break;
1612
1613 case 3:
1614 rb->lcd_invertrect(0, 48, 112, 8); break;
1615
1616 case 4:
1617 rb->lcd_invertrect(0, 56, 112, 8); break;
1618 } 1729 }
1619
1620 rb->lcd_update(); 1730 rb->lcd_update();
1621 1731
1622 switch(rb->button_get_w_tmo(HZ/4)) 1732 switch(rb->button_get_w_tmo(HZ/4))
@@ -1635,29 +1745,44 @@ bool f3_screen(void)
1635 invert_lcd++; 1745 invert_lcd++;
1636 break; 1746 break;
1637 1747
1638 case BUTTON_PLAY: 1748 case BUTTON_LEFT:
1749 if(invert_lcd == 1)
1750 {
1751 if(settings.lcd_date > 0)
1752 settings.lcd_date--;
1753 }
1754 else if(invert_lcd == 2)
1755 {
1756 if(settings.lcd_seconds > 0)
1757 settings.lcd_seconds--;
1758 }
1759 else if(invert_lcd == 3)
1760 settings.lcd_blinkcolon = false;
1761 else
1762 settings.lcd_12h = false;
1763 break;
1764
1765 case BUTTON_RIGHT:
1639 if(invert_lcd == 1) 1766 if(invert_lcd == 1)
1640 { 1767 {
1641 if(settings.lcd_date < 2) 1768 if(settings.lcd_date < 2)
1642 settings.lcd_date++; 1769 settings.lcd_date++;
1643 else
1644 settings.lcd_date = 0;
1645 } 1770 }
1646 else if(invert_lcd == 2) 1771 else if(invert_lcd == 2)
1647 { 1772 {
1648 if(settings.lcd_seconds < 3) 1773 if(settings.lcd_seconds < 3)
1649 settings.lcd_seconds++; 1774 settings.lcd_seconds++;
1650 else
1651 settings.lcd_seconds = 0;
1652 } 1775 }
1653 else if(invert_lcd == 3) 1776 else if(invert_lcd == 3)
1654 settings.lcd_blinkcolon = !settings.lcd_blinkcolon; 1777 settings.lcd_blinkcolon = true;
1655 else 1778 else
1656 settings.lcd_12h = !settings.lcd_12h; 1779 settings.lcd_12h = true;
1657 break; 1780 break;
1658 1781
1659 case BUTTON_F3: 1782 case BUTTON_F3:
1660 case BUTTON_OFF: 1783 case BUTTON_OFF:
1784 if(settings.save_mode == 2)
1785 save_settings(false);
1661 done = true; 1786 done = true;
1662 break; 1787 break;
1663 } 1788 }
@@ -1665,32 +1790,23 @@ bool f3_screen(void)
1665 else if(settings.clock == 4) 1790 else if(settings.clock == 4)
1666 { 1791 {
1667 rb->lcd_puts(0, 0, "OPTIONS (Full)"); 1792 rb->lcd_puts(0, 0, "OPTIONS (Full)");
1668 rb->lcd_puts(0, 1, "UP/DOWN & PLAY");
1669 rb->lcd_puts(0, 2, "F3/OFF: Done");
1670 1793
1671 rb->lcd_puts(2, 4, "Border"); 1794 rb->lcd_puts(2, 4, "Border");
1672 rb->lcd_puts(2, 5, "Second Hand"); 1795 rb->lcd_puts(2, 5, "Second Hand");
1673 rb->lcd_puts(2, 6, "Invert Seconds"); 1796 rb->lcd_puts(2, 6, "Invert Seconds");
1674 1797
1675 rb->checkbox(1, 33, 8, 6, settings.fullscreen_border); 1798 draw_checkbox(settings.fullscreen_border, 1, 33);
1676 rb->checkbox(1, 41, 8, 6, settings.fullscreen_secondhand); 1799 draw_checkbox(settings.fullscreen_secondhand, 1, 41);
1677 rb->checkbox(1, 49, 8, 6, settings.fullscreen_invertseconds); 1800 draw_checkbox(settings.fullscreen_invertseconds, 1, 49);
1678 1801
1679 /* Draw a line selector 1802 /* Draw a line selector
1680 * There are 4 values here in case we decide to "up" the amount of settings */ 1803 * There are 4 values here in case we decide to "up" the amount of settings */
1681 switch(invert_fullscreen) 1804 switch(invert_fullscreen)
1682 { 1805 {
1683 case 1: 1806 case 1: rb->lcd_invertrect(0, 32, 112, 8); break;
1684 rb->lcd_invertrect(0, 32, 112, 8); break; 1807 case 2: rb->lcd_invertrect(0, 40, 112, 8); break;
1685 1808 case 3: rb->lcd_invertrect(0, 48, 112, 8); break;
1686 case 2: 1809 case 4: rb->lcd_invertrect(0, 56, 112, 8); break;
1687 rb->lcd_invertrect(0, 40, 112, 8); break;
1688
1689 case 3:
1690 rb->lcd_invertrect(0, 48, 112, 8); break;
1691
1692 case 4:
1693 rb->lcd_invertrect(0, 56, 112, 8); break;
1694 } 1810 }
1695 1811
1696 rb->lcd_update(); 1812 rb->lcd_update();
@@ -1710,18 +1826,29 @@ bool f3_screen(void)
1710 else 1826 else
1711 invert_fullscreen++; 1827 invert_fullscreen++;
1712 break; 1828 break;
1713 1829
1714 case BUTTON_PLAY: 1830 case BUTTON_LEFT:
1715 if(invert_fullscreen == 1) 1831 if(invert_fullscreen == 1)
1716 settings.fullscreen_border = !settings.fullscreen_border; 1832 settings.fullscreen_border = false;
1717 else if(invert_fullscreen == 2) 1833 else if(invert_fullscreen == 2)
1718 settings.fullscreen_secondhand = !settings.fullscreen_secondhand; 1834 settings.fullscreen_secondhand = false;
1719 else 1835 else if(invert_fullscreen ==3)
1720 settings.fullscreen_invertseconds = !settings.fullscreen_invertseconds; 1836 settings.fullscreen_invertseconds = false;
1837 break;
1838
1839 case BUTTON_RIGHT:
1840 if(invert_fullscreen == 1)
1841 settings.fullscreen_border = true;
1842 else if(invert_fullscreen == 2)
1843 settings.fullscreen_secondhand = true;
1844 else if(invert_fullscreen ==3)
1845 settings.fullscreen_invertseconds = true;
1721 break; 1846 break;
1722 1847
1723 case BUTTON_F3: 1848 case BUTTON_F3:
1724 case BUTTON_OFF: 1849 case BUTTON_OFF:
1850 if(settings.save_mode == 2)
1851 save_settings(false);
1725 done = true; 1852 done = true;
1726 break; 1853 break;
1727 } 1854 }
@@ -1729,17 +1856,13 @@ bool f3_screen(void)
1729 else 1856 else
1730 { 1857 {
1731 rb->lcd_puts(0, 0, "OPTIONS (Binary)"); 1858 rb->lcd_puts(0, 0, "OPTIONS (Binary)");
1732 rb->lcd_puts(0, 1, "UP/DOWN & PLAY");
1733 rb->lcd_puts(0, 2, "F3/OFF: Done");
1734 1859
1735 rb->lcd_puts(2, 4, "-- NO OPTIONS --"); 1860 rb->lcd_puts(2, 4, "-- NO OPTIONS --");
1736 rb->lcd_puts(1, 6, "F3/OFF to return");
1737 1861
1738 rb->lcd_update(); 1862 rb->lcd_update();
1739 1863
1740 switch(rb->button_get_w_tmo(HZ/4)) 1864 switch(rb->button_get_w_tmo(HZ/4))
1741 { 1865 {
1742
1743 case BUTTON_F3: 1866 case BUTTON_F3:
1744 case BUTTON_OFF: 1867 case BUTTON_OFF:
1745 done = true; 1868 done = true;
@@ -1778,7 +1901,15 @@ void confirm_reset(void)
1778 ask_reset_done = true; 1901 ask_reset_done = true;
1779 break; 1902 break;
1780 1903
1781 case BUTTON_F1 : 1904 case BUTTON_F1:
1905 case BUTTON_F2:
1906 case BUTTON_F3:
1907 case BUTTON_DOWN:
1908 case BUTTON_UP:
1909 case BUTTON_LEFT:
1910 case BUTTON_RIGHT:
1911 case BUTTON_ON:
1912 case BUTTON_OFF:
1782 ask_reset_done = true; 1913 ask_reset_done = true;
1783 break; 1914 break;
1784 } 1915 }
@@ -1805,6 +1936,12 @@ void general_settings(void)
1805 rb->lcd_puts(2, 2, "Reset Settings"); 1936 rb->lcd_puts(2, 2, "Reset Settings");
1806 rb->lcd_puts(2, 3, "Save Settings"); 1937 rb->lcd_puts(2, 3, "Save Settings");
1807 rb->lcd_puts(2, 4, "Show Counter"); 1938 rb->lcd_puts(2, 4, "Show Counter");
1939 if(settings.save_mode == 1) /* save on exit */
1940 rb->lcd_puts(2, 5, "Save: on Exit");
1941 else if(settings.save_mode == 2)
1942 rb->lcd_puts(2, 5, "Save: Automatic");
1943 else
1944 rb->lcd_puts(2, 5, "Save: Manually");
1808 1945
1809 rb->snprintf(buf, sizeof(buf), "UP/DOWN to move"); 1946 rb->snprintf(buf, sizeof(buf), "UP/DOWN to move");
1810 rb->lcd_getstringsize(buf, &buf_w, &buf_h); 1947 rb->lcd_getstringsize(buf, &buf_w, &buf_h);
@@ -1815,18 +1952,21 @@ void general_settings(void)
1815 1952
1816 rb->lcd_bitmap(arrow, 1, 17, 8, 6, true); 1953 rb->lcd_bitmap(arrow, 1, 17, 8, 6, true);
1817 rb->lcd_bitmap(arrow, 1, 25, 8, 6, true); 1954 rb->lcd_bitmap(arrow, 1, 25, 8, 6, true);
1818 rb->checkbox(1, 33, 8, 6, display_counter); 1955 draw_checkbox(display_counter, 1, 33);
1956
1957 if(settings.save_mode == 1)
1958 rb->lcd_bitmap(checkbox_onethird, 1, 41, 8, 6, true);
1959 else if(settings.save_mode == 2)
1960 rb->lcd_bitmap(checkbox_twothird, 1, 41, 8, 6, true);
1961 else
1962 rb->lcd_bitmap(checkbox_full, 1, 41, 8, 6, true);
1819 1963
1820 switch(cursorpos) 1964 switch(cursorpos)
1821 { 1965 {
1822 case 1: 1966 case 1: rb->lcd_invertrect(0, 16, 112, 8); break;
1823 rb->lcd_invertrect(0, 16, 112, 8); break; 1967 case 2: rb->lcd_invertrect(0, 24, 112, 8); break;
1824 1968 case 3: rb->lcd_invertrect(0, 32, 112, 8); break;
1825 case 2: 1969 case 4: rb->lcd_invertrect(0, 40, 112, 8); break;
1826 rb->lcd_invertrect(0, 24, 112, 8); break;
1827
1828 case 3:
1829 rb->lcd_invertrect(0, 32, 112, 8); break;
1830 } 1970 }
1831 1971
1832 rb->lcd_update(); 1972 rb->lcd_update();
@@ -1844,17 +1984,38 @@ void general_settings(void)
1844 break; 1984 break;
1845 1985
1846 case BUTTON_DOWN: 1986 case BUTTON_DOWN:
1847 if(cursorpos < 3) 1987 if(cursorpos < 4)
1848 cursorpos++; 1988 cursorpos++;
1849 break; 1989 break;
1850 1990
1851 case BUTTON_PLAY: 1991 case BUTTON_LEFT:
1992 if(cursorpos == 3)
1993 display_counter = false;
1994 else
1995 {
1996 if(settings.save_mode > 1)
1997 {
1998 settings.save_mode--;
1999 save_settings(false);
2000 }
2001 }
2002 break;
2003
2004 case BUTTON_RIGHT:
1852 if(cursorpos == 1) 2005 if(cursorpos == 1)
1853 confirm_reset(); 2006 confirm_reset();
1854 else if(cursorpos == 2) 2007 else if(cursorpos == 2)
1855 save_settings(); 2008 save_settings(false);
2009 else if(cursorpos == 3)
2010 display_counter = true;
1856 else 2011 else
1857 display_counter = !display_counter; 2012 {
2013 if(settings.save_mode < 3)
2014 {
2015 settings.save_mode++;
2016 save_settings(false);
2017 }
2018 }
1858 break; 2019 break;
1859 } 2020 }
1860 } 2021 }
@@ -2080,6 +2241,7 @@ void select_mode(void)
2080 break; 2241 break;
2081 2242
2082 case BUTTON_PLAY: 2243 case BUTTON_PLAY:
2244 case BUTTON_RIGHT:
2083 settings.clock = cursorpos; 2245 settings.clock = cursorpos;
2084 done = true; 2246 done = true;
2085 break; 2247 break;
@@ -2402,12 +2564,12 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2402 TEST_PLUGIN_API(api); 2564 TEST_PLUGIN_API(api);
2403 (void)parameter; 2565 (void)parameter;
2404 rb = api; 2566 rb = api;
2405 2567
2406 load_settings();
2407
2408 /* universal font */ 2568 /* universal font */
2409 rb->lcd_setfont(FONT_SYSFIXED); 2569 rb->lcd_setfont(FONT_SYSFIXED);
2410 2570
2571 load_settings();
2572
2411 /* set backlight timeout */ 2573 /* set backlight timeout */
2412 rb->backlight_set_timeout(settings.backlight_on); 2574 rb->backlight_set_timeout(settings.backlight_on);
2413 2575
@@ -2637,7 +2799,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2637 switch (rb->button_get_w_tmo(HZ/10)) 2799 switch (rb->button_get_w_tmo(HZ/10))
2638 { 2800 {
2639 case BUTTON_OFF: /* save and exit */ 2801 case BUTTON_OFF: /* save and exit */
2640 save_settings(); 2802 if(settings.save_mode == 1)
2803 save_settings(true);
2641 2804
2642 /* restore set backlight timeout */ 2805 /* restore set backlight timeout */
2643 rb->backlight_set_timeout( 2806 rb->backlight_set_timeout(
@@ -2657,7 +2820,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
2657 general_settings(); 2820 general_settings();
2658 break; 2821 break;
2659 2822
2660 case BUTTON_F1 | BUTTON_REL: /* help */ 2823 case BUTTON_F1: /* help */
2661 f1_screen(); 2824 f1_screen();
2662 break; 2825 break;
2663 2826