]> git.karo-electronics.de Git - oswald.git/blob - ui/oswald_main.c
Make idle selectable
[oswald.git] / ui / oswald_main.c
1 #include "oswald.h"
2 #include "oswald_watch_faces.h"
3 #include "oswald_screens.h"
4
5 #include "embedvm.h"
6
7 #include "oswald_main.h"
8
9 /*
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
13  */
14 clock_state OswaldClk;
15 watch_state OswaldState;
16 watch_screen OswaldScreens[LAST_SCREEN];
17
18
19 void oswald_change_to_screen(screen_number screen_id)
20 {
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);
27         }
28 }
29
30 void oswald_set_time(u8t hour, u8t minute, u8t second)
31 {
32         OswaldClk.hour = hour;
33         OswaldClk.minute = minute;
34         OswaldClk.second = second;
35 }
36
37 static void update_clock_state (void)
38 {
39         OswaldClk.second += 1;
40         if (OswaldClk.second > 59) {
41                 OswaldClk.second = 0;
42                 OswaldClk.minute += 1;
43         } else
44                 return;
45         if (OswaldClk.minute > 59) {
46                 OswaldClk.minute = 0;
47                 OswaldClk.hour += 1;
48         } else
49                 return;
50         if (OswaldClk.hour > 23) {
51                 OswaldClk.hour = 0;
52                 // day++
53         } else
54                 return;
55 }
56
57 void oswald_one_second_tick(void)
58 {
59         /* update our 'RTC' */
60         update_clock_state();
61
62         /* wake-up screen if interested in the one-second-event */
63         if (OswaldState.screen->event_func != NULL &&
64             (OswaldState.screen->event_mask & EVENT_ONE_SEC_TIMER))
65                 OswaldState.screen->event_func(EVENT_ONE_SEC_TIMER, NULL);
66         // oswald_update_screen();
67 }
68
69 void oswald_handle_button_press(watch_button button)
70 {
71         switch (button) {
72                 case BUTTON_A:
73                 case BUTTON_B:
74                 case BUTTON_D:
75                 case BUTTON_E:
76                         if (OswaldState.screen->event_func != NULL &&
77                             (OswaldState.screen->event_mask & EVENT_USER_BUTTONS))
78                                 OswaldState.screen->event_func(EVENT_USER_BUTTONS, &button);
79                         break;
80                 case BUTTON_C:
81                         // next screen
82                         OswaldState.screen_id++;
83                         if (OswaldState.screen_id >= LAST_SCREEN) {
84                                 OswaldState.screen_id = IDLE_SCREEN;
85                         };
86                         OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
87                         //oswald_update_screen();
88                         OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
89                         break;
90                 case BUTTON_F:
91                         // backlight on/off
92                         break;
93                 default:
94                         // should never get here
95                         break;
96         };
97 }
98
99 void oswald_init(void)
100 {
101         OswaldScreens[IDLE_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ONE_SEC_TIMER;
102         OswaldScreens[IDLE_SCREEN].event_func = idle_handle_events;
103
104         OswaldScreens[ACCEL_DISPLAY_SCREEN].event_mask = EVENT_USER_BUTTONS;
105         OswaldScreens[ACCEL_DISPLAY_SCREEN].event_func = accel_handle_events;
106         
107
108         OswaldScreens[DATETIME_SETTING_SCREEN].event_mask = EVENT_USER_BUTTONS | EVENT_ONE_SEC_TIMER;
109         OswaldScreens[DATETIME_SETTING_SCREEN].event_func = datetime_setup_events;
110
111         OswaldScreens[MENU_TEST_SCREEN].event_mask = EVENT_USER_BUTTONS;
112         OswaldScreens[MENU_TEST_SCREEN].event_func = test_menu_handle_events;
113
114         OswaldState.screen_id = IDLE_SCREEN;
115         OswaldState.screen = &OswaldScreens[OswaldState.screen_id];
116
117         if (OswaldState.screen->event_func != NULL)
118                 OswaldState.screen->event_func(EVENT_SCREEN_VISIBLE, NULL);
119 }
120