Avoid repeated calls to rgblight_set() in tight succession when setting lighting layers (#18338)

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
This commit is contained in:
Joshua Diamond 2022-11-10 04:27:40 -05:00 committed by GitHub
parent bc269702ee
commit f6baf916a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 11 deletions

View File

@ -127,6 +127,8 @@ LED_TYPE led[RGBLED_NUM];
#ifdef RGBLIGHT_LAYERS #ifdef RGBLIGHT_LAYERS
rgblight_segment_t const *const *rgblight_layers = NULL; rgblight_segment_t const *const *rgblight_layers = NULL;
static bool deferred_set_layer_state = false;
#endif #endif
rgblight_ranges_t rgblight_ranges = {0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM}; rgblight_ranges_t rgblight_ranges = {0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM};
@ -748,17 +750,13 @@ void rgblight_set_layer_state(uint8_t layer, bool enabled) {
rgblight_status.enabled_layer_mask &= ~mask; rgblight_status.enabled_layer_mask &= ~mask;
} }
RGBLIGHT_SPLIT_SET_CHANGE_LAYERS; RGBLIGHT_SPLIT_SET_CHANGE_LAYERS;
// Static modes don't have a ticker running to update the LEDs
if (rgblight_status.timer_enabled == false) {
rgblight_mode_noeeprom(rgblight_config.mode);
}
# ifdef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF // Calling rgblight_set() here (directly or indirectly) could
// If not enabled, then nothing else will actually set the LEDs... // potentially cause timing issues when there are multiple
if (!rgblight_config.enable) { // successive calls to rgblight_set_layer_state(). Instead,
rgblight_set(); // set a flag and do it the next time rgblight_task() runs.
}
# endif deferred_set_layer_state = true;
} }
bool rgblight_get_layer_state(uint8_t layer) { bool rgblight_get_layer_state(uint8_t layer) {
@ -1154,9 +1152,27 @@ void rgblight_task(void) {
} }
} }
# ifdef RGBLIGHT_LAYERS
# ifdef RGBLIGHT_LAYER_BLINK # ifdef RGBLIGHT_LAYER_BLINK
rgblight_blink_layer_repeat_helper(); rgblight_blink_layer_repeat_helper();
# endif # endif
if (deferred_set_layer_state) {
deferred_set_layer_state = false;
// Static modes don't have a ticker running to update the LEDs
if (rgblight_status.timer_enabled == false) {
rgblight_mode_noeeprom(rgblight_config.mode);
}
# ifdef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF
// If not enabled, then nothing else will actually set the LEDs...
if (!rgblight_config.enable) {
rgblight_set();
}
# endif
}
# endif
} }
#endif /* RGBLIGHT_USE_TIMER */ #endif /* RGBLIGHT_USE_TIMER */