From dde9af8f054ab1c5c0186e62d418b5ba95c2b1d2 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Thu, 13 Oct 2022 19:37:27 +0200 Subject: [PATCH] Chip Infos added to Info Page * CPU type & Speed * FLASH speed * last boot code (reset reason) * totalHeap not available on 8266 --- wled00/data/index.js | 9 +++- wled00/json.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 123 insertions(+), 3 deletions(-) diff --git a/wled00/data/index.js b/wled00/data/index.js index 299550c1..4ae61a5c 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -670,12 +670,19 @@ ${inforow("Uptime",getRuntimeStr(i.uptime))} ${inforow("Total heap",theap," kB")} ${inforow("Free heap",heap," kB")} ${i.tpram?inforow("Total PSRAM",(i.tpram/1024).toFixed(1)," kB"):""} -${i.psram?inforow("Free PSRAM",(i.psram/1024).toFixed(1)," kB"):""} +${i.psram?inforow("Used PSRAM",(i.tpram-i.psram)," B"):""} ${inforow("Estimated current",pwru)} ${inforow("Average FPS",i.leds.fps)} ${inforow("MAC address",i.mac)} ${inforow("Filesystem",i.fs.u + "/" + i.fs.t + " kB (" +Math.round(i.fs.u*100/i.fs.t) + "%)")} ${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.e32core0code?inforow("Core0 bootcode", i.e32core0code, " "+i.e32core0text):""} +${i.e32core1code?inforow("Core1 bootcode",i.e32core1code, " "+i.e32core1text):""} + `; gId('kv').innerHTML = cn; // update all sliders in Info diff --git a/wled00/json.cpp b/wled00/json.cpp index 902265d1..017eb2ab 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -2,6 +2,29 @@ #include "palettes.h" +// begin WLEDSR +#ifdef ARDUINO_ARCH_ESP32 +#include +// get the right RTC.H for each MCU +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0) +#if CONFIG_IDF_TARGET_ESP32S2 +#include +#elif CONFIG_IDF_TARGET_ESP32C3 +#include +#elif CONFIG_IDF_TARGET_ESP32S3 +#include +#elif CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 +#include +#endif +#else // ESP32 Before IDF 4.0 +#include +#endif +#else // for 8266 +#include +#include +#endif +// end WLEDSR + /* * JSON API (De)serialization */ @@ -571,6 +594,63 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme } } +// begin WLEDSR +#ifdef ARDUINO_ARCH_ESP32 +static String resetCode2Info(int reason) { + switch(reason) { + + case 1 : // 1 = Vbat power on reset + return F("power-on"); break; + case 2 : // 2 = this code is not defined on ESP32 + return F("exception"); break; + case 3 : // 3 = Software reset digital core + case 12: //12 = Software reset CPU + return F("SW reboot"); break; + case 5 : // 5 = Deep Sleep wakeup reset digital core + return F("wakeup"); break; + case 14: //14 = for APP CPU, reset by PRO CPU + return F("restart"); break; + case 15: //15 = Reset when the vdd voltage is not stable (brownout) + return F("brown-out"); break; + + // watchdog resets + case 4 : // 4 = Legacy watch dog reset digital core + case 6 : // 6 = Reset by SLC module, reset digital core + case 7 : // 7 = Timer Group0 Watch dog reset digital core + case 8 : // 8 = Timer Group1 Watch dog reset digital core + case 9 : // 9 = RTC Watch dog Reset digital core + case 11: //11 = Time Group watchdog reset CPU + case 13: //13 = RTC Watch dog Reset CPU + case 16: //16 = RTC Watch dog reset digital core and rtc module + case 17: //17 = Time Group1 reset CPU + return F("watchdog"); break; + case 18: //18 = super watchdog reset digital core and rtc module + return F("super watchdog"); break; + + // misc + case 10: // 10 = Instrusion tested to reset CPU + return F("intrusion"); break; + case 19: //19 = glitch reset digital core and rtc module + return F("glitch"); break; + case 20: //20 = efuse reset digital core + return F("EFUSE reset"); break; + case 21: //21 = usb uart reset digital core + return F("USB UART reset"); break; + case 22: //22 = usb jtag reset digital core + return F("JTAG reset"); break; + case 23: //23 = power glitch reset digital core and rtc module + return F("power glitch"); break; + + // unknown reason code + case 0: + return F(""); break; + default: + return F("unknown"); break; + } +} +#endif +// end WLEDSR + void serializeInfo(JsonObject root) { root[F("ver")] = versionString; @@ -685,9 +765,11 @@ void serializeInfo(JsonObject root) //root[F("maxalloc")] = ESP.getMaxAllocHeap(); #ifdef WLED_DEBUG root[F("resetReason0")] = (int)rtc_get_reset_reason(0); - root[F("resetReason1")] = (int)rtc_get_reset_reason(1); + if(ESP.getChipCores() > 1) // WLEDSR + root[F("resetReason1")] = (int)rtc_get_reset_reason(1); #endif root[F("lwip")] = 0; //deprecated + root[F("totalheap")] = ESP.getHeapSize(); //WLEDSR #else root[F("arch")] = "esp8266"; root[F("core")] = ESP.getCoreVersion(); @@ -698,12 +780,43 @@ void serializeInfo(JsonObject root) root[F("lwip")] = LWIP_VERSION_MAJOR; #endif - root[F("totalheap")] = ESP.getHeapSize(); //WLEDSR root[F("freeheap")] = ESP.getFreeHeap(); #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) if (psramFound()) root[F("tpram")] = ESP.getPsramSize(); //WLEDSR if (psramFound()) root[F("psram")] = ESP.getFreePsram(); #endif + + // begin WLEDSR + #ifdef ARDUINO_ARCH_ESP32 + root[F("e32core0code")] = (int)rtc_get_reset_reason(0); + root[F("e32core0text")] = resetCode2Info(rtc_get_reset_reason(0)); + if(ESP.getChipCores() > 1) { + root[F("e32core1code")] = (int)rtc_get_reset_reason(1); + root[F("e32core1text")] = resetCode2Info(rtc_get_reset_reason(1)); + } + static char msgbuf[32]; + snprintf(msgbuf, sizeof(msgbuf)-1, "%s rev.%d", ESP.getChipModel(), ESP.getChipRevision()); + root[F("e32model")] = msgbuf; + root[F("e32cores")] = ESP.getChipCores(); + root[F("e32speed")] = ESP.getCpuFreqMHz(); + root[F("e32flash")] = int((ESP.getFlashChipSize()/1024)/1024); + root[F("e32flashspeed")] = int(ESP.getFlashChipSpeed()/1000000); + root[F("e32flashmode")] = int(ESP.getFlashChipMode()); + switch (ESP.getFlashChipMode()) { + // missing: Octal modes + case FM_QIO: root[F("e32flashtext")] = F(" (QIO)"); break; + case FM_QOUT: root[F("e32flashtext")] = F(" (QOUT)");break; + case FM_DIO: root[F("e32flashtext")] = F(" (DIO)"); break; + case FM_DOUT: root[F("e32flashtext")] = F(" (DOUT or other)");break; + default: root[F("e32flashtext")] = F(" (other)"); break; + } + + #else // for 8266 + root[F("e32core0code")] = (int)ESP.getResetInfoPtr()->reason; + root[F("e32core0text")] = F(""); + #endif + // end WLEDSR + root[F("uptime")] = millis()/1000 + rolloverMillis*4294967; usermods.addToJsonInfo(root);