2 #include "oswald_main.h"
3 #include "oswald_watch_faces.h"
5 #include "LcdDisplay.h"
7 #include "oswald_screens.h"
11 void (*screendraw_func)(boolean show_seconds);
15 static idle_data_t idle_screen = {
21 void idle_handle_user_buttons(watch_button button)
25 if (idle_screen.show_seconds)
26 idle_screen.show_seconds = FALSE;
28 idle_screen.show_seconds = TRUE;
31 if (idle_screen.analogue == TRUE) {
32 idle_screen.analogue = FALSE;
33 idle_screen.screendraw_func = DrawLcdDigitalClock;
35 idle_screen.analogue = TRUE;
36 idle_screen.screendraw_func = DrawLcdAnaClock;
40 OswaldState.screen_id = DATETIME_SETTING_SCREEN;
41 OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
42 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
48 idle_screen.screendraw_func(idle_screen.show_seconds);
51 void idle_handle_events(u16t event, void *data)
54 case EVENT_ONE_SEC_TIMER:
55 case EVENT_SCREEN_VISIBLE:
56 idle_screen.screendraw_func(idle_screen.show_seconds);
58 case EVENT_USER_BUTTONS:
59 dbg_out("button event %d\n", *(int *)data);
60 idle_handle_user_buttons(*(watch_button *)data);
71 static accelscreen_data_t accel_screen = {
75 void draw_accel_screen(accel_data_t *accel_data)
79 WriteLcdString(2, 2, "X:");
80 WriteLcdNumber(20, 2, accel_data->x);
81 WriteLcdString(2, 18, "Y:");
82 WriteLcdNumber(20, 18, accel_data->y);
83 WriteLcdString(2, 34, "Z:");
84 WriteLcdNumber(20, 34, accel_data->z);
87 void accel_handle_events(u16t event, void *data)
90 case EVENT_SCREEN_VISIBLE:
91 draw_accel_screen(&accel_screen.accdata);
93 case EVENT_ACCEL_UPDATE: {
94 accel_data_t *accel_data = (accel_data_t *)data;
95 accel_screen.accdata.x = accel_data->x;
96 accel_screen.accdata.y = accel_data->y;
97 accel_screen.accdata.z = accel_data->z;
98 draw_accel_screen(&accel_screen.accdata);
101 case EVENT_USER_BUTTONS:
102 dbg_out("button event %d\n", *(int *)data);
113 } datetime_setup_data_t;
114 static datetime_setup_data_t dt_setup_screen = {
119 void draw_datetime_setup_screen(datetime_setup_data_t *sdata)
122 SetFont(MetaWatch16);
123 WriteLcdString(2, 2, "Set");
125 SetFont(MetaWatchTime);
126 if ((sdata->pos == 0 && sdata->on) || sdata->pos != 0) {
127 WriteLcdCharacter(2, 20, (OswaldClk.hour / 10));
128 WriteLcdCharacter(14, 20, (OswaldClk.hour % 10));
130 WriteLcdCharacter(26, 20, TIME_CHARACTER_COLON_INDEX);
132 if ((sdata->pos == 1 && sdata->on) || sdata->pos != 1) {
133 WriteLcdCharacter(31, 20, (OswaldClk.minute / 10));
134 WriteLcdCharacter(43, 20, (OswaldClk.minute % 10));
137 WriteLcdCharacter(55, 20, TIME_CHARACTER_COLON_INDEX);
139 if ((sdata->pos == 2 && sdata->on) || sdata->pos != 2) {
140 WriteLcdCharacter(60, 20, (OswaldClk.second / 10));
141 WriteLcdCharacter(72, 20, (OswaldClk.second % 10));
144 SetFont(MetaWatch16);
145 if ((sdata->pos == 3 && sdata->on) || sdata->pos != 3) {
146 WriteLcdNumber(2, 45, OswaldClk.day);
148 WriteLcdString(18, 45, ".");
149 if ((sdata->pos == 4 && sdata->on) || sdata->pos != 4) {
150 WriteLcdNumber(22, 45, OswaldClk.month);
152 WriteLcdString(38, 45, ".");
153 if ((sdata->pos == 5 && sdata->on) || sdata->pos != 5) {
154 WriteLcdNumber(42, 45, OswaldClk.year);
158 if ((sdata->pos == 6 && sdata->on) || sdata->pos != 6) {
159 if (OswaldClk.clk24hr)
160 WriteLcdString(2, 66, "x");
162 WriteLcdString(2, 66, "_");
164 WriteLcdString(15, 66, "24hr");
166 if ((sdata->pos == 7 && sdata->on) || sdata->pos != 7) {
167 if (OswaldClk.day_first)
168 WriteLcdString(2, 79, "x");
170 WriteLcdString(2, 79, "_");
172 WriteLcdString(15, 79, "dd.mm. mm/dd");
175 void datetime_handle_updown(u8t pos, s8t incr)
179 if (OswaldClk.hour == 0 && incr == -1) {
183 OswaldClk.hour += incr;
184 if (OswaldClk.hour > 23)
188 if (OswaldClk.minute == 0 && incr == -1) {
189 OswaldClk.minute = 59;
192 OswaldClk.minute += incr;
193 if (OswaldClk.minute > 59)
194 OswaldClk.minute = 0;
197 OswaldClk.second = 0;
200 if (OswaldClk.day == 1 && incr == -1) {
204 OswaldClk.day += incr;
205 if (OswaldClk.day > 31)
209 if (OswaldClk.month == 1 && incr == -1) {
210 OswaldClk.month = 12;
213 OswaldClk.month += incr;
214 if (OswaldClk.month > 12)
218 OswaldClk.year += incr;
220 case 6: // 24hr / 12hr
221 if (OswaldClk.clk24hr)
222 OswaldClk.clk24hr = FALSE;
224 OswaldClk.clk24hr = TRUE;
226 case 7: // dd.mm. / mm/dd
227 if (OswaldClk.day_first)
228 OswaldClk.day_first = FALSE;
230 OswaldClk.day_first = TRUE;
237 void handle_setup_datetime_buttons(watch_button button, datetime_setup_data_t *sdata)
241 datetime_handle_updown(sdata->pos, 1);
244 datetime_handle_updown(sdata->pos, -1);
253 draw_datetime_setup_screen(sdata);
256 void datetime_setup_events(u16t event, void *data)
259 case EVENT_SCREEN_VISIBLE:
260 draw_datetime_setup_screen(&dt_setup_screen);
261 enable_halfsecond_timer();
263 case EVENT_SCREEN_DESTROY:
264 disable_halfsecond_timer();
266 case EVENT_USER_BUTTONS:
267 dbg_out("button event %d\n", *(int *)data);
268 handle_setup_datetime_buttons(*(watch_button *)data, &dt_setup_screen);
270 case EVENT_HALF_SEC_TIMER:
271 if (dt_setup_screen.on)
272 dt_setup_screen.on = FALSE;
274 dt_setup_screen.on = TRUE;
275 draw_datetime_setup_screen(&dt_setup_screen);
286 static test_menu_t test_menu = { 0 };
288 void draw_menu_test_screen(void)
291 SetFont(MetaWatch16);
292 WriteLcdString(2, 2, "Menu");
294 WriteLcdString(2, 20, "Item 1");
295 WriteLcdString(2, 29, "Item 2");
296 WriteLcdString(2, 38, "Item 3");
297 WriteLcdString(2, 47, "Item 4");
298 WriteLcdString(2, 56, "Item 5");
300 WriteLcdString(50, 20+(9*test_menu.menu_pos), "*");
303 static void handle_menu_user_buttons(watch_button button)
307 test_menu.menu_pos--;
308 test_menu.menu_pos%=5;
311 test_menu.menu_pos++;
312 test_menu.menu_pos%=5;
317 draw_menu_test_screen();
320 void test_menu_handle_events(u16t event, void *data)
323 case EVENT_USER_BUTTONS:
324 dbg_out("button event %d\n", *(int *)data);
325 handle_menu_user_buttons(*(watch_button *)data);
327 case EVENT_SCREEN_VISIBLE:
328 test_menu.menu_pos = 0;
329 draw_menu_test_screen();