diff --git a/src/CHANGES.md b/src/CHANGES.md index a1b23dbc..3002ed7c 100644 --- a/src/CHANGES.md +++ b/src/CHANGES.md @@ -1,5 +1,8 @@ # Development Changes +## 0.8.122 - 2024-05-23 +* add button for donwloading coredump + ## 0.8.121 - 2024-05-20 * fix ESP32 factory image generation * fix plot of history graph #1635 diff --git a/src/defines.h b/src/defines.h index a83d4e89..c0664b7d 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,7 +13,7 @@ //------------------------------------- #define VERSION_MAJOR 0 #define VERSION_MINOR 8 -#define VERSION_PATCH 121 +#define VERSION_PATCH 122 //------------------------------------- typedef struct { uint8_t ch; diff --git a/src/web/RestApi.h b/src/web/RestApi.h index eaa18a0f..e810a5cb 100644 --- a/src/web/RestApi.h +++ b/src/web/RestApi.h @@ -55,6 +55,7 @@ class RestApi { mSrv->on("/api", HTTP_GET, std::bind(&RestApi::onApi, this, std::placeholders::_1)); mSrv->on("/get_setup", HTTP_GET, std::bind(&RestApi::onDwnldSetup, this, std::placeholders::_1)); + mSrv->on("/coredump", HTTP_GET, std::bind(&RestApi::getCoreDump, this, std::placeholders::_1)); } uint32_t getTimezoneOffset(void) { @@ -348,6 +349,33 @@ class RestApi { fp.close(); } + void getCoreDump(AsyncWebServerRequest *request) { + const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_COREDUMP, "coredump"); + if (partition != NULL) { + size_t size = partition->size; + + AsyncWebServerResponse *response = request->beginResponse("application/octet-stream", size, [size, partition](uint8_t *buffer, size_t maxLen, size_t index) -> size_t { + if((index + maxLen) > size) + maxLen = size - index; + + if (ESP_OK != esp_partition_read(partition, index, buffer, maxLen)) + DPRINTLN(DBG_ERROR, F("can't read partition")); + + return maxLen; + }); + + String filename = ah::getDateTimeStrFile(gTimezone.toLocal(mApp->getTimestamp())); + filename += "_v" + String(mApp->getVersion()); + + response->addHeader("Content-Description", "File Transfer"); + response->addHeader("Content-Disposition", "attachment; filename=" + filename + "_coredump.bin"); + request->send(response); + } else { + AsyncWebServerResponse *response = request->beginResponse(200, F("application/json; charset=utf-8"), "{}"); + request->send(response); + } + } + void getGeneric(AsyncWebServerRequest *request, JsonObject obj) { mApp->resetLockTimeout(); #if !defined(ETHERNET) @@ -435,8 +463,8 @@ class RestApi { void getHtmlSystem(AsyncWebServerRequest *request, JsonObject obj) { getSysInfo(request, obj.createNestedObject(F("system"))); getGeneric(request, obj.createNestedObject(F("generic"))); - char tmp[200]; - snprintf(tmp, 200, "%s

%s", FACTORY_RESET, BTN_REBOOT); + char tmp[300]; + snprintf(tmp, 300, "%s

%s

%s", FACTORY_RESET, BTN_REBOOT, BTN_COREDUMP); obj[F("html")] = String(tmp); } diff --git a/src/web/lang.h b/src/web/lang.h index 54ade94e..dd6640b2 100644 --- a/src/web/lang.h +++ b/src/web/lang.h @@ -90,4 +90,10 @@ #define BTN_NO "no" #endif +#ifdef LANG_DE + #define BTN_COREDUMP "CoreDump herunterladen" +#else /*LANG_EN*/ + #define BTN_COREDUMP "download CoreDump" +#endif + #endif /*__LANG_H__*/