Fixed canAllShow() and removeAll()

This commit is contained in:
cschwinne 2021-01-18 20:51:32 +01:00
parent aeb3f2b018
commit d5025fdbcc
8 changed files with 35 additions and 22 deletions

View File

@ -24,6 +24,8 @@
Modified for WLED Modified for WLED
*/ */
#include "wled.h"
#ifndef WS2812FX_h #ifndef WS2812FX_h
#define WS2812FX_h #define WS2812FX_h

View File

@ -48,6 +48,7 @@ const uint16_t customMappingSize = sizeof(customMappingTable)/sizeof(uint16_t);
#define PWM_INDEX 0 #define PWM_INDEX 0
#endif #endif
//do not call this method from system context (network callback)
void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst) void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
{ {
if (supportWhite == _useRgbw && countPixels == _length && _skipFirstMode == skipFirst) return; if (supportWhite == _useRgbw && countPixels == _length && _skipFirstMode == skipFirst) return;
@ -62,6 +63,9 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
} }
uint8_t pins[] = {2}; 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); busses->add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, countPixels, COL_ORDER_GRB);
_segments[0].start = 0; _segments[0].start = 0;

View File

@ -30,7 +30,7 @@ class Bus {
virtual void cleanup() {}; virtual void cleanup() {};
virtual ~Bus() { //throw the bus under the bus virtual ~Bus() { //throw the bus under the bus
cleanup(); //Serial.println("Destructor!");
} }
uint16_t getStart() { uint16_t getStart() {
@ -85,7 +85,7 @@ class BusDigital : public Bus {
_busPtr = PolyBus::create(_iType, _pins, _len); _busPtr = PolyBus::create(_iType, _pins, _len);
_valid = (_busPtr != nullptr); _valid = (_busPtr != nullptr);
_colorOrder = colorOrder; _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() { void show() {
@ -127,6 +127,7 @@ class BusDigital : public Bus {
} }
void cleanup() { void cleanup() {
//Serial.println("Digital Cleanup");
PolyBus::cleanup(_busPtr, _iType); PolyBus::cleanup(_busPtr, _iType);
_iType = I_NONE; _iType = I_NONE;
_valid = false; _valid = false;
@ -135,6 +136,10 @@ class BusDigital : public Bus {
pinManager.deallocatePin(_pins[1]); pinManager.deallocatePin(_pins[1]);
} }
~BusDigital() {
cleanup();
}
private: private:
uint8_t _colorOrder = COL_ORDER_GRB; uint8_t _colorOrder = COL_ORDER_GRB;
uint8_t _pins[2] = {255, 255}; uint8_t _pins[2] = {255, 255};
@ -263,6 +268,7 @@ class BusManager {
} }
void removeAll() { void removeAll() {
//Serial.println("Removing all.");
for (uint8_t i = 0; i < numBusses; i++) delete busses[i]; for (uint8_t i = 0; i < numBusses; i++) delete busses[i];
numBusses = 0; numBusses = 0;
} }
@ -278,7 +284,7 @@ class BusManager {
for (uint8_t i = 0; i < numBusses; i++) { for (uint8_t i = 0; i < numBusses; i++) {
Bus* b = busses[i]; Bus* b = busses[i];
uint16_t bstart = b->getStart(); uint16_t bstart = b->getStart();
if (pix < bstart) continue; if (pix < bstart || pix >= bstart + b->getLength()) continue;
busses[i]->setPixelColor(pix - bstart, c); busses[i]->setPixelColor(pix - bstart, c);
} }
} }
@ -301,7 +307,7 @@ class BusManager {
bool canAllShow() { bool canAllShow() {
for (uint8_t i = 0; i < numBusses; i++) { for (uint8_t i = 0; i < numBusses; i++) {
if (busses[i]->canShow()) return false; if (!busses[i]->canShow()) return false;
} }
return true; return true;
} }

View File

@ -16,7 +16,7 @@
#ifdef ESP8266 #ifdef ESP8266
#define WLED_MAX_BUSSES 2 #define WLED_MAX_BUSSES 2
#else #else
#define WLED_MAX_BUSSES 8 #define WLED_MAX_BUSSES 7
#endif #endif
//Usermod IDs //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 // 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 #ifndef MAX_LEDS
#define MAX_LEDS 1500 #ifdef ESP8266
#define MAX_LEDS 1536
#else
#define MAX_LEDS 8192
#endif
#endif #endif
#define MAX_LEDS_DMA 500 #define MAX_LEDS_DMA 500

View File

@ -331,9 +331,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
#endif #endif
if (subPage != 6 || !doReboot) serializeConfig(); //do not save if factory reset if (subPage != 6 || !doReboot) serializeConfig(); //do not save if factory reset
if (subPage == 2) { if (subPage == 2) doInitStrip = true;
strip.init(useRGBW,ledCount,skipFirstLed);
}
if (subPage == 4) alexaInit(); if (subPage == 4) alexaInit();
} }

View File

@ -195,10 +195,10 @@ void WLED::loop()
handleHue(); handleHue();
handleBlynk(); handleBlynk();
/*if (presetToApply) { if (doInitStrip) {
applyPreset(presetToApply); strip.init(useRGBW, ledCount, skipFirstLed);
presetToApply = 0; doInitStrip = false;
}*/ }
yield(); yield();
@ -267,13 +267,10 @@ void WLED::setup()
DEBUG_PRINTLN(ESP.getFreeHeap()); DEBUG_PRINTLN(ESP.getFreeHeap());
registerUsermods(); registerUsermods();
//strip.init(EEPROM.read(372), ledCount, EEPROM.read(2204)); // init LEDs quickly
//strip.setBrightness(0);
//DEBUG_PRINT(F("LEDs inited. heap usage ~")); //DEBUG_PRINT(F("LEDs inited. heap usage ~"));
//DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap()); //DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap());
bool fsinit = false; bool fsinit = false;
DEBUGFS_PRINTLN(F("Mount FS")); DEBUGFS_PRINTLN(F("Mount FS"));
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32

View File

@ -528,6 +528,7 @@ WLED_GLOBAL bool e131NewData _INIT(false);
// led fx library object // led fx library object
WLED_GLOBAL WS2812FX strip _INIT(WS2812FX()); WLED_GLOBAL WS2812FX strip _INIT(WS2812FX());
WLED_GLOBAL bool doInitStrip _INIT(false);
// Usermod manager // Usermod manager
WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager()); WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());

View File

@ -254,13 +254,14 @@ void getSettingsJS(byte subPage, char* dest)
} }
if (subPage == 2) { if (subPage == 2) {
#ifdef ESP8266 oappend(SET_F("d.Sf.LC.max="));
#if LEDPIN == 3 #if defined(ESP8266) && LEDPIN == 3
oappend(SET_F("d.Sf.LC.max=500;")); oappendi(MAX_LEDS_DMA);
#else #else
oappend(SET_F("d.Sf.LC.max=1500;")); oappendi(MAX_LEDS);
#endif
#endif #endif
oappend(";");
sappend('v',SET_F("LC"),ledCount); sappend('v',SET_F("LC"),ledCount);
sappend('v',SET_F("MA"),strip.ablMilliampsMax); sappend('v',SET_F("MA"),strip.ablMilliampsMax);
sappend('v',SET_F("LA"),strip.milliampsPerLed); sappend('v',SET_F("LA"),strip.milliampsPerLed);