X-Git-Url: https://git.karo-electronics.de/?p=oswald.git;a=blobdiff_plain;f=ui%2Foswald_main.c;h=82b856712f9ebe3a1ec42c3c64dcac273b2a3a4c;hp=9dd69ccac87166010f2d9aac62b1045af1ce4132;hb=8e3cbad72c8e3abb97f2081527f91af98d8558be;hpb=e09935ae9396421171a3bc4e32320874a0bfd193 diff --git a/ui/oswald_main.c b/ui/oswald_main.c index 9dd69cc..82b8567 100644 --- a/ui/oswald_main.c +++ b/ui/oswald_main.c @@ -1,5 +1,8 @@ #include "oswald.h" #include "oswald_watch_faces.h" +#include "oswald_screens.h" + +#include "embedvm.h" #include "oswald_main.h" @@ -10,27 +13,17 @@ */ clock_state OswaldClk; watch_state OswaldState; +watch_screen OswaldScreens[LAST_SCREEN]; -void update_screen(void) -{ - switch (OswaldState.screen) { - case IDLE_SCREEN: - if (OswaldState.idle_draw_func != NULL) - OswaldState.idle_draw_func(OswaldState.idle_show_seconds); - break; - case APPLICATION_SCREEN: - break; - deafault: - break; - }; -} -void oswald_change_to_screen(screen_number screen) +void oswald_change_to_screen(screen_number screen_id) { - // we spare the update if no change - if (OswaldState.screen != screen) { - OswaldState.screen = screen; - update_screen(); + // we spare the update if no change happened + 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); } } @@ -63,18 +56,65 @@ static void update_clock_state (void) void oswald_one_second_tick(void) { + /* update our 'RTC' */ update_clock_state(); - update_screen(); + + /* 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); + // oswald_update_screen(); } void oswald_handle_button_press(watch_button button) { + switch (button) { + case BUTTON_A: + case BUTTON_B: + case BUTTON_D: + case BUTTON_E: + 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: + // next screen + OswaldState.screen_id++; + if (OswaldState.screen_id >= LAST_SCREEN) { + OswaldState.screen_id = IDLE_SCREEN; + }; + OswaldState.screen = &OswaldScreens[OswaldState.screen_id]; + //oswald_update_screen(); + OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL); + break; + case BUTTON_F: + // backlight on/off + break; + default: + // should never get here + break; + }; } void oswald_init(void) { - OswaldState.screen = IDLE_SCREEN; - OswaldState.idle_draw_func = DrawLcdDigitalClock; - OswaldState.idle_show_seconds = FALSE; + 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; + OswaldScreens[ACCEL_DISPLAY_SCREEN].event_func = accel_handle_events; + + + OswaldScreens[DATETIME_SETTING_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ONE_SEC_TIMER; + OswaldScreens[DATETIME_SETTING_SCREEN].event_func = datetime_setup_events; + + OswaldScreens[MENU_TEST_SCREEN].event_mask = EVENT_USER_BUTTONS; + OswaldScreens[MENU_TEST_SCREEN].event_func = test_menu_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); }