2 #include "oswald_watch_faces.h"
3 #include "oswald_screens.h"
7 #include "oswald_main.h"
10 * some variable defining our curent state
11 * these are globals in order to avoid having to pass pointers
12 * through function calls thus saving stack space
14 clock_state OswaldClk;
15 watch_state OswaldState;
16 watch_screen OswaldScreens[SCREENS_END];
19 void oswald_change_to_screen(screen_number screen_id)
21 // we spare the update if no change happened
22 if (OswaldState.screen_id != screen_id) {
23 OswaldState.screen_id = screen_id;
24 if ((OswaldState.screen->event_func != NULL) &&
25 (OswaldState.screen->event_mask & EVENT_SCREEN_VISIBLE))
26 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
30 void oswald_set_time(u8t hour, u8t minute, u8t second, boolean clk24hr)
32 OswaldClk.hour = hour;
33 OswaldClk.minute = minute;
34 OswaldClk.second = second;
35 OswaldClk.clk24hr = clk24hr;
38 void oswald_set_date(u8t day, u8t month, u16t year, boolean day_first)
41 OswaldClk.month = month;
42 OswaldClk.year = year;
43 OswaldClk.day_first = day_first;
46 static void update_clock_state (void)
48 OswaldClk.second += 1;
49 if (OswaldClk.second > 59) {
51 OswaldClk.minute += 1;
54 if (OswaldClk.minute > 59) {
59 if (OswaldClk.hour > 23) {
66 void oswald_one_second_tick(void)
68 /* update our 'RTC' */
71 /* wake-up screen if interested in the one-second-event */
72 if (OswaldState.screen->event_func != NULL &&
73 (OswaldState.screen->event_mask & EVENT_ONE_SEC_TIMER))
74 OswaldState.screen->event_func(EVENT_ONE_SEC_TIMER, NULL);
77 void oswald_centisecond_tick(void)
79 if (OswaldState.screen->event_func != NULL &&
80 (OswaldState.screen->event_mask & EVENT_CS_TIMER))
81 OswaldState.screen->event_func(EVENT_CS_TIMER, NULL);
84 void oswald_halfsecond_tick(void)
86 if (OswaldState.screen->event_func != NULL &&
87 (OswaldState.screen->event_mask & EVENT_HALF_SEC_TIMER))
88 OswaldState.screen->event_func(EVENT_HALF_SEC_TIMER, NULL);
91 void oswald_handle_button_press(watch_button button)
98 if (OswaldState.screen->event_func != NULL &&
99 (OswaldState.screen->event_mask & EVENT_USER_BUTTONS))
100 OswaldState.screen->event_func(EVENT_USER_BUTTONS, &button);
103 OswaldState.screen->event_func(EVENT_SCREEN_DESTROY, NULL);
105 OswaldState.screen_id++;
106 if (OswaldState.screen_id >= LAST_SCREEN) {
107 OswaldState.screen_id = IDLE_SCREEN;
109 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
110 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
116 // should never get here
121 void oswald_handle_accel_event(u8t x, u8t y, u8t z)
123 accel_data_t accel_data;
129 if (OswaldState.screen->event_func != NULL &&
130 (OswaldState.screen->event_mask & EVENT_ACCEL_UPDATE))
131 OswaldState.screen->event_func(EVENT_ACCEL_UPDATE, &accel_data);
134 void oswald_handle_ambientlight_event(u8t light_level)
136 if (OswaldState.screen->event_func != NULL &&
137 (OswaldState.screen->event_mask & EVENT_AMBIENTLIGHT_UPDATE))
138 OswaldState.screen->event_func(EVENT_AMBIENTLIGHT_UPDATE, &light_level);
141 void oswald_init(void)
143 OswaldScreens[IDLE_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ONE_SEC_TIMER;
144 OswaldScreens[IDLE_SCREEN].event_func = idle_handle_events;
146 OswaldScreens[ACCEL_DISPLAY_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ACCEL_UPDATE;
147 OswaldScreens[ACCEL_DISPLAY_SCREEN].event_func = accel_handle_events;
149 OswaldScreens[DATETIME_SETTING_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_HALF_SEC_TIMER;
150 OswaldScreens[DATETIME_SETTING_SCREEN].event_func = datetime_setup_events;
152 OswaldScreens[MENU_TEST_SCREEN].event_mask = EVENT_USER_BUTTONS;
153 OswaldScreens[MENU_TEST_SCREEN].event_func = test_menu_handle_events;
155 OswaldScreens[STOP_WATCH_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_CS_TIMER;
156 OswaldScreens[STOP_WATCH_SCREEN].event_func = stop_watch_handle_events;
158 OswaldState.screen_id = IDLE_SCREEN;
159 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
161 if (OswaldState.screen->event_func != NULL)
162 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);