4 #include "oswald_main.h"
5 #include "oswald_watch_faces.h"
6 #include "oswald_graphics.h"
7 #include "oswald_hal.h"
9 #include "oswald_screens.h"
11 #if defined(__GNUC__) && (__MSP430X__ > 0)
12 __attribute__((__far__))
14 #include "bitmaps/timesetup_icon.xbm"
16 #if defined(__GNUC__) && (__MSP430X__ > 0)
17 __attribute__((__far__))
19 #include "bitmaps/stopwatch_icon.xbm"
21 #if defined(__GNUC__) && (__MSP430X__ > 0)
22 __attribute__((__far__))
24 #include "bitmaps/alarm_icon.xbm"
26 #if defined(__GNUC__) && (__MSP430X__ > 0)
27 __attribute__((__far__))
29 #include "bitmaps/startstopbutton_icon.xbm"
31 #if defined(__GNUC__) && (__MSP430X__ > 0)
32 __attribute__((__far__))
34 #include "bitmaps/lapsebutton_icon.xbm"
36 #if defined(__GNUC__) && (__MSP430X__ > 0)
37 __attribute__((__far__))
39 #include "bitmaps/upbutton_icon.xbm"
41 #if defined(__GNUC__) && (__MSP430X__ > 0)
42 __attribute__((__far__))
44 #include "bitmaps/downbutton_icon.xbm"
46 #if defined(__GNUC__) && (__MSP430X__ > 0)
47 __attribute__((__far__))
49 #include "bitmaps/Bluetooth_icon.xbm"
51 #if defined(__GNUC__) && (__MSP430X__ > 0)
52 __attribute__((__far__))
54 #include "bitmaps/info_icon.xbm"
56 #if defined(__GNUC__) && (__MSP430X__ > 0)
57 __attribute__((__far__))
59 #include "bitmaps/acc_icon.xbm"
64 * Common event handler part of the watch faces
67 void (*screendraw_func)(boolean show_seconds);
71 static idle_data_t idle_screen = {
77 event_ret_t idle_handle_user_buttons(watch_button button)
81 if (idle_screen.show_seconds)
82 idle_screen.show_seconds = FALSE;
84 idle_screen.show_seconds = TRUE;
87 if (idle_screen.analogue == TRUE) {
88 idle_screen.analogue = FALSE;
89 idle_screen.screendraw_func = DrawLcdDigitalClock;
91 idle_screen.analogue = TRUE;
92 idle_screen.screendraw_func = DrawLcdAnaClock;
96 return EVENT_RET_UNHANDLED;
99 OswaldState.screen_id = DATETIME_SETTING_SCREEN;
100 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
101 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
102 return EVENT_RET_HANDLED;
105 return EVENT_RET_UNHANDLED;
109 idle_screen.screendraw_func(idle_screen.show_seconds);
111 return EVENT_RET_HANDLED;
114 event_ret_t idle_handle_events(uint16_t event, void *data)
117 case EVENT_ONE_SEC_TIMER:
118 case EVENT_SCREEN_VISIBLE:
119 idle_screen.screendraw_func(idle_screen.show_seconds);
120 return EVENT_RET_HANDLED;
122 case EVENT_USER_BUTTONS:
123 dbg_out("button event %d\n", *(int *)data);
124 return idle_handle_user_buttons(*(watch_button *)data);
127 return EVENT_RET_UNHANDLED;
130 return EVENT_RET_UNHANDLED;
135 * Accelerometer and sensor display screen
138 accel_data_t accdata;
139 } accelscreen_data_t;
140 static accelscreen_data_t accel_screen = {
144 void draw_accel_screen(accel_data_t *accel_data)
146 hal_lcd_clear_display();
148 oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
150 oswald_write_string(1, 40, FONT_6x9, "X:");
151 oswald_write_number(15, 40, FONT_6x9, accel_data->x);
152 oswald_write_string(1, 52, FONT_6x9, "Y:");
153 oswald_write_number(15, 52, FONT_6x9, accel_data->y);
154 oswald_write_string(1, 64, FONT_6x9, "Z:");
155 oswald_write_number(15, 64, FONT_6x9, accel_data->z);
157 oswald_write_string(1, 85, FONT_6x9, "Light:");
158 oswald_write_number(50, 85, FONT_6x9, 0);
160 oswald_draw_line(40, 30, 92, 30);
161 oswald_draw_line(92, 30, 92, 82);
162 oswald_draw_line(40, 82, 92, 82);
163 oswald_draw_line(40, 82, 40, 30);
165 oswald_draw_pixel(41+25+((accel_data->x * 50) / (254)), 31+25+((accel_data->y * 50) / (254)));
167 hal_lcd_update_display();
170 event_ret_t accel_handle_events(uint16_t event, void *data)
173 case EVENT_SCREEN_VISIBLE:
174 draw_accel_screen(&accel_screen.accdata);
175 return EVENT_RET_HANDLED;
177 case EVENT_ACCEL_UPDATE: {
178 accel_data_t *accel_data = (accel_data_t *)data;
179 accel_screen.accdata.x = accel_data->x;
180 accel_screen.accdata.y = accel_data->y;
181 accel_screen.accdata.z = accel_data->z;
182 draw_accel_screen(&accel_screen.accdata);
184 return EVENT_RET_HANDLED;
186 case EVENT_USER_BUTTONS:
187 dbg_out("button event %d\n", *(int *)data);
190 return EVENT_RET_UNHANDLED;
193 return EVENT_RET_UNHANDLED;
198 * Date / time setup screen
204 } datetime_setup_data_t;
205 static datetime_setup_data_t dt_setup_screen = {
211 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
213 hal_lcd_clear_display();
215 oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
217 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
218 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
220 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
221 oswald_write_character(2, 30, FONT_LCD13x21, (OswaldClk.hour / 10));
222 oswald_write_character(15, 30, FONT_LCD13x21, (OswaldClk.hour % 10));
224 oswald_write_character(25, 30, FONT_LCD13x21, 10);
226 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
227 oswald_write_character(34, 30, FONT_LCD13x21, (OswaldClk.minute / 10));
228 oswald_write_character(47, 30, FONT_LCD13x21, (OswaldClk.minute % 10));
231 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
232 oswald_write_character(61, 38, FONT_LCD8x13, (OswaldClk.second / 10));
233 oswald_write_character(69, 38, FONT_LCD8x13, (OswaldClk.second % 10));
237 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
238 oswald_write_number(2, 55, FONT_DROID8x12, OswaldClk.day);
240 oswald_write_character(15, 55, FONT_DROID8x12, '.');
241 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
242 oswald_write_number(21, 55, FONT_DROID8x12, OswaldClk.month);
244 oswald_write_character(36, 55, FONT_DROID8x12, '.');
245 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
246 oswald_write_number(43, 55, FONT_DROID8x12, OswaldClk.year);
249 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
250 if (OswaldClk.clk24hr) {
251 oswald_write_character(2, 76, FONT_6x9, 'x');
253 oswald_write_character(2, 76, FONT_6x9, '_');
256 oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
258 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
259 if (OswaldClk.day_first) {
260 oswald_write_character(2, 86, FONT_6x9, 'x');
262 oswald_write_character(2, 86, FONT_6x9, '_');
265 oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm. mm/dd");
267 hal_lcd_update_display();
270 void datetime_handle_updown(uint8_t pos, int8_t incr)
274 if (OswaldClk.hour == 0 && incr == -1) {
278 OswaldClk.hour += incr;
279 if (OswaldClk.hour > 23)
283 if (OswaldClk.minute == 0 && incr == -1) {
284 OswaldClk.minute = 59;
287 OswaldClk.minute += incr;
288 if (OswaldClk.minute > 59)
289 OswaldClk.minute = 0;
292 OswaldClk.second = 0;
295 if (OswaldClk.day == 1 && incr == -1) {
299 OswaldClk.day += incr;
300 if (OswaldClk.day > 31)
304 if (OswaldClk.month == 1 && incr == -1) {
305 OswaldClk.month = 12;
308 OswaldClk.month += incr;
309 if (OswaldClk.month > 12)
313 OswaldClk.year += incr;
315 case 6: // 24hr / 12hr
316 if (OswaldClk.clk24hr)
317 OswaldClk.clk24hr = FALSE;
319 OswaldClk.clk24hr = TRUE;
321 case 7: // dd.mm. / mm/dd
322 if (OswaldClk.day_first)
323 OswaldClk.day_first = FALSE;
325 OswaldClk.day_first = TRUE;
331 hal_set_rtc(&OswaldClk, TRUE);
333 hal_set_rtc(&OswaldClk, FALSE);
336 event_ret_t handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
340 datetime_handle_updown(sdata->pos, 1);
343 datetime_handle_updown(sdata->pos, -1);
350 OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
351 OswaldState.screen_id = IDLE_SCREEN;
352 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
353 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
354 return EVENT_RET_HANDLED;
357 return EVENT_RET_UNHANDLED;
360 draw_datetime_setup_screen(sdata);
361 return EVENT_RET_HANDLED;
364 event_ret_t datetime_setup_events(uint16_t event, void *data)
367 case EVENT_SCREEN_VISIBLE:
368 dt_setup_screen.pos = 0;
369 draw_datetime_setup_screen(&dt_setup_screen);
370 hal_enable_halfsecond_timer();
371 return EVENT_RET_HANDLED;
373 case EVENT_SCREEN_DESTROY:
374 hal_disable_halfsecond_timer();
375 return EVENT_RET_HANDLED;
377 case EVENT_USER_BUTTONS:
378 dbg_out("button event %d\n", *(int *)data);
379 return handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
381 case EVENT_HALF_SEC_TIMER:
382 if (dt_setup_screen.on)
383 dt_setup_screen.on = FALSE;
385 dt_setup_screen.on = TRUE;
386 draw_datetime_setup_screen(&dt_setup_screen);
387 return EVENT_RET_HANDLED;
390 return EVENT_RET_UNHANDLED;
393 return EVENT_RET_UNHANDLED;
404 } alarm_setup_data_t;
405 static alarm_setup_data_t alarm_setup_screen = {
411 void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
413 hal_lcd_clear_display();
415 oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
417 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
418 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
420 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
421 oswald_write_character(18, 30, FONT_LCD13x21, (OswaldAlarm.hour / 10));
422 oswald_write_character(32, 30, FONT_LCD13x21, (OswaldAlarm.hour % 10));
424 oswald_write_character(42, 30, FONT_LCD13x21, 10);
426 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
427 oswald_write_character(53, 30, FONT_LCD13x21, (OswaldAlarm.minute / 10));
428 oswald_write_character(67, 30, FONT_LCD13x21, (OswaldAlarm.minute % 10));
431 oswald_write_character(3, 55, FONT_6x9, 'S');
432 oswald_write_character(15, 55, FONT_6x9, 'M');
433 oswald_write_character(27, 55, FONT_6x9, 'T');
434 oswald_write_character(39, 55, FONT_6x9, 'W');
435 oswald_write_character(51, 55, FONT_6x9, 'T');
436 oswald_write_character(63, 55, FONT_6x9, 'F');
437 oswald_write_character(75, 55, FONT_6x9, 'S');
439 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
440 oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
441 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
442 oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
443 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
444 oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
445 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
446 oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
447 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
448 oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
449 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
450 oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
451 if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
452 oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
454 hal_lcd_update_display();
457 void alarm_handle_updown(uint8_t pos, int8_t incr)
461 if (OswaldAlarm.hour == 0 && incr == -1) {
462 OswaldAlarm.hour = 23;
465 OswaldAlarm.hour += incr;
466 if (OswaldAlarm.hour > 23)
467 OswaldAlarm.hour = 0;
470 if (OswaldAlarm.minute == 0 && incr == -1) {
471 OswaldAlarm.minute = 59;
474 OswaldAlarm.minute += incr;
475 if (OswaldAlarm.minute > 59)
476 OswaldAlarm.minute = 0;
479 OswaldAlarm.wday ^= WDAY_SUNDAY;
482 OswaldAlarm.wday ^= WDAY_MONDAY;
485 OswaldAlarm.wday ^= WDAY_TUESDAY;
488 OswaldAlarm.wday ^= WDAY_WEDNESDAY;
491 OswaldAlarm.wday ^= WDAY_THURSDAY;
494 OswaldAlarm.wday ^= WDAY_FRIDAY;
497 OswaldAlarm.wday ^= WDAY_SATURDAY;
504 event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
506 if (alarm_setup_screen.set_mode) {
509 alarm_handle_updown(sdata->pos, 1);
512 alarm_handle_updown(sdata->pos, -1);
519 alarm_setup_screen.set_mode = FALSE;
522 return EVENT_RET_UNHANDLED;
528 alarm_setup_screen.set_mode = TRUE;
531 return EVENT_RET_UNHANDLED;
535 draw_alarm_setup_screen(sdata);
537 return EVENT_RET_HANDLED;
540 event_ret_t alarm_setup_events(uint16_t event, void *data)
543 case EVENT_SCREEN_VISIBLE:
544 alarm_setup_screen.pos = 0;
545 alarm_setup_screen.on = TRUE;
546 alarm_setup_screen.set_mode = FALSE;
547 draw_alarm_setup_screen(&alarm_setup_screen);
548 hal_enable_halfsecond_timer();
549 return EVENT_RET_HANDLED;
551 case EVENT_SCREEN_DESTROY:
552 hal_disable_halfsecond_timer();
553 return EVENT_RET_HANDLED;
555 case EVENT_USER_BUTTONS:
556 dbg_out("button event %d\n", *(int *)data);
557 return handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
559 case EVENT_HALF_SEC_TIMER:
560 if (alarm_setup_screen.set_mode) {
561 if (alarm_setup_screen.on)
562 alarm_setup_screen.on = FALSE;
564 alarm_setup_screen.on = TRUE;
566 alarm_setup_screen.on = TRUE;
567 draw_alarm_setup_screen(&alarm_setup_screen);
568 return EVENT_RET_HANDLED;
571 return EVENT_RET_UNHANDLED;
574 return EVENT_RET_UNHANDLED;
584 static test_menu_t test_menu = { 0 };
586 void draw_menu_test_screen(void)
588 hal_lcd_clear_display();
590 SetFont(MetaWatch16);
591 WriteLcdString(2, 2, "Menu");
593 WriteLcdString(2, 20, "Item 1");
594 WriteLcdString(2, 29, "Item 2");
595 WriteLcdString(2, 38, "Item 3");
596 WriteLcdString(2, 47, "Item 4");
597 WriteLcdString(2, 56, "Item 5");
599 WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
601 oswald_write_string(2, 2, FONT_DROID11x14b, "Menu");
603 oswald_write_string(2, 20, FONT_DROID8x12, "Item 1");
604 oswald_write_string(2, 29, FONT_DROID8x12, "Item 2");
605 oswald_write_string(2, 38, FONT_DROID8x12, "Item 3");
606 oswald_write_string(2, 47, FONT_DROID8x12, "Item 4");
607 oswald_write_string(2, 56, FONT_DROID8x12, "Item 5");
609 oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, 0x11);
611 hal_lcd_update_display();
614 event_ret_t handle_menu_user_buttons(watch_button button)
618 test_menu.menu_pos--;
619 test_menu.menu_pos %= 5;
622 test_menu.menu_pos++;
623 test_menu.menu_pos %= 5;
626 return EVENT_RET_UNHANDLED;
629 draw_menu_test_screen();
630 return EVENT_RET_HANDLED;
633 event_ret_t test_menu_handle_events(uint16_t event, void *data)
636 case EVENT_USER_BUTTONS:
637 dbg_out("button event %d\n", *(int *)data);
638 return handle_menu_user_buttons(*(watch_button *)data);
640 case EVENT_SCREEN_VISIBLE:
641 test_menu.menu_pos = 0;
642 draw_menu_test_screen();
645 return EVENT_RET_UNHANDLED;
648 return EVENT_RET_HANDLED;
666 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
669 static void update_stop_watch_screen(stopwatch_data_t *sdata)
673 SetFont(MetaWatchMonospaced10);
675 snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
676 WriteLcdString(5, 40, tstr);
677 snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
678 WriteLcdString(5, 60, tstr);
681 snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
682 oswald_write_string(5, 40, FONT_6x9, tstr);
684 snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
685 oswald_write_string(5, 60, FONT_6x9, tstr);
688 hal_lcd_update_display();
692 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
697 hal_lcd_clear_display();
699 oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
700 oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
701 oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
704 update_stop_watch_screen(sdata);
706 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->hr % 10));
707 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min / 10));
708 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min % 10));
709 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec / 10));
710 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec % 10));
711 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->csec / 10));
715 gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_hr % 10));
716 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min / 10));
717 gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min % 10));
718 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec / 10));
719 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec % 10));
720 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec / 10));
721 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec % 10));
723 hal_lcd_update_display();
727 event_ret_t handle_stop_watch_buttons(watch_button button)
730 case BUTTON_A: // start/stop
731 if (stopwatch_screen.running) {
732 hal_disable_centisecond_timer();
733 stopwatch_screen.running = FALSE;
735 hal_enable_centisecond_timer();
736 stopwatch_screen.running = TRUE;
738 return EVENT_RET_HANDLED;
740 case BUTTON_B: // lapse
741 stopwatch_screen.lapse_hr = stopwatch_screen.hr;
742 stopwatch_screen.lapse_min = stopwatch_screen.min;
743 stopwatch_screen.lapse_sec = stopwatch_screen.sec;
744 stopwatch_screen.lapse_csec = stopwatch_screen.csec;
745 return EVENT_RET_HANDLED;
747 case BUTTON_F: // reset
748 stopwatch_screen.hr = 0;
749 stopwatch_screen.min = 0;
750 stopwatch_screen.sec = 0;
751 stopwatch_screen.csec = 0;
752 stopwatch_screen.lapse_hr = 0;
753 stopwatch_screen.lapse_min = 0;
754 stopwatch_screen.lapse_sec = 0;
755 stopwatch_screen.lapse_csec = 0;
756 return EVENT_RET_HANDLED;
759 return EVENT_RET_UNHANDLED;
762 return EVENT_RET_UNHANDLED;
765 event_ret_t stop_watch_handle_events(uint16_t event, void *data)
768 case EVENT_USER_BUTTONS:
769 dbg_out("button event %d\n", *(int *)data);
770 return handle_stop_watch_buttons(*(watch_button *)data);
771 //update_stop_watch_screen(&stopwatch_screen);
772 draw_stop_watch_screen(&stopwatch_screen);
774 case EVENT_SCREEN_VISIBLE:
775 hal_lcd_clear_display();
776 draw_stop_watch_screen(&stopwatch_screen);
777 return EVENT_RET_HANDLED;
779 case EVENT_SCREEN_DESTROY:
780 hal_disable_centisecond_timer();
781 stopwatch_screen.running = FALSE;
782 return EVENT_RET_HANDLED;
785 stopwatch_screen.csec++;
786 if (stopwatch_screen.csec > 99) {
787 stopwatch_screen.csec = 0;
788 stopwatch_screen.sec++;
790 if (stopwatch_screen.sec > 59) {
791 stopwatch_screen.sec = 0;
792 stopwatch_screen.min++;
794 if (stopwatch_screen.min > 59) {
795 stopwatch_screen.min = 0;
796 stopwatch_screen.hr++;
798 if (stopwatch_screen.hr > 59) {
799 stopwatch_screen.hr = 0;
801 if (stopwatch_screen.csec % 10 == 0)
802 draw_stop_watch_screen(&stopwatch_screen);
803 //update_stop_watch_screen(&stopwatch_screen);
804 return EVENT_RET_HANDLED;
807 return EVENT_RET_UNHANDLED;
810 return EVENT_RET_HANDLED;
815 * Alarm screen, shown when alarm is fired
817 void draw_alarm_screen(void)
819 hal_lcd_clear_display();
821 oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
823 hal_lcd_update_display();
826 event_ret_t alarm_handle_events(uint16_t event, void *data)
829 case EVENT_SCREEN_VISIBLE:
831 hal_enable_halfsecond_timer();
832 hal_vibration_set_state(TRUE);
833 return EVENT_RET_HANDLED;
835 case EVENT_SCREEN_DESTROY:
836 hal_disable_halfsecond_timer();
837 hal_lcd_set_backlight(FALSE);
838 hal_vibration_set_state(FALSE);
839 return EVENT_RET_HANDLED;
841 case EVENT_USER_BUTTONS:
842 dbg_out("button event %d\n", *(int *)data);
843 // hal_lcd_set_backlight(FALSE);
844 return EVENT_RET_HANDLED;
846 case EVENT_HALF_SEC_TIMER:
847 hal_lcd_set_backlight(!hal_lcd_get_backlight());
848 hal_vibration_set_state(!hal_vibration_get_state());
850 return EVENT_RET_HANDLED;
853 return EVENT_RET_UNHANDLED;
856 return EVENT_RET_HANDLED;
861 * Bluetooth setup screen
869 static bluetooth_data_t bluetooth_screen = {
876 void draw_bluetooth_screen(bluetooth_data_t *sdata)
881 hal_lcd_clear_display();
883 oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
885 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
886 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
888 oswald_write_string(1, 30, FONT_DROID8x12, "Enable:");
889 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
890 oswald_write_character(53, 30, FONT_DROID8x12, bluetooth_screen.bt_en ? 'x' : '_');
892 oswald_write_string(1, 40, FONT_DROID8x12, "State:");
893 switch (hal_bluetooth_get_state()) {
895 oswald_write_string(53, 40, FONT_DROID8x12, "off");
898 oswald_write_string(53, 40, FONT_DROID8x12, "on");
900 case BLUETOOTH_CONNECTED:
901 oswald_write_string(53, 40, FONT_DROID8x12, "conn.");
906 oswald_write_string(1, 50, FONT_DROID8x12, "Visible:");
907 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
908 oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
911 if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
912 bd_addr = hal_bluetooth_get_local_bdaddr();
913 snprintf(bstr, 20, "%02x:%02x:%02x:%02x:%02x:%02x", bd_addr[5], bd_addr[4], bd_addr[3], bd_addr[2], bd_addr[1], bd_addr[0]);
914 oswald_write_string(2, 85, FONT_5x7, bstr);
918 hal_lcd_update_display();
921 void bluetooth_handle_updown(uint8_t pos, int8_t incr)
925 if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
926 hal_bluetooth_set_state(BLUETOOTH_OFF);
927 bluetooth_screen.bt_en = FALSE;
929 hal_bluetooth_set_state(BLUETOOTH_ON);
930 bluetooth_screen.bt_en = TRUE;
934 if (hal_bluetooth_get_state() >= BLUETOOTH_ON && !hal_bluetooth_get_visible()) {
935 hal_bluetooth_set_visible(TRUE);
937 hal_bluetooth_set_visible(FALSE);
959 event_ret_t handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdata)
961 if (bluetooth_screen.set_mode) {
964 bluetooth_handle_updown(sdata->pos, 1);
967 bluetooth_handle_updown(sdata->pos, -1);
974 bluetooth_screen.set_mode = FALSE;
977 return EVENT_RET_UNHANDLED;
983 bluetooth_screen.set_mode = TRUE;
986 return EVENT_RET_UNHANDLED;
991 draw_bluetooth_screen(sdata);
993 return EVENT_RET_HANDLED;
996 event_ret_t bluetooth_screen_events(uint16_t event, void *data)
999 case EVENT_SCREEN_VISIBLE:
1000 bluetooth_screen.pos = 0;
1001 bluetooth_screen.bt_en = (hal_bluetooth_get_state() > 0);
1002 draw_bluetooth_screen(&bluetooth_screen);
1003 hal_enable_halfsecond_timer();
1005 case EVENT_SCREEN_DESTROY:
1006 hal_disable_halfsecond_timer();
1008 case EVENT_USER_BUTTONS:
1009 dbg_out("button event %d\n", *(int *)data);
1010 return handle_bluetooth_buttons(*(watch_button *)data, &bluetooth_screen);
1012 case EVENT_HALF_SEC_TIMER:
1013 if (bluetooth_screen.set_mode) {
1014 if (bluetooth_screen.on)
1015 bluetooth_screen.on = FALSE;
1017 bluetooth_screen.on = TRUE;
1019 bluetooth_screen.on = TRUE;
1020 draw_bluetooth_screen(&bluetooth_screen);
1023 return EVENT_RET_UNHANDLED;
1026 return EVENT_RET_HANDLED;
1033 void draw_info_screen(accel_data_t *accel_data)
1035 hal_lcd_clear_display();
1037 oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, info_icon_bits);
1039 oswald_write_string(2, 29, FONT_DROID8x12, "Oswald");
1040 oswald_write_string(35, 29, FONT_DROID8x12, OSWALD_VERSION);
1041 oswald_write_string(2, 41, FONT_DROID8x12, "HAL");
1042 oswald_write_string(35, 41, FONT_DROID8x12, (char *)hal_get_version_string());
1043 oswald_write_string(2, 53, FONT_DROID8x12, "Build");
1044 oswald_write_string(35, 53, FONT_DROID8x12, (char *)hal_get_buildno_string());
1045 oswald_write_string(2, 65, FONT_DROID8x12, "Radio");
1046 oswald_write_string(35, 65, FONT_DROID8x12, (char *)hal_get_radio_version_string());
1048 hal_lcd_update_display();
1051 event_ret_t info_screen_handle_events(uint16_t event, void *data)
1054 case EVENT_SCREEN_VISIBLE:
1055 draw_info_screen(&accel_screen.accdata);
1056 return EVENT_RET_HANDLED;
1058 case EVENT_USER_BUTTONS:
1059 dbg_out("button event %d\n", *(int *)data);
1062 return EVENT_RET_UNHANDLED;
1065 return EVENT_RET_UNHANDLED;