Skip to content

Commit

Permalink
Avoid repeated calls to rgblight_set() in tight succession when setti…
Browse files Browse the repository at this point in the history
…ng lighting layers (#18338)

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
  • Loading branch information
spidey3 and sigprof authored Nov 10, 2022
1 parent bc26970 commit f6baf91
Showing 1 changed file with 27 additions and 11 deletions.
38 changes: 27 additions & 11 deletions quantum/rgblight/rgblight.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ LED_TYPE led[RGBLED_NUM];

#ifdef RGBLIGHT_LAYERS
rgblight_segment_t const *const *rgblight_layers = NULL;

static bool deferred_set_layer_state = false;
#endif

rgblight_ranges_t rgblight_ranges = {0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM};
Expand Down Expand Up @@ -748,17 +750,13 @@ void rgblight_set_layer_state(uint8_t layer, bool enabled) {
rgblight_status.enabled_layer_mask &= ~mask;
}
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
// If not enabled, then nothing else will actually set the LEDs...
if (!rgblight_config.enable) {
rgblight_set();
}
# endif
// Calling rgblight_set() here (directly or indirectly) could
// potentially cause timing issues when there are multiple
// successive calls to rgblight_set_layer_state(). Instead,
// set a flag and do it the next time rgblight_task() runs.

deferred_set_layer_state = true;
}

bool rgblight_get_layer_state(uint8_t layer) {
Expand Down Expand Up @@ -1154,8 +1152,26 @@ void rgblight_task(void) {
}
}

# ifdef RGBLIGHT_LAYER_BLINK
# ifdef RGBLIGHT_LAYERS
# ifdef RGBLIGHT_LAYER_BLINK
rgblight_blink_layer_repeat_helper();
# 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
}

Expand Down

0 comments on commit f6baf91

Please sign in to comment.