Skip to content

Commit 78ecd38

Browse files
authored
service cleanup after removing return FRAMETIME (#5443)
Clean-up and simplification of strip.service() after individual effect FRAMETIME was removed. * Activation "_frametime" is now the same for all effects, so effects scheduling based on individual frametime is not needed any more * Special handling for mode_static is obsolete, because the solid effect does not have a different timing any more * Ensures a safe fallback segment after servicing to avoid stale state. * Brightness changes use a capped refresh threshold to avoid excessive redraws.
1 parent 4c7fa03 commit 78ecd38

1 file changed

Lines changed: 11 additions & 13 deletions

File tree

wled00/FX_fcn.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,16 +1266,16 @@ void WS2812FX::finalizeInit() {
12661266

12671267
void WS2812FX::service() {
12681268
unsigned long nowUp = millis(); // Be aware, millis() rolls over every 49 days
1269-
now = nowUp + timebase;
12701269
unsigned long elapsed = nowUp - _lastServiceShow;
1271-
if (_suspend || elapsed <= MIN_FRAME_DELAY) return; // keep wifi alive - no matter if triggered or unlimited
1272-
if (!_triggered && (_targetFps != FPS_UNLIMITED)) { // unlimited mode = no frametime
1273-
if (elapsed < _frametime) return; // too early for service
1274-
}
1270+
bool timeToShow = (elapsed >= _frametime); // all segments are running at the same speed
1271+
if (_triggered || _targetFps == FPS_UNLIMITED) timeToShow = true; // unlimited mode = no frametime; strip.trigger() can overrule timing
12751272

1276-
bool doShow = false;
1273+
now = nowUp + timebase; // common time base for all effects
1274+
if (!timeToShow) return; // too early for service
1275+
if (_suspend || elapsed <= MIN_FRAME_DELAY) return; // keep wifi alive - no matter if triggered or unlimited
12771276

12781277
_isServicing = true;
1278+
bool doShow = _triggered; // true if ≥1 active segment was processed (and strip was not suspended mid-loop), or trigger received → triggers show()
12791279
for (size_t i = 0; i < _segments.size(); i++) {
12801280
Segment &seg = _segments[i];
12811281
_segment_index = i;
@@ -1286,13 +1286,10 @@ void WS2812FX::service() {
12861286
// reset the segment runtime data if needed
12871287
seg.resetIfRequired();
12881288

1289-
if (!seg.isActive()) continue;
1290-
1291-
// last condition ensures all solid segments are updated at the same time
1292-
if (nowUp > _lastServiceShow + _frametime || _triggered || (doShow && seg.mode == FX_MODE_STATIC))
1293-
{
1289+
if (seg.isActive()) {
1290+
// current segment is active -> re-run effect, and remember that show() call is necessary
1291+
// if we arrive here, its always showtime (timeToShow == true)
12941292
doShow = true;
1295-
12961293
if (!seg.freeze) { //only run effect function if not frozen
12971294
// Effect blending
12981295
uint16_t prog = seg.progress();
@@ -1318,6 +1315,7 @@ void WS2812FX::service() {
13181315
}
13191316
}
13201317
_segment_index = 0; // segment index is only valid while effects are serviced
1318+
_currentSegment = &_segments[0]; // safe fallback to prevent stale pointer - SEGMENT/SEGENV should not be used outside of the service loop
13211319

13221320
#ifdef WLED_DEBUG
13231321
if ((_targetFps != FPS_UNLIMITED) && (millis() - nowUp > _frametime)) DEBUG_PRINTF_P(PSTR("Slow effects %u/%d.\n"), (unsigned)(millis()-nowUp), (int)_frametime);
@@ -1754,7 +1752,7 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) {
17541752
BusManager::setBrightness(scaledBri(b));
17551753
if (!direct) {
17561754
unsigned long t = millis();
1757-
if (t - _lastShow > MIN_SHOW_DELAY) trigger(); //apply brightness change immediately if no refresh soon
1755+
if (t - _lastShow > min(_frametime, uint16_t(FRAMETIME_FIXED))) trigger(); //apply brightness change immediately if no refresh soon, but don't speed up above 42fps
17581756
}
17591757
}
17601758

0 commit comments

Comments
 (0)