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 <matheus@matheusmoreira.com>
Tested-on-hardware-by: Wesley Aptekar-Cassels <me@wesleyac.com>
Tested-on-hardware-by: 814d3 (GitHub)
GitHub-Pull-Request: https://github.com/joeycastillo/Sensor-Watch/pull/293
This commit is contained in:
Matheus Afonso Martins Moreira 2024-09-03 19:02:21 -03:00
commit 014ef32576
3 changed files with 28 additions and 10 deletions

View File

@ -278,14 +278,24 @@ void movement_request_tick_frequency(uint8_t freq) {
} }
void movement_illuminate_led(void) { 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, 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.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(); _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) { bool movement_default_loop_handler(movement_event_t event, movement_settings_t *settings) {
(void)settings; (void)settings;
@ -296,6 +306,11 @@ bool movement_default_loop_handler(movement_event_t event, movement_settings_t *
case EVENT_LIGHT_BUTTON_DOWN: case EVENT_LIGHT_BUTTON_DOWN:
movement_illuminate_led(); movement_illuminate_led();
break; break;
case EVENT_LIGHT_BUTTON_UP:
if (movement_state.settings.bit.led_duration == 0) {
_movement_led_off();
}
break;
case EVENT_MODE_LONG_PRESS: case EVENT_MODE_LONG_PRESS:
if (MOVEMENT_SECONDARY_FACE_INDEX && movement_state.current_face_idx == 0) { if (MOVEMENT_SECONDARY_FACE_INDEX && movement_state.current_face_idx == 0) {
movement_move_to_face(MOVEMENT_SECONDARY_FACE_INDEX); movement_move_to_face(MOVEMENT_SECONDARY_FACE_INDEX);
@ -559,9 +574,7 @@ bool app_loop(void) {
if (watch_get_pin_level(BTN_LIGHT)) { if (watch_get_pin_level(BTN_LIGHT)) {
movement_state.light_ticks = 1; movement_state.light_ticks = 1;
} else { } else {
watch_set_led_off(); _movement_led_off();
movement_state.light_ticks = -1;
_movement_disable_fast_tick_if_possible();
} }
} }
@ -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) { 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); return _figure_out_button_event(pin_level, code, timestamp);
} }

View File

@ -50,7 +50,7 @@ typedef union {
uint8_t to_interval : 2; // an inactivity interval for asking the active face to resign. 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). 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 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_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 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. uint8_t time_zone : 6; // an integer representing an index in the time zone table.

View File

@ -84,6 +84,9 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
break; break;
case 4: case 4:
settings->bit.led_duration = settings->bit.led_duration + 1; settings->bit.led_duration = settings->bit.led_duration + 1;
if (settings->bit.led_duration > 3) {
settings->bit.led_duration = 0b111;
}
break; break;
case 5: case 5:
settings->bit.led_green_color = settings->bit.led_green_color + 1; 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; break;
case 4: 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); sprintf(buf, " %1d SeC", settings->bit.led_duration * 2 - 1);
watch_display_string(buf, 4); watch_display_string(buf, 4);
} else {
watch_display_string("no LEd", 4);
} }
break; break;
case 5: case 5: