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)
148 hal_lcd_clear_display();
150 oswald_draw_bitmap(36, 0, acc_icon_width, acc_icon_height, acc_icon_bits);
152 oswald_write_string(1, 40, FONT_6x9, "X:");
153 oswald_write_number(15, 40, FONT_6x9, accel_data->x);
154 oswald_write_string(1, 52, FONT_6x9, "Y:");
155 oswald_write_number(15, 52, FONT_6x9, accel_data->y);
156 oswald_write_string(1, 64, FONT_6x9, "Z:");
157 oswald_write_number(15, 64, FONT_6x9, accel_data->z);
159 oswald_write_string(1, 85, FONT_6x9, "Light:");
160 oswald_write_number(50, 85, FONT_6x9, 0);
162 oswald_draw_line(40, 30, 92, 30);
163 oswald_draw_line(92, 30, 92, 82);
164 oswald_draw_line(40, 82, 92, 82);
165 oswald_draw_line(40, 82, 40, 30);
167 x = 41+25+((accel_data->x * 50) / (254));
168 y = 31+25+((accel_data->y * 50) / (254));
169 oswald_draw_pixel(x, y);
170 oswald_draw_pixel(x+1, y);
171 oswald_draw_pixel(x-1, y);
172 oswald_draw_pixel(x, y+1);
173 oswald_draw_pixel(x, y-1);
175 hal_lcd_update_display();
178 event_ret_t accel_handle_events(uint16_t event, void *data)
181 case EVENT_SCREEN_VISIBLE:
182 draw_accel_screen(&accel_screen.accdata);
183 hal_accelerometer_enable();
184 return EVENT_RET_HANDLED;
186 case EVENT_SCREEN_DESTROY:
187 hal_accelerometer_disable();
188 return EVENT_RET_HANDLED;
190 case EVENT_ACCEL_UPDATE: {
191 accel_data_t *accel_data = (accel_data_t *)data;
192 accel_screen.accdata.x = accel_data->x;
193 accel_screen.accdata.y = accel_data->y;
194 accel_screen.accdata.z = accel_data->z;
195 draw_accel_screen(&accel_screen.accdata);
197 return EVENT_RET_HANDLED;
199 case EVENT_USER_BUTTONS:
200 dbg_out("button event %d\n", *(int *)data);
203 return EVENT_RET_UNHANDLED;
206 return EVENT_RET_UNHANDLED;
211 * Date / time setup screen
217 } datetime_setup_data_t;
218 static datetime_setup_data_t dt_setup_screen = {
224 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
226 hal_lcd_clear_display();
228 oswald_draw_bitmap(36, 0, timesetup_icon_width, timesetup_icon_height, timesetup_icon_bits);
230 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
231 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
233 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
234 oswald_write_character(2, 30, FONT_LCD13x21, (OswaldClk.hour / 10));
235 oswald_write_character(15, 30, FONT_LCD13x21, (OswaldClk.hour % 10));
237 oswald_write_character(25, 30, FONT_LCD13x21, 10);
239 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
240 oswald_write_character(34, 30, FONT_LCD13x21, (OswaldClk.minute / 10));
241 oswald_write_character(47, 30, FONT_LCD13x21, (OswaldClk.minute % 10));
244 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
245 oswald_write_character(61, 38, FONT_LCD8x13, (OswaldClk.second / 10));
246 oswald_write_character(69, 38, FONT_LCD8x13, (OswaldClk.second % 10));
250 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
251 oswald_write_number(2, 55, FONT_DROID8x12, OswaldClk.day);
253 oswald_write_character(15, 55, FONT_DROID8x12, '.');
254 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
255 oswald_write_number(21, 55, FONT_DROID8x12, OswaldClk.month);
257 oswald_write_character(36, 55, FONT_DROID8x12, '.');
258 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
259 oswald_write_number(43, 55, FONT_DROID8x12, OswaldClk.year);
262 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
263 if (OswaldClk.clk24hr) {
264 oswald_write_character(2, 76, FONT_6x9, 'x');
266 oswald_write_character(2, 76, FONT_6x9, '_');
269 oswald_write_string(15, 73, FONT_DROID8x12, "24hr");
271 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
272 if (OswaldClk.day_first) {
273 oswald_write_character(2, 86, FONT_6x9, 'x');
275 oswald_write_character(2, 86, FONT_6x9, '_');
278 oswald_write_string(15, 83, FONT_DROID8x12, "dd.mm. mm/dd");
280 hal_lcd_update_display();
283 void datetime_handle_updown(uint8_t pos, int8_t incr)
287 if (OswaldClk.hour == 0 && incr == -1) {
291 OswaldClk.hour += incr;
292 if (OswaldClk.hour > 23)
296 if (OswaldClk.minute == 0 && incr == -1) {
297 OswaldClk.minute = 59;
300 OswaldClk.minute += incr;
301 if (OswaldClk.minute > 59)
302 OswaldClk.minute = 0;
305 OswaldClk.second = 0;
308 if (OswaldClk.day == 1 && incr == -1) {
312 OswaldClk.day += incr;
313 if (OswaldClk.day > 31)
317 if (OswaldClk.month == 1 && incr == -1) {
318 OswaldClk.month = 12;
321 OswaldClk.month += incr;
322 if (OswaldClk.month > 12)
326 OswaldClk.year += incr;
328 case 6: // 24hr / 12hr
329 if (OswaldClk.clk24hr)
330 OswaldClk.clk24hr = FALSE;
332 OswaldClk.clk24hr = TRUE;
334 case 7: // dd.mm. / mm/dd
335 if (OswaldClk.day_first)
336 OswaldClk.day_first = FALSE;
338 OswaldClk.day_first = TRUE;
344 hal_set_rtc(&OswaldClk, TRUE);
346 hal_set_rtc(&OswaldClk, FALSE);
349 event_ret_t handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
353 datetime_handle_updown(sdata->pos, 1);
356 datetime_handle_updown(sdata->pos, -1);
363 OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
364 OswaldState.screen_id = IDLE_SCREEN;
365 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
366 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
367 return EVENT_RET_HANDLED;
370 return EVENT_RET_UNHANDLED;
373 draw_datetime_setup_screen(sdata);
374 return EVENT_RET_HANDLED;
377 event_ret_t datetime_setup_events(uint16_t event, void *data)
380 case EVENT_SCREEN_VISIBLE:
381 dt_setup_screen.pos = 0;
382 draw_datetime_setup_screen(&dt_setup_screen);
383 hal_enable_halfsecond_timer();
384 return EVENT_RET_HANDLED;
386 case EVENT_SCREEN_DESTROY:
387 hal_disable_halfsecond_timer();
388 return EVENT_RET_HANDLED;
390 case EVENT_USER_BUTTONS:
391 dbg_out("button event %d\n", *(int *)data);
392 return handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
394 case EVENT_HALF_SEC_TIMER:
395 if (dt_setup_screen.on)
396 dt_setup_screen.on = FALSE;
398 dt_setup_screen.on = TRUE;
399 draw_datetime_setup_screen(&dt_setup_screen);
400 return EVENT_RET_HANDLED;
403 return EVENT_RET_UNHANDLED;
406 return EVENT_RET_UNHANDLED;
417 } alarm_setup_data_t;
418 static alarm_setup_data_t alarm_setup_screen = {
424 void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
426 hal_lcd_clear_display();
428 oswald_draw_bitmap(36, 0, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
430 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
431 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
433 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
434 oswald_write_character(18, 30, FONT_LCD13x21, (OswaldAlarm.hour / 10));
435 oswald_write_character(32, 30, FONT_LCD13x21, (OswaldAlarm.hour % 10));
437 oswald_write_character(42, 30, FONT_LCD13x21, 10);
439 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
440 oswald_write_character(53, 30, FONT_LCD13x21, (OswaldAlarm.minute / 10));
441 oswald_write_character(67, 30, FONT_LCD13x21, (OswaldAlarm.minute % 10));
444 oswald_write_character(3, 55, FONT_6x9, 'S');
445 oswald_write_character(15, 55, FONT_6x9, 'M');
446 oswald_write_character(27, 55, FONT_6x9, 'T');
447 oswald_write_character(39, 55, FONT_6x9, 'W');
448 oswald_write_character(51, 55, FONT_6x9, 'T');
449 oswald_write_character(63, 55, FONT_6x9, 'F');
450 oswald_write_character(75, 55, FONT_6x9, 'S');
452 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
453 oswald_write_character(3, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
454 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
455 oswald_write_character(15, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
456 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
457 oswald_write_character(27, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
458 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
459 oswald_write_character(39, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
460 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
461 oswald_write_character(51, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
462 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
463 oswald_write_character(63, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
464 if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
465 oswald_write_character(75, 65, FONT_6x9, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
467 hal_lcd_update_display();
470 void alarm_handle_updown(uint8_t pos, int8_t incr)
474 if (OswaldAlarm.hour == 0 && incr == -1) {
475 OswaldAlarm.hour = 23;
478 OswaldAlarm.hour += incr;
479 if (OswaldAlarm.hour > 23)
480 OswaldAlarm.hour = 0;
483 if (OswaldAlarm.minute == 0 && incr == -1) {
484 OswaldAlarm.minute = 59;
487 OswaldAlarm.minute += incr;
488 if (OswaldAlarm.minute > 59)
489 OswaldAlarm.minute = 0;
492 OswaldAlarm.wday ^= WDAY_SUNDAY;
495 OswaldAlarm.wday ^= WDAY_MONDAY;
498 OswaldAlarm.wday ^= WDAY_TUESDAY;
501 OswaldAlarm.wday ^= WDAY_WEDNESDAY;
504 OswaldAlarm.wday ^= WDAY_THURSDAY;
507 OswaldAlarm.wday ^= WDAY_FRIDAY;
510 OswaldAlarm.wday ^= WDAY_SATURDAY;
517 event_ret_t handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
519 if (alarm_setup_screen.set_mode) {
522 alarm_handle_updown(sdata->pos, 1);
525 alarm_handle_updown(sdata->pos, -1);
532 alarm_setup_screen.set_mode = FALSE;
535 return EVENT_RET_UNHANDLED;
541 alarm_setup_screen.set_mode = TRUE;
544 return EVENT_RET_UNHANDLED;
548 draw_alarm_setup_screen(sdata);
550 return EVENT_RET_HANDLED;
553 event_ret_t alarm_setup_events(uint16_t event, void *data)
556 case EVENT_SCREEN_VISIBLE:
557 alarm_setup_screen.pos = 0;
558 alarm_setup_screen.on = TRUE;
559 alarm_setup_screen.set_mode = FALSE;
560 draw_alarm_setup_screen(&alarm_setup_screen);
561 hal_enable_halfsecond_timer();
562 return EVENT_RET_HANDLED;
564 case EVENT_SCREEN_DESTROY:
565 hal_disable_halfsecond_timer();
566 return EVENT_RET_HANDLED;
568 case EVENT_USER_BUTTONS:
569 dbg_out("button event %d\n", *(int *)data);
570 return handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
572 case EVENT_HALF_SEC_TIMER:
573 if (alarm_setup_screen.set_mode) {
574 if (alarm_setup_screen.on)
575 alarm_setup_screen.on = FALSE;
577 alarm_setup_screen.on = TRUE;
579 alarm_setup_screen.on = TRUE;
580 draw_alarm_setup_screen(&alarm_setup_screen);
581 return EVENT_RET_HANDLED;
584 return EVENT_RET_UNHANDLED;
587 return EVENT_RET_UNHANDLED;
597 static test_menu_t test_menu = { 0 };
599 void draw_menu_test_screen(void)
601 hal_lcd_clear_display();
603 SetFont(MetaWatch16);
604 WriteLcdString(2, 2, "Menu");
606 WriteLcdString(2, 20, "Item 1");
607 WriteLcdString(2, 29, "Item 2");
608 WriteLcdString(2, 38, "Item 3");
609 WriteLcdString(2, 47, "Item 4");
610 WriteLcdString(2, 56, "Item 5");
612 WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
614 oswald_write_string(2, 2, FONT_DROID11x14b, "Menu");
616 oswald_write_string(2, 20, FONT_DROID8x12, "Item 1");
617 oswald_write_string(2, 29, FONT_DROID8x12, "Item 2");
618 oswald_write_string(2, 38, FONT_DROID8x12, "Item 3");
619 oswald_write_string(2, 47, FONT_DROID8x12, "Item 4");
620 oswald_write_string(2, 56, FONT_DROID8x12, "Item 5");
622 oswald_write_character(50, 18+(9*test_menu.menu_pos), FONT_6x9, 0x11);
624 hal_lcd_update_display();
627 event_ret_t handle_menu_user_buttons(watch_button button)
631 test_menu.menu_pos--;
632 test_menu.menu_pos %= 5;
635 test_menu.menu_pos++;
636 test_menu.menu_pos %= 5;
639 return EVENT_RET_UNHANDLED;
642 draw_menu_test_screen();
643 return EVENT_RET_HANDLED;
646 event_ret_t test_menu_handle_events(uint16_t event, void *data)
649 case EVENT_USER_BUTTONS:
650 dbg_out("button event %d\n", *(int *)data);
651 return handle_menu_user_buttons(*(watch_button *)data);
653 case EVENT_SCREEN_VISIBLE:
654 test_menu.menu_pos = 0;
655 draw_menu_test_screen();
658 return EVENT_RET_UNHANDLED;
661 return EVENT_RET_HANDLED;
679 static stopwatch_data_t stopwatch_screen = { 0, 0, 0, 0, 0, 0, 0, 0, FALSE };
682 static void update_stop_watch_screen(stopwatch_data_t *sdata)
686 SetFont(MetaWatchMonospaced10);
688 snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
689 WriteLcdString(5, 40, tstr);
690 snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
691 WriteLcdString(5, 60, tstr);
694 snprintf(tstr, 16, "%02d:%02d:%02d.%1d", sdata->hr, sdata->min, sdata->sec, sdata->csec / 10);
695 oswald_write_string(5, 40, FONT_6x9, tstr);
697 snprintf(tstr, 16, "%02d:%02d:%02d.%02d", sdata->lapse_hr, sdata->lapse_min, sdata->lapse_sec, sdata->lapse_csec);
698 oswald_write_string(5, 60, FONT_6x9, tstr);
701 hal_lcd_update_display();
705 static void draw_stop_watch_screen(stopwatch_data_t *sdata)
710 hal_lcd_clear_display();
712 oswald_draw_bitmap(36, 0, stopwatch_icon_width, stopwatch_icon_height, stopwatch_icon_bits);
713 oswald_draw_bitmap(81, 6, startstopbutton_icon_width, startstopbutton_icon_height, startstopbutton_icon_bits);
714 oswald_draw_bitmap(81, 38, lapsebutton_icon_width, lapsebutton_icon_height, lapsebutton_icon_bits);
717 update_stop_watch_screen(sdata);
719 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->hr % 10));
720 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min / 10));
721 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->min % 10));
722 gRow += oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec / 10));
723 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD13x21, (sdata->sec % 10));
724 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->csec / 10));
728 gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_hr % 10));
729 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min / 10));
730 gRow += 13 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_min % 10));
731 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec / 10));
732 gRow += 3 + oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_sec % 10));
733 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec / 10));
734 gRow += oswald_write_character(gRow, gColumn, FONT_LCD8x13, (sdata->lapse_csec % 10));
736 hal_lcd_update_display();
740 event_ret_t handle_stop_watch_buttons(watch_button button)
743 case BUTTON_A: // start/stop
744 if (stopwatch_screen.running) {
745 hal_disable_centisecond_timer();
746 stopwatch_screen.running = FALSE;
748 hal_enable_centisecond_timer();
749 stopwatch_screen.running = TRUE;
751 return EVENT_RET_HANDLED;
753 case BUTTON_B: // lapse
754 stopwatch_screen.lapse_hr = stopwatch_screen.hr;
755 stopwatch_screen.lapse_min = stopwatch_screen.min;
756 stopwatch_screen.lapse_sec = stopwatch_screen.sec;
757 stopwatch_screen.lapse_csec = stopwatch_screen.csec;
758 return EVENT_RET_HANDLED;
760 case BUTTON_F: // reset
761 stopwatch_screen.hr = 0;
762 stopwatch_screen.min = 0;
763 stopwatch_screen.sec = 0;
764 stopwatch_screen.csec = 0;
765 stopwatch_screen.lapse_hr = 0;
766 stopwatch_screen.lapse_min = 0;
767 stopwatch_screen.lapse_sec = 0;
768 stopwatch_screen.lapse_csec = 0;
769 return EVENT_RET_HANDLED;
772 return EVENT_RET_UNHANDLED;
775 return EVENT_RET_UNHANDLED;
778 event_ret_t stop_watch_handle_events(uint16_t event, void *data)
781 case EVENT_USER_BUTTONS:
782 dbg_out("button event %d\n", *(int *)data);
783 return handle_stop_watch_buttons(*(watch_button *)data);
784 //update_stop_watch_screen(&stopwatch_screen);
785 draw_stop_watch_screen(&stopwatch_screen);
787 case EVENT_SCREEN_VISIBLE:
788 hal_lcd_clear_display();
789 draw_stop_watch_screen(&stopwatch_screen);
790 return EVENT_RET_HANDLED;
792 case EVENT_SCREEN_DESTROY:
793 hal_disable_centisecond_timer();
794 stopwatch_screen.running = FALSE;
795 return EVENT_RET_HANDLED;
798 stopwatch_screen.csec++;
799 if (stopwatch_screen.csec > 99) {
800 stopwatch_screen.csec = 0;
801 stopwatch_screen.sec++;
803 if (stopwatch_screen.sec > 59) {
804 stopwatch_screen.sec = 0;
805 stopwatch_screen.min++;
807 if (stopwatch_screen.min > 59) {
808 stopwatch_screen.min = 0;
809 stopwatch_screen.hr++;
811 if (stopwatch_screen.hr > 59) {
812 stopwatch_screen.hr = 0;
814 if (stopwatch_screen.csec % 10 == 0)
815 draw_stop_watch_screen(&stopwatch_screen);
816 //update_stop_watch_screen(&stopwatch_screen);
817 return EVENT_RET_HANDLED;
820 return EVENT_RET_UNHANDLED;
823 return EVENT_RET_HANDLED;
828 * Alarm screen, shown when alarm is fired
830 void draw_alarm_screen(void)
832 hal_lcd_clear_display();
834 oswald_draw_bitmap(36, 20, alarm_icon_width, alarm_icon_height, alarm_icon_bits);
836 hal_lcd_update_display();
839 event_ret_t alarm_handle_events(uint16_t event, void *data)
842 case EVENT_SCREEN_VISIBLE:
844 hal_enable_halfsecond_timer();
845 hal_vibration_set_state(TRUE);
846 return EVENT_RET_HANDLED;
848 case EVENT_SCREEN_DESTROY:
849 hal_disable_halfsecond_timer();
850 hal_lcd_set_backlight(FALSE);
851 hal_vibration_set_state(FALSE);
852 return EVENT_RET_HANDLED;
854 case EVENT_USER_BUTTONS:
855 dbg_out("button event %d\n", *(int *)data);
856 return EVENT_RET_UNHANDLED;
858 case EVENT_HALF_SEC_TIMER:
859 hal_lcd_set_backlight(!hal_lcd_get_backlight());
860 hal_vibration_set_state(!hal_vibration_get_state());
862 return EVENT_RET_HANDLED;
865 return EVENT_RET_UNHANDLED;
868 return EVENT_RET_HANDLED;
873 * Bluetooth setup screen
881 static bluetooth_data_t bluetooth_screen = {
888 void draw_bluetooth_screen(bluetooth_data_t *sdata)
893 hal_lcd_clear_display();
895 oswald_draw_bitmap(36, 0, Bluetooth_icon_width, Bluetooth_icon_height, Bluetooth_icon_bits);
897 oswald_draw_bitmap(81, 6, upbutton_icon_width, upbutton_icon_height, upbutton_icon_bits);
898 oswald_draw_bitmap(81, 38, downbutton_icon_width, downbutton_icon_height, downbutton_icon_bits);
900 oswald_write_string(1, 30, FONT_DROID8x12, "Enable:");
901 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
902 oswald_write_character(53, 30, FONT_DROID8x12, bluetooth_screen.bt_en ? 'x' : '_');
904 oswald_write_string(1, 40, FONT_DROID8x12, "State:");
905 switch (hal_bluetooth_get_state()) {
907 oswald_write_string(53, 40, FONT_DROID8x12, "off");
910 oswald_write_string(53, 40, FONT_DROID8x12, "on");
912 case BLUETOOTH_CONNECTED:
913 oswald_write_string(53, 40, FONT_DROID8x12, "conn.");
918 oswald_write_string(1, 50, FONT_DROID8x12, "Visible:");
919 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
920 oswald_write_character(53, 50, FONT_DROID8x12, hal_bluetooth_get_visible() ? 'x' : '_');
923 if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
924 bd_addr = hal_bluetooth_get_local_bdaddr();
925 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]);
926 oswald_write_string(2, 85, FONT_5x7, bstr);
930 hal_lcd_update_display();
933 void bluetooth_handle_updown(uint8_t pos, int8_t incr)
937 if (hal_bluetooth_get_state() >= BLUETOOTH_ON) {
938 hal_bluetooth_set_state(BLUETOOTH_OFF);
939 bluetooth_screen.bt_en = FALSE;
941 hal_bluetooth_set_state(BLUETOOTH_ON);
942 bluetooth_screen.bt_en = TRUE;
946 if (hal_bluetooth_get_state() >= BLUETOOTH_ON && !hal_bluetooth_get_visible()) {
947 hal_bluetooth_set_visible(TRUE);
949 hal_bluetooth_set_visible(FALSE);
971 event_ret_t handle_bluetooth_buttons(watch_button button, bluetooth_data_t *sdata)
973 if (bluetooth_screen.set_mode) {
976 bluetooth_handle_updown(sdata->pos, 1);
979 bluetooth_handle_updown(sdata->pos, -1);
986 bluetooth_screen.set_mode = FALSE;
989 return EVENT_RET_UNHANDLED;
995 bluetooth_screen.set_mode = TRUE;
998 return EVENT_RET_UNHANDLED;
1003 draw_bluetooth_screen(sdata);
1005 return EVENT_RET_HANDLED;
1008 event_ret_t bluetooth_screen_events(uint16_t event, void *data)
1011 case EVENT_SCREEN_VISIBLE:
1012 bluetooth_screen.pos = 0;
1013 bluetooth_screen.bt_en = (hal_bluetooth_get_state() > 0);
1014 draw_bluetooth_screen(&bluetooth_screen);
1015 hal_enable_halfsecond_timer();
1017 case EVENT_SCREEN_DESTROY:
1018 hal_disable_halfsecond_timer();
1020 case EVENT_USER_BUTTONS:
1021 dbg_out("button event %d\n", *(int *)data);
1022 return handle_bluetooth_buttons(*(watch_button *)data, &bluetooth_screen);
1024 case EVENT_HALF_SEC_TIMER:
1025 if (bluetooth_screen.set_mode) {
1026 if (bluetooth_screen.on)
1027 bluetooth_screen.on = FALSE;
1029 bluetooth_screen.on = TRUE;
1031 bluetooth_screen.on = TRUE;
1032 draw_bluetooth_screen(&bluetooth_screen);
1035 return EVENT_RET_UNHANDLED;
1038 return EVENT_RET_HANDLED;
1045 void draw_info_screen(accel_data_t *accel_data)
1047 hal_lcd_clear_display();
1049 oswald_draw_bitmap(36, 0, info_icon_width, info_icon_height, info_icon_bits);
1051 oswald_write_string(2, 29, FONT_DROID8x12, "Oswald");
1052 oswald_write_string(35, 29, FONT_DROID8x12, OSWALD_VERSION);
1053 oswald_write_string(2, 41, FONT_DROID8x12, "HAL");
1054 oswald_write_string(35, 41, FONT_DROID8x12, (char *)hal_get_version_string());
1055 oswald_write_string(2, 53, FONT_DROID8x12, "Build");
1056 oswald_write_string(35, 53, FONT_DROID8x12, (char *)hal_get_buildno_string());
1057 oswald_write_string(2, 65, FONT_DROID8x12, "Radio");
1058 oswald_write_string(35, 65, FONT_DROID8x12, (char *)hal_get_radio_version_string());
1060 hal_lcd_update_display();
1063 event_ret_t info_screen_handle_events(uint16_t event, void *data)
1066 case EVENT_SCREEN_VISIBLE:
1067 draw_info_screen(&accel_screen.accdata);
1068 return EVENT_RET_HANDLED;
1070 case EVENT_USER_BUTTONS:
1071 dbg_out("button event %d\n", *(int *)data);
1074 return EVENT_RET_UNHANDLED;
1077 return EVENT_RET_UNHANDLED;