Skip to content

Commit befeb55

Browse files
committed
Memory check on bus creation
1 parent 746a8ba commit befeb55

File tree

6 files changed

+39
-10
lines changed

6 files changed

+39
-10
lines changed

wled00/FX_fcn.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ void WS2812FX::finalizeInit(bool supportWhite, uint16_t countPixels, bool skipFi
7070

7171
deserializeMap();
7272

73+
//make segment 0 cover the entire strip
7374
_segments[0].start = 0;
7475
_segments[0].stop = _length;
7576

wled00/bus_manager.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,29 @@ class BusManager {
297297
BusManager() {
298298

299299
};
300+
301+
//utility to get the approx. memory usage of a given BusConfig
302+
uint32_t memUsage(BusConfig &bc) {
303+
uint8_t type = bc.type;
304+
uint16_t len = bc.count;
305+
if (type < 32) {
306+
#ifdef ESP8266
307+
if (bc.pins[0] == 3) { //8266 DMA uses 5x the mem
308+
if (type > 29) return len*20; //RGBW
309+
return len*15;
310+
}
311+
if (type > 29) return len*4; //RGBW
312+
return len*3;
313+
#else //ESP32 RMT uses double buffer?
314+
if (type > 29) return len*8; //RGBW
315+
return len*6;
316+
#endif
317+
}
318+
319+
if (type > 31 && type < 48) return 5;
320+
if (type == 44 || type == 45) return len*4; //RGBW
321+
return len*3;
322+
}
300323

301324
int add(BusConfig &bc) {
302325
if (numBusses >= WLED_MAX_BUSSES) return -1;
@@ -317,7 +340,6 @@ class BusManager {
317340
for (uint8_t i = 0; i < numBusses; i++) delete busses[i];
318341
numBusses = 0;
319342
}
320-
//void remove(uint8_t id);
321343

322344
void show() {
323345
for (uint8_t i = 0; i < numBusses; i++) {

wled00/cfg.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,10 @@ void deserializeConfig() {
9999
CJSON(strip.rgbwMode, hw_led[F("rgbwm")]);
100100

101101
JsonArray ins = hw_led["ins"];
102-
uint8_t s = 0;
102+
uint8_t s = 0; //bus iterator
103103
useRGBW = false;
104104
busses.removeAll();
105+
uint32_t mem = 0;
105106
for (JsonObject elm : ins) {
106107
if (s >= WLED_MAX_BUSSES) break;
107108
uint8_t pins[5] = {255, 255, 255, 255, 255};
@@ -130,7 +131,8 @@ void deserializeConfig() {
130131
useRGBW = (useRGBW || BusManager::isRgbw(ledType));
131132
s++;
132133
BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed);
133-
busses.add(bc);
134+
mem += busses.memUsage(bc);
135+
if (mem <= MAX_LED_MEMORY) busses.add(bc);
134136
}
135137
strip.finalizeInit(useRGBW, ledCount, skipFirstLed);
136138

wled00/const.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,19 @@
188188
// maximum number of LEDs - more than 1500 LEDs (or 500 DMA "LEDPIN 3" driven ones) will cause a low memory condition on ESP8266
189189
#ifndef MAX_LEDS
190190
#ifdef ESP8266
191-
#define MAX_LEDS 1536
191+
#define MAX_LEDS 2048
192192
#else
193193
#define MAX_LEDS 8192
194194
#endif
195195
#endif
196196

197-
#define MAX_LEDS_DMA 500
197+
#ifndef MAX_LED_MEMORY
198+
#ifdef ESP8266
199+
#define MAX_LED_MEMORY 5000
200+
#else
201+
#define MAX_LED_MEMORY 64000
202+
#endif
203+
#endif
198204

199205
// string temp buffer (now stored in stack locally)
200206
#define OMAX 2048

wled00/wled.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,11 @@ void WLED::loop()
218218
//LED settings have been saved, re-init busses
219219
if (busConfigs[0] != nullptr) {
220220
busses.removeAll();
221+
uint32_t mem = 0;
221222
for (uint8_t i = 0; i < WLED_MAX_BUSSES; i++) {
222223
if (busConfigs[i] == nullptr) break;
223-
busses.add(*busConfigs[i]);
224+
mem += busses.memUsage(*busConfigs[i]);
225+
if (mem <= MAX_LED_MEMORY) busses.add(*busConfigs[i]);
224226
delete busConfigs[i]; busConfigs[i] = nullptr;
225227
}
226228
strip.finalizeInit(useRGBW, ledCount, skipFirstLed);

wled00/xml.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,7 @@ void getSettingsJS(byte subPage, char* dest)
279279
#endif
280280

281281
oappend(SET_F("d.Sf.LC.max=")); //TODO Formula for max LEDs on ESP8266 depending on types. 500 DMA or 1500 UART (about 4kB mem usage)
282-
#if defined(ESP8266) && LEDPIN == 3
283-
oappendi(MAX_LEDS_DMA);
284-
#else
285282
oappendi(MAX_LEDS);
286-
#endif
287283
oappend(";");
288284

289285
sappend('v',SET_F("LC"),ledCount);

0 commit comments

Comments
 (0)