2 #include "oswald_main.h"
3 #include "oswald_watch_faces.h"
5 #include "LcdDisplay.h"
7 #include "oswald_screens.h"
11 void (*screendraw_func)(boolean show_seconds);
15 static idle_data_t idle_screen = {
21 void idle_handle_user_buttons(watch_button button)
25 if (idle_screen.show_seconds)
26 idle_screen.show_seconds = FALSE;
28 idle_screen.show_seconds = TRUE;
31 if (idle_screen.analogue == TRUE) {
32 idle_screen.analogue = FALSE;
33 idle_screen.screendraw_func = DrawLcdDigitalClock;
35 idle_screen.analogue = TRUE;
36 idle_screen.screendraw_func = DrawLcdAnaClock;
40 OswaldState.screen_id = DATETIME_SETTING_SCREEN;
41 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
42 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
48 idle_screen.screendraw_func(idle_screen.show_seconds);
51 void idle_handle_events(u16t event, void *data)
54 case EVENT_ONE_SEC_TIMER:
55 case EVENT_SCREEN_VISIBLE:
56 idle_screen.screendraw_func(idle_screen.show_seconds);
58 case EVENT_USER_BUTTONS:
59 dbg_out("button event %d\n", *(int *)data);
60 idle_handle_user_buttons(*(watch_button *)data);
71 static accelscreen_data_t accel_screen = {
75 void draw_accel_screen(accel_data_t *accel_data)
79 WriteLcdString(2, 2, "X:");
80 WriteLcdNumber(20, 2, accel_data->x);
81 WriteLcdString(2, 18, "Y:");
82 WriteLcdNumber(20, 18, accel_data->y);
83 WriteLcdString(2, 34, "Z:");
84 WriteLcdNumber(20, 34, accel_data->z);
88 void accel_handle_events(u16t event, void *data)
91 case EVENT_SCREEN_VISIBLE:
92 draw_accel_screen(&accel_screen.accdata);
94 case EVENT_ACCEL_UPDATE: {
95 accel_data_t *accel_data = (accel_data_t *)data;
96 accel_screen.accdata.x = accel_data->x;
97 accel_screen.accdata.y = accel_data->y;
98 accel_screen.accdata.z = accel_data->z;
99 draw_accel_screen(&accel_screen.accdata);
102 case EVENT_USER_BUTTONS:
103 dbg_out("button event %d\n", *(int *)data);
114 } datetime_setup_data_t;
115 static datetime_setup_data_t dt_setup_screen = {
120 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
123 SetFont(MetaWatch16);
124 WriteLcdString(2, 2, "Set");
126 SetFont(MetaWatchTime);
127 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
128 WriteLcdCharacter(2, 20, (OswaldClk.hour / 10));
129 WriteLcdCharacter(14, 20, (OswaldClk.hour % 10));
131 WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
133 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
134 WriteLcdCharacter(31, 20, (OswaldClk.minute / 10));
135 WriteLcdCharacter(43, 20, (OswaldClk.minute % 10));
138 WriteLcdCharacter(55, 20, TIME_CHARACTER_COLON_INDEX);
140 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
141 WriteLcdCharacter(60, 20, (OswaldClk.second / 10));
142 WriteLcdCharacter(72, 20, (OswaldClk.second % 10));
145 SetFont(MetaWatch16);
146 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
147 WriteLcdNumber(2, 45, OswaldClk.day);
149 WriteLcdString(18, 45, ".");
150 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
151 WriteLcdNumber(22, 45, OswaldClk.month);
153 WriteLcdString(38, 45, ".");
154 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
155 WriteLcdNumber(42, 45, OswaldClk.year);
159 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
160 if (OswaldClk.clk24hr)
161 WriteLcdString(2, 66, "x");
163 WriteLcdString(2, 66, "_");
165 WriteLcdString(15, 66, "24hr");
167 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
168 if (OswaldClk.day_first)
169 WriteLcdString(2, 79, "x");
171 WriteLcdString(2, 79, "_");
173 WriteLcdString(15, 79, "dd.mm. mm/dd");
175 lcd_update_display();
178 void datetime_handle_updown(u8t pos, s8t incr)
182 if (OswaldClk.hour == 0 && incr == -1) {
186 OswaldClk.hour += incr;
187 if (OswaldClk.hour > 23)
191 if (OswaldClk.minute == 0 && incr == -1) {
192 OswaldClk.minute = 59;
195 OswaldClk.minute += incr;
196 if (OswaldClk.minute > 59)
197 OswaldClk.minute = 0;
200 OswaldClk.second = 0;
203 if (OswaldClk.day == 1 && incr == -1) {
207 OswaldClk.day += incr;
208 if (OswaldClk.day > 31)
212 if (OswaldClk.month == 1 && incr == -1) {
213 OswaldClk.month = 12;
216 OswaldClk.month += incr;
217 if (OswaldClk.month > 12)
221 OswaldClk.year += incr;
223 case 6: // 24hr / 12hr
224 if (OswaldClk.clk24hr)
225 OswaldClk.clk24hr = FALSE;
227 OswaldClk.clk24hr = TRUE;
229 case 7: // dd.mm. / mm/dd
230 if (OswaldClk.day_first)
231 OswaldClk.day_first = FALSE;
233 OswaldClk.day_first = TRUE;
240 void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
244 datetime_handle_updown(sdata->pos, 1);
247 datetime_handle_updown(sdata->pos, -1);
256 draw_datetime_setup_screen(sdata);
259 void datetime_setup_events(u16t event, void *data)
262 case EVENT_SCREEN_VISIBLE:
263 draw_datetime_setup_screen(&dt_setup_screen);
264 enable_halfsecond_timer();
266 case EVENT_SCREEN_DESTROY:
267 disable_halfsecond_timer();
269 case EVENT_USER_BUTTONS:
270 dbg_out("button event %d\n", *(int *)data);
271 handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
273 case EVENT_HALF_SEC_TIMER:
274 if (dt_setup_screen.on)
275 dt_setup_screen.on = FALSE;
277 dt_setup_screen.on = TRUE;
278 draw_datetime_setup_screen(&dt_setup_screen);
289 static test_menu_t test_menu = { 0 };
291 void draw_menu_test_screen(void)
294 SetFont(MetaWatch16);
295 WriteLcdString(2, 2, "Menu");
297 WriteLcdString(2, 20, "Item 1");
298 WriteLcdString(2, 29, "Item 2");
299 WriteLcdString(2, 38, "Item 3");
300 WriteLcdString(2, 47, "Item 4");
301 WriteLcdString(2, 56, "Item 5");
303 WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
304 lcd_update_display();
307 static void handle_menu_user_buttons(watch_button button)
311 test_menu.menu_pos--;
312 test_menu.menu_pos%=5;
315 test_menu.menu_pos++;
316 test_menu.menu_pos%=5;
321 draw_menu_test_screen();
324 void test_menu_handle_events(u16t event, void *data)
327 case EVENT_USER_BUTTONS:
328 dbg_out("button event %d\n", *(int *)data);
329 handle_menu_user_buttons(*(watch_button *)data);
331 case EVENT_SCREEN_VISIBLE:
332 test_menu.menu_pos = 0;
333 draw_menu_test_screen();
352 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
355 static void update_stop_watch_screen(stopwatch_data_t *sdata)
357 SetFont(MetaWatchMonospaced10);
359 WriteLcdNumber(0, 30, sdata->hr);
360 WriteLcdCharacter(14, 30, ':');
361 WriteLcdNumber(19, 30, sdata->min);
362 WriteLcdCharacter(33, 30, ':');
363 WriteLcdNumber(38, 30, sdata->sec);
364 WriteLcdCharacter(52, 30, '.');
365 WriteLcdNumber(57, 30, sdata->csec / 10);
367 WriteLcdNumber(0, 50, sdata->lapse_hr);
368 WriteLcdCharacter(14, 50, ':');
369 WriteLcdNumber(19, 50, sdata->lapse_min);
370 WriteLcdCharacter(33, 50, ':');
371 WriteLcdNumber(38, 50, sdata->lapse_sec);
372 WriteLcdCharacter(52, 50, '.');
373 WriteLcdNumber(57, 50, sdata->lapse_csec / 10);
375 lcd_update_display();
378 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
380 SetFont(MetaWatch16);
381 WriteLcdString(2, 5, "StopWatch");
383 update_stop_watch_screen(sdata);
386 static void handle_stop_watch_buttons(watch_button button)
389 case BUTTON_A: // start/stop
390 if (stopwatch_screen.running) {
391 disable_centisecond_timer();
392 stopwatch_screen.running = FALSE;
394 enable_centisecond_timer();
395 stopwatch_screen.running = TRUE;
398 case BUTTON_B: // lapse
399 stopwatch_screen.lapse_hr = stopwatch_screen.hr;
400 stopwatch_screen.lapse_min = stopwatch_screen.min;
401 stopwatch_screen.lapse_sec = stopwatch_screen.sec;
402 stopwatch_screen.lapse_csec = stopwatch_screen.csec;
404 case BUTTON_D: // reset
405 stopwatch_screen.hr = 0;
406 stopwatch_screen.min = 0;
407 stopwatch_screen.sec = 0;
408 stopwatch_screen.csec = 0;
409 stopwatch_screen.lapse_hr = 0;
410 stopwatch_screen.lapse_min = 0;
411 stopwatch_screen.lapse_sec = 0;
412 stopwatch_screen.lapse_csec = 0;
419 void stop_watch_handle_events(u16t event, void *data)
422 case EVENT_USER_BUTTONS:
423 dbg_out("button event %d\n", *(int *)data);
424 handle_stop_watch_buttons(*(watch_button *)data);
425 update_stop_watch_screen(&stopwatch_screen);
427 case EVENT_SCREEN_VISIBLE:
429 draw_stop_watch_screen(&stopwatch_screen);
431 case EVENT_SCREEN_DESTROY:
432 disable_centisecond_timer();
433 stopwatch_screen.running = FALSE;
436 stopwatch_screen.csec++;
437 if (stopwatch_screen.csec > 99) {
438 stopwatch_screen.csec = 0;
439 stopwatch_screen.sec++;
441 if (stopwatch_screen.sec > 59) {
442 stopwatch_screen.sec = 0;
443 stopwatch_screen.min++;
445 if (stopwatch_screen.min > 59) {
446 stopwatch_screen.min = 0;
447 stopwatch_screen.hr++;
449 if (stopwatch_screen.hr > 59) {
450 stopwatch_screen.hr = 0;
452 if (stopwatch_screen.csec % 10 == 0)
453 update_stop_watch_screen(&stopwatch_screen);