]> git.earman.xyz Git - sensor-watch.git/commitdiff
movement settings: add timeout and LED duration
authorJoey Castillo <jose.castillo@gmail.com>
Tue, 19 Oct 2021 17:33:11 +0000 (13:33 -0400)
committerJoey Castillo <jose.castillo@gmail.com>
Tue, 19 Oct 2021 17:46:25 +0000 (13:46 -0400)
movement/README.md
movement/movement.c
movement/movement.h
movement/watch_faces/clock/simple_clock_face.c
movement/watch_faces/complications/pulsometer_face.c
movement/watch_faces/settings/preferences_face.c

index e4eeb1c41b12e92455e44e17aad6a5df53718b18..009234f8e981d875d55cb8f949475c579cc6e0d1 100644 (file)
@@ -158,10 +158,10 @@ case EVENT_MODE_BUTTON_UP:
     break;
 ```
 
-Similarly in response to the user releasing the LIGHT button, we tell Movement to illuminate the LED. Movement does not do this automatically, in case your watch face UI has another use for the LIGHT button.
+Similarly in response to the user pressing the LIGHT button, we tell Movement to illuminate the LED. Movement does not do this automatically, in case your watch face UI has another use for the LIGHT button.
 
 ```c
-case EVENT_LIGHT_BUTTON_UP:
+case EVENT_LIGHT_BUTTON_DOWN:
     movement_illuminate_led();
     break;
 ```
index 8d28cc55aef188edcfbc96e15d89d8bf4491cb56..a95501a415677c5778b59021b2f9626abcc517c1 100644 (file)
@@ -19,8 +19,8 @@ void cb_alarm_fired();
 void cb_tick();
 
 static inline void _movement_reset_inactivity_countdown() {
-    movement_state.le_mode_ticks = movement_le_inactivity_deadlines[movement_state.settings.bit.le_inactivity_interval];
-    movement_state.timeout_ticks = movement_timeout_inactivity_deadlines[movement_state.settings.bit.to_inactivity_interval];
+    movement_state.le_mode_ticks = movement_le_inactivity_deadlines[movement_state.settings.bit.le_interval];
+    movement_state.timeout_ticks = movement_timeout_inactivity_deadlines[movement_state.settings.bit.to_interval];
 }
 
 void movement_request_tick_frequency(uint8_t freq) {
@@ -31,7 +31,10 @@ void movement_request_tick_frequency(uint8_t freq) {
 }
 
 void movement_illuminate_led() {
-    movement_state.light_ticks = movement_state.settings.bit.led_duration;
+    watch_set_led_color(movement_state.settings.bit.led_red_color ? (0xF | movement_state.settings.bit.led_red_color << 4) : 0,
+                        movement_state.settings.bit.led_green_color ? (0xF | movement_state.settings.bit.led_green_color << 4) : 0);
+    movement_state.led_on = true;
+    movement_state.light_ticks = movement_state.settings.bit.led_duration * 2;
 }
 
 void movement_move_to_face(uint8_t watch_face_index) {
@@ -48,8 +51,8 @@ void app_init() {
 
     movement_state.settings.bit.led_green_color = 0xF;
     movement_state.settings.bit.button_should_sound = true;
-    movement_state.settings.bit.le_inactivity_interval = 1;
-    movement_state.settings.bit.led_duration = 3;
+    movement_state.settings.bit.le_interval = 1;
+    movement_state.settings.bit.led_duration = 1;
     _movement_reset_inactivity_countdown();
 }
 
@@ -112,14 +115,6 @@ bool app_loop() {
         movement_state.watch_face_changed = false;
     }
 
-    // If the LED is off and should be on, turn it on
-    if (movement_state.light_ticks > 0 && !movement_state.led_on) {
-        watch_set_led_color(movement_state.settings.bit.led_red_color ? (0xF | movement_state.settings.bit.led_red_color << 4) : 0,
-                            movement_state.settings.bit.led_green_color ? (0xF | movement_state.settings.bit.led_green_color << 4) : 0);
-        movement_state.led_on = true;
-
-    }
-
     // if the LED is on and should be off, turn it off
     if (movement_state.led_on && movement_state.light_ticks == 0) {
         // unless the user is holding down the LIGHT button, in which case, give them more time.
@@ -215,7 +210,7 @@ void cb_tick() {
     watch_date_time date_time = watch_rtc_get_date_time();
     if (date_time.unit.second != movement_state.last_second) {
         if (movement_state.light_ticks) movement_state.light_ticks--;
-        if (movement_state.settings.bit.le_inactivity_interval && movement_state.le_mode_ticks > 0) movement_state.le_mode_ticks--;
+        if (movement_state.settings.bit.le_interval && movement_state.le_mode_ticks > 0) movement_state.le_mode_ticks--;
         if (movement_state.timeout_ticks > 0) movement_state.timeout_ticks--;
 
         movement_state.last_second = date_time.unit.second;
index d116a6e02eb62a3bce5da553e1e19816bd168ce9..41446a9b04afd520b4e31484d13c13a7ad74c9cf 100644 (file)
@@ -6,12 +6,12 @@
 // TODO: none of this is implemented
 typedef union {
     struct {
-        uint32_t reserved : 14;
+        uint32_t reserved : 15;
         uint32_t clock_mode_24h : 1;        // determines whether clock should use 12 or 24 hour mode.
         uint32_t button_should_sound : 1;   // if true, pressing a button emits a sound.
-        uint32_t to_inactivity_interval : 2;// an inactivity interval for asking the active face to resign.
-        uint32_t le_inactivity_interval : 3;// 0 to disable low energy mode, or an inactivity interval for going into low energy mode.
-        uint32_t led_duration : 3;          // how many seconds to shine the LED for, or 0 to disable it.
+        uint32_t to_interval : 2;           // an inactivity interval for asking the active face to resign.
+        uint32_t le_interval : 3;           // 0 to disable low energy mode, or an inactivity interval for going into low energy mode.
+        uint32_t led_duration : 2;          // how many seconds to shine the LED for (x2), 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;
index 95db3901e2203cebf319fdc5c188c6695a1ce3a4..70e350475032bf26eed4d804fe7b3aef2184d2dc 100644 (file)
@@ -65,7 +65,7 @@ bool simple_clock_face_loop(movement_event_t event, movement_settings_t *setting
         case EVENT_MODE_BUTTON_UP:
             movement_move_to_next_face();
             return false;
-        case EVENT_LIGHT_BUTTON_UP:
+        case EVENT_LIGHT_BUTTON_DOWN:
             movement_illuminate_led();
             break;
         case EVENT_ALARM_BUTTON_UP:
index abe002fbdf1f83d5afbb590e5d126cec96a3a272..d54d8ddfb0cdc8c8f02931670fdcbff3dcf7b664 100644 (file)
@@ -24,7 +24,7 @@ bool pulsometer_face_loop(movement_event_t event, movement_settings_t *settings,
         case EVENT_MODE_BUTTON_UP:
             movement_move_to_next_face();
             break;
-        case EVENT_LIGHT_BUTTON_UP:
+        case EVENT_LIGHT_BUTTON_DOWN:
             movement_illuminate_led();
             break;
         case EVENT_ALARM_BUTTON_DOWN:
index 98a2372da27b224e30b3fee1440916dee2c204d6..b68f2a393b1e94cb9f3ca6958296dfa574bebdf3 100644 (file)
@@ -2,8 +2,16 @@
 #include "preferences_face.h"
 #include "watch.h"
 
-#define PREFERENCES_FACE_NUM_PREFEFENCES (5)
-const char preferences_face_titles[PREFERENCES_FACE_NUM_PREFEFENCES][11] = {"CL        ", "Bt  Beep  ", "SC        ", "Lt   grn  ", "Lt   red  "};
+#define PREFERENCES_FACE_NUM_PREFEFENCES (7)
+const char preferences_face_titles[PREFERENCES_FACE_NUM_PREFEFENCES][11] = {
+    "CL        ",   // Clock: 12 or 24 hour
+    "BT  Beep  ",   // Buttons: should they beep?
+    "TO        ",   // Timeout: how long before we snap back to the clock face?
+    "LE        ",   // Low Energy mode: how long before it engages?
+    "LT        ",   // Light: duration
+    "LT   grn  ",   // Light: green component
+    "LT   red  ",   // Light: red component
+};
 
 void preferences_face_setup(movement_settings_t *settings, void ** context_ptr) {
     (void) settings;
@@ -36,12 +44,18 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
                     settings->bit.button_should_sound = !(settings->bit.button_should_sound);
                     break;
                 case 2:
-                    settings->bit.le_inactivity_interval = settings->bit.le_inactivity_interval + 1;
+                    settings->bit.to_interval = settings->bit.to_interval + 1;
                     break;
                 case 3:
-                    settings->bit.led_green_color = settings->bit.led_green_color + 1;
+                    settings->bit.le_interval = settings->bit.le_interval + 1;
                     break;
                 case 4:
+                    settings->bit.led_duration = settings->bit.led_duration + 1;
+                    break;
+                case 5:
+                    settings->bit.led_green_color = settings->bit.led_green_color + 1;
+                    break;
+                case 6:
                     settings->bit.led_red_color = settings->bit.led_red_color + 1;
                     break;
             }
@@ -56,7 +70,7 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
     watch_display_string((char *)preferences_face_titles[current_page], 0);
 
     if (event.subsecond % 2) return current_page <= 2;
-    char buf[3];
+    char buf[8];
     switch (current_page) {
         case 0:
             if (settings->bit.clock_mode_24h) watch_display_string("24h", 4);
@@ -67,7 +81,23 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
             else watch_display_string("n", 9);
             break;
         case 2:
-            switch (settings->bit.le_inactivity_interval) {
+            switch (settings->bit.to_interval) {
+                case 0:
+                    watch_display_string("60 sec", 4);
+                    break;
+                case 1:
+                    watch_display_string("2 n&in", 4);
+                    break;
+                case 2:
+                    watch_display_string("5 n&in", 4);
+                    break;
+                case 3:
+                    watch_display_string("30n&in", 4);
+                    break;
+            }
+            break;
+        case 3:
+            switch (settings->bit.le_interval) {
                 case 0:
                     watch_display_string(" never", 4);
                     break;
@@ -94,17 +124,28 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
                     break;
             }
             break;
-        case 3:
+        case 4:
+            if (settings->bit.led_duration) {
+                // FIXME: since we time the LED with the 1 Hz tick, the actual time lit can vary depending
+                // on whether the user hit it just before or just after a tick. so the setting is "1-2 s",
+                // "3-4 s", or "5-6 s". If we time this with the system tick we can do better.
+                sprintf(buf, " %1d-%1d s", settings->bit.led_duration * 2 - 1, settings->bit.led_duration * 2);
+                watch_display_string(buf, 4);
+            } else {
+                watch_display_string("no LEd", 4);
+            }
+            break;
+        case 5:
             sprintf(buf, "%2d", settings->bit.led_green_color);
             watch_display_string(buf, 8);
             break;
-        case 4:
+        case 6:
             sprintf(buf, "%2d", settings->bit.led_red_color);
             watch_display_string(buf, 8);
             break;
     }
 
-    if (current_page > 2) {
+    if (current_page >= 5) {
         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;