fix flickering LED in preferences screen

This commit is contained in:
joeycastillo 2024-09-23 00:02:31 -04:00
parent ac1f1eb7ef
commit 1357634d9d
3 changed files with 109 additions and 107 deletions

View File

@ -212,7 +212,13 @@ void movement_illuminate_led(void) {
} }
} }
static void _movement_led_off(void) { void movement_force_led_on(uint8_t red, uint8_t green, uint8_t blue) {
// this is hacky, we need a way for watch faces to set an arbitrary color and prevent Movement from turning it right back off.
watch_set_led_color_rgb(red, green, blue);
movement_state.light_ticks = 32767;
}
void movement_force_led_off(void) {
watch_set_led_off(); watch_set_led_off();
movement_state.light_ticks = -1; movement_state.light_ticks = -1;
_movement_disable_fast_tick_if_possible(); _movement_disable_fast_tick_if_possible();
@ -230,7 +236,7 @@ bool movement_default_loop_handler(movement_event_t event, movement_settings_t *
break; break;
case EVENT_LIGHT_BUTTON_UP: case EVENT_LIGHT_BUTTON_UP:
if (movement_state.settings.bit.led_duration == 0) { if (movement_state.settings.bit.led_duration == 0) {
_movement_led_off(); movement_force_led_off();
} }
break; break;
case EVENT_MODE_LONG_PRESS: case EVENT_MODE_LONG_PRESS:
@ -512,7 +518,7 @@ bool app_loop(void) {
if (HAL_GPIO_BTN_LIGHT_read()) { if (HAL_GPIO_BTN_LIGHT_read()) {
movement_state.light_ticks = 1; movement_state.light_ticks = 1;
} else { } else {
_movement_led_off(); movement_force_led_off();
} }
} }

View File

@ -290,6 +290,8 @@ void movement_move_to_next_face(void);
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 movement_illuminate_led(void); void movement_illuminate_led(void);
void movement_force_led_on(uint8_t red, uint8_t green, uint8_t blue);
void movement_force_led_off(void);
void movement_request_tick_frequency(uint8_t freq); void movement_request_tick_frequency(uint8_t freq);

View File

@ -75,60 +75,6 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
switch (event.event_type) { switch (event.event_type) {
case EVENT_TICK: case EVENT_TICK:
case EVENT_ACTIVATE: case EVENT_ACTIVATE:
// Do nothing; handled below.
break;
case EVENT_MODE_BUTTON_UP:
watch_set_led_off();
movement_move_to_next_face();
return false;
case EVENT_LIGHT_BUTTON_DOWN:
state->current_page = (state->current_page + 1) % PREFERENCES_PAGE_NUM_PREFERENCES;
while (!state->setting_enabled[state->current_page]) {
state->current_page = (state->current_page + 1) % PREFERENCES_PAGE_NUM_PREFERENCES;
}
break;
case EVENT_ALARM_BUTTON_UP:
switch (state->current_page) {
case PREFERENCES_PAGE_CLOCK_MODE:
settings->bit.clock_mode_24h = !settings->bit.clock_mode_24h;
break;
case PREFERENCES_PAGE_BUTTON_SOUND:
settings->bit.button_should_sound = !settings->bit.button_should_sound;
break;
case PREFERENCES_PAGE_TIMEOUT:
settings->bit.to_interval = settings->bit.to_interval + 1;
break;
case PREFERENCES_PAGE_LOW_ENERGY:
settings->bit.le_interval = settings->bit.le_interval + 1;
break;
case PREFERENCES_PAGE_LED_DURATION:
settings->bit.led_duration = settings->bit.led_duration + 1;
if (settings->bit.led_duration > 3) {
// set all bits to disable the LED
settings->bit.led_duration = 0b111;
}
break;
case PREFERENCES_PAGE_LED_RED:
settings->bit.led_red_color = settings->bit.led_red_color + 1;
break;
case PREFERENCES_PAGE_LED_GREEN:
settings->bit.led_green_color = settings->bit.led_green_color + 1;
break;
case PREFERENCES_PAGE_LED_BLUE:
settings->bit.led_blue_color = settings->bit.led_blue_color + 1;
break;
case PREFERENCES_PAGE_NUM_PREFERENCES:
// nothing to do here, just silencing the warning
break;
}
break;
case EVENT_TIMEOUT:
movement_move_to_face(0);
break;
default:
return movement_default_loop_handler(event, settings);
}
watch_display_text(WATCH_POSITION_FULL, (char *)preferences_face_titles[state->current_page]); watch_display_text(WATCH_POSITION_FULL, (char *)preferences_face_titles[state->current_page]);
watch_clear_all_indicators(); watch_clear_all_indicators();
watch_clear_colon(); watch_clear_colon();
@ -206,12 +152,10 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
sprintf(buf, "%2d", settings->bit.led_red_color); sprintf(buf, "%2d", settings->bit.led_red_color);
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf); watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);
break; break;
break;
case PREFERENCES_PAGE_LED_GREEN: case PREFERENCES_PAGE_LED_GREEN:
sprintf(buf, "%2d", settings->bit.led_green_color); sprintf(buf, "%2d", settings->bit.led_green_color);
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf); watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);
break; break;
break;
case PREFERENCES_PAGE_LED_BLUE: case PREFERENCES_PAGE_LED_BLUE:
sprintf(buf, "%2d", settings->bit.led_blue_color); sprintf(buf, "%2d", settings->bit.led_blue_color);
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf); watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);
@ -221,25 +165,75 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
break; break;
} }
} }
break;
case EVENT_MODE_BUTTON_UP:
movement_force_led_off();
movement_move_to_next_face();
return false;
case EVENT_LIGHT_BUTTON_DOWN:
state->current_page = (state->current_page + 1) % PREFERENCES_PAGE_NUM_PREFERENCES;
while (!state->setting_enabled[state->current_page]) {
state->current_page = (state->current_page + 1) % PREFERENCES_PAGE_NUM_PREFERENCES;
}
break;
case EVENT_ALARM_BUTTON_UP:
switch (state->current_page) {
case PREFERENCES_PAGE_CLOCK_MODE:
settings->bit.clock_mode_24h = !settings->bit.clock_mode_24h;
break;
case PREFERENCES_PAGE_BUTTON_SOUND:
settings->bit.button_should_sound = !settings->bit.button_should_sound;
break;
case PREFERENCES_PAGE_TIMEOUT:
settings->bit.to_interval = settings->bit.to_interval + 1;
break;
case PREFERENCES_PAGE_LOW_ENERGY:
settings->bit.le_interval = settings->bit.le_interval + 1;
break;
case PREFERENCES_PAGE_LED_DURATION:
settings->bit.led_duration = settings->bit.led_duration + 1;
if (settings->bit.led_duration > 3) {
// set all bits to disable the LED
settings->bit.led_duration = 0b111;
}
break;
case PREFERENCES_PAGE_LED_RED:
settings->bit.led_red_color = settings->bit.led_red_color + 1;
break;
case PREFERENCES_PAGE_LED_GREEN:
settings->bit.led_green_color = settings->bit.led_green_color + 1;
break;
case PREFERENCES_PAGE_LED_BLUE:
settings->bit.led_blue_color = settings->bit.led_blue_color + 1;
break;
case PREFERENCES_PAGE_NUM_PREFERENCES:
// nothing to do here, just silencing the warning
break;
}
break;
case EVENT_TIMEOUT:
movement_move_to_face(0);
break;
default:
return movement_default_loop_handler(event, settings);
}
// on LED color select screns, preview the color.
if (state->current_page == PREFERENCES_PAGE_LED_RED || if (state->current_page == PREFERENCES_PAGE_LED_RED ||
state->current_page == PREFERENCES_PAGE_LED_GREEN || state->current_page == PREFERENCES_PAGE_LED_GREEN ||
state->current_page == PREFERENCES_PAGE_LED_BLUE) { state->current_page == PREFERENCES_PAGE_LED_BLUE) {
watch_set_led_color_rgb(settings->bit.led_red_color ? (0xF | settings->bit.led_red_color << 4) : 0, movement_force_led_on(settings->bit.led_red_color | settings->bit.led_red_color << 4,
settings->bit.led_green_color ? (0xF | settings->bit.led_green_color << 4) : 0, settings->bit.led_green_color | settings->bit.led_green_color << 4,
settings->bit.led_blue_color ? (0xF | settings->bit.led_blue_color << 4) : 0); settings->bit.led_blue_color | settings->bit.led_blue_color << 4);
// return false so the watch stays awake (needed for the PWM driver to function).
return false; return false;
} } else {
movement_force_led_off();
watch_set_led_off();
return true; return true;
} }
}
void preferences_face_resign(movement_settings_t *settings, void *context) { void preferences_face_resign(movement_settings_t *settings, void *context) {
(void) settings; (void) settings;
(void) context; (void) context;
watch_set_led_off(); movement_force_led_off();
watch_store_backup_data(settings->reg, 0); watch_store_backup_data(settings->reg, 0);
} }