X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=ui%2Foswald_main.c;h=02396d4bddab2205c9077dd4cb3097eabacb0fa1;hb=b83e605bc8ba69950a84b6ed268f0c196f68762c;hp=dc8cfa1c34401f5ad4553937f2c05dc4f4ea7331;hpb=013b763c4c6740bb48dfcb28c2dd8547ff7e7697;p=oswald.git diff --git a/ui/oswald_main.c b/ui/oswald_main.c index dc8cfa1..02396d4 100644 --- a/ui/oswald_main.c +++ b/ui/oswald_main.c @@ -1,7 +1,9 @@ #include "oswald.h" #include "oswald_watch_faces.h" -#include "Fonts.h" -#include "LcdDisplay.h" +#include "oswald_screens.h" +#include "oswald_hal.h" + +#include "embedvm.h" #include "oswald_main.h" @@ -11,103 +13,120 @@ * 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; +char MainMessage[148]; -void update_screen(void) -{ - if (OswaldState.user_screendraw_func != NULL) - OswaldState.user_screendraw_func(); -} -void oswald_change_to_screen(screen_number screen) +void oswald_change_to_screen(screen_number screen_id) { // we spare the update if no change happened - if (OswaldState.screen != screen) { - OswaldState.screen = screen; - update_screen(); + if (OswaldState.screen_id != screen_id) { + OswaldState.screen_id = screen_id; + if ((OswaldState.screen->event_func != NULL) && + (OswaldState.screen->event_mask & EVENT_SCREEN_VISIBLE)) + OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL); } } -void oswald_set_time(u8t hour, u8t minute, u8t second) +void oswald_set_time(u8t hour, u8t minute, u8t second, boolean clk24hr) { OswaldClk.hour = hour; OswaldClk.minute = minute; OswaldClk.second = second; + OswaldClk.clk24hr = clk24hr; +} + +void oswald_set_date(u8t day, u8t month, u16t year, boolean day_first) +{ + OswaldClk.day = day; + OswaldClk.month = month; + OswaldClk.year = year; + OswaldClk.day_first = 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 clock - should use RTC if available */ update_clock_state(); - update_screen(); + + 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)) + OswaldState.screen->event_func(EVENT_ONE_SEC_TIMER, NULL); } -void draw_accel_screen(void) +void oswald_centisecond_tick(void) { - lcd_clear_display(); - SetFont(MetaWatch16); - WriteLcdString(2, 2, "X:"); - WriteLcdString(20, 2, "123"); - WriteLcdString(2, 18, "Z:"); - WriteLcdString(20, 18, "123"); - WriteLcdString(2, 34, "Y:"); - WriteLcdString(20, 34, "123"); + if (OswaldState.screen->event_func != NULL && + (OswaldState.screen->event_mask & EVENT_CS_TIMER)) + OswaldState.screen->event_func(EVENT_CS_TIMER, NULL); } -void idle_handle_user_buttons(watch_button button) +void oswald_halfsecond_tick(void) { + if (OswaldState.screen->event_func != NULL && + (OswaldState.screen->event_mask & EVENT_HALF_SEC_TIMER)) + OswaldState.screen->event_func(EVENT_HALF_SEC_TIMER, NULL); } 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: - if (OswaldState.user_button_func != NULL) - OswaldState.user_button_func(button); + case BUTTON_F: + if (OswaldState.screen->event_func != NULL && + (OswaldState.screen->event_mask & EVENT_USER_BUTTONS)) + OswaldState.screen->event_func(EVENT_USER_BUTTONS, &button); break; case BUTTON_C: + OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL); // next screen - OswaldState.screen++; - if (OswaldState.screen >= LAST_SCREEN) { - OswaldState.screen = IDLE_SCREEN; - OswaldState.user_button_func = idle_handle_user_buttons; - OswaldState.user_screendraw_func = DrawLcdDigitalClock; - } else { - switch (OswaldState.screen) { - case SETTING_DATETIME_SCREEN: - OswaldState.user_button_func = idle_handle_user_buttons; - OswaldState.user_screendraw_func = draw_accel_screen; - break; - default: - break; - }; + OswaldState.screen_id++; + if (OswaldState.screen_id >= LAST_SCREEN) { + OswaldState.screen_id = IDLE_SCREEN; }; - update_screen(); - break; - case BUTTON_F: - // backlight on/off + OswaldState.screen = &OswaldScreens[OswaldState.screen_id]; + OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL); break; default: // should never get here @@ -115,11 +134,80 @@ void oswald_handle_button_press(watch_button button) }; } +void oswald_handle_accel_event(u8t x, u8t y, u8t z) +{ + accel_data_t accel_data; + + accel_data.x = x; + accel_data.y = y; + accel_data.z = z; + + if (OswaldState.screen->event_func != NULL && + (OswaldState.screen->event_mask & EVENT_ACCEL_UPDATE)) + OswaldState.screen->event_func(EVENT_ACCEL_UPDATE, &accel_data); +} + +void oswald_handle_ambientlight_event(u8t light_level) +{ + if (OswaldState.screen->event_func != NULL && + (OswaldState.screen->event_mask & EVENT_AMBIENTLIGHT_UPDATE)) + OswaldState.screen->event_func(EVENT_AMBIENTLIGHT_UPDATE, &light_level); +} + +void oswald_handle_comm_input(uint16_t mlen, const void *mdat) +{ + char *icmd = (char *) mdat; + + if (icmd[0] == '$') { + if (strncmp(icmd, "$GRT", 4) == 0) { // get current RTC + char rtime[16]; + snprintf(rtime, 10, "%02d%02d%02d\n", OswaldClk.hour, OswaldClk.minute, OswaldClk.second); + hal_bluetooth_send_data(rtime, strlen(rtime)); + } else if (strncmp(icmd, "$MSG", 4) == 0) { // message on main screen + char *msg = (icmd+4); + mlen -= 4; + memset(MainMessage, 0, 148); + strncpy(MainMessage, msg, (mlen > 147) ? 147 : mlen); + } else if (strncmp(icmd, "$MCL", 4) == 0) { // clear message + memset(MainMessage, 0, 148); + } + } +} + void oswald_init(void) { - OswaldState.screen = IDLE_SCREEN; - OswaldState.idle_show_seconds = FALSE; - OswaldState.user_screendraw_func = DrawLcdDigitalClock; - OswaldState.user_button_func = idle_handle_user_buttons; + OswaldScreens[IDLE_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ONE_SEC_TIMER; + OswaldScreens[IDLE_SCREEN].event_func = idle_handle_events; + + OswaldScreens[ACCEL_DISPLAY_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ACCEL_UPDATE; + OswaldScreens[ACCEL_DISPLAY_SCREEN].event_func = accel_handle_events; + + 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[BLUETOOTH_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_HALF_SEC_TIMER; + OswaldScreens[BLUETOOTH_SCREEN].event_func = bluetooth_screen_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; }