From 5761dce95785a470ba95d0eeed434767f52aa359 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/wled_server.cpp | 5 ++++- wled00/ws.cpp | 16 +++++++++++++--- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/wled00/presets.cpp b/wled00/presets.cpp index a1a7b08fc..80335ad3b 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -83,7 +83,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, pDoc)) { diff --git a/wled00/util.cpp b/wled00/util.cpp index ea89adc68..9e7d2eb46 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -215,10 +215,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 c6e984035..9cca09db0 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -113,7 +113,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(*pDoc, Serial); if (error) { diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 1de200218..0e20aaf53 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -285,7 +285,10 @@ void initServer() bool verboseResponse = false; bool isConfig = false; - if (!requestJSONBufferLock(14)) return; + if (!requestJSONBufferLock(14)) { + serveJsonError(request, 503, ERR_NOBUF); + return; + } DeserializationError error = deserializeJson(*pDoc, (uint8_t*)(request->_tempObject)); JsonObject root = pDoc->as(); diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 2bf74a41f..1dd141a68 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -36,7 +36,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(*pDoc, data, len); JsonObject root = pDoc->as(); @@ -101,7 +104,14 @@ 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 = pDoc->createNestedObject("state"); serializeState(state); @@ -109,7 +119,7 @@ void sendDataWs(AsyncWebSocketClient * client) serializeInfo(info); size_t len = measureJson(*pDoc); - DEBUG_PRINTF("JSON buffer size: %u for WS request (%u).\n", pDoc->memoryUsage(), len); + DEBUG_PRINTF_P(PSTR("JSON buffer size: %u for WS request (%u).\n"), pDoc->memoryUsage(), len); size_t heap1 = ESP.getFreeHeap(); DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());