]> git.earman.xyz Git - sensor-watch.git/commitdiff
launcher: let widgets prevent sleep
authorJoey Castillo <jose.castillo@gmail.com>
Mon, 4 Oct 2021 13:51:49 +0000 (09:51 -0400)
committerJoey Castillo <jose.castillo@gmail.com>
Mon, 4 Oct 2021 13:52:07 +0000 (09:52 -0400)
launcher/launcher.c
launcher/launcher.h
launcher/widgets/clock/simple_clock_widget.c
launcher/widgets/clock/simple_clock_widget.h
launcher/widgets/fake_widget_1.c
launcher/widgets/fake_widget_1.h
launcher/widgets/fake_widget_2.c
launcher/widgets/fake_widget_2.h
launcher/widgets/settings/preferences_widget.c
launcher/widgets/settings/preferences_widget.h

index 4211e1ac45186cff373cf84ccd745ced2c0cafa7..20fd7e59785ed1e61b0b78feefce12d2d69efda6 100644 (file)
@@ -35,13 +35,7 @@ void launcher_illuminate_led() {
 
 void launcher_move_to_widget(uint8_t widget_index) {
     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 = widget_index;
-    watch_clear_display();
-    widgets[launcher_state.current_widget].activate(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]);
-    event.value = 0;
-    event.bit.event_type = EVENT_ACTIVATE;
-    widgets[launcher_state.current_widget].loop(event, &launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]);
+    launcher_state.next_widget = widget_index;
 }
 
 void launcher_move_to_next_widget() {
@@ -94,12 +88,17 @@ void app_wake_from_sleep() {
 }
 
 bool app_loop() {
-    // play a beep if the widget has changed in response to a user's press of the MODE button
     if (launcher_state.widget_changed) {
-        // low note for nonzero case, high note for return to widget 0
         if (launcher_state.launcher_settings.bit.button_should_sound) {
+            // low note for nonzero case, high note for return to widget 0
             watch_buzzer_play_note(launcher_state.current_widget ? BUZZER_NOTE_C7 : BUZZER_NOTE_C8, 50);
         }
+        widgets[launcher_state.current_widget].resign(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]);
+        launcher_state.current_widget = launcher_state.next_widget;
+        watch_clear_display();
+        widgets[launcher_state.current_widget].activate(&launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]);
+        event.value = 0;
+        event.bit.event_type = EVENT_ACTIVATE;
         launcher_state.widget_changed = false;
     }
 
@@ -136,16 +135,15 @@ bool app_loop() {
         watch_enter_shallow_sleep(true);
     }
 
+    bool can_sleep = true;
+
     if (event.bit.event_type) {
         event.bit.subsecond = launcher_state.subsecond;
-        widgets[launcher_state.current_widget].loop(event, &launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]);
+        can_sleep = widgets[launcher_state.current_widget].loop(event, &launcher_state.launcher_settings, widget_contexts[launcher_state.current_widget]);
         event.value = 0;
     }
 
