diff --git a/main/kernel/CrashManager.hpp b/main/kernel/CrashManager.hpp index 6bf512b5..91255ec6 100644 --- a/main/kernel/CrashManager.hpp +++ b/main/kernel/CrashManager.hpp @@ -5,30 +5,43 @@ #include +#include #include namespace farmhub::kernel { class CrashManager { public: - static void reportPreviousCrashIfAny(JsonObject& json) { + static void handleCrashReport(JsonObject& json) { + NvsStore nvs("crash-report"); + reportPreviousCrashIfAny(json, nvs); + nvs.set("version", farmhubVersion); + } + +private: + static void reportPreviousCrashIfAny(JsonObject& json, NvsStore& nvs) { if (!hasCoreDump()) { return; } + std::string crashedFirmwareVersion; + if (!nvs.get("version", crashedFirmwareVersion)) { + crashedFirmwareVersion = "unknown"; + } + esp_core_dump_summary_t summary {}; esp_err_t err = esp_core_dump_get_summary(&summary); if (err != ESP_OK) { LOGE("Failed to get core dump summary: %s", esp_err_to_name(err)); } else { auto crashJson = json["crash"].to(); + crashJson["firmware-version"] = crashedFirmwareVersion; reportPreviousCrash(crashJson, summary); } ESP_ERROR_CHECK_WITHOUT_ABORT(esp_core_dump_image_erase()); } -private: static bool hasCoreDump() { esp_err_t err = esp_core_dump_image_check(); switch (err) { @@ -58,8 +71,8 @@ class CrashManager { LOGW("Core dump found: task: %s, cause: %ld", summary.exc_task, excCause); - json["version"] = summary.core_dump_version; - json["sha256"] = std::string((const char*) summary.app_elf_sha256); + json["dump-version"] = summary.core_dump_version; + json["elf-sha256"] = std::string((const char*) summary.app_elf_sha256); json["task"] = std::string(summary.exc_task); json["cause"] = excCause; diff --git a/main/main.cpp b/main/main.cpp index fcf69f26..89bf2c9c 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -499,7 +499,7 @@ extern "C" void app_main() { json["peripherals"].to().set(peripheralsInitJson); json["sleepWhenIdle"] = powerManager->sleepWhenIdle; - CrashManager::reportPreviousCrashIfAny(json); + CrashManager::handleCrashReport(json); }, Retention::NoRetain, QoS::AtLeastOnce, 5s);