refactor movement's LED color to a function call

This commit is contained in:
joeycastillo 2024-09-29 08:31:23 -04:00
parent 71922f8e51
commit e2b01d4018
4 changed files with 51 additions and 13 deletions

View File

@ -353,6 +353,20 @@ void movement_set_use_imperial_units(bool value) {
movement_state.settings.bit.use_imperial_units = value;
}
movement_color_t movement_backlight_color(void) {
return (movement_color_t) {
.red = movement_state.settings.bit.led_red_color,
.green = movement_state.settings.bit.led_green_color,
.blue = movement_state.settings.bit.led_blue_color
};
}
void movement_set_backlight_color(movement_color_t color) {
movement_state.settings.bit.led_red_color = color.red;
movement_state.settings.bit.led_green_color = color.green;
movement_state.settings.bit.led_blue_color = color.blue;
}
bool movement_alarm_enabled(void) {
return movement_state.settings.bit.alarm_enabled;
}

View File

@ -47,6 +47,13 @@ typedef enum {
MOVEMENT_NUM_CLOCK_MODES
} movement_clock_mode_t;
/// struct for Movement LED color
typedef struct {
uint8_t red : 4;
uint8_t green : 4;
uint8_t blue : 4;
} movement_color_t;
// movement_settings_t contains global settings that cover watch behavior, including preferences around clock and unit
// display, time zones, buzzer behavior, LED color and low energy mode timeouts.
typedef union {
@ -334,6 +341,9 @@ void movement_set_clock_mode_24h(movement_clock_mode_t value);
bool movement_use_imperial_units(void);
void movement_set_use_imperial_units(bool value);
movement_color_t movement_backlight_color(void);
void movement_set_backlight_color(movement_color_t color);
/// TODO: For #SecondMovement: Should we have a counter that watch faces increment when they enable an alarm, and decrement when they disable it?
/// Or should there be a watch face function where watch faces can tell us if they have an alarm enabled?
/// Worth considering a better way to handle this.

View File

@ -160,8 +160,9 @@ bool morsecalc_face_loop(movement_event_t event, movement_settings_t *settings,
case EVENT_LIGHT_LONG_PRESS:
mcs->led_is_on = !mcs->led_is_on;
if(mcs->led_is_on) {
watch_set_led_color(settings->bit.led_red_color ? (0xF | settings->bit.led_red_color << 4) : 0,
settings->bit.led_green_color ? (0xF | settings->bit.led_green_color << 4) : 0);
movement_color_t color = movement_backlight_color();
watch_set_led_color(color.red ? (0xF | color.red << 4) : 0,
color.green ? (0xF | color.green << 4) : 0);
movement_request_tick_frequency(4);
}
else {
@ -180,8 +181,9 @@ bool morsecalc_face_loop(movement_event_t event, movement_settings_t *settings,
case EVENT_TICK:
if(mcs->led_is_on) {
watch_set_led_color(settings->bit.led_red_color ? (0xF | settings->bit.led_red_color << 4) : 0,
settings->bit.led_green_color ? (0xF | settings->bit.led_green_color << 4) : 0);
movement_color_t color = movement_backlight_color();
watch_set_led_color(color.red ? (0xF | color.red << 4) : 0,
color.green ? (0xF | color.green << 4) : 0);
}
break;
case EVENT_LIGHT_BUTTON_DOWN:

View File

@ -71,6 +71,7 @@ void preferences_face_activate(movement_settings_t *settings, void *context) {
bool preferences_face_loop(movement_event_t event, movement_settings_t *settings, void *context) {
preferences_state_t *state = (preferences_state_t *)context;
movement_color_t color; // to use in the switch if we need it
switch (event.event_type) {
case EVENT_TICK:
@ -149,15 +150,18 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
}
break;
case PREFERENCES_PAGE_LED_RED:
sprintf(buf, "%2d", settings->bit.led_red_color);
color = movement_backlight_color();
sprintf(buf, "%2d", color.red);
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);
break;
case PREFERENCES_PAGE_LED_GREEN:
sprintf(buf, "%2d", settings->bit.led_green_color);
color = movement_backlight_color();
sprintf(buf, "%2d", color.green);
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);
break;
case PREFERENCES_PAGE_LED_BLUE:
sprintf(buf, "%2d", settings->bit.led_blue_color);
color = movement_backlight_color();
sprintf(buf, "%2d", color.blue);
watch_display_text(WATCH_POSITION_TOP_RIGHT, buf);
break;
case PREFERENCES_PAGE_NUM_PREFERENCES:
@ -198,13 +202,19 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
}
break;
case PREFERENCES_PAGE_LED_RED:
settings->bit.led_red_color = settings->bit.led_red_color + 1;
color = movement_backlight_color();
color.red++;
movement_set_backlight_color(color);
break;
case PREFERENCES_PAGE_LED_GREEN:
settings->bit.led_green_color = settings->bit.led_green_color + 1;
color = movement_backlight_color();
color.green++;
movement_set_backlight_color(color);
break;
case PREFERENCES_PAGE_LED_BLUE:
settings->bit.led_blue_color = settings->bit.led_blue_color + 1;
color = movement_backlight_color();
color.blue++;
movement_set_backlight_color(color);
break;
case PREFERENCES_PAGE_NUM_PREFERENCES:
// nothing to do here, just silencing the warning
@ -221,9 +231,11 @@ bool preferences_face_loop(movement_event_t event, movement_settings_t *settings
if (state->current_page == PREFERENCES_PAGE_LED_RED ||
state->current_page == PREFERENCES_PAGE_LED_GREEN ||
state->current_page == PREFERENCES_PAGE_LED_BLUE) {
movement_force_led_on(settings->bit.led_red_color | settings->bit.led_red_color << 4,
settings->bit.led_green_color | settings->bit.led_green_color << 4,
settings->bit.led_blue_color | settings->bit.led_blue_color << 4);
movement_color_t color = movement_backlight_color();
// this bitwise math turns #000 into #000000, #111 into #111111, etc.
movement_force_led_on(color.red | color.red << 4,
color.green | color.green << 4,
color.blue | color.blue << 4);
return false;
} else {
movement_force_led_off();