]> git.earman.xyz Git - sensor-watch.git/commitdiff
movement: Add "instant" led_duration option.
authorWesley Aptekar-Cassels <me@wesleyac.com>
Sat, 30 Sep 2023 02:10:14 +0000 (22:10 -0400)
committerWesley Aptekar-Cassels <me@wesleyac.com>
Sat, 30 Sep 2023 02:10:14 +0000 (22:10 -0400)
This illuminates the LED only for the time that the button is pressed,
and turns it off as soon as it's released, which is the behaviour of the
original watch.

I chose a led_duration of zero to represent "instant" and all bits set
to represent "no LED", which is arbitrary but seemed more sensible to
me.

movement/movement.c
movement/movement.h
movement/watch_faces/settings/preferences_face.c

index f0868416eb0b2f9cee5271a732692f8c0e5aea91..17011e0be867b07d6d0457322ff0182cdbe140c4 100644 (file)
@@ -213,14 +213,24 @@ void movement_request_tick_frequency(uint8_t freq) {
 }
 
 void movement_illuminate_led(void) {
-    if (movement_state.settings.bit.led_duration) {
+    if (movement_state.settings.bit.led_duration != 0b111) {
         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.light_ticks = (movement_state.settings.bit.led_duration * 2 - 1) * 128;
+        if (movement_state.settings.bit.led_duration == 0) {
+            movement_state.light_ticks = 1;
+        } else {
+            movement_state.light_ticks = (movement_state.settings.bit.led_duration * 2 - 1) * 128;
+        }
         _movement_enable_fast_tick_if_needed();
     }
 }
 
+static void _movement_led_off(void) {
+    watch_set_led_off();
+    movement_state.light_ticks = -1;
+    _movement_disable_fast_tick_if_possible();
+}
+
 bool movement_default_loop_handler(movement_event_t event, movement_settings_t *settings) {
     (void)settings;
 
@@ -231,6 +241,11 @@ bool movement_default_loop_handler(movement_event_t event, movement_settings_t *
         case EVENT_LIGHT_BUTTON_DOWN:
             movement_illuminate_led();
             break;
+        case EVENT_LIGHT_BUTTON_UP:
+            if (movement_state.settings.bit.led_duration == 0) {
+                _movement_led_off();
+            }
+            break;
         case EVENT_MODE_LONG_PRESS:
             if (MOVEMENT_SECONDARY_FACE_INDEX && movement_state.current_watch_face == 0) {
                 movement_move_to_face(MOVEMENT_SECONDARY_FACE_INDEX);
@@ -465,9 +480,7 @@ bool app_loop(void) {
         if (watch_get_pin_level(BTN_LIGHT)) {
             movement_state.light_ticks = 1;
         } else {
-            watch_set_led_off();
-            movement_state.light_ticks = -1;
-            _movement_disable_fast_tick_if_possible();
+            _movement_led_off();
         }
     }
 
index 5f30dfb8c652413808665e7870f54013a6316e7d..87fdeba14aa3e3694ea66b45f5700b5c497318e2 100644 (file)
@@ -50,7 +50,7 @@ typedef union {
         uint8_t to_interval : 2;            // an inactivity interval for asking the active face to resign.
         bool to_always : 1;                 // if true, always time out from the active face to face 0. otherwise only faces that time out will resign (the default).
         uint8_t le_interval : 3;            // 0 to disable low energy mode, or an inactivity interval for going into low energy mode.
-        uint8_t led_duration : 2;           // how many seconds to shine the LED for (x2), or 0 to disable it.
+        uint8_t led_duration : 3;           // how many seconds to shine the LED for (x2), 0 to shine only while the button is depressed, or all bits set to disable the LED altogether.
         uint8_t led_red_color : 4;          // for general purpose illumination, the red LED value (0-15)
         uint8_t led_green_color : 4;        // for general purpose illumination, the green LED value (0-15)
         uint8_t time_zone : 6;              // an integer representing an index in the time zone table.
@@ -62,7 +62,7 @@ typedef union {
         bool clock_mode_24h : 1;            // indicates whether clock should use 12 or 24 hour mode.
         bool use_imperial_units : 1;        // indicates whether to use metric units (the default) or imperial.
         bool alarm_enabled : 1;             // indicates whether there is at least one alarm enabled.
-        uint8_t reserved : 6;               // room for more preferences if needed.
+        uint8_t reserved : 5;               // room for more preferences if needed.
     } bit;
     uint32_t reg;
 } movement_settings_t;
index b0e328b3fe8ff505e85f1fd5605f2f36aba1a6b7..68041d2dcf8a9ae046d631510c83a7de0423e7ab 100644 (file)
@@ -84,6 +84,9 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
                     break;
                 case 4:
                     settings->bit.led_duration = settings->bit.led_duration + 1;
+                    if (settings->bit.led_duration > 3) {
+                        settings->bit.led_duration = 0b111;
+                    }
                     break;
                 case 5:
                     settings->bit.led_green_color = settings->bit.led_green_color + 1;
@@ -159,11 +162,13 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
                 }
                 break;
             case 4:
-                if (settings->bit.led_duration) {
+                if (settings->bit.led_duration == 0) {
+                    watch_display_string("instnt", 4);
+                } else if (settings->bit.led_duration == 0b111) {
+                    watch_display_string("no LEd", 4);
+                } else {
                     sprintf(buf, " %1d SeC", settings->bit.led_duration * 2 - 1);
                     watch_display_string(buf, 4);
-                } else {
-                    watch_display_string("no LEd", 4);
                 }
                 break;
             case 5: