diff --git a/movement.c b/movement.c index 390edc3b..0e5d17fb 100644 --- a/movement.c +++ b/movement.c @@ -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; } diff --git a/movement.h b/movement.h index 494a88ce..2c1e5ba3 100644 --- a/movement.h +++ b/movement.h @@ -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. diff --git a/movement/watch_faces/complication/morsecalc_face.c b/movement/watch_faces/complication/morsecalc_face.c index 30118e2e..c92a402b 100644 --- a/movement/watch_faces/complication/morsecalc_face.c +++ b/movement/watch_faces/complication/morsecalc_face.c @@ -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: diff --git a/watch-faces/settings/preferences_face.c b/watch-faces/settings/preferences_face.c index 344f0f35..1eaf4b73 100644 --- a/watch-faces/settings/preferences_face.c +++ b/watch-faces/settings/preferences_face.c @@ -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();