From 8d8fdfe77e6308e0c9b39a479cadaee71df7f081 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 5 Mar 2023 23:48:14 +0100 Subject: [PATCH] info page: add ESP restart reason this is another "restart reason" - sometimes provides clearer information, especially in case of crash or watchdog reset. --- wled00/data/index.js | 1 + wled00/fcn_declare.h | 9 +++++++++ wled00/json.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++- wled00/wled.cpp | 12 ++++++++++++ wled00/wled.h | 2 +- 5 files changed, 68 insertions(+), 2 deletions(-) diff --git a/wled00/data/index.js b/wled00/data/index.js index 324f72aa..82bdb7ae 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -691,6 +691,7 @@ ${inforow("Environment",i.arch + " " + i.core + " (" + i.lwip + ")")}
${i.e32model?inforow(i.e32model + " ☾",i.e32cores +" core(s)"," "+i.e32speed+" Mhz"):""} ${i.e32flash?inforow("Flash "+i.e32flash+"MB"+" mode "+i.e32flashmode+i.e32flashtext + " ☾",i.e32flashspeed," Mhz"):""} +${i.e32code?inforow("Last ESP Restart ☾",i.e32code+" "+i.e32text):""} ${i.e32core0code?inforow("Core0 rst reason ☾",i.e32core0code, " "+i.e32core0text):""} ${i.e32core1code?inforow("Core1 rst reason ☾",i.e32core1code, " "+i.e32core1text):""} diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 6bd74515..617d609f 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -136,6 +136,15 @@ void serveJson(AsyncWebServerRequest* request); bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient = 0); #endif +#ifdef ARDUINO_ARCH_ESP32 +#include +int getCoreResetReason(int core); +String resetCode2Info(int reason); +esp_reset_reason_t getRestartReason(); +String restartCode2Info(esp_reset_reason_t reason); +String restartCode2InfoLong(esp_reset_reason_t reason); +#endif + //led.cpp void setValuesFromSegment(uint8_t s); void setValuesFromMainSeg(); diff --git a/wled00/json.cpp b/wled00/json.cpp index 3b5f6329..0e97a1fc 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -654,7 +654,12 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme // begin WLEDMM #ifdef ARDUINO_ARCH_ESP32 -static String resetCode2Info(int reason) { +int getCoreResetReason(int core) { + if (core >= ESP.getChipCores()) return 0; + return((int)rtc_get_reset_reason(core)); +} + +String resetCode2Info(int reason) { switch(reason) { case 1 : // 1 = Vbat power on reset @@ -707,6 +712,42 @@ static String resetCode2Info(int reason) { return F("unknown"); break; } } + +esp_reset_reason_t getRestartReason() { + return(esp_reset_reason()); +} +String restartCode2InfoLong(esp_reset_reason_t reason) { + switch (reason) { + case ESP_RST_UNKNOWN: return(F("Reset reason can not be determined")); break; + case ESP_RST_POWERON: return(F("Restart due to power-on event")); break; + case ESP_RST_EXT: return(F("Reset by external pin (not applicable for ESP32)")); break; + case ESP_RST_SW: return(F("Software restart via esp_restart()")); break; + case ESP_RST_PANIC: return(F("Software reset due to panic or unhandled exception (SW error)")); break; + case ESP_RST_INT_WDT: return(F("Reset (software or hardware) due to interrupt watchdog")); break; + case ESP_RST_TASK_WDT: return(F("Reset due to task watchdog")); break; + case ESP_RST_WDT: return(F("Reset due to other watchdogs")); break; + case ESP_RST_DEEPSLEEP:return(F("Restart after exiting deep sleep mode")); break; + case ESP_RST_BROWNOUT: return(F("Brownout Reset (software or hardware)")); break; + case ESP_RST_SDIO: return(F("Reset over SDIO")); break; + } + return(F("unknown")); +} +String restartCode2Info(esp_reset_reason_t reason) { + switch (reason) { + case ESP_RST_UNKNOWN: return(F("unknown reason")); break; + case ESP_RST_POWERON: return(F("power-on event")); break; + case ESP_RST_EXT: return(F("external pin reset")); break; + case ESP_RST_SW: return(F("SW restart by esp_restart()")); break; + case ESP_RST_PANIC: return(F("SW error (panic or exception)")); break; + case ESP_RST_INT_WDT: return(F("interrupt watchdog")); break; + case ESP_RST_TASK_WDT: return(F("task watchdog")); break; + case ESP_RST_WDT: return(F("other watchdog")); break; + case ESP_RST_DEEPSLEEP:return(F("exit from deep sleep")); break; + case ESP_RST_BROWNOUT: return(F("Brownout Reset")); break; + case ESP_RST_SDIO: return(F("Reset over SDIO")); break; + } + return(F("unknown")); +} #endif // end WLEDMM @@ -882,6 +923,9 @@ void serializeInfo(JsonObject root) root[F("e32core1code")] = (int)rtc_get_reset_reason(1); root[F("e32core1text")] = resetCode2Info(rtc_get_reset_reason(1)); } + root[F("e32code")] = (int)getRestartReason(); + root[F("e32text")] = restartCode2Info(getRestartReason()); + static char msgbuf[32]; snprintf(msgbuf, sizeof(msgbuf)-1, "%s rev.%d", ESP.getChipModel(), ESP.getChipRevision()); root[F("e32model")] = msgbuf; diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 7ac96a5b..d4c1375c 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -336,6 +336,18 @@ void WLED::setup() USER_PRINT(F(" rev.")); USER_PRINT(ESP.getChipRevision()); USER_PRINT(F(", ")); USER_PRINT(ESP.getChipCores()); USER_PRINT(F(" core(s)")); USER_PRINT(F(", ")); USER_PRINT(ESP.getCpuFreqMHz()); USER_PRINTLN(F("MHz.")); + + // WLEDMM begin + USER_PRINT(F("CPU ")); + esp_reset_reason_t resetReason = getRestartReason(); + USER_PRINT(restartCode2InfoLong(resetReason)); + int core0code = getCoreResetReason(0); + int core1code = getCoreResetReason(1); + USER_PRINTF("Core#0 %s (%d)", resetCode2Info(core0code).c_str(), core0code); + if (core1code > 0) {USER_PRINTF("; Core#1 %s (%d)", resetCode2Info(core1code).c_str(), core1code);} + USER_PRINTLN(F(".")); + // WLEDMM end + USER_PRINT(F("FLASH: ")); USER_PRINT((ESP.getFlashChipSize()/1024)/1024); USER_PRINT(F("MB, Mode ")); USER_PRINT(ESP.getFlashChipMode()); #ifdef WLED_DEBUG diff --git a/wled00/wled.h b/wled00/wled.h index d1b33f9e..692eb478 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2303010 +#define VERSION 2303051 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG