+typedef struct {
+ u8t pos;
+ boolean on;
+} alarm_setup_data_t;
+static alarm_setup_data_t alarm_setup_screen = {
+ 0,
+ TRUE
+};
+
+void draw_alarm_setup_screen(alarm_setup_data_t *sdata)
+{
+ hal_lcd_clear_display();
+
+ SetFont(MetaWatch16);
+ WriteLcdString(2, 2, "Alarm");
+
+ SetFont(MetaWatchTime);
+ if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
+ WriteLcdCharacter(2, 20, (OswaldAlarm.hour / 10));
+ WriteLcdCharacter(14, 20, (OswaldAlarm.hour % 10));
+ }
+ WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
+
+ if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
+ WriteLcdCharacter(31, 20, (OswaldAlarm.minute / 10));
+ WriteLcdCharacter(43, 20, (OswaldAlarm.minute % 10));
+ }
+
+ SetFont(MetaWatchMonospaced10);
+ WriteLcdCharacter(3, 45, 'S');
+ WriteLcdCharacter(15, 45, 'M');
+ WriteLcdCharacter(27, 45, 'T');
+ WriteLcdCharacter(39, 45, 'W');
+ WriteLcdCharacter(51, 45, 'T');
+ WriteLcdCharacter(63, 45, 'F');
+ WriteLcdCharacter(75, 45, 'S');
+
+ if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2)
+ WriteLcdCharacter(3, 55, (OswaldAlarm.wday & WDAY_SUNDAY) ? 'x' : '_');
+ if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3)
+ WriteLcdCharacter(15, 55, (OswaldAlarm.wday & WDAY_MONDAY) ? 'x' : '_');
+ if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4)
+ WriteLcdCharacter(27, 55, (OswaldAlarm.wday & WDAY_TUESDAY) ? 'x' : '_');
+ if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5)
+ WriteLcdCharacter(39, 55, (OswaldAlarm.wday & WDAY_WEDNESDAY) ? 'x' : '_');
+ if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6)
+ WriteLcdCharacter(51, 55, (OswaldAlarm.wday & WDAY_THURSDAY) ? 'x' : '_');
+ if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7)
+ WriteLcdCharacter(63, 55, (OswaldAlarm.wday & WDAY_FRIDAY) ? 'x' : '_');
+ if ((sdata->pos == 8 && sdata->on) || sdata->pos != 8)
+ WriteLcdCharacter(75, 55, (OswaldAlarm.wday & WDAY_SATURDAY) ? 'x' : '_');
+
+#if 0
+ SetFont(MetaWatch7);
+ if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
+ if (OswaldClk.clk24hr)
+ WriteLcdString(2, 66, "x");
+ else
+ WriteLcdString(2, 66, "_");
+ }
+ WriteLcdString(15, 66, "24hr");
+
+ if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
+ if (OswaldClk.day_first)
+ WriteLcdString(2, 79, "x");
+ else
+ WriteLcdString(2, 79, "_");
+ }
+ WriteLcdString(15, 79, "dd.mm. mm/dd");
+#endif
+ hal_lcd_update_display();
+}
+
+void alarm_handle_updown(u8t pos, s8t incr)
+{
+ switch (pos) {
+ case 0: // hour
+ if (OswaldAlarm.hour == 0 && incr == -1) {
+ OswaldAlarm.hour = 23;
+ break;
+ };
+ OswaldAlarm.hour += incr;
+ if (OswaldAlarm.hour > 23)
+ OswaldAlarm.hour = 0;
+ break;
+ case 1: // minute
+ if (OswaldAlarm.minute == 0 && incr == -1) {
+ OswaldAlarm.minute = 59;
+ break;
+ };
+ OswaldAlarm.minute += incr;
+ if (OswaldAlarm.minute > 59)
+ OswaldAlarm.minute = 0;
+ break;
+ case 2: // sunday
+ OswaldAlarm.wday ^= WDAY_SUNDAY;
+ break;
+ case 3: // monday
+ OswaldAlarm.wday ^= WDAY_MONDAY;
+ break;
+ case 4: // tuesday
+ OswaldAlarm.wday ^= WDAY_TUESDAY;
+ break;
+ case 5: // wednesday
+ OswaldAlarm.wday ^= WDAY_WEDNESDAY;
+ break;
+ case 6: // thursday
+ OswaldAlarm.wday ^= WDAY_THURSDAY;
+ break;
+ case 7: // friday
+ OswaldAlarm.wday ^= WDAY_FRIDAY;
+ break;
+ case 8: // saturday
+ OswaldAlarm.wday ^= WDAY_SATURDAY;
+ break;
+ default:
+ break;
+ };
+}
+
+void handle_setup_alarm_buttons(watch_button button, alarm_setup_data_t *sdata)
+{
+ switch (button) {
+ case BUTTON_A:
+ alarm_handle_updown(sdata->pos, 1);
+ break;
+ case BUTTON_B:
+ alarm_handle_updown(sdata->pos, -1);
+ break;
+ case BUTTON_F:
+ sdata->pos++;
+ sdata->pos %= 9;
+ break;
+ default:
+ break;
+ }
+ draw_alarm_setup_screen(sdata);
+}
+
+void alarm_setup_events(u16t event, void *data)
+{
+ switch (event) {
+ case EVENT_SCREEN_VISIBLE:
+ alarm_setup_screen.pos = 0;
+ draw_alarm_setup_screen(&alarm_setup_screen);
+ hal_enable_halfsecond_timer();
+ break;
+ case EVENT_SCREEN_DESTROY:
+ hal_disable_halfsecond_timer();
+ break;
+ case EVENT_USER_BUTTONS:
+ dbg_out("button event %d\n", *(int *)data);
+ handle_setup_alarm_buttons(*(watch_button *)data, &alarm_setup_screen);
+ break;
+ case EVENT_HALF_SEC_TIMER:
+ if (alarm_setup_screen.on)
+ alarm_setup_screen.on = FALSE;
+ else
+ alarm_setup_screen.on = TRUE;
+ draw_alarm_setup_screen(&alarm_setup_screen);
+ break;
+ default:
+ break;
+ };
+}
+