-
-    if (launcher_state.led_on) return false;
-
-    return true;
+    return can_sleep && !launcher_state.led_on;
 }
 
 LauncherEventType _figure_out_button_event(LauncherEventType button_down_event, uint8_t *down_timestamp) {
index d6ebbc2c52e8f5f9f6d921af700176cbf37a90cb..97c56545aaa8478c09740597aa1f46813ccedc18 100644 (file)
@@ -49,7 +49,7 @@ typedef union {
 
 typedef void (*launcher_widget_setup)(LauncherSettings *settings, void ** context_ptr);
 typedef void (*launcher_widget_activate)(LauncherSettings *settings, void *context);
-typedef void (*launcher_widget_loop)(LauncherEvent event, LauncherSettings *settings, void *context);
+typedef bool (*launcher_widget_loop)(LauncherEvent event, LauncherSettings *settings, void *context);
 typedef void (*launcher_widget_resign)(LauncherSettings *settings, void *context);
 
 typedef struct WatchWidget {
@@ -65,6 +65,7 @@ typedef struct LauncherState {
 
     // transient properties
     int16_t current_widget;
+    int16_t next_widget;
     bool widget_changed;
 
     // LED stuff
index 427793f3175914171abf78ef89d6f024c8687917..83b5a7138a38d6447bdf296c82daf87e2ba77fec 100644 (file)
@@ -17,7 +17,7 @@ void simple_clock_widget_activate(LauncherSettings *settings, void *context) {
     *((uint32_t *)context) = 0xFFFFFFFF;
 }
 
-void simple_clock_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
+bool simple_clock_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
     printf("simple_clock_widget_loop\n");
     const char weekdays[7][3] = {"SA", "SU", "MO", "TU", "WE", "TH", "FR"};
     char buf[11];
@@ -64,7 +64,7 @@ void simple_clock_widget_loop(LauncherEvent event, LauncherSettings *settings, v
             break;
         case EVENT_MODE_BUTTON_UP:
             launcher_move_to_next_widget();
-            return;
+            return false;
         case EVENT_LIGHT_BUTTON_UP:
             launcher_illuminate_led();
             break;
@@ -73,6 +73,8 @@ void simple_clock_widget_loop(LauncherEvent event, LauncherSettings *settings, v
         default:
             break;
     }
+
+    return true;
 }
 
 void simple_clock_widget_resign(LauncherSettings *settings, void *context) {
index 42b0d3c5934fafe24c7828db2ac91e24356f4aa0..739c942b4b6f793b2089396d5603bca537ab8c06 100644 (file)
@@ -5,7 +5,7 @@
 
 void simple_clock_widget_setup(LauncherSettings *settings, void ** context_ptr);
 void simple_clock_widget_activate(LauncherSettings *settings, void *context);
-void simple_clock_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context);
+bool simple_clock_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context);
 void simple_clock_widget_resign(LauncherSettings *settings, void *context);
 
 uint8_t simple_clock_widget_get_weekday(uint16_t day, uint16_t month, uint16_t year);
index 65324095cec157976f388351587734fdc56779d5..bdc964e20ee022eaeb8fbc2a86d67e9fb1abd7f5 100644 (file)
@@ -11,7 +11,7 @@ void fake_widget_1_activate(LauncherSettings *settings, void *context) {
     (void) context;
 }
 
-void fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
+bool fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
     printf("fake_widget_1_loop\n");
     (void) settings;
     (void) context;
@@ -20,13 +20,15 @@ void fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *c
     switch (event.bit.event_type) {
         case EVENT_MODE_BUTTON_UP:
             launcher_move_to_next_widget();
-            return;
+            return false;
         case EVENT_LIGHT_BUTTON_UP:
             launcher_illuminate_led();
             break;
         default:
             break;
     }
+
+    return true;
 }
 
 void fake_widget_1_resign(LauncherSettings *settings, void *context) {
index 24704f235134a99d698e6f91ab92945b97117816..d033b49a70b191d087c8f9e14325bdd3a0c62e58 100644 (file)
@@ -5,7 +5,7 @@
 
 void fake_widget_1_setup(LauncherSettings *settings, void ** context_ptr);
 void fake_widget_1_activate(LauncherSettings *settings, void *context);
-void fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *context);
+bool fake_widget_1_loop(LauncherEvent event, LauncherSettings *settings, void *context);
 void fake_widget_1_resign(LauncherSettings *settings, void *context);
 
 #define fake_widget_1 { \
index a6eafb7bccb09ae46d87d620747efa57748f96c9..46772222e16b4b6b838dde637b286f546ca0fc78 100644 (file)
@@ -11,7 +11,7 @@ void fake_widget_2_activate(LauncherSettings *settings, void *context) {
     (void) context;
 }
 
-void fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
+bool fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
     printf("fake_widget_2_loop\n");
     (void) settings;
     (void) context;
@@ -20,13 +20,15 @@ void fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *c
     switch (event.bit.event_type) {
         case EVENT_MODE_BUTTON_UP:
             launcher_move_to_next_widget();
-            return;
+            return false;
         case EVENT_LIGHT_BUTTON_UP:
             launcher_illuminate_led();
             break;
         default:
             break;
     }
+
+    return true;
 }
 
 void fake_widget_2_resign(LauncherSettings *settings, void *context) {
index 945e28fa6c10a641fd9d40213c848e3b3d1de823..cf01969d2a574ed123056a6279ffb4f36d2c3ca5 100644 (file)
@@ -5,7 +5,7 @@
 
 void fake_widget_2_setup(LauncherSettings *settings, void ** context_ptr);
 void fake_widget_2_activate(LauncherSettings *settings, void *context);
-void fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *context);
+bool fake_widget_2_loop(LauncherEvent event, LauncherSettings *settings, void *context);
 void fake_widget_2_resign(LauncherSettings *settings, void *context);
 
 #define fake_widget_2 { \
index d4abeb8e79283b74fd1202c9403aa9980162eeee..878b775b34d17449f7b8ad91941957faaca74118 100644 (file)
@@ -16,15 +16,16 @@ void preferences_widget_activate(LauncherSettings *settings, void *context) {
     launcher_request_tick_frequency(4); // we need to manually blink some pixels
 }
 
-void preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
+bool preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context) {
     (void) settings;
     (void) context;
     printf("preferences_widget_loop\n");
     uint8_t current_page = *((uint8_t *)context);
     switch (event.bit.event_type) {
         case EVENT_MODE_BUTTON_UP:
+            watch_set_led_off();
             launcher_move_to_next_widget();
-            return;
+            return false;
         case EVENT_LIGHT_BUTTON_UP:
             current_page = (current_page + 1) % PREFERENCES_WIDGET_NUM_PREFEFENCES;
             *((uint8_t *)context) = current_page;
@@ -54,16 +55,8 @@ void preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, vo
 
     watch_clear_display();
     watch_display_string((char *)preferences_widget_titles[current_page], 0);
-    if (current_page > 2) {
-        // this is a hack, launcher should be able to illumate with a custom color.
-        launcher_illuminate_led();
-        watch_set_led_color(settings->bit.led_red_color ? (0xF | settings->bit.led_red_color << 4) : 0,
-                            settings->bit.led_green_color ? (0xF | settings->bit.led_green_color << 4) : 0);
-    } else {
-        watch_set_led_off();
-    }
 
-    if (event.bit.subsecond % 2) return;
+    if (event.bit.subsecond % 2) return current_page <= 2;
     char buf[3];
     switch (current_page) {
         case 0:
@@ -111,6 +104,15 @@ void preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, vo
             watch_display_string(buf, 8);
             break;
     }
+
+    if (current_page > 2) {
+        watch_set_led_color(settings->bit.led_red_color ? (0xF | settings->bit.led_red_color << 4) : 0,
+                            settings->bit.led_green_color ? (0xF | settings->bit.led_green_color << 4) : 0);
+        return false;
+    }
+
+    watch_set_led_off();
+    return true;
 }
 
 void preferences_widget_resign(LauncherSettings *settings, void *context) {
index e2e27fc78136c341c2ae451624b227c5346d1363..11a189f8631146d88fb0e2905a21a5588cb9107a 100644 (file)
@@ -5,7 +5,7 @@
 
 void preferences_widget_setup(LauncherSettings *settings, void ** context_ptr);
 void preferences_widget_activate(LauncherSettings *settings, void *context);
-void preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context);
+bool preferences_widget_loop(LauncherEvent event, LauncherSettings *settings, void *context);
 void preferences_widget_resign(LauncherSettings *settings, void *context);
 
 #define preferences_widget { \