fix flickering LED in preferences screen
This commit is contained in:
parent
ac1f1eb7ef
commit
1357634d9d
12
movement.c
12
movement.c
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user