From 7fb3fe65b29e9dbb8ab24518ea1024699c8eb8c7 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:19:54 +0100 Subject: [PATCH] experimental: strict framerate limit for strip.show() --- wled00/FX_fcn.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 4ac95069..4a194d5c 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1879,9 +1879,9 @@ void WS2812FX::service() { if (elapsed < 2) return; // keep wifi alive if ( !_triggered && (_targetFps != FPS_UNLIMITED) && (_targetFps != FPS_UNLIMITED_AC)) { #if 0 - if (elapsed < MIN_SHOW_DELAY) return; // WLEDMM too early for service + if (elapsed < MIN_SHOW_DELAY) return; // WLEDMM too early for service - delivers higher fps #else - if (elapsed < _frametime) return; // code from upstream - stricter on FPS + if ((elapsed+1) < _frametime) return; // code from upstream - stricter on FPS #endif } #else // legacy @@ -1941,7 +1941,15 @@ void WS2812FX::service() { _virtualSegmentLength = 0; busses.setSegmentCCT(-1); if(doShow) { +#if 0 && defined(ARDUINO_ARCH_ESP32) // EXPERIMENTAL - enabled this to enforce stricter frametime limits + static unsigned long lastTimeShow = 0; + long tdelta = millis() - lastTimeShow; + if ((lastTimeShow > 0) && (tdelta > 1) && (tdelta < _frametime)) // too early - release CPU to slow down + vTaskDelay((tdelta-1) / portTICK_PERIOD_MS); // "-1" because vTaskDelay() may actually delay longer than requested + lastTimeShow = millis(); +#else yield(); +#endif show(); _lastServiceShow = nowUp; // WLEDMM use correct timestamp }