From 399caa2582a4c139bd37ea0ce4480d06cfa53914 Mon Sep 17 00:00:00 2001 From: Joey Castillo Date: Sun, 3 Oct 2021 12:31:51 -0400 Subject: more wip launcher stuff --- launcher/launcher.c | 37 +++++++++++++++++++++---------------- launcher/launcher.h | 33 +++++++++++++++++---------------- launcher/widgets/fake_widget.c | 6 +++--- launcher/widgets/fake_widget.h | 12 +++++++----- 4 files changed, 48 insertions(+), 40 deletions(-) diff --git a/launcher/launcher.c b/launcher/launcher.c index 1ad0b9da..26fec93e 100644 --- a/launcher/launcher.c +++ b/launcher/launcher.c @@ -7,8 +7,19 @@ LauncherState launcher_state; void * widget_contexts[LAUNCHER_NUM_WIDGETS]; +void launcher_request_tick_frequency(uint8_t freq) { + watch_rtc_disable_all_periodic_callbacks(); + watch_rtc_register_periodic_callback(cb_tick, freq); +} + +void launcher_illuminate_led() { + launcher_state.light_ticks = 3; +} + + void app_init() { memset(&launcher_state, 0, sizeof(launcher_state)); + launcher_state.launcher_settings.bit.led_green_color = 0xF; } void app_wake_from_deep_sleep() { @@ -25,10 +36,10 @@ void app_setup() { watch_enable_leds(); watch_enable_display(); - watch_register_tick_callback(cb_tick); + launcher_request_tick_frequency(1); for(uint8_t i = 0; i < LAUNCHER_NUM_WIDGETS; i++) { - widgets[i].setup(&launcher_state.launcherSettings, widget_contexts[i]); + widgets[i].setup(&launcher_state.launcher_settings, widget_contexts[i]); } } @@ -50,7 +61,7 @@ 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_green(); + watch_set_led_color(launcher_state.launcher_settings.bit.led_red_color, launcher_state.launcher_settings.bit.led_green_color); launcher_state.led_on = true; } @@ -67,32 +78,26 @@ bool app_loop() { if (event) { event = 0; - bool can_sleep = widgets[launcher_state.current_widget].loop(event, &launcher_state.launcherSettings, widget_contexts[launcher_state.current_widget]); - if (can_sleep) return true; - - event = EVENT_LOOP; - return false; + widgets[launcher_state.current_widget].loop(event, &launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); } + if (launcher_state.led_on) return false; + return true; } void move_to_next_widget() { launcher_state.widget_changed = true; - widgets[launcher_state.current_widget].enter_background(&launcher_state.launcherSettings, widget_contexts[launcher_state.current_widget]); + 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].enter_foreground(&launcher_state.launcherSettings, widget_contexts[launcher_state.current_widget]); + 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].enter_background(&launcher_state.launcherSettings, widget_contexts[launcher_state.current_widget]); + widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]); launcher_state.current_widget = 0; - widgets[0].enter_foreground(&launcher_state.launcherSettings, widget_contexts[0]); -} - -void illuminate_led() { - launcher_state.light_ticks = 3; + widgets[0].activate(&launcher_state.launcher_settings, widget_contexts[0]); } void cb_light_pressed() { diff --git a/launcher/launcher.h b/launcher/launcher.h index 888d1adb..bc8d9191 100644 --- a/launcher/launcher.h +++ b/launcher/launcher.h @@ -6,16 +6,16 @@ // TODO: none of this is implemented typedef union { struct { - uint32_t reserved : 1; - uint32_t clock_mode_24h : 1; // determines whether display should use 12 or 24 hour mode. + uint32_t clock_mode_24h : 1; // determines whether clock should use 12 or 24 hour mode. uint32_t signal_should_sound : 1; // if true, a double beep is played at the top of each hour. - uint32_t alarm_should_sound : 1; // if true, the alarm interrupt plays a song. - uint32_t note_index : 7; // the index of the tone to play, or 0x7F for no tone. - uint32_t snapback_enabled : 1; // if true, snaps back to the main screen after 5 minutes - uint32_t sleep_interval : 3; // 0 to disable sleep, or a number of days to sleep after. - uint32_t sleep_blanks_screen : 1; // blank screen or display "SLEEP" when asleep - uint32_t led_red_color : 8; // for general purpose illumination, the red LED value - uint32_t led_green_color : 8; // for general purpose illumination, the green LED value + uint32_t alarm_should_sound : 1; // if true, the alarm interrupt can match a time and play a song. + uint32_t alarm_minute : 6; // the minute of the alarm we want to match + uint32_t alarm_hour : 5; // the second of the alarm we want to match + uint32_t note_index : 4; // the index of the tone to play on button press, or 0xF for no tone. + uint32_t screensaver_interval : 3; // 0 to disable screensaver, or a screensaver activation interval. + uint32_t led_duration : 3; // how many seconds to shine the LED for, or 0 to disable it. + uint32_t led_red_color : 4; // for general purpose illumination, the red LED value (0-15) + uint32_t led_green_color : 4; // for general purpose illumination, the green LED value (0-15) } bit; uint32_t value; } LauncherSettings; @@ -24,7 +24,6 @@ typedef enum LauncherEvent { EVENT_NONE = 0, // There is no event to report. EVENT_ACTIVATE, // Your widget is entering the foreground. EVENT_TICK, // Most common event type. Your widget is being called from the tick callback. - EVENT_LOOP, // The app did not sleep, and is going into another invocation of the run loop. EVENT_LIGHT_BUTTON_DOWN, // The light button has been pressed, but not yet released. EVENT_LIGHT_BUTTON_UP, // The light button was pressed and released. EVENT_LIGHT_LONG_PRESS, // The light button was held for >2 seconds, and released. @@ -37,20 +36,22 @@ typedef enum LauncherEvent { } LauncherEvent; typedef void (*launcher_widget_setup)(LauncherSettings *settings, void ** context_ptr); -typedef void (*launcher_widget_enter_foreground)(LauncherSettings *settings, void *context); -typedef bool (*launcher_widget_loop)(LauncherEvent event, LauncherSettings *settings, void *context); -typedef void (*launcher_widget_enter_background)(LauncherSettings *settings, void *context); +typedef void (*launcher_widget_activate)(LauncherSettings *settings, void *context); +typedef void (*launcher_widget_loop)(LauncherEvent event, LauncherSettings *settings, void *context); +typedef void (*launcher_widget_resign)(LauncherSettings *settings, void *context); typedef struct WatchWidget { + char widget_name[11]; + bool snapback_enabled; launcher_widget_setup setup; - launcher_widget_enter_foreground enter_foreground; + launcher_widget_activate activate; launcher_widget_loop loop; - launcher_widget_enter_background enter_background; + launcher_widget_resign resign; } WatchWidget; typedef struct LauncherState { // properties stored in BACKUP register - LauncherSettings launcherSettings; + LauncherSettings launcher_settings; // transient properties int16_t current_widget; diff --git a/launcher/widgets/fake_widget.c b/launcher/widgets/fake_widget.c index 15e3cf2a..70b6918c 100644 --- a/launcher/widgets/fake_widget.c +++ b/launcher/widgets/fake_widget.c @@ -5,12 +5,12 @@ void fake_widget_setup(LauncherSettings *settings, void ** context_ptr) { *context_ptr = NULL; } -void fake_widget_enter_foreground(LauncherSettings *settings, void *context) { +void fake_widget_activate(LauncherSettings *settings, void *context) { (void) settings; (void) context; } -bool fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) { +void fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) { (void) event; (void) settings; (void) context; @@ -18,7 +18,7 @@ bool fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *con return true; } -void fake_widget_enter_background(LauncherSettings *settings, void *context) { +void fake_widget_resign(LauncherSettings *settings, void *context) { (void) settings; (void) context; } diff --git a/launcher/widgets/fake_widget.h b/launcher/widgets/fake_widget.h index 5a4b33db..470cdf99 100644 --- a/launcher/widgets/fake_widget.h +++ b/launcher/widgets/fake_widget.h @@ -4,15 +4,17 @@ #include "launcher.h" void fake_widget_setup(LauncherSettings *settings, void ** context_ptr); -void fake_widget_enter_foreground(LauncherSettings *settings, void *context); -bool fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context); -void fake_widget_enter_background(LauncherSettings *settings, void *context); +void fake_widget_activate(LauncherSettings *settings, void *context); +void fake_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context); +void fake_widget_resign(LauncherSettings *settings, void *context); #define fake_widget { \ + "WI dGIt01", \ + true, \ fake_widget_setup, \ - fake_widget_enter_foreground, \ + fake_widget_activate, \ fake_widget_loop, \ - fake_widget_enter_background, \ + fake_widget_resign, \ } #endif // FAKE_WIDGET_H_ \ No newline at end of file -- cgit v1.2.3