Don't sync every cycle

Because `led_sync` is a major cause of slowness, do not sync every cycle. In
most cases, it is pointless to sync 100 times a second, about 60 - or even 30 -
may be more than enough.

For this reason, introduce a timer, and a settable delay: we'll only call
`led_sync` once the delay's up. It can be set to 0 to call it every time, but
defaults to 16 (for about 62 syncs/sec), as a safe bet.

This speeds the loop up dramatically, except for the few exceptions where sync
is called.

Fixes #1.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
pull/365/head
Gergely Nagy 8 years ago
parent 1a8ce8cab1
commit 559eab96ae

@ -2,6 +2,8 @@
LEDMode *LEDControl_::modes[LED_MAX_MODES]; LEDMode *LEDControl_::modes[LED_MAX_MODES];
uint8_t LEDControl_::previousMode, LEDControl_::mode; uint8_t LEDControl_::previousMode, LEDControl_::mode;
uint16_t LEDControl_::syncDelay = 16;
uint32_t LEDControl_::syncTimer;
void void
LEDMode::activate (void) { LEDMode::activate (void) {
@ -126,6 +128,8 @@ LEDControl_::begin (void) {
event_handler_hook_use(eventHandler); event_handler_hook_use(eventHandler);
loop_hook_use(loopHook); loop_hook_use(loopHook);
syncTimer = millis();
} }
Key Key
@ -144,7 +148,10 @@ LEDControl_::loopHook (bool postClear) {
if (postClear) if (postClear)
return; return;
led_sync(); if (millis() - syncTimer >= syncDelay) {
led_sync();
syncTimer = millis();
}
update(); update();
} }

@ -41,7 +41,10 @@ class LEDControl_ : public KaleidoscopePlugin {
static void activate (LEDMode *mode); static void activate (LEDMode *mode);
static uint16_t syncDelay;
private: private:
static uint32_t syncTimer;
static LEDMode *modes[LED_MAX_MODES]; static LEDMode *modes[LED_MAX_MODES];
static uint8_t previousMode, mode; static uint8_t previousMode, mode;

Loading…
Cancel
Save