From b0828a62808c0a56a2f1dbad525192d7649735b0 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Thu, 8 Oct 2020 00:52:15 +0200 Subject: [PATCH] Bigger buffer testing --- wled00/fcn_declare.h | 6 ++-- wled00/file.cpp | 12 ++++---- wled00/json.cpp | 13 ++++---- wled00/led.cpp | 2 +- wled00/set.cpp | 7 ++--- wled00/wled.cpp | 14 ++++----- wled00/wled.h | 6 ++-- wled00/wled_eeprom.cpp | 67 +++++++++++++++++++++++++++--------------- wled00/wled_server.cpp | 2 ++ 9 files changed, 71 insertions(+), 58 deletions(-) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 9a268bbfe..862c3829d 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -198,10 +198,10 @@ void clearEEPROM(); void writeStringToEEPROM(uint16_t pos, char* str, uint16_t len); void readStringFromEEPROM(uint16_t pos, char* str, uint16_t len); void saveSettingsToEEPROM(); -void loadSettingsFromEEPROM(bool first); +void loadSettingsFromEEPROM(); void savedToPresets(); -bool applyPreset(byte index, bool loadBri = true); -void savePreset(byte index, bool persist = true, const char* pname = nullptr, byte prio = 5, JsonObject saveobj = JsonObject()); +bool applyPreset(byte index); +void savePreset(byte index, bool persist = true, const char* pname = nullptr, JsonObject saveobj = JsonObject()); void deletePreset(byte index); void loadMacro(byte index, char* m); void applyMacro(byte index); diff --git a/wled00/file.cpp b/wled00/file.cpp index 4859cfc92..c6767c49c 100644 --- a/wled00/file.cpp +++ b/wled00/file.cpp @@ -10,7 +10,7 @@ #include "esp_spiffs.h" //FS info bare IDF function until FS wrapper is available for ESP32 #endif -#define FS_BUFSIZE 256 +#define FS_BUFSIZE 512 //allow presets to be added until this percentage of FS space is used #define FS_QUOTA 75 @@ -86,16 +86,16 @@ bool bufferedFindSpace(uint16_t targetLen, File f) { count = 0; while (count < bufsize) { - if(buf[count] != ' ') - index = 0; // reset index if not space - if(buf[count] == ' ') { if(++index >= targetLen) { // return true if space long enough f.seek((f.position() - bufsize) + count +1 - targetLen); DEBUGFS_PRINTF("Found at pos %d, took %d ms", f.position(), millis() - s); return true; } + } else { + index = 0; // reset index if not space } + count++; } } @@ -115,7 +115,7 @@ bool bufferedFindObjectEnd(File f) { uint16_t objDepth = 0; //num of '{' minus num of '}'. return once 0 uint16_t bufsize = 0, count = 0; //size_t start = f.position(); - byte buf[256]; + byte buf[FS_BUFSIZE]; while (f.position() < f.size() -1) { bufsize = f.read(buf, FS_BUFSIZE); @@ -297,7 +297,7 @@ bool readObjectFromFile(const char* file, const char* key, JsonDocument* dest) if (!bufferedFind(key, f)) //key does not exist in file { f.close(); - DEBUGFS_PRINTLN("Obj not found."); + DEBUGFS_PRINTLN(F("Obj not found.")); return false; } diff --git a/wled00/json.cpp b/wled00/json.cpp index 1bd776d34..2d2538b7b 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -147,9 +147,6 @@ bool deserializeState(JsonObject root) { strip.applyToAllSelected = false; bool stateResponse = root[F("v")] | false; - - int ps = root[F("ps")] | -1; - if (ps >= 0) applyPreset(ps); bri = root["bri"] | bri; @@ -240,17 +237,17 @@ bool deserializeState(JsonObject root) colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE); - //write presets to flash directly? - bool persistSaves = !(root[F("np")] | false); - - ps = root[F("psave")] | -1; + int ps = root[F("psave")] | -1; if (ps > 0) { - savePreset(ps, persistSaves, root["n"], root["p"] | 50, root["o"].as()); + savePreset(ps, true, nullptr, root); } else { ps = root[F("pdel")] | -1; //deletion if (ps > 0) { deletePreset(ps); } + ps = root[F("ps")] | -1; //load preset (clears state request!) + if (ps >= 0) applyPreset(ps); + //HTTP API commands const char* httpwin = root["win"]; if (httpwin) { diff --git a/wled00/led.cpp b/wled00/led.cpp index 395cd8493..d1f120eef 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -296,7 +296,7 @@ void handleNightlight() if (bri == 0 || nightlightActive) return; if (presetCycCurr < presetCycleMin || presetCycCurr > presetCycleMax) presetCycCurr = presetCycleMin; - applyPreset(presetCycCurr,presetApplyBri); + applyPreset(presetCycCurr); presetCycCurr++; if (presetCycCurr > 16) presetCycCurr = 1; colorUpdated(NOTIFIER_CALL_MODE_PRESET_CYCLE); diff --git a/wled00/set.cpp b/wled00/set.cpp index e263fcc46..f8ebd1898 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -486,15 +486,12 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) if (v > 100) presetCycleTime = v/100; } - pos = req.indexOf(F("PA=")); //apply brightness from preset - if (pos > 0) presetApplyBri = (req.charAt(pos+3) != '0'); - pos = req.indexOf(F("PS=")); //saves current in preset - if (pos > 0) savePreset(getNumVal(&req, pos), persistSaves); + if (pos > 0) savePreset(getNumVal(&req, pos)); //apply preset if (updateVal(&req, "PL=", &presetCycCurr, presetCycleMin, presetCycleMax)) { - applyPreset(presetCycCurr, presetApplyBri); + applyPreset(presetCycCurr); } //set brightness diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 4a6826a9c..ea7c8d0f7 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -85,13 +85,10 @@ void WLED::loop() handleHue(); handleBlynk(); - if (presetToApply) { - StaticJsonDocument<1024> temp; - errorFlag = !readObjectFromFileUsingId("/presets.json", presetToApply, &temp); - serializeJson(temp, Serial); - deserializeState(temp.as()); + /*if (presetToApply) { + applyPreset(presetToApply); presetToApply = 0; - } + }*/ yield(); @@ -192,7 +189,7 @@ void WLED::setup() #endif DEBUG_PRINTLN(F("Load EEPROM")); - loadSettingsFromEEPROM(true); + loadSettingsFromEEPROM(); beginStrip(); userSetup(); usermods.setup(); @@ -252,8 +249,7 @@ void WLED::beginStrip() pinMode(BTNPIN, INPUT_PULLUP); #endif - if (bootPreset > 0) - applyPreset(bootPreset, turnOnAtBoot); + if (bootPreset > 0) applyPreset(bootPreset); colorUpdated(NOTIFIER_CALL_MODE_INIT); // init relay pin diff --git a/wled00/wled.h b/wled00/wled.h index 86a87f834..2237b650c 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -167,10 +167,12 @@ WLED_GLOBAL char otaPass[33] _INIT(DEFAULT_OTA_PASS); // Hardware CONFIG (only changeble HERE, not at runtime) // LED strip pin, button pin and IR pin changeable in NpbWrapper.h! -WLED_GLOBAL byte presetToApply _INIT(0); +//WLED_GLOBAL byte presetToApply _INIT(0); +#if AUXPIN >= 0 WLED_GLOBAL byte auxDefaultState _INIT(0); // 0: input 1: high 2: low WLED_GLOBAL byte auxTriggeredState _INIT(0); // 0: input 1: high 2: low +#endif WLED_GLOBAL char ntpServerName[33] _INIT("0.wled.pool.ntp.org"); // NTP server to use // WiFi CONFIG (all these can be changed via web UI, no need to set them here) @@ -425,7 +427,6 @@ WLED_GLOBAL byte presetCycleMin _INIT(1), presetCycleMax _INIT(5); WLED_GLOBAL uint16_t presetCycleTime _INIT(12); WLED_GLOBAL unsigned long presetCycledTime _INIT(0); WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin); -WLED_GLOBAL bool presetApplyBri _INIT(true); WLED_GLOBAL bool saveCurrPresetCycConf _INIT(false); // realtime @@ -476,6 +477,7 @@ WLED_GLOBAL uint16_t olen _INIT(0); WLED_GLOBAL size_t fsBytesUsed _INIT(0); WLED_GLOBAL size_t fsBytesTotal _INIT(0); WLED_GLOBAL unsigned long presetsModifiedTime _INIT(0L); +WLED_GLOBAL JsonDocument* fileDoc; // presets WLED_GLOBAL uint16_t savedPresets _INIT(0); diff --git a/wled00/wled_eeprom.cpp b/wled00/wled_eeprom.cpp index afa5f75ee..bd0e9c021 100644 --- a/wled00/wled_eeprom.cpp +++ b/wled00/wled_eeprom.cpp @@ -249,7 +249,7 @@ void saveSettingsToEEPROM() EEPROM.write(2207, (presetCycleTime >> 8) & 0xFF); EEPROM.write(2208, presetCycleMin); EEPROM.write(2209, presetCycleMax); - EEPROM.write(2210, presetApplyBri); + // was EEPROM.write(2210, presetApplyBri); // was EEPROM.write(2211, presetApplyCol); // was EEPROM.write(2212, presetApplyFx); saveCurrPresetCycConf = false; @@ -295,7 +295,7 @@ void saveSettingsToEEPROM() /* * Read all configuration from flash */ -void loadSettingsFromEEPROM(bool first) +void loadSettingsFromEEPROM() { if (EEPROM.read(233) != 233) //first boot/reset to default { @@ -343,7 +343,7 @@ void loadSettingsFromEEPROM(bool first) staticSubnet[3] = EEPROM.read(245); briS = EEPROM.read(249); bri = briS; - if (!EEPROM.read(369) && first) + if (!EEPROM.read(369)) { bri = 0; briLast = briS; } @@ -559,7 +559,7 @@ void loadSettingsFromEEPROM(bool first) if (lastEEPROMversion < 21) presetCycleTime /= 100; //was stored in ms, now is in tenths of a second presetCycleMin = EEPROM.read(2208); presetCycleMax = EEPROM.read(2209); - presetApplyBri = EEPROM.read(2210); + //was presetApplyBri = EEPROM.read(2210); //was presetApplyCol = EEPROM.read(2211); //was presetApplyFx = EEPROM.read(2212); } @@ -627,19 +627,31 @@ void savedToPresets() } } -bool applyPreset(byte index, bool loadBri) +bool applyPreset(byte index) { - StaticJsonDocument<1024> temp; - errorFlag = readObjectFromFileUsingId("/presets.json", index, &temp) ? ERR_NONE : ERR_FS_PLOAD; - serializeJson(temp, Serial); - deserializeState(temp.as()); + if (fileDoc) { + errorFlag = readObjectFromFileUsingId("/presets.json", index, fileDoc) ? ERR_NONE : ERR_FS_PLOAD; + #ifdef WLED_DEBUG_FS + serializeJson(*fileDoc, Serial); + #endif + deserializeState(fileDoc->as()); + } else { + WLED_DEBUG_FS(F("Make read buf")); + DynamicJsonDocument fDoc(JSON_BUFFER_SIZE); + errorFlag = readObjectFromFileUsingId("/presets.json", index, &fDoc) ? ERR_NONE : ERR_FS_PLOAD; + #ifdef WLED_DEBUG_FS + serializeJson(fDoc, Serial); + #endif + deserializeState(fDoc.as()); + } + if (!errorFlag) { currentPreset = index; isPreset = true; return true; } return false; - if (index == 255 || index == 0) + /*if (index == 255 || index == 0) { loadSettingsFromEEPROM(false);//load boot defaults return true; @@ -681,29 +693,36 @@ bool applyPreset(byte index, bool loadBri) } currentPreset = index; isPreset = true; - return true; + return true;*/ } -void savePreset(byte index, bool persist, const char* pname, byte priority, JsonObject saveobj) +void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj) { - StaticJsonDocument<1024> doc; - JsonObject sObj = doc.to(); + bool docAlloc = fileDoc; + JsonObject sObj = saveobj; - if (saveobj.isNull()) { - DEBUGFS_PRINTLN("Save current state"); - serializeState(doc.to(), true); - currentPreset = index; + if (!docAlloc) { + DEBUGFS_PRINTLN(F("Allocating saving buffer")); + fileDoc = new DynamicJsonDocument(JSON_BUFFER_SIZE); + sObj = fileDoc->to(); + if (pname) sObj["n"] = pname; } else { - DEBUGFS_PRINTLN("Save custom"); - sObj.set(saveobj); + DEBUGFS_PRINTLN(F("Reuse recv buffer")); + sObj.remove(F("psave")); + sObj.remove(F("v")); } - sObj["p"] = priority; - if (pname) sObj["n"] = pname; - writeObjectToFileUsingId("/presets.json", index, &doc); + if (!sObj["o"]) { + DEBUGFS_PRINTLN(F("Save current state")); + serializeState(sObj, true); + currentPreset = index; + } + sObj.remove("o"); + + writeObjectToFileUsingId("/presets.json", index, fileDoc); + if (!docAlloc) delete fileDoc; presetsModifiedTime = now(); //unix time updateFSInfo(); - return; /*if (index > 16) return; if (index < 1) {saveSettingsToEEPROM();return;} diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index cff5a09e9..74b2aa372 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -85,7 +85,9 @@ void initServer() if (error || root.isNull()) { request->send(400, "application/json", F("{\"error\":9}")); return; } + fileDoc = &jsonBuffer; verboseResponse = deserializeState(root); + fileDoc = nullptr; } if (verboseResponse) { //if JSON contains "v" serveJson(request); return;