From: Matheus Afonso Martins Moreira Date: Tue, 3 Sep 2024 22:02:21 +0000 (-0300) Subject: Merge PR #293 - add instant LED duration X-Git-Url: https://git.earman.xyz/?a=commitdiff_plain;h=014ef325769b59d02bb4f3e267cf0ad16c8e97b2;p=sensor-watch.git Merge PR #293 - add instant LED duration Adds an instant LED duration preference that only keeps the LED lit while the LIGHT button remains held down. Matches the behavior of the original watch. Reviewed-by: Matheus Afonso Martins Moreira Tested-on-hardware-by: Wesley Aptekar-Cassels Tested-on-hardware-by: 814d3 (GitHub) GitHub-Pull-Request: https://github.com/joeycastillo/Sensor-Watch/pull/293 --- 014ef325769b59d02bb4f3e267cf0ad16c8e97b2 diff --cc movement/movement.c index 0f7be19,577f199..39eebaa --- a/movement/movement.c +++ b/movement/movement.c @@@ -296,8 -241,13 +306,13 @@@ bool movement_default_loop_handler(move 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) { + if (MOVEMENT_SECONDARY_FACE_INDEX && movement_state.current_face_idx == 0) { movement_move_to_face(MOVEMENT_SECONDARY_FACE_INDEX); } else { movement_move_to_face(0); @@@ -689,52 -611,10 +702,52 @@@ static movement_event_type_t _figure_ou } } -void cb_light_btn_interrupt(void) { - bool pin_level = watch_get_pin_level(BTN_LIGHT); +static movement_event_type_t btn_action(bool pin_level, int code, uint16_t *timestamp) { - _movement_reset_inactivity_countdown(); + _movement_reset_inactivity_countdown(); - event.event_type = _figure_out_button_event(pin_level, EVENT_LIGHT_BUTTON_DOWN, &movement_state.light_down_timestamp); + return _figure_out_button_event(pin_level, code, timestamp); +} + +static void light_btn_action(bool pin_level) { + event.event_type = btn_action(pin_level, EVENT_LIGHT_BUTTON_DOWN, &movement_state.light_down_timestamp); +} + +static void mode_btn_action(bool pin_level) { + event.event_type = btn_action(pin_level, EVENT_MODE_BUTTON_DOWN, &movement_state.mode_down_timestamp); +} + +static void alarm_btn_action(bool pin_level) { + uint8_t event_type = btn_action(pin_level, EVENT_ALARM_BUTTON_DOWN, &movement_state.alarm_down_timestamp); + if (movement_state.ignore_alarm_btn_after_sleep){ + if (event_type == EVENT_ALARM_BUTTON_UP || event_type == EVENT_ALARM_LONG_UP) movement_state.ignore_alarm_btn_after_sleep = false; + return; + } + event.event_type = event_type; +} + +static void debounce_btn_press(uint8_t pin, uint8_t *debounce_ticks, uint16_t *down_timestamp, void (*function)(bool)) { + if (*debounce_ticks == 0) { + bool pin_level = watch_get_pin_level(pin); + function(pin_level); + *debounce_ticks = pin_level ? DEBOUNCE_TICKS_DOWN : DEBOUNCE_TICKS_UP; + if (*debounce_ticks != 0) _movement_enable_fast_tick_if_needed(); + } + else + *down_timestamp = 0; +} + +static void disable_if_needed(uint8_t *ticks) { + if (*ticks > 0 && --*ticks == 0) + _movement_disable_fast_tick_if_possible(); +} + +static void movement_disable_if_debounce_complete(void) { + disable_if_needed(&movement_state.debounce_ticks_light); + disable_if_needed(&movement_state.debounce_ticks_alarm); + disable_if_needed(&movement_state.debounce_ticks_mode); +} + +void cb_light_btn_interrupt(void) { + debounce_btn_press(BTN_LIGHT, &movement_state.debounce_ticks_light, &movement_state.light_down_timestamp, light_btn_action); } void cb_mode_btn_interrupt(void) {