diff --git a/wled00/FX.h b/wled00/FX.h index cdab23369..ab90e4bdd 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -24,6 +24,8 @@ Modified for WLED */ +#include "wled.h" + #ifndef WS2812FX_h #define WS2812FX_h diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 183998699..b1cbffd05 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -48,6 +48,7 @@ const uint16_t customMappingSize = sizeof(customMappingTable)/sizeof(uint16_t); #define PWM_INDEX 0 #endif +//do not call this method from system context (network callback) void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst) { if (supportWhite == _useRgbw && countPixels == _length && _skipFirstMode == skipFirst) return; @@ -62,8 +63,11 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst) } uint8_t pins[] = {2}; + + while (!busses->canAllShow()) yield(); + busses->removeAll(); busses->add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, countPixels, COL_ORDER_GRB); - + _segments[0].start = 0; _segments[0].stop = _length; diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 94371776d..ca32b9a3a 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -30,7 +30,7 @@ class Bus { virtual void cleanup() {}; virtual ~Bus() { //throw the bus under the bus - cleanup(); + //Serial.println("Destructor!"); } uint16_t getStart() { @@ -85,7 +85,7 @@ class BusDigital : public Bus { _busPtr = PolyBus::create(_iType, _pins, _len); _valid = (_busPtr != nullptr); _colorOrder = colorOrder; - Serial.printf("Successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n",nr, len, type, pins[0],pins[1],_iType); + //Serial.printf("Successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n",nr, len, type, pins[0],pins[1],_iType); }; void show() { @@ -127,6 +127,7 @@ class BusDigital : public Bus { } void cleanup() { + //Serial.println("Digital Cleanup"); PolyBus::cleanup(_busPtr, _iType); _iType = I_NONE; _valid = false; @@ -135,6 +136,10 @@ class BusDigital : public Bus { pinManager.deallocatePin(_pins[1]); } + ~BusDigital() { + cleanup(); + } + private: uint8_t _colorOrder = COL_ORDER_GRB; uint8_t _pins[2] = {255, 255}; @@ -263,6 +268,7 @@ class BusManager { } void removeAll() { + //Serial.println("Removing all."); for (uint8_t i = 0; i < numBusses; i++) delete busses[i]; numBusses = 0; } @@ -278,7 +284,7 @@ class BusManager { for (uint8_t i = 0; i < numBusses; i++) { Bus* b = busses[i]; uint16_t bstart = b->getStart(); - if (pix < bstart) continue; + if (pix < bstart || pix >= bstart + b->getLength()) continue; busses[i]->setPixelColor(pix - bstart, c); } } @@ -301,7 +307,7 @@ class BusManager { bool canAllShow() { for (uint8_t i = 0; i < numBusses; i++) { - if (busses[i]->canShow()) return false; + if (!busses[i]->canShow()) return false; } return true; } diff --git a/wled00/const.h b/wled00/const.h index 8fec2661e..dabd0001a 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -16,7 +16,7 @@ #ifdef ESP8266 #define WLED_MAX_BUSSES 2 #else -#define WLED_MAX_BUSSES 8 +#define WLED_MAX_BUSSES 7 #endif //Usermod IDs @@ -175,7 +175,11 @@ // maximum number of LEDs - more than 1500 LEDs (or 500 DMA "LEDPIN 3" driven ones) will cause a low memory condition on ESP8266 #ifndef MAX_LEDS -#define MAX_LEDS 1500 +#ifdef ESP8266 +#define MAX_LEDS 1536 +#else +#define MAX_LEDS 8192 +#endif #endif #define MAX_LEDS_DMA 500 diff --git a/wled00/set.cpp b/wled00/set.cpp index db54ab31f..93d3f0ebb 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -331,9 +331,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) #endif if (subPage != 6 || !doReboot) serializeConfig(); //do not save if factory reset - if (subPage == 2) { - strip.init(useRGBW,ledCount,skipFirstLed); - } + if (subPage == 2) doInitStrip = true; if (subPage == 4) alexaInit(); } diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 9cb6be1e7..24d8500ef 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -195,10 +195,10 @@ void WLED::loop() handleHue(); handleBlynk(); - /*if (presetToApply) { - applyPreset(presetToApply); - presetToApply = 0; - }*/ + if (doInitStrip) { + strip.init(useRGBW, ledCount, skipFirstLed); + doInitStrip = false; + } yield(); @@ -267,13 +267,10 @@ void WLED::setup() DEBUG_PRINTLN(ESP.getFreeHeap()); registerUsermods(); - //strip.init(EEPROM.read(372), ledCount, EEPROM.read(2204)); // init LEDs quickly - //strip.setBrightness(0); //DEBUG_PRINT(F("LEDs inited. heap usage ~")); //DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap()); - bool fsinit = false; DEBUGFS_PRINTLN(F("Mount FS")); #ifdef ARDUINO_ARCH_ESP32 diff --git a/wled00/wled.h b/wled00/wled.h index f2fb2ad8d..2bd505b67 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -528,6 +528,7 @@ WLED_GLOBAL bool e131NewData _INIT(false); // led fx library object WLED_GLOBAL WS2812FX strip _INIT(WS2812FX()); +WLED_GLOBAL bool doInitStrip _INIT(false); // Usermod manager WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager()); diff --git a/wled00/xml.cpp b/wled00/xml.cpp index ebfda269f..c947c88a3 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -254,13 +254,14 @@ void getSettingsJS(byte subPage, char* dest) } if (subPage == 2) { - #ifdef ESP8266 - #if LEDPIN == 3 - oappend(SET_F("d.Sf.LC.max=500;")); + oappend(SET_F("d.Sf.LC.max=")); + #if defined(ESP8266) && LEDPIN == 3 + oappendi(MAX_LEDS_DMA); #else - oappend(SET_F("d.Sf.LC.max=1500;")); - #endif + oappendi(MAX_LEDS); #endif + oappend(";"); + sappend('v',SET_F("LC"),ledCount); sappend('v',SET_F("MA"),strip.ablMilliampsMax); sappend('v',SET_F("LA"),strip.milliampsPerLed);