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);
}
}
-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) {