From 972b03376b255358226920a86637ff9447e3d2a2 Mon Sep 17 00:00:00 2001 From: lumapu Date: Thu, 16 Nov 2023 23:59:05 +0100 Subject: [PATCH] 0.8.8 * fix ESP8266 save inverter #1232 --- src/CHANGES.md | 3 +++ src/defines.h | 2 +- src/web/RestApi.h | 36 +++++++++++++++++++++++++++--------- src/web/html/setup.html | 2 +- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/CHANGES.md b/src/CHANGES.md index 4fb9bf7e..380458fc 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,8 @@ # Development Changes +## 0.8.8 - 2023-11-16 +* fix ESP8266 save inverter #1232 + ## 0.8.7 - 2023-11-13 * fix ESP8266 inverter settings #1226 * send radio statistics via MqTT #1227 diff --git a/src/defines.h b/src/defines.h index fe9acf95..4d95b022 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 7 +#define VERSION_PATCH 8 //------------------------------------- typedef struct { diff --git a/src/web/RestApi.h b/src/web/RestApi.h index fa2aaf22..d44e0f1e 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -124,12 +124,26 @@ class RestApi { void onApiPostBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { DPRINTLN(DBG_VERBOSE, "onApiPostBody"); - DynamicJsonDocument json(800); - AsyncJsonResponse* response = new AsyncJsonResponse(false, 200); - JsonObject root = response->getRoot(); - DeserializationError err = deserializeJson(json, (const char *)data, len); + if(0 == index) { + if(NULL != mTmpBuf) + delete[] mTmpBuf; + mTmpBuf = new uint8_t[total+1]; + mTmpSize = total; + } + if(mTmpSize >= (len + index)) + memcpy(&mTmpBuf[index], data, len); + + if((len + index) != total) + return; // not last frame - nothing to do + + DynamicJsonDocument json(1000); + + DeserializationError err = deserializeJson(json, (const char *)mTmpBuf, mTmpSize); JsonObject obj = json.as(); + + AsyncJsonResponse* response = new AsyncJsonResponse(false, 200); + JsonObject root = response->getRoot(); root[F("success")] = (err) ? false : true; if(!err) { String path = request->url().substring(5); @@ -141,18 +155,20 @@ class RestApi { root[F("success")] = false; root[F("error")] = "Path not found: " + path; } - } - else { + } else { switch (err.code()) { case DeserializationError::Ok: break; - case DeserializationError::InvalidInput: root[F("error")] = F("Invalid input"); break; - case DeserializationError::NoMemory: root[F("error")] = F("Not enough memory"); break; - default: root[F("error")] = F("Deserialization failed"); break; + case DeserializationError::IncompleteInput: root[F("error")] = F("Incomplete input"); break; + case DeserializationError::InvalidInput: root[F("error")] = F("Invalid input"); break; + case DeserializationError::NoMemory: root[F("error")] = F("Not enough memory"); break; + default: root[F("error")] = F("Deserialization failed"); break; } } response->setLength(); request->send(response); + delete[] mTmpBuf; + mTmpBuf = NULL; } void getNotFound(JsonObject obj, String url) { @@ -760,6 +776,8 @@ class RestApi { uint32_t mTimezoneOffset; uint32_t mHeapFree, mHeapFreeBlk; uint8_t mHeapFrag; + uint8_t *mTmpBuf = NULL; + uint32_t mTmpSize; }; #endif /*__WEB_API_H__*/ diff --git a/src/web/html/setup.html b/src/web/html/setup.html index b9933cea..c1c1c841 100644 --- a/src/web/html/setup.html +++ b/src/web/html/setup.html @@ -798,7 +798,7 @@ function cb(obj) { var e = document.getElementById("res"); if(!obj.success) - e.innerHTML = "error while saving"; + e.innerHTML = "error: " + obj.error; else { modalClose(); getAjax("/api/inverter/list", parseIv);