diff options
Diffstat (limited to 'launcher/launcher.c')
-rw-r--r-- | launcher/launcher.c | 90 |
1 files changed, 43 insertions, 47 deletions
diff --git a/launcher/launcher.c b/launcher/launcher.c index 26fec93e..ff10cf6e 100644 --- a/launcher/launcher.c +++ b/launcher/launcher.c @@ -7,6 +7,11 @@ LauncherState launcher_state; void * widget_contexts[LAUNCHER_NUM_WIDGETS]; +void cb_mode_pressed(); +void cb_light_pressed(); +void cb_alarm_pressed(); +void cb_tick(); + void launcher_request_tick_frequency(uint8_t freq) { watch_rtc_disable_all_periodic_callbacks(); watch_rtc_register_periodic_callback(cb_tick, freq); @@ -16,10 +21,26 @@ void launcher_illuminate_led() { launcher_state.light_ticks = 3; } +void launcher_move_to_next_widget() { + launcher_state.widget_changed = true; + widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + launcher_state.current_widget = (launcher_state.current_widget + 1) % LAUNCHER_NUM_WIDGETS; + widgets[launcher_state.current_widget].activate(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + watch_display_string(widgets[launcher_state.current_widget].widget_name, 0); +} + +void launcher_move_to_first_widget() { + launcher_state.widget_changed = true; + widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + launcher_state.current_widget = 0; + widgets[0].activate(&launcher_state.launcher_settings, widget_contexts[0]); + watch_display_string(widgets[launcher_state.current_widget].widget_name, 0); +} void app_init() { memset(&launcher_state, 0, sizeof(launcher_state)); launcher_state.launcher_settings.bit.led_green_color = 0xF; + launcher_state.launcher_settings.bit.led_red_color = 0x0; } void app_wake_from_deep_sleep() { @@ -41,6 +62,8 @@ void app_setup() { for(uint8_t i = 0; i < LAUNCHER_NUM_WIDGETS; i++) { widgets[i].setup(&launcher_state.launcher_settings, widget_contexts[i]); } + + launcher_move_to_first_widget(); } void app_prepare_for_sleep() { @@ -61,8 +84,10 @@ bool app_loop() { // If the LED is off and should be on, turn it on if (launcher_state.light_ticks > 0 && !launcher_state.led_on) { - watch_set_led_color(launcher_state.launcher_settings.bit.led_red_color, launcher_state.launcher_settings.bit.led_green_color); + watch_set_led_color(launcher_state.launcher_settings.bit.led_red_color ? (0xF | launcher_state.launcher_settings.bit.led_red_color << 4) : 0, + launcher_state.launcher_settings.bit.led_green_color ? (0xF | launcher_state.launcher_settings.bit.led_green_color << 4) : 0); launcher_state.led_on = true; + } // if the LED is on and should be off, turn it off @@ -77,71 +102,42 @@ bool app_loop() { } if (event) { - event = 0; widgets[launcher_state.current_widget].loop(event, &launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); + event = 0; } + if (launcher_state.led_on) return false; return true; } -void move_to_next_widget() { - launcher_state.widget_changed = true; - widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); - launcher_state.current_widget = (launcher_state.current_widget + 1) % LAUNCHER_NUM_WIDGETS; - widgets[launcher_state.current_widget].activate(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); -} - -void move_to_first_widget() { - launcher_state.widget_changed = true; - widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); - launcher_state.current_widget = 0; - widgets[0].activate(&launcher_state.launcher_settings, widget_contexts[0]); +LauncherEvent _figure_out_button_event(LauncherEvent button_down_event, uint8_t *down_timestamp) { + watch_date_time date_time = watch_rtc_get_date_time(); + if (*down_timestamp) { + uint8_t diff = ((61 + date_time.unit.second) - *down_timestamp) % 60; + *down_timestamp = 0; + if (diff > 1) return button_down_event + 2; + else return button_down_event + 1; + } else { + *down_timestamp = date_time.unit.second + 1; + return button_down_event; + } } void cb_light_pressed() { - struct calendar_date_time date_time; - watch_get_date_time(&date_time); - if (launcher_state.light_down_timestamp) { - uint8_t diff = (61 + date_time.time.sec) - launcher_state.light_down_timestamp; - if (diff > 1) event = EVENT_LIGHT_LONG_PRESS; - else event = EVENT_LIGHT_BUTTON_UP; - launcher_state.light_down_timestamp = 0; - } else { - launcher_state.light_down_timestamp = date_time.time.sec + 1; - event = EVENT_LIGHT_BUTTON_DOWN; - } + event = _figure_out_button_event(EVENT_LIGHT_BUTTON_DOWN, &launcher_state.light_down_timestamp); } void cb_mode_pressed() { - struct calendar_date_time date_time; - watch_get_date_time(&date_time); - if (launcher_state.mode_down_timestamp) { - uint8_t diff = (61 + date_time.time.sec) - launcher_state.mode_down_timestamp; - if (diff > 1) event = EVENT_MODE_LONG_PRESS; - else event = EVENT_MODE_BUTTON_UP; - launcher_state.mode_down_timestamp = 0; - } else { - launcher_state.mode_down_timestamp = date_time.time.sec + 1; - event = EVENT_MODE_BUTTON_DOWN; - } + event = _figure_out_button_event(EVENT_MODE_BUTTON_DOWN, &launcher_state.mode_down_timestamp); } void cb_alarm_pressed() { - struct calendar_date_time date_time; - watch_get_date_time(&date_time); - if (launcher_state.alarm_down_timestamp) { - uint8_t diff = (61 + date_time.time.sec) - launcher_state.alarm_down_timestamp; - if (diff > 1) event = EVENT_ALARM_LONG_PRESS; - else event = EVENT_ALARM_BUTTON_UP; - launcher_state.alarm_down_timestamp = 0; - } else { - launcher_state.alarm_down_timestamp = date_time.time.sec + 1; - event = EVENT_ALARM_BUTTON_DOWN; - } + event = _figure_out_button_event(EVENT_ALARM_BUTTON_DOWN, &launcher_state.alarm_down_timestamp); } void cb_tick() { event = EVENT_TICK; + if (launcher_state.light_ticks) launcher_state.light_ticks--; } |