diff --git a/movement/movement.c b/movement/movement.c index 0f7be193..39eebaa7 100644 --- a/movement/movement.c +++ b/movement/movement.c @@ -278,14 +278,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; @@ -296,6 +306,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_face_idx == 0) { movement_move_to_face(MOVEMENT_SECONDARY_FACE_INDEX); @@ -559,9 +574,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(); } } @@ -690,7 +703,7 @@ static movement_event_type_t _figure_out_button_event(bool pin_level, movement_e } static movement_event_type_t btn_action(bool pin_level, int code, uint16_t *timestamp) { - _movement_reset_inactivity_countdown(); + _movement_reset_inactivity_countdown(); return _figure_out_button_event(pin_level, code, timestamp); } diff --git a/movement/movement.h b/movement/movement.h index 0c31291f..2158b7dd 100644 --- a/movement/movement.h +++ b/movement/movement.h @@ -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. diff --git a/movement/watch_faces/settings/preferences_face.c b/movement/watch_faces/settings/preferences_face.c index 3b14b5f4..24836dce 100644 --- a/movement/watch_faces/settings/preferences_face.c +++ b/movement/watch_faces/settings/preferences_face.c @@ -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; @@ -171,11 +174,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: