X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=ui%2Foswald_main.c;h=e080a7130aee0a0716809031ac66f12ac0ad8d30;hp=15091a6e7229d6e95e410ca8cd3c7c216d20682e;hb=5d0ff002cee35d109f4a60eff415b2db556fb8f4;hpb=dff6532fd5dbbd4a6c2f0fff2c428201b225c529 diff --git a/ui/oswald_main.c b/ui/oswald_main.c index 15091a6..e080a71 100644 --- a/ui/oswald_main.c +++ b/ui/oswald_main.c @@ -1,6 +1,7 @@ #include "oswald.h" #include "oswald_watch_faces.h" #include "oswald_screens.h" +#include "oswald_hal.h" #include "embedvm.h" @@ -12,9 +13,11 @@ * through function calls thus saving stack space */ clock_state OswaldClk; +alarm_clk OswaldAlarm; watch_state OswaldState; watch_screen OswaldScreens[SCREENS_END]; - +power_state OswaldPowerState; +u8t backlight_safety_off = 0; void oswald_change_to_screen(screen_number screen_id) { @@ -45,29 +48,33 @@ void oswald_set_date(u8t day, u8t month, u16t year, boolean day_first) static void update_clock_state (void) { - OswaldClk.second += 1; - if (OswaldClk.second > 59) { - OswaldClk.second = 0; - OswaldClk.minute += 1; - } else - return; - if (OswaldClk.minute > 59) { - OswaldClk.minute = 0; - OswaldClk.hour += 1; - } else - return; - if (OswaldClk.hour > 23) { - OswaldClk.hour = 0; - // day++ - } else - return; + hal_get_rtc(&OswaldClk); + + /* check for pending alarm once per minute */ + if (OswaldClk.second == 0) { + if (OswaldClk.hour == OswaldAlarm.hour && + OswaldClk.minute == OswaldAlarm.minute && + ((1 << OswaldClk.wday) & OswaldAlarm.wday)) { + OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL); + OswaldState.screen_id = ALARM_SCREEN; + OswaldState.screen = &OswaldScreens[OswaldState.screen_id]; + OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL); + } + } } void oswald_one_second_tick(void) { - /* update our 'RTC' */ + /* update clock - should use RTC if available */ update_clock_state(); + hal_get_power_state(&OswaldPowerState); + if (backlight_safety_off) { + backlight_safety_off--; + if (!backlight_safety_off) + hal_lcd_set_backlight(FALSE); + } + /* wake-up screen if interested in the one-second-event */ if (OswaldState.screen->event_func != NULL && (OswaldState.screen->event_mask & EVENT_ONE_SEC_TIMER)) @@ -91,10 +98,20 @@ void oswald_halfsecond_tick(void) void oswald_handle_button_press(watch_button button) { switch (button) { + case BUTTON_D: + // backlight on/off + if (hal_lcd_get_backlight()) { + hal_lcd_set_backlight(FALSE); + backlight_safety_off = 0; + } else { + hal_lcd_set_backlight(TRUE); + backlight_safety_off = 2; + } + break; case BUTTON_A: case BUTTON_B: - case BUTTON_D: case BUTTON_E: + case BUTTON_F: if (OswaldState.screen->event_func != NULL && (OswaldState.screen->event_mask & EVENT_USER_BUTTONS)) OswaldState.screen->event_func(EVENT_USER_BUTTONS, &button); @@ -109,9 +126,6 @@ void oswald_handle_button_press(watch_button button) OswaldState.screen = &OswaldScreens[OswaldState.screen_id]; OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL); break; - case BUTTON_F: - // backlight on/off - break; default: // should never get here break; @@ -149,16 +163,26 @@ void oswald_init(void) OswaldScreens[DATETIME_SETTING_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_HALF_SEC_TIMER; OswaldScreens[DATETIME_SETTING_SCREEN].event_func = datetime_setup_events; + OswaldScreens[ALARM_SETUP_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_HALF_SEC_TIMER; + OswaldScreens[ALARM_SETUP_SCREEN].event_func = alarm_setup_events; + OswaldScreens[MENU_TEST_SCREEN].event_mask = EVENT_USER_BUTTONS; OswaldScreens[MENU_TEST_SCREEN].event_func = test_menu_handle_events; OswaldScreens[STOP_WATCH_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_CS_TIMER; OswaldScreens[STOP_WATCH_SCREEN].event_func = stop_watch_handle_events; + OswaldScreens[ALARM_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_HALF_SEC_TIMER; + OswaldScreens[ALARM_SCREEN].event_func = alarm_handle_events; + OswaldState.screen_id = IDLE_SCREEN; OswaldState.screen = &OswaldScreens[OswaldState.screen_id]; if (OswaldState.screen->event_func != NULL) OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL); + + OswaldAlarm.hour = 12; + OswaldAlarm.minute = 0; + OswaldAlarm.wday = 0x00; }