From c9611bde73d52c05e8aea1be7ef1cddc028e2c57 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 17 Feb 2024 11:30:29 +0100 Subject: [PATCH] JSON buffer lock error messages Reduce wait time for lock to 100ms --- wled00/presets.cpp | 2 +- wled00/util.cpp | 6 +++--- wled00/wled_serial.cpp | 5 ++++- wled00/ws.cpp | 18 ++++++++++++++---- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 748771a9..3beab1b8 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -95,7 +95,7 @@ static void doSaveState() { bool getPresetName(byte index, String& name) { - if (!requestJSONBufferLock(9)) return false; + if (!requestJSONBufferLock(19)) return false; bool presetExists = false; if (readObjectFromFileUsingId(getFileName(), index, &doc)) { diff --git a/wled00/util.cpp b/wled00/util.cpp index 37d1b2c2..bea68c48 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -204,10 +204,10 @@ bool requestJSONBufferLock(uint8_t module) { unsigned long now = millis(); - while (jsonBufferLock && millis()-now < 1000) delay(1); // wait for a second for buffer lock + while (jsonBufferLock && millis()-now < 100) delay(1); // wait for fraction for buffer lock - if (millis()-now >= 1000) { - DEBUG_PRINT(F("ERROR: Locking JSON buffer failed! (")); + if (jsonBufferLock) { + DEBUG_PRINT(F("ERROR: Locking JSON buffer failed! (still locked by ")); DEBUG_PRINT(jsonBufferLock); DEBUG_PRINTLN(")"); return false; // waiting time-outed diff --git a/wled00/wled_serial.cpp b/wled00/wled_serial.cpp index c34e29dc..b46bb60a 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -136,7 +136,10 @@ void handleSerial() } else if (next == '{') { //JSON API bool verboseResponse = false; - if (!requestJSONBufferLock(16)) return; + if (!requestJSONBufferLock(16)) { + Serial.println(F("{\"error\":3}")); // ERR_NOBUF + return; + } Serial.setTimeout(100); DeserializationError error = deserializeJson(doc, Serial); if (error) { diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 2ed23ce5..0437a56c 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -41,7 +41,10 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp } bool verboseResponse = false; - if (!requestJSONBufferLock(11)) return; + if (!requestJSONBufferLock(11)) { + client->text(F("{\"error\":3}")); // ERR_NOBUF + return; + } DeserializationError error = deserializeJson(doc, data, len); JsonObject root = doc.as(); @@ -106,15 +109,22 @@ void sendDataWs(AsyncWebSocketClient * client) if (!ws.count()) return; AsyncWebSocketMessageBuffer * buffer; - if (!requestJSONBufferLock(12)) return; + if (!requestJSONBufferLock(12)) { + if (client) { + client->text(F("{\"error\":3}")); // ERR_NOBUF + } else { + ws.textAll(F("{\"error\":3}")); // ERR_NOBUF + } + return; + } JsonObject state = doc.createNestedObject("state"); serializeState(state); JsonObject info = doc.createNestedObject("info"); serializeInfo(info); - size_t len = measureJson(doc); - DEBUG_PRINTF("JSON buffer size: %u for WS request (%u).\n", doc.memoryUsage(), len); + size_t len = measureJson(*pDoc); + DEBUG_PRINTF("JSON buffer size: %u for WS request (%u).\n", pDoc->memoryUsage(), len); #ifdef ESP8266 size_t heap1 = ESP.getFreeHeap(); // WLEDMM moved into 8266 specific section