Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 11 additions & 13 deletions wled00/FX_fcn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1266,16 +1266,16 @@ void WS2812FX::finalizeInit() {

void WS2812FX::service() {
unsigned long nowUp = millis(); // Be aware, millis() rolls over every 49 days
now = nowUp + timebase;
unsigned long elapsed = nowUp - _lastServiceShow;
if (_suspend || 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
}
bool timeToShow = (elapsed >= _frametime); // all segments are running at the same speed
if (_triggered || _targetFps == FPS_UNLIMITED) timeToShow = true; // unlimited mode = no frametime; strip.trigger() can overrule timing

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

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

if (!seg.isActive()) continue;

// last condition ensures all solid segments are updated at the same time
if (nowUp > _lastServiceShow + _frametime || _triggered || (doShow && seg.mode == FX_MODE_STATIC))
{
if (seg.isActive()) {
// current segment is active -> re-run effect, and remember that show() call is necessary
// if we arrive here, its always showtime (timeToShow == true)
doShow = true;

if (!seg.freeze) { //only run effect function if not frozen
// Effect blending
uint16_t prog = seg.progress();
Expand All @@ -1318,6 +1315,7 @@ void WS2812FX::service() {
}
}
_segment_index = 0; // segment index is only valid while effects are serviced
_currentSegment = &_segments[0]; // safe fallback to prevent stale pointer - SEGMENT/SEGENV should not be used outside of the service loop

#ifdef WLED_DEBUG
if ((_targetFps != FPS_UNLIMITED) && (millis() - nowUp > _frametime)) DEBUG_PRINTF_P(PSTR("Slow effects %u/%d.\n"), (unsigned)(millis()-nowUp), (int)_frametime);
Expand Down Expand Up @@ -1754,7 +1752,7 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) {
BusManager::setBrightness(scaledBri(b));
if (!direct) {
unsigned long t = millis();
if (t - _lastShow > MIN_SHOW_DELAY) trigger(); //apply brightness change immediately if no refresh soon
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
}
}

Expand Down
Loading