From 6404bb55eee5a2d1adb8b35b02312b0810553f82 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 19 Nov 2022 19:59:37 +0100 Subject: [PATCH] rotary encode (alt): avoid starvation * for installations with >1000 LEDs, strip.isUpdating() is true almost all the time. This fix ensures that rotary are polled at least every 4 ms (250Hz) * fixing a few potential string buffer overruns. --- .../usermod_v2_rotary_encoder_ui.h | 5 ++-- .../usermod_v2_rotary_encoder_ui_ALT.h | 29 ++++++++++--------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/usermods/usermod_v2_rotary_encoder_ui/usermod_v2_rotary_encoder_ui.h b/usermods/usermod_v2_rotary_encoder_ui/usermod_v2_rotary_encoder_ui.h index 02bc0ccd..dc96ee52 100644 --- a/usermods/usermod_v2_rotary_encoder_ui/usermod_v2_rotary_encoder_ui.h +++ b/usermods/usermod_v2_rotary_encoder_ui/usermod_v2_rotary_encoder_ui.h @@ -54,8 +54,8 @@ class RotaryEncoderUIUsermod : public Usermod { private: int fadeAmount = 10; // Amount to change every step (brightness) - unsigned long currentTime; - unsigned long loopTime; + unsigned long currentTime = 0; + unsigned long loopTime = 0; int8_t pinA = ENCODER_DT_PIN; // DT from encoder int8_t pinB = ENCODER_CLK_PIN; // CLK from encoder int8_t pinC = ENCODER_SW_PIN; // SW from encoder @@ -107,6 +107,7 @@ public: // tracking the owner tags.... pinA = pinB = pinC = -1; enabled = false; + DEBUG_PRINTLN(F("Failed to alocate GPIO pins for Usermod Rotary Encoder.")); //WLEDMM add debug info return; } diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h index ecc994e6..13dd0dea 100644 --- a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h @@ -116,7 +116,7 @@ static int re_qstringCmp(const void *ap, const void *bp) { class RotaryEncoderUIUsermod : public Usermod { private: int8_t fadeAmount = 5; // Amount to change every step (brightness) - unsigned long loopTime; + unsigned long loopTime = 0; unsigned long buttonPressedTime = 0; unsigned long buttonWaitTime = 0; @@ -275,6 +275,7 @@ public: // tracking the owner tags.... pinA = pinB = pinC = -1; enabled = false; + DEBUG_PRINTLN(F("Failed to alocate GPIO pins for Usermod Rotary Encoder (ALT).")); //WLEDMM add debug info return; } @@ -327,9 +328,11 @@ public: */ void loop() { - if (!enabled || strip.isUpdating()) return; + if (!enabled) return; unsigned long currentTime = millis(); // get the current elapsed time + if (strip.isUpdating() && (currentTime - loopTime < 4)) return; // WLEDMM: be nice, but not too nice + // Initialize effectCurrentIndex and effectPaletteIndex to // current state. We do it here as (at least) effectCurrent // is not yet initialized when setup is called. @@ -342,7 +345,7 @@ public: currentEffectAndPaletteInitialized = false; } - if (currentTime >= (loopTime + 2)) // 2ms since last check of encoder = 500Hz + if (currentTime - loopTime >= 2) // 2ms since last check of encoder = 500Hz { loopTime = currentTime; // Updates loopTime @@ -642,8 +645,8 @@ public: } lampUdated(); #ifdef USERMOD_FOUR_LINE_DISPLAY - char lineBuffer[64]; - sprintf(lineBuffer, "%d", val); + char lineBuffer[64] = { '\0' }; + snprintf(lineBuffer, 63, "%d", val); // WLEDMM: avoid string buffer overflow display->overlay(lineBuffer, 500, 10); // use star #endif } @@ -702,8 +705,8 @@ public: } lampUdated(); #ifdef USERMOD_FOUR_LINE_DISPLAY - char lineBuffer[64]; - sprintf(lineBuffer, "%d", currentHue1); + char lineBuffer[64] = { '\0' }; + snprintf(lineBuffer, 63, "%d", currentHue1); // WLEDMM: avoid string buffer overflow display->overlay(lineBuffer, 500, 7); // use brush #endif } @@ -731,8 +734,8 @@ public: } lampUdated(); #ifdef USERMOD_FOUR_LINE_DISPLAY - char lineBuffer[64]; - sprintf(lineBuffer, "%d", currentSat1); + char lineBuffer[64] = { '\0' }; + snprintf(lineBuffer, 63, "%d", currentSat1); // WLEDMM: avoid string buffer overflow display->overlay(lineBuffer, 500, 8); // use contrast #endif } @@ -748,7 +751,7 @@ public: #endif if (presetHigh && presetLow && presetHigh > presetLow) { StaticJsonDocument<64> root; - char str[64]; + char str[64] = { '\0' }; sprintf_P(str, PSTR("%d~%d~%s"), presetLow, presetHigh, increase?"":"-"); root[F("ps")] = str; deserializeState(root.as(), CALL_MODE_BUTTON_PRESET); @@ -763,7 +766,7 @@ public: */ lampUdated(); #ifdef USERMOD_FOUR_LINE_DISPLAY - sprintf(str, "%d", currentPreset); + snprintf(str, 63, "%d", currentPreset); // WLEDMM: avoid string buffer overflow display->overlay(str, 500, 11); // use heart #endif } @@ -791,8 +794,8 @@ public: // } lampUdated(); #ifdef USERMOD_FOUR_LINE_DISPLAY - char lineBuffer[64]; - sprintf(lineBuffer, "%d", currentCCT); + char lineBuffer[64] = { '\0' }; + snprintf(lineBuffer, 63, "%d", currentCCT); // WLEDMM: avoid string buffer overflow display->overlay(lineBuffer, 500, 10); // use star #endif }