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"
53 void (*screendraw_func)(boolean show_seconds);
57 static idle_data_t idle_screen = {
63 event_ret_t idle_handle_user_buttons(watch_button button)
67 if (idle_screen.show_seconds)
68 idle_screen.show_seconds = FALSE;
70 idle_screen.show_seconds = TRUE;
73 if (idle_screen.analogue == TRUE) {
74 idle_screen.analogue = FALSE;
75 idle_screen.screendraw_func = DrawLcdDigitalClock;
77 idle_screen.analogue = TRUE;
78 idle_screen.screendraw_func = DrawLcdAnaClock;
82 return EVENT_RET_UNHANDLED;
85 OswaldState.screen_id = DATETIME_SETTING_SCREEN;
86 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
87 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
88 return EVENT_RET_HANDLED;
91 return EVENT_RET_UNHANDLED;
95 idle_screen.screendraw_func(idle_screen.show_seconds);
97 return EVENT_RET_HANDLED;
100 event_ret_t idle_handle_events(uint16_t event, void *data)
103 case EVENT_ONE_SEC_TIMER:
104 case EVENT_SCREEN_VISIBLE:
105 idle_screen.screendraw_func(idle_screen.show_seconds);
106 return EVENT_RET_HANDLED;
108 case EVENT_USER_BUTTONS:
109 dbg_out("button event %d\n", *(int *)data);
110 return idle_handle_user_buttons(*(watch_button *)data);
113 return EVENT_RET_UNHANDLED;
116 return EVENT_RET_UNHANDLED;
121 accel_data_t accdata;
122 } accelscreen_data_t;
123 static accelscreen_data_t accel_screen = {
127 void draw_accel_screen(accel_data_t *accel_data)
129 hal_lcd_clear_display();
131 oswald_write_string(0, 2, FONT_6x9, "X:");
132 oswald_write_number(20, 2, FONT_6x9, accel_data->x);
133 oswald_write_string(0, 16, FONT_6x9, "Y:");
134 oswald_write_number(20, 16, FONT_6x9, accel_data->y);
135 oswald_write_string(0, 32, FONT_6x9, "Z:");
136 oswald_write_number(20, 32, FONT_6x9, accel_data->z);
138 oswald_write_string(0, 54, FONT_6x9, "Light:");
139 oswald_write_number(50, 54, FONT_6x9, accel_data->z);
141 hal_lcd_update_display();
144 event_ret_t accel_handle_events(uint16_t event, void *data)
147 case EVENT_SCREEN_VISIBLE:
148 draw_accel_screen(&accel_screen.accdata);
149 return EVENT_RET_HANDLED;
151 case EVENT_ACCEL_UPDATE: {
152 accel_data_t *accel_data = (accel_data_t *)data;
153 accel_screen.accdata.x = accel_data->x;
154 accel_screen.accdata.y = accel_data->y;
155 accel_screen.accdata.z = accel_data->z;
156 draw_accel_screen(&accel_screen.accdata);
158 return EVENT_RET_HANDLED;
160 case EVENT_USER_BUTTONS:
161 dbg_out("button event %d\n", *(int *)data);
164 return EVENT_RET_UNHANDLED;
167 return EVENT_RET_UNHANDLED;
175 } datetime_setup_data_t;
176 static datetime_setup_data_t dt_setup_screen = {
182 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
184 hal_lcd_clear_display();
186 oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
188 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
189 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
191 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
192 oswald_write_character(2, 30, FONT_LCD13x21, (OswaldClk.hour / 10));
193 oswald_write_character(15, 30, FONT_LCD13x21, (OswaldClk.hour % 10));
195 oswald_write_character(25, 30, FONT_LCD13x21, 10);
197 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
198 oswald_write_character(34, 30, FONT_LCD13x21, (OswaldClk.minute / 10));
199 oswald_write_character(47, 30, FONT_LCD13x21, (OswaldClk.minute % 10));
202 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
203 oswald_write_character(61, 38, FONT_LCD8x13, (OswaldClk.second / 10));
204 oswald_write_character(69, 38, FONT_LCD8x13, (OswaldClk.second % 10));
208 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
209 oswald_write_number(2, 55, FONT_DROID8x12, OswaldClk.day);
211 oswald_write_character(15, 55, FONT_DROID8x12, '.');
212 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
213 oswald_write_number(21, 55, FONT_DROID8x12, OswaldClk.month);
215 oswald_write_character(36, 55, FONT_DROID8x12, '.');
216 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
217 oswald_write_number(43, 55, FONT_DROID8x12, OswaldClk.year);
220 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
221 if (OswaldClk.clk24hr) {
222 oswald_write_character(2, 76, FONT_6x9, 'x');
224 oswald_write_character(2, 76, FONT_6x9, '_');
227 oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
229 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
230 if (OswaldClk.day_first) {
231 oswald_write_character(2, 86, FONT_6x9, 'x');
233 oswald_write_character(2, 86, FONT_6x9, '_');
236 oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm. mm/dd");
238 hal_lcd_update_display();
241 void datetime_handle_updown(uint8_t pos, int8_t incr)
245 if (OswaldClk.hour == 0 && incr == -1) {
249 OswaldClk.hour += incr;
250 if (OswaldClk.hour > 23)
254 if (OswaldClk.minute == 0 && incr == -1) {
255 OswaldClk.minute = 59;
258 OswaldClk.minute += incr;
259 if (OswaldClk.minute > 59)
260 OswaldClk.minute = 0;
263 OswaldClk.second = 0;
266 if (OswaldClk.day == 1 && incr == -1) {
270 OswaldClk.day += incr;
271 if (OswaldClk.day > 31)
275 if (OswaldClk.month == 1 && incr == -1) {
276 OswaldClk.month = 12;
279 OswaldClk.month += incr;
280 if (OswaldClk.month > 12)
284 OswaldClk.year += incr;
286 case 6: // 24hr / 12hr
287 if (OswaldClk.clk24hr)
288 OswaldClk.clk24hr = FALSE;
290 OswaldClk.clk24hr = TRUE;
292 case 7: // dd.mm. / mm/dd
293 if (OswaldClk.day_first)
294 OswaldClk.day_first = FALSE;
296 OswaldClk.day_first = TRUE;
302 hal_set_rtc(&OswaldClk, TRUE);
304 hal_set_rtc(&OswaldClk, FALSE);
307 event_ret_t handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
311 datetime_handle_updown(sdata->pos, 1);
314 datetime_handle_updown(sdata->pos, -1);
321 OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
322 OswaldState.screen_id = IDLE_SCREEN;
323 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
324 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
325 return EVENT_RET_HANDLED;
328 return EVENT_RET_UNHANDLED;
331 draw_datetime_setup_screen(sdata);
332 return EVENT_RET_HANDLED;
335 event_ret_t datetime_setup_events(uint16_t event, void *data)
338 case EVENT_SCREEN_VISIBLE:
339 dt_setup_screen.pos = 0;
340 draw_datetime_setup_screen(&dt_setup_screen);
341 hal_enable_halfsecond_timer();
342 return EVENT_RET_HANDLED;
344 case EVENT_SCREEN_DESTROY:
345 hal_disable_halfsecond_timer();
346 return EVENT_RET_HANDLED;
348 case EVENT_USER_BUTTONS:
349 dbg_out("button event %d\n", *(int *)data);
350 return handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
352 case EVENT_HALF_SEC_TIMER:
353 if (dt_setup_screen.on)
354 dt_setup_screen.on = FALSE;
356 dt_setup_screen.on = TRUE;
357 draw_datetime_setup_screen(&dt_setup_screen);
358 return EVENT_RET_HANDLED;
361 return EVENT_RET_UNHANDLED;
364 return EVENT_RET_UNHANDLED;
376 } alarm_setup_data_t;
377 static alarm_setup_data_t alarm_setup_screen = {
383 void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
385 hal_lcd_clear_display();
387 oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
389 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
390 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
392 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
393 oswald_write_character(18, 30, FONT_LCD13x21, (OswaldAlarm.hour / 10));
394 oswald_write_character(32, 30, FONT_LCD13x21, (OswaldAlarm.hour % 10));
396 oswald_write_character(42, 30, FONT_LCD13x21, 10);
398 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
399 oswald_write_character(53, 30, FONT_LCD13x21, (OswaldAlarm.minute / 10));
400 oswald_write_character(67, 30, FONT_LCD13x21, (OswaldAlarm.minute % 10));
403 oswald_write_character(3, 55, FONT_6x9, 'S');
404 oswald_write_character(15, 55, FONT_6x9, 'M');
405 oswald_write_character(27, 55, FONT_6x9, 'T');
406 oswald_write_character(39, 55, FONT_6x9, 'W');
407 oswald_write_character(51, 55, FONT_6x9, 'T');
408 oswald_write_character(63, 55, FONT_6x9, 'F');
409 oswald_write_character(75, 55, FONT_6x9, 'S');
411 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
412 oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
413 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
414 oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
415 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
416 oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
417 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
418 oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
419 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
420 oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
421 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
422 oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
423 if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
424 oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
426 hal_lcd_update_display();
429 void alarm_handle_updown(uint8_t pos, int8_t incr)
433 if (OswaldAlarm.hour == 0 && incr == -1) {
434 OswaldAlarm.hour = 23;
437 OswaldAlarm.hour += incr;
438 if (OswaldAlarm.hour > 23)
439 OswaldAlarm.hour = 0;
442 if (OswaldAlarm.minute == 0 && incr == -1) {
443 OswaldAlarm.minute = 59;
446 OswaldAlarm.minute += incr;
447 if (OswaldAlarm.minute > 59)
448 OswaldAlarm.minute = 0;
451 OswaldAlarm.wday ^= WDAY_SUNDAY;
454 OswaldAlarm.wday ^= WDAY_MONDAY;
457 OswaldAlarm.wday ^= WDAY_TUESDAY;
460 OswaldAlarm.wday ^= WDAY_WEDNESDAY;
463 OswaldAlarm.wday ^= WDAY_THURSDAY;
466 OswaldAlarm.wday ^= WDAY_FRIDAY;
469 OswaldAlarm.wday ^= WDAY_SATURDAY;
476 event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
478 if (alarm_setup_screen.set_mode) {
481 alarm_handle_updown(sdata->pos, 1);
484 alarm_handle_updown(sdata->pos, -1);
491 alarm_setup_screen.set_mode = FALSE;
494 return EVENT_RET_UNHANDLED;
500 alarm_setup_screen.set_mode = TRUE;
503 return EVENT_RET_UNHANDLED;
507 draw_alarm_setup_screen(sdata);
509 return EVENT_RET_HANDLED;
512 event_ret_t alarm_setup_events(uint16_t event, void *data)
515 case EVENT_SCREEN_VISIBLE:
516 alarm_setup_screen.pos = 0;
517 alarm_setup_screen.on = TRUE;
518 alarm_setup_screen.set_mode = FALSE;
519 draw_alarm_setup_screen(&alarm_setup_screen);
520 hal_enable_halfsecond_timer();
521 return EVENT_RET_HANDLED;
523 case EVENT_SCREEN_DESTROY:
524 hal_disable_halfsecond_timer();
525 return EVENT_RET_HANDLED;
527 case EVENT_USER_BUTTONS:
528 dbg_out("button event %d\n", *(int *)data);
529 return handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
531 case EVENT_HALF_SEC_TIMER:
532 if (alarm_setup_screen.set_mode) {
533 if (alarm_setup_screen.on)
534 alarm_setup_screen.on = FALSE;
536 alarm_setup_screen.on = TRUE;
538 alarm_setup_screen.on = TRUE;
539 draw_alarm_setup_screen(&alarm_setup_screen);
540 return EVENT_RET_HANDLED;
543 return EVENT_RET_UNHANDLED;
546 return EVENT_RET_UNHANDLED;
557 static test_menu_t test_menu = { 0 };
559 void draw_menu_test_screen(void)
561 hal_lcd_clear_display();
563 SetFont(MetaWatch16);
564 WriteLcdString(2, 2, "Menu");
566 WriteLcdString(2, 20, "Item 1");
567 WriteLcdString(2, 29, "Item 2");
568 WriteLcdString(2, 38, "Item 3");
569 WriteLcdString(2, 47, "Item 4");
570 WriteLcdString(2, 56, "Item 5");
572 WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
574 oswald_write_string(2, 2, FONT_DROID11x14b, "Menu");
576 oswald_write_string(2, 20, FONT_DROID8x12, "Item 1");
577 oswald_write_string(2, 29, FONT_DROID8x12, "Item 2");
578 oswald_write_string(2, 38, FONT_DROID8x12, "Item 3");
579 oswald_write_string(2, 47, FONT_DROID8x12, "Item 4");
580 oswald_write_string(2, 56, FONT_DROID8x12, "Item 5");
582 oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, 0x11);
584 hal_lcd_update_display();
587 event_ret_t handle_menu_user_buttons(watch_button button)
591 test_menu.menu_pos--;
592 test_menu.menu_pos %= 5;
595 test_menu.menu_pos++;
596 test_menu.menu_pos %= 5;
599 return EVENT_RET_UNHANDLED;
602 draw_menu_test_screen();
603 return EVENT_RET_HANDLED;
606 event_ret_t test_menu_handle_events(uint16_t event, void *data)
609 case EVENT_USER_BUTTONS:
610 dbg_out("button event %d\n", *(int *)data);
611 return handle_menu_user_buttons(*(watch_button *)data);
613 case EVENT_SCREEN_VISIBLE:
614 test_menu.menu_pos = 0;
615 draw_menu_test_screen();
618 return EVENT_RET_UNHANDLED;
621 return EVENT_RET_HANDLED;
640 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
643 static void update_stop_watch_screen(stopwatch_data_t *sdata)
647 SetFont(MetaWatchMonospaced10);
649 snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
650 WriteLcdString(5, 40, tstr);
651 snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
652 WriteLcdString(5, 60, tstr);
655 snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
656 oswald_write_string(5, 40, FONT_6x9, tstr);
658 snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
659 oswald_write_string(5, 60, FONT_6x9, tstr);
662 hal_lcd_update_display();
666 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
671 hal_lcd_clear_display();
673 oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
674 oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
675 oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
678 update_stop_watch_screen(sdata);
680 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->hr % 10));
681 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min / 10));
682 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min % 10));
683 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec / 10));
684 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec % 10));
685 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->csec / 10));
689 gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_hr % 10));
690 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min / 10));
691 gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min % 10));
692 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec / 10));
693 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec % 10));
694 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec / 10));
695 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec % 10));
697 hal_lcd_update_display();
701 event_ret_t handle_stop_watch_buttons(watch_button button)
704 case BUTTON_A: // start/stop
705 if (stopwatch_screen.running) {
706 hal_disable_centisecond_timer();
707 stopwatch_screen.running = FALSE;
709 hal_enable_centisecond_timer();
710 stopwatch_screen.running = TRUE;
712 return EVENT_RET_HANDLED;
714 case BUTTON_B: // lapse
715 stopwatch_screen.lapse_hr = stopwatch_screen.hr;
716 stopwatch_screen.lapse_min = stopwatch_screen.min;
717 stopwatch_screen.lapse_sec = stopwatch_screen.sec;
718 stopwatch_screen.lapse_csec = stopwatch_screen.csec;
719 return EVENT_RET_HANDLED;
721 case BUTTON_F: // reset
722 stopwatch_screen.hr = 0;
723 stopwatch_screen.min = 0;
724 stopwatch_screen.sec = 0;
725 stopwatch_screen.csec = 0;
726 stopwatch_screen.lapse_hr = 0;
727 stopwatch_screen.lapse_min = 0;
728 stopwatch_screen.lapse_sec = 0;
729 stopwatch_screen.lapse_csec = 0;
730 return EVENT_RET_HANDLED;
733 return EVENT_RET_UNHANDLED;
736 return EVENT_RET_UNHANDLED;
739 event_ret_t stop_watch_handle_events(uint16_t event, void *data)
742 case EVENT_USER_BUTTONS:
743 dbg_out("button event %d\n", *(int *)data);
744 return handle_stop_watch_buttons(*(watch_button *)data);
745 //update_stop_watch_screen(&stopwatch_screen);
746 draw_stop_watch_screen(&stopwatch_screen);
748 case EVENT_SCREEN_VISIBLE:
749 hal_lcd_clear_display();
750 draw_stop_watch_screen(&stopwatch_screen);
751 return EVENT_RET_HANDLED;
753 case EVENT_SCREEN_DESTROY:
754 hal_disable_centisecond_timer();
755 stopwatch_screen.running = FALSE;
756 return EVENT_RET_HANDLED;
759 stopwatch_screen.csec++;
760 if (stopwatch_screen.csec > 99) {
761 stopwatch_screen.csec = 0;
762 stopwatch_screen.sec++;
764 if (stopwatch_screen.sec > 59) {
765 stopwatch_screen.sec = 0;
766 stopwatch_screen.min++;
768 if (stopwatch_screen.min > 59) {
769 stopwatch_screen.min = 0;
770 stopwatch_screen.hr++;
772 if (stopwatch_screen.hr > 59) {
773 stopwatch_screen.hr = 0;
775 if (stopwatch_screen.csec % 10 == 0)
776 draw_stop_watch_screen(&stopwatch_screen);
777 //update_stop_watch_screen(&stopwatch_screen);
778 return EVENT_RET_HANDLED;
781 return EVENT_RET_UNHANDLED;
784 return EVENT_RET_HANDLED;
789 * when alarm is fired
791 void draw_alarm_screen(void)
793 hal_lcd_clear_display();
795 oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
797 hal_lcd_update_display();
800 event_ret_t alarm_handle_events(uint16_t event, void *data)
803 case EVENT_SCREEN_VISIBLE:
805 hal_enable_halfsecond_timer();
806 hal_vibration_set_state(TRUE);
807 return EVENT_RET_HANDLED;
809 case EVENT_SCREEN_DESTROY:
810 hal_disable_halfsecond_timer();
811 hal_lcd_set_backlight(FALSE);
812 hal_vibration_set_state(FALSE);
813 return EVENT_RET_HANDLED;
815 case EVENT_USER_BUTTONS:
816 dbg_out("button event %d\n", *(int *)data);
817 // hal_lcd_set_backlight(FALSE);
818 return EVENT_RET_HANDLED;
820 case EVENT_HALF_SEC_TIMER:
821 hal_lcd_set_backlight(!hal_lcd_get_backlight());
822 hal_vibration_set_state(!hal_vibration_get_state());
824 return EVENT_RET_HANDLED;
827 return EVENT_RET_UNHANDLED;
830 return EVENT_RET_HANDLED;
843 static bluetooth_data_t bluetooth_screen = {
850 void draw_bluetooth_screen(bluetooth_data_t *sdata)
855 hal_lcd_clear_display();
857 oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
859 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
860 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
862 oswald_write_string(1, 30, FONT_DROID8x12, "Enable:");
863 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
864 oswald_write_character(53, 30, FONT_DROID8x12, bluetooth_screen.bt_en ? 'x' : '_');
866 oswald_write_string(1, 40, FONT_DROID8x12, "State:");
867 switch (hal_bluetooth_get_state()) {
869 oswald_write_string(53, 40, FONT_DROID8x12, "off");
872 oswald_write_string(53, 40, FONT_DROID8x12, "on");
874 case BLUETOOTH_CONNECTED:
875 oswald_write_string(53, 40, FONT_DROID8x12, "conn.");
880 oswald_write_string(1, 50, FONT_DROID8x12, "Visible:");
881 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
882 oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
885 if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
886 bd_addr = hal_bluetooth_get_local_bdaddr();
887 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]);
888 oswald_write_string(2, 85, FONT_5x7, bstr);
892 hal_lcd_update_display();
895 void bluetooth_handle_updown(uint8_t pos, int8_t incr)
899 if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
900 hal_bluetooth_set_state(BLUETOOTH_OFF);
901 bluetooth_screen.bt_en = FALSE;
903 hal_bluetooth_set_state(BLUETOOTH_ON);
904 bluetooth_screen.bt_en = TRUE;
908 if (hal_bluetooth_get_state() >= BLUETOOTH_ON && !hal_bluetooth_get_visible()) {
909 hal_bluetooth_set_visible(TRUE);
911 hal_bluetooth_set_visible(FALSE);
933 event_ret_t handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdata)
935 if (bluetooth_screen.set_mode) {
938 bluetooth_handle_updown(sdata->pos, 1);
941 bluetooth_handle_updown(sdata->pos, -1);
948 bluetooth_screen.set_mode = FALSE;
951 return EVENT_RET_UNHANDLED;
957 bluetooth_screen.set_mode = TRUE;
960 return EVENT_RET_UNHANDLED;
965 draw_bluetooth_screen(sdata);
967 return EVENT_RET_HANDLED;
970 event_ret_t bluetooth_screen_events(uint16_t event, void *data)
973 case EVENT_SCREEN_VISIBLE:
974 bluetooth_screen.pos = 0;
975 bluetooth_screen.bt_en = (hal_bluetooth_get_state() > 0);
976 draw_bluetooth_screen(&bluetooth_screen);
977 hal_enable_halfsecond_timer();
979 case EVENT_SCREEN_DESTROY:
980 hal_disable_halfsecond_timer();
982 case EVENT_USER_BUTTONS:
983 dbg_out("button event %d\n", *(int *)data);
984 return handle_bluetooth_buttons(*(watch_button *)data, &bluetooth_screen);
986 case EVENT_HALF_SEC_TIMER:
987 if (bluetooth_screen.set_mode) {
988 if (bluetooth_screen.on)
989 bluetooth_screen.on = FALSE;
991 bluetooth_screen.on = TRUE;
993 bluetooth_screen.on = TRUE;
994 draw_bluetooth_screen(&bluetooth_screen);
997 return EVENT_RET_UNHANDLED;
1000 return EVENT_RET_HANDLED;