From b7d6f6b8ea04dbe24a7fb8a6cbdd0ea2dcba10b4 Mon Sep 17 00:00:00 2001 From: Vladimir Hirner Date: Mon, 11 Mar 2024 22:58:43 +0100 Subject: [PATCH 1/3] refactored status reporting to use String added additional information to status page including ESP32 chip info --- src/main.cpp | 68 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4d2f83d..4af0da9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,7 @@ Preferences preferences; #include #include "esp32c3/rom/rtc.h" #include + #include HTTPUpdateServer httpUpdater; #else @@ -209,39 +210,48 @@ void saveParamsCallback () { } -char* status_string(){ - static char status[1024]; - - int pos = 0; - - pos += sprintf(status + pos, "async mode: %s\n", USE_ASYNCHRONOUS ? "true" : "false"); - pos += sprintf(status + pos, "software serial mode: %s\n", USE_SOFTWARE_SERIAL ? "true" : "false"); - pos += sprintf(status + pos, "uptime: %ld ms\n", millis()); - pos += sprintf(status + pos, "last_connect_time: %ld ms\n", lastConnectTime); - pos += sprintf(status + pos, "reconnect_count: %d \n", reconnectCount); - pos += sprintf(status + pos, "rssi: %d dBm\n", WiFi.RSSI()); - pos += sprintf(status + pos, "free_heap: %d B\n", ESP.getFreeHeap()); - pos += sprintf(status + pos, "reset_code: %d\n", last_reset_code); - pos += sprintf(status + pos, "loop_duration: %ld us\r\n", loopDuration); - pos += sprintf(status + pos, "max_loop_duration: %ld us\r\n", maxLoopDuration); - pos += sprintf(status + pos, "version: %s\r\n", AUTO_VERSION); - pos += sprintf(status + pos, "nbr arbitrations: %i\r\n", (int)Bus._nbrArbitrations); - pos += sprintf(status + pos, "nbr restarts1: %i\r\n", (int)Bus._nbrRestarts1); - pos += sprintf(status + pos, "nbr restarts2: %i\r\n", (int)Bus._nbrRestarts2); - pos += sprintf(status + pos, "nbr lost1: %i\r\n", (int)Bus._nbrLost1); - pos += sprintf(status + pos, "nbr lost2: %i\r\n", (int)Bus._nbrLost2); - pos += sprintf(status + pos, "nbr won1: %i\r\n", (int)Bus._nbrWon1); - pos += sprintf(status + pos, "nbr won2: %i\r\n", (int)Bus._nbrWon2); - pos += sprintf(status + pos, "nbr late: %i\r\n", (int)Bus._nbrLate); - pos += sprintf(status + pos, "nbr errors: %i\r\n", (int)Bus._nbrErrors); - pos += sprintf(status + pos, "pwm_value: %i\r\n", get_pwm()); - - return status; +String status_string() { + String result; + + result += "firmware_version: " + String(AUTO_VERSION) + "\r\n"; +#ifdef ESP32 + result += "esp32_chip_model: " + String(ESP.getChipModel()) + " Rev " + String(ESP.getChipRevision()) + "\r\n"; + result += "esp32_chip_cores: " + String(ESP.getChipCores()) + "\r\n"; + result += "esp32_chip_temperature: " + String(temperatureRead()) + " °C\r\n"; +#endif + result += "cpu_chip_speed: " + String(ESP.getCpuFreqMHz()) + " MHz\r\n"; + result += "flash_chip_speed: " + String(ESP.getFlashChipSpeed()/1000000) + " MHz\r\n"; + result += "flash_size: " + String(ESP.getFlashChipSize()/1024/1024) + " MB\r\n"; + result += "free_heap: " + String(ESP.getFreeHeap()) + " B\r\n"; + result += "sdk_version: " + String(ESP.getSdkVersion()) + "\r\n"; + result += "wifi_sid: " + String(WiFi.SSID()) + "\r\n"; + result += "wifi_ip_address: " + String(WiFi.localIP().toString()) + "\r\n"; + result += "wifi_rssi: " + String(WiFi.RSSI()) + " dBm\r\n"; + result += "async_mode: " + String(USE_ASYNCHRONOUS ? "true" : "false") + "\r\n"; + result += "software_serial_mode: " + String(USE_SOFTWARE_SERIAL ? "true" : "false") + "\r\n"; + result += "uptime: " + String(millis()/1000) + " s\r\n"; + result += "last_connect_time: " + String(lastConnectTime) + " ms\r\n"; + result += "reconnect_count: " + String(reconnectCount) + " \r\n"; + result += "reset_code: " + String(last_reset_code) + "\r\n"; + result += "loop_duration: " + String(loopDuration) + " µs\r\n"; + result += "max_loop_duration: " + String(maxLoopDuration) + " µs\r\n"; + result += "nbr_arbitrations: " + String((int)Bus._nbrArbitrations) + "\r\n"; + result += "nbr_restarts1: " + String((int)Bus._nbrRestarts1) + "\r\n"; + result += "nbr_restarts2: " + String((int)Bus._nbrRestarts2) + "\r\n"; + result += "nbr_lost1: " + String((int)Bus._nbrLost1) + "\r\n"; + result += "nbr_lost2: " + String((int)Bus._nbrLost2) + "\r\n"; + result += "nbr_won1: " + String((int)Bus._nbrWon1) + "\r\n"; + result += "nbr_won2: " + String((int)Bus._nbrWon2) + "\r\n"; + result += "nbr_late: " + String((int)Bus._nbrLate) + "\r\n"; + result += "nbr_errors: " + String((int)Bus._nbrErrors) + "\r\n"; + result += "pwm_value: " + String(get_pwm()) + "\r\n"; + + return result; } void handleStatus() { - configServer.send(200, "text/plain", status_string()); + configServer.send(200, "text/plain; charset=utf-8", status_string()); } From a75b991a677b99cb44d477f12d8f44c7bad28c3b Mon Sep 17 00:00:00 2001 From: Vladimir Hirner Date: Tue, 12 Mar 2024 10:47:43 +0100 Subject: [PATCH 2/3] added last reset reason as string + fixed reset_code for ESP8266 --- src/main.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 4af0da9..0bd82b7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -210,6 +210,34 @@ void saveParamsCallback () { } +String get_last_error_str() { + String result; +#ifdef ESP32 + switch (last_reset_code) + { + case 1 : result = "Vbat power on reset";break; + case 3 : result = "Software reset digital core";break; + case 4 : result = "Legacy watch dog reset digital core";break; + case 5 : result = "Deep Sleep reset digital core";break; + case 6 : result = "Reset by SLC module, reset digital core";break; + case 7 : result = "Timer Group0 Watch dog reset digital core";break; + case 8 : result = "Timer Group1 Watch dog reset digital core";break; + case 9 : result = "RTC Watch dog Reset digital core";break; + case 10 : result = "Instrusion tested to reset CPU";break; + case 11 : result = "Time Group reset CPU";break; + case 12 : result = "Software reset CPU";break; + case 13 : result = "RTC Watch dog Reset CPU";break; + case 14 : result = "for APP CPU, reseted by PRO CPU";break; + case 15 : result = "Reset when the vdd voltage is not stable";break; + case 16 : result = "RTC Watch dog reset digital core and rtc module";break; + default : result = "Unknown"; + } +#elif defined(ESP8266) + result = ESP.getResetReason(); +#endif + return result; +} + String status_string() { String result; @@ -233,6 +261,7 @@ String status_string() { result += "last_connect_time: " + String(lastConnectTime) + " ms\r\n"; result += "reconnect_count: " + String(reconnectCount) + " \r\n"; result += "reset_code: " + String(last_reset_code) + "\r\n"; + result += "reset_reason: " + String(get_last_error_str()) + "\r\n"; result += "loop_duration: " + String(loopDuration) + " µs\r\n"; result += "max_loop_duration: " + String(maxLoopDuration) + " µs\r\n"; result += "nbr_arbitrations: " + String((int)Bus._nbrArbitrations) + "\r\n"; @@ -286,7 +315,10 @@ void setup() { #ifdef ESP32 last_reset_code = rtc_get_reset_reason(0); #elif defined(ESP8266) - last_reset_code = (int) ESP.getResetInfoPtr(); + struct rst_info *last_reset_ptr = ESP.getResetInfoPtr(); + if (last_reset_ptr != NULL) { + last_reset_code = last_reset_ptr->reason; + } #endif Bus.begin(); From 8bd5d43d15b7044651415d8c105f7d26d56e0ac9 Mon Sep 17 00:00:00 2001 From: Vladimir Hirner Date: Tue, 12 Mar 2024 11:22:23 +0100 Subject: [PATCH 3/3] added new reset reasons for ESP32_C3 chip + normal power on --- src/main.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0bd82b7..c1b5ee0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -215,6 +215,7 @@ String get_last_error_str() { #ifdef ESP32 switch (last_reset_code) { + case 0 : result = "Normal power On";break; case 1 : result = "Vbat power on reset";break; case 3 : result = "Software reset digital core";break; case 4 : result = "Legacy watch dog reset digital core";break; @@ -223,13 +224,20 @@ String get_last_error_str() { case 7 : result = "Timer Group0 Watch dog reset digital core";break; case 8 : result = "Timer Group1 Watch dog reset digital core";break; case 9 : result = "RTC Watch dog Reset digital core";break; - case 10 : result = "Instrusion tested to reset CPU";break; - case 11 : result = "Time Group reset CPU";break; + case 10 : result = "Intrusion tested to reset CPU";break; + case 11 : result = "Time Group0 reset CPU";break; case 12 : result = "Software reset CPU";break; case 13 : result = "RTC Watch dog Reset CPU";break; case 14 : result = "for APP CPU, reseted by PRO CPU";break; case 15 : result = "Reset when the vdd voltage is not stable";break; case 16 : result = "RTC Watch dog reset digital core and rtc module";break; + case 17 : result = "Time Group1 reset CPU";break; + case 18 : result = "Super watchdog reset digital core and rtc module";break; + case 19 : result = "Glitch reset digital core and rtc module";break; + case 20 : result = "Efuse reset digital core";break; + case 21 : result = "USB uart reset digital core";break; + case 22 : result = "USB jtag reset digital core";break; + case 23 : result = "Power glitch reset digital core and rtc module";break; default : result = "Unknown"; } #elif defined(ESP8266)