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());