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:
parent
bc269702ee
commit
f6baf916a9
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue