diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index d4a1345bb..6c28b3e76 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1089,14 +1089,11 @@ void WS2812FX::deserializeMap(uint8_t n) { return; } -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } -#endif + #else + if (!requestJSONBufferLock(5)) return; + #endif DEBUG_PRINT(F("Reading LED map from ")); DEBUG_PRINTLN(fileName); diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 5fda92073..8d77b6bb8 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -425,14 +425,11 @@ void deserializeConfigFromFS() { return; } -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } -#endif + #else + if (!requestJSONBufferLock(1)) return; + #endif DEBUG_PRINTLN(F("Reading settings from /cfg.json...")); @@ -456,14 +453,11 @@ void serializeConfig() { DEBUG_PRINTLN(F("Writing settings to /cfg.json...")); -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } -#endif + #else + if (!requestJSONBufferLock(2)) return; + #endif JsonArray rev = doc.createNestedArray("rev"); rev.add(1); //major settings revision @@ -777,14 +771,11 @@ void serializeConfig() { bool deserializeConfigSec() { DEBUG_PRINTLN(F("Reading settings from /wsec.json...")); -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return false; - } -#endif + #else + if (!requestJSONBufferLock(3)) return false; + #endif bool success = readObjectFromFile("/wsec.json", nullptr, &doc); if (!success) { @@ -829,14 +820,11 @@ bool deserializeConfigSec() { void serializeConfigSec() { DEBUG_PRINTLN(F("Writing settings to /wsec.json...")); -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } -#endif + #else + if (!requestJSONBufferLock(4)) return; + #endif JsonObject nw = doc.createNestedObject("nw"); diff --git a/wled00/data/index.js b/wled00/data/index.js index fe311ca50..9bef5dbbf 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -1066,6 +1066,7 @@ function updateSelectedFx() var parent = gId('fxlist'); var selEffectInput = parent.querySelector(`input[name="fx"][value="${selectedFx}"]`); if (selEffectInput) selEffectInput.checked = true; +console.log(selEffectInput); var selElement = parent.querySelector('.selected'); if (selElement) selElement.classList.remove('selected'); @@ -1106,7 +1107,7 @@ function makeWS() { jsonTimeout = null; lastUpdate = new Date(); clearErrorToast(); - gId('connind').style.backgroundColor = "var(--c-l)"; + gId('connind').style.backgroundColor = "var(--c-l)"; // json object should contain json.info AND json.state (but may not) var i = json.info; if (i) { diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 3edccb5f8..2b81199f9 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -272,7 +272,7 @@ void sappends(char stype, const char* key, char* val); void prepareHostname(char* hostname); void _setRandomColor(bool _sec, bool fromButton); bool isAsterisksOnly(const char* str, byte maxLen); -bool requestJSONBufferLock(); +bool requestJSONBufferLock(uint8_t module=255); void releaseJSONBufferLock(); //wled_eeprom.cpp diff --git a/wled00/ir.cpp b/wled00/ir.cpp index 0cdca96a3..f3b6355e0 100644 --- a/wled00/ir.cpp +++ b/wled00/ir.cpp @@ -576,14 +576,11 @@ void decodeIRJson(uint32_t code) JsonObject jsonCmdObj; DEBUG_PRINTLN(F("IR JSON buffer requested.")); -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } -#endif + #else + if (!requestJSONBufferLock(6)) return; + #endif sprintf_P(objKey, PSTR("\"0x%lX\":"), (unsigned long)code); diff --git a/wled00/json.cpp b/wled00/json.cpp index f130d4096..5c28916bf 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -917,15 +917,12 @@ void serveJson(AsyncWebServerRequest* request) return; } -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON AsyncJsonResponse* response = new AsyncJsonResponse(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } + #else + if (!requestJSONBufferLock(7)) return; AsyncJsonResponse *response = new AsyncJsonResponse(&doc); -#endif + #endif JsonObject lDoc = response->getRoot(); diff --git a/wled00/mqtt.cpp b/wled00/mqtt.cpp index 3b608df0c..9ef3a22fb 100644 --- a/wled00/mqtt.cpp +++ b/wled00/mqtt.cpp @@ -92,12 +92,9 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties } else if (strcmp_P(topic, PSTR("/api")) == 0) { DEBUG_PRINTLN(F("MQTT JSON buffer requested.")); #ifdef WLED_USE_DYNAMIC_JSON - DynamicJsonDocument doc(JSON_BUFFER_SIZE); + DynamicJsonDocument doc(JSON_BUFFER_SIZE); #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } + if (!requestJSONBufferLock(8)) return; #endif if (payload[0] == '{') { //JSON API deserializeJson(doc, payloadStr); diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 580dc44aa..114f593db 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -22,14 +22,11 @@ bool applyPreset(byte index, byte callMode) deserializeState(fdo, callMode, index); } else { DEBUG_PRINTLN(F("Apply preset JSON buffer requested.")); - #ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return false; - } - #endif + #else + if (!requestJSONBufferLock(9)) return false; + #endif errorFlag = readObjectFromFileUsingId(filename, index, &doc) ? ERR_NONE : ERR_FS_PLOAD; JsonObject fdo = doc.as(); @@ -57,14 +54,11 @@ void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj) if (!fileDoc) { DEBUG_PRINTLN(F("Save preset JSON buffer requested.")); - #ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(10)) return; + #endif sObj = doc.to(); if (pname) sObj["n"] = pname; diff --git a/wled00/set.cpp b/wled00/set.cpp index e97974ee8..a47a27e77 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -415,14 +415,11 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) //USERMODS if (subPage == 8) { - #ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(11)) return; + #endif JsonObject um = doc.createNestedObject("um"); diff --git a/wled00/util.cpp b/wled00/util.cpp index e9af648ea..281887f85 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -131,15 +131,20 @@ bool isAsterisksOnly(const char* str, byte maxLen) } -bool requestJSONBufferLock() +bool requestJSONBufferLock(uint8_t module) { unsigned long now = millis(); while (jsonBufferLock && millis()-now < 1000) delay(1); // wait for a second for buffer lock - if (millis()-now >= 1000) return false; // waiting time-outed + if (millis()-now >= 1000) { + DEBUG_PRINT(F("ERROR: Locking JSON buffer failed! (")); + DEBUG_PRINT(jsonBufferLock); + DEBUG_PRINTLN(")"); + return false; // waiting time-outed + } - jsonBufferLock = true; + jsonBufferLock = module ? module : 255; fileDoc = &doc; // used for applying presets (presets.cpp) doc.clear(); return true; @@ -148,8 +153,11 @@ bool requestJSONBufferLock() void releaseJSONBufferLock() { -#ifndef WLED_USE_DYNAMIC_JSON + DEBUG_PRINT(F("JSON buffer released. (")); + DEBUG_PRINT(jsonBufferLock); + DEBUG_PRINTLN(")"); fileDoc = nullptr; - jsonBufferLock = false; -#endif + #ifndef WLED_USE_DYNAMIC_JSON + jsonBufferLock = 0; + #endif } diff --git a/wled00/wled.h b/wled00/wled.h index d21dff4ed..47c20e9ad 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -606,7 +606,7 @@ WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager()); #ifndef WLED_USE_DYNAMIC_JSON WLED_GLOBAL StaticJsonDocument doc; #endif -WLED_GLOBAL volatile bool jsonBufferLock _INIT(false); +WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0); // enable additional debug output #ifdef WLED_DEBUG diff --git a/wled00/wled_eeprom.cpp b/wled00/wled_eeprom.cpp index 03d0a8067..691ea81de 100644 --- a/wled00/wled_eeprom.cpp +++ b/wled00/wled_eeprom.cpp @@ -382,14 +382,11 @@ void deEEP() { DEBUG_PRINTLN(F("Preset file not found, attempting to load from EEPROM")); DEBUGFS_PRINTLN(F("Allocating saving buffer for dEEP")); -#ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); -#else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } -#endif + #else + if (!requestJSONBufferLock(12)) return; + #endif JsonObject sObj = doc.to(); sObj.createNestedObject("0"); @@ -469,6 +466,7 @@ void deEEP() { File f = WLED_FS.open("/presets.json", "w"); if (!f) { errorFlag = ERR_FS_GENERAL; + releaseJSONBufferLock(); return; } serializeJson(doc, f); diff --git a/wled00/wled_serial.cpp b/wled00/wled_serial.cpp index 5e250818d..c7d9a9968 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -44,14 +44,11 @@ void handleSerial() else if (next == '{') { //JSON API bool verboseResponse = false; DEBUG_PRINTLN(F("Serial JSON buffer requested.")); - #ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(13)) return; + #endif Serial.setTimeout(100); DeserializationError error = deserializeJson(doc, Serial); if (error) { diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 07ff2107b..cb3da0aae 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -111,19 +111,18 @@ void initServer() bool isConfig = false; { //scope JsonDocument so it releases its buffer DEBUG_PRINTLN(F("HTTP JSON buffer requested.")); - #ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(14)) return; + #endif DeserializationError error = deserializeJson(doc, (uint8_t*)(request->_tempObject)); JsonObject root = doc.as(); if (error || root.isNull()) { - request->send(400, "application/json", F("{\"error\":9}")); return; + releaseJSONBufferLock(); + request->send(400, "application/json", F("{\"error\":9}")); + return; } const String& url = request->url(); isConfig = url.indexOf("cfg") > -1; diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 5722a3284..9457d9774 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -36,15 +36,12 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp } bool verboseResponse = false; { //scope JsonDocument so it releases its buffer - DEBUG_PRINTLN(F("WS JSON receive buffer requested.")); - #ifdef WLED_USE_DYNAMIC_JSON + DEBUG_PRINTLN(F("WS JSON receive buffer requested.")); + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(15)) return; + #endif DeserializationError error = deserializeJson(doc, data, len); JsonObject root = doc.as(); @@ -116,15 +113,12 @@ void sendDataWs(AsyncWebSocketClient * client) AsyncWebSocketMessageBuffer * buffer; { //scope JsonDocument so it releases its buffer - DEBUG_PRINTLN(F("WS JSON send buffer requested.")); - #ifdef WLED_USE_DYNAMIC_JSON + DEBUG_PRINTLN(F("WS JSON send buffer requested.")); + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(JSON_BUFFER_SIZE); - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(16)) return; + #endif JsonObject state = doc.createNestedObject("state"); serializeState(state); diff --git a/wled00/xml.cpp b/wled00/xml.cpp index a1bca6c7f..0a59cf270 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -253,14 +253,11 @@ void getSettingsJS(byte subPage, char* dest) // add reserved and usermod pins as d.um_p array oappend(SET_F("d.um_p=[6,7,8,9,10,11")); - #ifdef WLED_USE_DYNAMIC_JSON + #ifdef WLED_USE_DYNAMIC_JSON DynamicJsonDocument doc(2048); // 2k is enough for usermods - #else - if (!requestJSONBufferLock()) { - DEBUG_PRINTLN(F("ERROR: Locking JSON buffer failed!")); - return; - } - #endif + #else + if (!requestJSONBufferLock(17)) return; + #endif JsonObject mods = doc.createNestedObject(F("um")); usermods.addToConfig(mods);