Skip to content

Commit

Permalink
prevent flickering during OTA
Browse files Browse the repository at this point in the history
I've almost toasted my wiring due to uncontrolled LED flickering during OTA.
So here is the fix - it prevents any strip updates when OTA is ongoing.
  • Loading branch information
softhack007 committed Feb 12, 2024
1 parent 7593c23 commit c9b416a
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 1 deletion.
4 changes: 4 additions & 0 deletions wled00/FX_fcn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1615,6 +1615,8 @@ void WS2812FX::waitUntilIdle(void) {

void WS2812FX::service() {
unsigned long nowUp = millis(); // Be aware, millis() rolls over every 49 days // WLEDMM avoid losing precision
if (OTAisRunning) return; // WLEDMM avoid flickering during OTA

now = nowUp + timebase;
#if defined(ARDUINO_ARCH_ESP32) && defined(WLEDMM_FASTPATH)
if ((_frametime > 2) && (_frametime < 32) && (nowUp - _lastShow) < (_frametime/2)) return; // WLEDMM experimental - stabilizes frametimes but increases CPU load
Expand Down Expand Up @@ -1776,6 +1778,8 @@ void WS2812FX::estimateCurrentAndLimitBri() {
}

void WS2812FX::show(void) {
if (OTAisRunning) return; // WLEDMM avoid flickering during OTA

// avoid race condition, capture _callback value
show_callback callback = _callback;
if (callback) callback();
Expand Down
3 changes: 2 additions & 1 deletion wled00/wled.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*/

// version code in format yymmddb (b = daily build)
#define VERSION 2401290
#define VERSION 2402120

// WLEDMM - you can check for this define in usermods, to only enabled WLEDMM specific code in the "right" fork. Its not defined in AC WLED.
#define _MoonModules_WLED_
Expand Down Expand Up @@ -749,6 +749,7 @@ WLED_GLOBAL volatile bool doInitBusses _INIT(false); // WLEDMM "volatile"
WLED_GLOBAL volatile bool loadLedmap _INIT(false); // WLEDMM use as bool and use loadedLedmap for Nr
WLED_GLOBAL volatile uint8_t loadedLedmap _INIT(0); // WLEDMM default 0
WLED_GLOBAL volatile bool suspendStripService _INIT(false); // WLEDMM temporarily prevent running strip.service, when strip or segments are "under update" and inconsistent
WLED_GLOBAL volatile bool OTAisRunning _INIT(false); // WLEDMM temporarily stop led updates during OTA
#ifndef ESP8266
WLED_GLOBAL char *ledmapNames[WLED_MAX_LEDMAPS-1] _INIT_N(({nullptr}));
#endif
Expand Down
3 changes: 3 additions & 0 deletions wled00/wled_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,8 @@ void initServer()
if(!index){
DEBUG_PRINTLN(F("OTA Update Start"));
WLED::instance().disableWatchdog();
OTAisRunning = true; // WLEDMM flicker fixer
strip.fill(BLACK);
usermods.onUpdateBegin(true); // notify usermods that update is about to begin (some may require task de-init)
lastEditTime = millis(); // make sure PIN does not lock during update
#ifdef ESP8266
Expand All @@ -352,6 +354,7 @@ void initServer()
usermods.onUpdateBegin(false); // notify usermods that update has failed (some may require task init)
WLED::instance().enableWatchdog();
}
OTAisRunning = false; // WLEDMM flicker fixer
}
});
#else
Expand Down

0 comments on commit c9b416a

Please sign in to comment.