diff --git a/quantum/rgblight.c b/quantum/rgblight.c index bd805813c834..52f4b00a1e1e 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -95,6 +95,11 @@ rgblight_config_t rgblight_config; rgblight_status_t rgblight_status = {.timer_enabled = false}; bool is_rgblight_initialized = false; +#ifdef RGBLIGHT_SLEEP +static bool is_suspended; +static bool pre_suspend_enabled; +#endif + #ifdef RGBLIGHT_USE_TIMER animation_status_t animation_status = {}; #endif @@ -710,6 +715,42 @@ void rgblight_unblink_layers(void) { #endif +#ifdef RGBLIGHT_SLEEP + +void rgblight_suspend(void) { + rgblight_timer_disable(); + if (!is_suspended) { + is_suspended = true; + pre_suspend_enabled = rgblight_config.enable; + +# ifdef RGBLIGHT_LAYER_BLINK + // make sure any layer blinks don't come back after suspend + rgblight_status.enabled_layer_mask &= ~_blinked_layer_mask; + _blinked_layer_mask = 0; +# endif + + rgblight_disable_noeeprom(); + } +} + +void rgblight_wakeup(void) { + is_suspended = false; + + if (pre_suspend_enabled) { + rgblight_enable_noeeprom(); + } +# ifdef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF + // Need this or else the LEDs won't be set + else if (rgblight_status.enabled_layer_mask != 0) { + rgblight_set(); + } +# endif + + rgblight_timer_enable(); +} + +#endif + __attribute__((weak)) void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { ws2812_setleds(start_led, num_leds); } #ifndef RGBLIGHT_CUSTOM_DRIVER @@ -731,8 +772,10 @@ void rgblight_set(void) { # ifdef RGBLIGHT_LAYERS if (rgblight_layers != NULL -# ifndef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF +# if !defined(RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF) && rgblight_config.enable +# elif defined(RGBLIGHT_SLEEP) + && !is_suspended # endif ) { rgblight_layers_write(); diff --git a/quantum/rgblight.h b/quantum/rgblight.h index c02fd4f37b64..efbffa7fdb0a 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -357,6 +357,8 @@ HSV rgblight_get_hsv(void); /* === qmk_firmware (core)internal Functions === */ void rgblight_init(void); +void rgblight_suspend(void); +void rgblight_wakeup(void); uint32_t rgblight_read_dword(void); void rgblight_update_dword(uint32_t dword); uint32_t eeconfig_read_rgblight(void); diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index 807c837e3668..b784a0835d1e 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -24,9 +24,6 @@ #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) # include "rgblight.h" -extern rgblight_config_t rgblight_config; -static bool rgblight_enabled; -static bool is_suspended; #endif /** \brief Suspend idle @@ -103,12 +100,7 @@ static void power_down(uint8_t wdto) { stop_all_notes(); # endif /* AUDIO_ENABLE */ # if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) - rgblight_timer_disable(); - if (!is_suspended) { - is_suspended = true; - rgblight_enabled = rgblight_config.enable; - rgblight_disable_noeeprom(); - } + rgblight_suspend(); # endif // TODO: more power saving @@ -176,11 +168,7 @@ void suspend_wakeup_init(void) { #endif led_set(host_keyboard_leds()); #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) - is_suspended = false; - if (rgblight_enabled) { - rgblight_enable_noeeprom(); - } - rgblight_timer_enable(); + rgblight_wakeup(); #endif suspend_wakeup_init_kb(); } diff --git a/tmk_core/common/chibios/suspend.c b/tmk_core/common/chibios/suspend.c index c3b690b16425..49e20641fb95 100644 --- a/tmk_core/common/chibios/suspend.c +++ b/tmk_core/common/chibios/suspend.c @@ -22,9 +22,6 @@ #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) # include "rgblight.h" -extern rgblight_config_t rgblight_config; -static bool rgblight_enabled; -static bool is_suspended; #endif /** \brief suspend idle @@ -70,12 +67,7 @@ void suspend_power_down(void) { // shouldn't power down TPM/FTM if we want a breathing LED // also shouldn't power down USB #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) - rgblight_timer_disable(); - if (!is_suspended) { - is_suspended = true; - rgblight_enabled = rgblight_config.enable; - rgblight_disable_noeeprom(); - } + rgblight_suspend(); #endif #ifdef AUDIO_ENABLE stop_all_notes(); @@ -143,11 +135,7 @@ void suspend_wakeup_init(void) { #endif /* BACKLIGHT_ENABLE */ led_set(host_keyboard_leds()); #if defined(RGBLIGHT_SLEEP) && defined(RGBLIGHT_ENABLE) - is_suspended = false; - if (rgblight_enabled) { - rgblight_enable_noeeprom(); - } - rgblight_timer_enable(); + rgblight_wakeup(); #endif suspend_wakeup_init_kb(); }