kopia lustrzana https://github.com/Aircoookie/WLED
Combat low memory condition on ESP8266.
rodzic
ddd32bd600
commit
763b64cc57
|
@ -184,7 +184,8 @@ void Segment::deallocateData() {
|
||||||
void Segment::resetIfRequired() {
|
void Segment::resetIfRequired() {
|
||||||
if (reset) {
|
if (reset) {
|
||||||
if (leds && !Segment::_globalLeds) { free(leds); leds = nullptr; }
|
if (leds && !Segment::_globalLeds) { free(leds); leds = nullptr; }
|
||||||
//if (_t) { delete _t; _t = nullptr; transitional = false; }
|
if (transitional && _t) { transitional = false; delete _t; _t = nullptr; }
|
||||||
|
deallocateData();
|
||||||
next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0;
|
next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0;
|
||||||
reset = false; // setOption(SEG_OPTION_RESET, false);
|
reset = false; // setOption(SEG_OPTION_RESET, false);
|
||||||
}
|
}
|
||||||
|
@ -1385,7 +1386,6 @@ void WS2812FX::purgeSegments(bool force) {
|
||||||
if (_segments.size() <= 1) return;
|
if (_segments.size() <= 1) return;
|
||||||
for (size_t i = _segments.size()-1; i > 0; i--)
|
for (size_t i = _segments.size()-1; i > 0; i--)
|
||||||
if (_segments[i].stop == 0 || force) {
|
if (_segments[i].stop == 0 || force) {
|
||||||
DEBUG_PRINT(F("Purging segment segment: ")); DEBUG_PRINTLN(i);
|
|
||||||
deleted++;
|
deleted++;
|
||||||
_segments.erase(_segments.begin() + i);
|
_segments.erase(_segments.begin() + i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,7 +124,7 @@ void handleIR();
|
||||||
#include "src/dependencies/json/AsyncJson-v6.h"
|
#include "src/dependencies/json/AsyncJson-v6.h"
|
||||||
#include "FX.h"
|
#include "FX.h"
|
||||||
|
|
||||||
void deserializeSegment(JsonObject elem, byte it, byte presetId = 0);
|
bool deserializeSegment(JsonObject elem, byte it, byte presetId = 0);
|
||||||
bool deserializeState(JsonObject root, byte callMode = CALL_MODE_DIRECT_CHANGE, byte presetId = 0);
|
bool deserializeState(JsonObject root, byte callMode = CALL_MODE_DIRECT_CHANGE, byte presetId = 0);
|
||||||
void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset = false, bool segmentBounds = true);
|
void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset = false, bool segmentBounds = true);
|
||||||
void serializeState(JsonObject root, bool forPreset = false, bool includeBri = true, bool segmentBounds = true, bool selectedSegmentsOnly = false);
|
void serializeState(JsonObject root, bool forPreset = false, bool includeBri = true, bool segmentBounds = true, bool selectedSegmentsOnly = false);
|
||||||
|
|
|
@ -14,16 +14,16 @@
|
||||||
* JSON API (De)serialization
|
* JSON API (De)serialization
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
bool deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||||
{
|
{
|
||||||
byte id = elem["id"] | it;
|
byte id = elem["id"] | it;
|
||||||
if (id >= strip.getMaxSegments()) return;
|
if (id >= strip.getMaxSegments()) return false;
|
||||||
|
|
||||||
int stop = elem["stop"] | -1;
|
int stop = elem["stop"] | -1;
|
||||||
|
|
||||||
// if using vectors use this code to append segment
|
// if using vectors use this code to append segment
|
||||||
if (id >= strip.getSegmentsNum()) {
|
if (id >= strip.getSegmentsNum()) {
|
||||||
if (stop <= 0) return; // ignore empty/inactive segments
|
if (stop <= 0) return false; // ignore empty/inactive segments
|
||||||
strip.appendSegment(Segment(0, strip.getLengthTotal()));
|
strip.appendSegment(Segment(0, strip.getLengthTotal()));
|
||||||
id = strip.getSegmentsNum()-1; // segments are added at the end of list
|
id = strip.getSegmentsNum()-1; // segments are added at the end of list
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||||
elem["rev"] = !elem["rev"]; // alternate reverse on even/odd segments
|
elem["rev"] = !elem["rev"]; // alternate reverse on even/odd segments
|
||||||
deserializeSegment(elem, i, presetId); // recursive call with new id
|
deserializeSegment(elem, i, presetId); // recursive call with new id
|
||||||
}
|
}
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elem["n"]) {
|
if (elem["n"]) {
|
||||||
|
@ -107,7 +107,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||||
if (stop > start && of > len -1) of = len -1;
|
if (stop > start && of > len -1) of = len -1;
|
||||||
seg.set(start, stop, grp, spc, of, startY, stopY);
|
seg.set(start, stop, grp, spc, of, startY, stopY);
|
||||||
|
|
||||||
if (seg.reset && seg.stop == 0) return; // segment was deleted & is marked for reset, no need to change anything else
|
if (seg.reset && seg.stop == 0) return true; // segment was deleted & is marked for reset, no need to change anything else
|
||||||
|
|
||||||
byte segbri = seg.opacity;
|
byte segbri = seg.opacity;
|
||||||
if (getVal(elem["bri"], &segbri)) {
|
if (getVal(elem["bri"], &segbri)) {
|
||||||
|
@ -264,6 +264,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||||
}
|
}
|
||||||
// send UDP/WS if segment options changed (except selection; will also deselect current preset)
|
// send UDP/WS if segment options changed (except selection; will also deselect current preset)
|
||||||
if (seg.differs(prev) & 0x7F) stateChanged = true;
|
if (seg.differs(prev) & 0x7F) stateChanged = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// deserializes WLED state (fileDoc points to doc object if called from web server)
|
// deserializes WLED state (fileDoc points to doc object if called from web server)
|
||||||
|
@ -379,11 +381,12 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
|
||||||
deserializeSegment(segVar, id, presetId); //apply only the segment with the specified ID
|
deserializeSegment(segVar, id, presetId); //apply only the segment with the specified ID
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
size_t deleted = 0;
|
||||||
JsonArray segs = segVar.as<JsonArray>();
|
JsonArray segs = segVar.as<JsonArray>();
|
||||||
for (JsonObject elem : segs) {
|
for (JsonObject elem : segs) {
|
||||||
deserializeSegment(elem, it, presetId);
|
if (deserializeSegment(elem, it++, presetId) && !elem["stop"].isNull() && elem["stop"]==0) deleted++;
|
||||||
it++;
|
|
||||||
}
|
}
|
||||||
|
if (strip.getSegmentsNum() > 3 && deleted >= strip.getSegmentsNum()/2U) strip.purgeSegments(); // batch deleting more than half segments
|
||||||
}
|
}
|
||||||
|
|
||||||
usermods.readFromJsonState(root);
|
usermods.readFromJsonState(root);
|
||||||
|
|
|
@ -316,8 +316,7 @@ void WLED::setup()
|
||||||
DEBUG_PRINT(F("esp8266 "));
|
DEBUG_PRINT(F("esp8266 "));
|
||||||
DEBUG_PRINTLN(ESP.getCoreVersion());
|
DEBUG_PRINTLN(ESP.getCoreVersion());
|
||||||
#endif
|
#endif
|
||||||
DEBUG_PRINT(F("heap "));
|
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
|
||||||
DEBUG_PRINTLN(ESP.getFreeHeap());
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM)
|
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM)
|
||||||
if (psramFound()) {
|
if (psramFound()) {
|
||||||
|
@ -352,6 +351,8 @@ void WLED::setup()
|
||||||
DEBUG_PRINTLN(F("Registering usermods ..."));
|
DEBUG_PRINTLN(F("Registering usermods ..."));
|
||||||
registerUsermods();
|
registerUsermods();
|
||||||
|
|
||||||
|
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
|
||||||
|
|
||||||
for (uint8_t i=1; i<WLED_MAX_BUTTONS; i++) btnPin[i] = -1;
|
for (uint8_t i=1; i<WLED_MAX_BUTTONS; i++) btnPin[i] = -1;
|
||||||
|
|
||||||
bool fsinit = false;
|
bool fsinit = false;
|
||||||
|
@ -392,10 +393,12 @@ void WLED::setup()
|
||||||
|
|
||||||
DEBUG_PRINTLN(F("Initializing strip"));
|
DEBUG_PRINTLN(F("Initializing strip"));
|
||||||
beginStrip();
|
beginStrip();
|
||||||
|
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
|
||||||
|
|
||||||
DEBUG_PRINTLN(F("Usermods setup"));
|
DEBUG_PRINTLN(F("Usermods setup"));
|
||||||
userSetup();
|
userSetup();
|
||||||
usermods.setup();
|
usermods.setup();
|
||||||
|
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
|
||||||
|
|
||||||
if (strcmp(clientSSID, DEFAULT_CLIENT_SSID) == 0)
|
if (strcmp(clientSSID, DEFAULT_CLIENT_SSID) == 0)
|
||||||
showWelcomePage = true;
|
showWelcomePage = true;
|
||||||
|
@ -451,7 +454,9 @@ void WLED::setup()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// HTTP server page init
|
// HTTP server page init
|
||||||
|
DEBUG_PRINTLN(F("initServer"));
|
||||||
initServer();
|
initServer();
|
||||||
|
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
|
||||||
|
|
||||||
enableWatchdog();
|
enableWatchdog();
|
||||||
|
|
||||||
|
@ -747,6 +752,8 @@ void WLED::handleConnection()
|
||||||
DEBUG_PRINTLN(heap);
|
DEBUG_PRINTLN(heap);
|
||||||
forceReconnect = true;
|
forceReconnect = true;
|
||||||
strip.purgeSegments(true); // remove all but one segments from memory
|
strip.purgeSegments(true); // remove all but one segments from memory
|
||||||
|
} else if (heap < MIN_HEAP_SIZE) {
|
||||||
|
strip.purgeSegments();
|
||||||
}
|
}
|
||||||
lastHeap = heap;
|
lastHeap = heap;
|
||||||
heapTime = now;
|
heapTime = now;
|
||||||
|
|
Ładowanie…
Reference in New Issue