From 0404ec988137acca997e620384cf446b19dce350 Mon Sep 17 00:00:00 2001
From: Frank <91616163+softhack007@users.noreply.github.com>
Date: Thu, 7 Nov 2024 23:15:39 +0100
Subject: [PATCH] changes in response to feedback from @willmmiles
* MIN_SHOW_DELAY -> MIN_FRAME_DELAY
* allow up to 250 for target FPS
* minor cleanup
* added specific MIN_FRAME_DELAY for -S2
---
wled00/FX.h | 10 ++++++----
wled00/FX_fcn.cpp | 11 +++++------
wled00/data/settings_leds.htm | 2 +-
3 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/wled00/FX.h b/wled00/FX.h
index d749d7796..56a0c9bd0 100644
--- a/wled00/FX.h
+++ b/wled00/FX.h
@@ -46,10 +46,12 @@
#define WLED_FPS 42
#define FRAMETIME_FIXED (1000/WLED_FPS)
#define FRAMETIME strip.getFrameTime()
-#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) // all ESP32 except -C3(very slow, untested)
- #define MIN_SHOW_DELAY 3 // supports higher framerates and better animation control
+#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2)
+ #define MIN_FRAME_DELAY 2 // minimum wait between repaints, to keep other functions like WiFi alive
+#elif defined(CONFIG_IDF_TARGET_ESP32S2)
+ #define MIN_FRAME_DELAY 4 // S2 is slower than normal esp32, and only has one core
#else
- #define MIN_SHOW_DELAY (_frametime < 16 ? 8 : 15) // legacy MIN_SHOW_DELAY - creates more idle loops, but reduces framerates
+ #define MIN_FRAME_DELAY 8 // 8266 legacy MIN_SHOW_DELAY
#endif
#define FPS_UNLIMITED 0
@@ -842,7 +844,7 @@ class WS2812FX { // 96 bytes
getMappedPixelIndex(uint16_t index) const;
inline uint16_t getFrameTime() const { return _frametime; } // returns amount of time a frame should take (in ms)
- inline uint16_t getMinShowDelay() const { return MIN_SHOW_DELAY; } // returns minimum amount of time strip.service() can be delayed (constant)
+ inline uint16_t getMinShowDelay() const { return MIN_FRAME_DELAY; } // returns minimum amount of time strip.service() can be delayed (constant)
inline uint16_t getLength() const { return _length; } // returns actual amount of LEDs on a strip (2D matrix may have less LEDs than W*H)
inline uint16_t getTransition() const { return _transitionDur; } // returns currently set transition time (in ms)
diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp
index 6bc61d10d..f4b46dade 100644
--- a/wled00/FX_fcn.cpp
+++ b/wled00/FX_fcn.cpp
@@ -1312,7 +1312,7 @@ void WS2812FX::service() {
if (_suspend) return;
unsigned long elapsed = nowUp - _lastServiceShow;
- if (elapsed < 2) return; // keep wifi alive - no matter if triggered or unlimited
+ if (elapsed <= MIN_FRAME_DELAY) return; // keep wifi alive - no matter if triggered or unlimited
if ( !_triggered && (_targetFps != FPS_UNLIMITED)) { // unlimited mode = no frametime
if (elapsed < _frametime) return; // too early for service
}
@@ -1369,7 +1369,6 @@ void WS2812FX::service() {
Segment::modeBlend(false); // unset semaphore
}
#endif
- frameDelay = max(frameDelay, unsigned(MIN_SHOW_DELAY)); // limit effects that want to go faster than target FPS
seg.call++;
if (seg.isInTransition() && frameDelay > FRAMETIME) frameDelay = FRAMETIME; // force faster updates during transition
BusManager::setSegmentCCT(oldCCT); // restore old CCT for ABL adjustments
@@ -1390,7 +1389,7 @@ void WS2812FX::service() {
yield();
Segment::handleRandomPalette(); // slowly transition random palette; move it into for loop when each segment has individual random palette
show();
- _lastServiceShow = nowUp; // correct timestamp, for better FPS control
+ _lastServiceShow = nowUp; // update timestamp, for precise FPS control
}
#ifdef WLED_DEBUG
if ((_targetFps != FPS_UNLIMITED) && (millis() - nowUp > _frametime)) DEBUG_PRINTF_P(PSTR("Slow strip %u/%d.\n"), (unsigned)(millis()-nowUp), (int)_frametime);
@@ -1445,9 +1444,9 @@ uint16_t WS2812FX::getFps() const {
}
void WS2812FX::setTargetFps(uint8_t fps) {
- if (fps <= 120) _targetFps = fps;
+ if (fps <= 250) _targetFps = fps;
if (_targetFps > 0) _frametime = 1000 / _targetFps;
- else _frametime = 3; // unlimited mode
+ else _frametime = MIN_FRAME_DELAY; // unlimited mode
}
void WS2812FX::setMode(uint8_t segid, uint8_t m) {
@@ -1495,7 +1494,7 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) {
BusManager::setBrightness(b);
if (!direct) {
unsigned long t = millis();
- if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) trigger(); //apply brightness change immediately if no refresh soon
+ if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_FRAME_DELAY) trigger(); //apply brightness change immediately if no refresh soon
}
}
diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm
index 55f8122e8..b467d5b9b 100644
--- a/wled00/data/settings_leds.htm
+++ b/wled00/data/settings_leds.htm
@@ -875,7 +875,7 @@ Swap:
- Target refresh rate: FPS
+ Target refresh rate: FPS