From cb3149b7f26bc8efb0bb9b8ab489fa3eb0f963b9 Mon Sep 17 00:00:00 2001 From: Filios92 Date: Mon, 27 Oct 2025 00:47:04 +0100 Subject: [PATCH] Fix RGB matrix not syncing and turning off properly on timeout (#25467) --- quantum/led_matrix/led_matrix.c | 32 ++++++++++++++++++-------------- quantum/rgb_matrix/rgb_matrix.c | 32 ++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c index b2665597df..715d520d1c 100644 --- a/quantum/led_matrix/led_matrix.c +++ b/quantum/led_matrix/led_matrix.c @@ -78,11 +78,12 @@ static const uint8_t led_matrix_flag_steps[] = LED_MATRIX_FLAG_STEPS; #define LED_MATRIX_FLAG_STEPS_COUNT ARRAY_SIZE(led_matrix_flag_steps) // internals -static bool suspend_state = false; -static uint8_t led_last_enable = UINT8_MAX; -static uint8_t led_last_effect = UINT8_MAX; -static effect_params_t led_effect_params = {0, LED_FLAG_ALL, false}; -static led_task_states led_task_state = SYNCING; +static bool suspend_state = false; +static uint8_t led_last_enable = UINT8_MAX; +static uint8_t led_last_effect = UINT8_MAX; +static uint8_t led_current_effect = 0; +static effect_params_t led_effect_params = {0, LED_FLAG_ALL, false}; +static led_task_states led_task_state = SYNCING; // double buffers static uint32_t led_timer_buffer; @@ -268,6 +269,17 @@ static void led_task_start(void) { g_last_hit_tracker = last_hit_buffer; #endif // LED_MATRIX_KEYREACTIVE_ENABLED + // Ideally we would also stop sending zeros to the LED driver PWM buffers + // while suspended and just do a software shutdown. This is a cheap hack for now. + bool suspend_backlight = suspend_state || +#if LED_MATRIX_TIMEOUT > 0 + (last_input_activity_elapsed() > (uint32_t)LED_MATRIX_TIMEOUT) || +#endif // LED_MATRIX_TIMEOUT > 0 + false; + + // Set effect to be renedered + led_current_effect = suspend_backlight || !led_matrix_eeconfig.enable ? 0 : led_matrix_eeconfig.mode; + // next task led_task_state = RENDERING; } @@ -349,15 +361,7 @@ static void led_task_flush(uint8_t effect) { void led_matrix_task(void) { led_task_timers(); - // Ideally we would also stop sending zeros to the LED driver PWM buffers - // while suspended and just do a software shutdown. This is a cheap hack for now. - bool suspend_backlight = suspend_state || -#if LED_MATRIX_TIMEOUT > 0 - (last_input_activity_elapsed() > (uint32_t)LED_MATRIX_TIMEOUT) || -#endif // LED_MATRIX_TIMEOUT > 0 - false; - - uint8_t effect = suspend_backlight || !led_matrix_eeconfig.enable ? 0 : led_matrix_eeconfig.mode; + uint8_t effect = led_current_effect; switch (led_task_state) { case STARTING: diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index 19edfb52b0..f517190e35 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -80,11 +80,12 @@ static const uint8_t rgb_matrix_flag_steps[] = RGB_MATRIX_FLAG_STEPS; #define RGB_MATRIX_FLAG_STEPS_COUNT ARRAY_SIZE(rgb_matrix_flag_steps) // internals -static bool suspend_state = false; -static uint8_t rgb_last_enable = UINT8_MAX; -static uint8_t rgb_last_effect = UINT8_MAX; -static effect_params_t rgb_effect_params = {0, LED_FLAG_ALL, false}; -static rgb_task_states rgb_task_state = SYNCING; +static bool suspend_state = false; +static uint8_t rgb_last_enable = UINT8_MAX; +static uint8_t rgb_last_effect = UINT8_MAX; +static uint8_t rgb_current_effect = 0; +static effect_params_t rgb_effect_params = {0, LED_FLAG_ALL, false}; +static rgb_task_states rgb_task_state = SYNCING; // double buffers static uint32_t rgb_timer_buffer; @@ -296,6 +297,17 @@ static void rgb_task_start(void) { g_last_hit_tracker = last_hit_buffer; #endif // RGB_MATRIX_KEYREACTIVE_ENABLED + // Ideally we would also stop sending zeros to the LED driver PWM buffers + // while suspended and just do a software shutdown. This is a cheap hack for now. + bool suspend_backlight = suspend_state || +#if RGB_MATRIX_TIMEOUT > 0 + (last_input_activity_elapsed() > (uint32_t)RGB_MATRIX_TIMEOUT) || +#endif // RGB_MATRIX_TIMEOUT > 0 + false; + + // Set effect to be renedered + rgb_current_effect = suspend_backlight || !rgb_matrix_config.enable ? 0 : rgb_matrix_config.mode; + // next task rgb_task_state = RENDERING; } @@ -384,15 +396,7 @@ static void rgb_task_flush(uint8_t effect) { void rgb_matrix_task(void) { rgb_task_timers(); - // Ideally we would also stop sending zeros to the LED driver PWM buffers - // while suspended and just do a software shutdown. This is a cheap hack for now. - bool suspend_backlight = suspend_state || -#if RGB_MATRIX_TIMEOUT > 0 - (last_input_activity_elapsed() > (uint32_t)RGB_MATRIX_TIMEOUT) || -#endif // RGB_MATRIX_TIMEOUT > 0 - false; - - uint8_t effect = suspend_backlight || !rgb_matrix_config.enable ? 0 : rgb_matrix_config.mode; + uint8_t effect = rgb_current_effect; switch (rgb_task_state) { case STARTING: