From 2342746720e2fc9a3d2693987331f787d622da97 Mon Sep 17 00:00:00 2001 From: fvanroie <15969459+fvanroie@users.noreply.github.com> Date: Sat, 1 May 2021 19:28:16 +0200 Subject: [PATCH] Add get_info --- src/dev/device.h | 4 ++ src/dev/esp32/esp32.cpp | 115 +++++++++++++++++++++++++++++++++++++--- src/dev/esp32/esp32.h | 2 + 3 files changed, 115 insertions(+), 6 deletions(-) diff --git a/src/dev/device.h b/src/dev/device.h index 94a8f5ac..2bcd0a21 100644 --- a/src/dev/device.h +++ b/src/dev/device.h @@ -18,6 +18,8 @@ #include "Windows.h" #endif +#include "ArduinoJson.h" + namespace dev { class BaseDevice { @@ -86,6 +88,8 @@ class BaseDevice { { return 0; } + virtual void get_info(JsonDocument& doc) + {} virtual bool is_system_pin(uint8_t pin) { return false; diff --git a/src/dev/esp32/esp32.cpp b/src/dev/esp32/esp32.cpp index c63779f1..722ddb48 100644 --- a/src/dev/esp32/esp32.cpp +++ b/src/dev/esp32/esp32.cpp @@ -7,21 +7,94 @@ #include #include #include "esp_system.h" - -#include "hasp_conf.h" - -#include "../device.h" -#include "esp32.h" - +#include // needed to get the ResetInfo #include "driver/adc.h" #include "esp_adc_cal.h" +#include "hasp_conf.h" +#include "../device.h" +#include "esp32.h" #include "hasp_debug.h" #define BACKLIGHT_CHANNEL 0 namespace dev { +static String esp32ResetReason(uint8_t cpuid) +{ + if(cpuid > 1) { + return F("Invalid CPU id"); + } + RESET_REASON reason = rtc_get_reset_reason(cpuid); + + String resetReason((char*)0); + resetReason.reserve(128); + + resetReason += F("CPU"); + resetReason += cpuid; + resetReason += F(": "); + + switch(reason) { + case 1: + resetReason += F("POWERON"); + break; /**<1, Vbat power on reset*/ + case 3: + resetReason += F("SW"); + break; /**<3, Software reset digital core*/ + case 4: + resetReason += F("OWDT"); + break; /**<4, Legacy watch dog reset digital core*/ + case 5: + resetReason += F("DEEPSLEEP"); + break; /**<5, Deep Sleep reset digital core*/ + case 6: + resetReason += F("SDIO"); + break; /**<6, Reset by SLC module, reset digital core*/ + case 7: + resetReason += F("TG0WDT_SYS"); + break; /**<7, Timer Group0 Watch dog reset digital core*/ + case 8: + resetReason += F("TG1WDT_SYS"); + break; /**<8, Timer Group1 Watch dog reset digital core*/ + case 9: + resetReason += F("RTCWDT_SYS"); + break; /**<9, RTC Watch dog Reset digital core*/ + case 10: + resetReason += F("INTRUSION"); + break; /**<10, Instrusion tested to reset CPU*/ + case 11: + resetReason += F("TGWDT_CPU"); + break; /**<11, Time Group reset CPU*/ + case 12: + resetReason += F("SW_CPU"); + break; /**<12, Software reset CPU*/ + case 13: + resetReason += F("RTCWDT_CPU"); + break; /**<13, RTC Watch dog Reset CPU*/ + case 14: + resetReason += F("EXT_CPU"); + break; /**<14, for APP CPU, reseted by PRO CPU*/ + case 15: + resetReason += F("RTCWDT_BROWN_OUT"); + break; /**<15, Reset when the vdd voltage is not stable*/ + case 16: + resetReason += F("RTCWDT_RTC"); + break; /**<16, RTC Watch dog reset digital core and rtc module*/ + default: + resetReason += F("NO_MEAN"); + return resetReason; + } + resetReason += F("_RESET"); + return resetReason; +} + +static void halGetResetInfo(String& resetReason) +{ + resetReason = String(esp32ResetReason(0)); + resetReason += F(" / "); + resetReason += String(esp32ResetReason(1)); +} + Esp32Device::Esp32Device() { _hostname = MQTT_NODENAME; @@ -38,6 +111,8 @@ Esp32Device::Esp32Device() if(mac[i] < 0x10) _hardware_id += "0"; _hardware_id += String(mac[i], HEX).c_str(); } + + _sketch_size = ESP.getSketchSize(); // slow: takes ~1 second } void Esp32Device::reboot() @@ -178,6 +253,34 @@ bool Esp32Device::is_system_pin(uint8_t pin) return false; } +void Esp32Device::get_info(JsonDocument& doc) +{ + char size_buf[64]; + String buffer((char*)0); + buffer.reserve(64); + + JsonObject info = doc.createNestedObject(F(D_INFO_MODULE)); + + /* ESP Stats */ + buffer = String(get_cpu_frequency()); + buffer += F("MHz"); + info[F(D_INFO_MODULE)] = get_chip_model(); // 10ms + info[F(D_INFO_FREQUENCY)] = buffer; + + info[F(D_INFO_CORE_VERSION)] = get_core_version(); + halGetResetInfo(buffer); + info[F(D_INFO_RESET_REASON)] = buffer; + + Parser::format_bytes(ESP.getFlashChipSize(), size_buf, sizeof(size_buf)); // 25ms + info[F(D_INFO_FLASH_SIZE)] = size_buf; + + Parser::format_bytes(_sketch_size, size_buf, sizeof(size_buf)); + info[F(D_INFO_SKETCH_USED)] = size_buf; + + Parser::format_bytes(ESP.getFreeSketchSpace(), size_buf, sizeof(size_buf)); + info[F(D_INFO_SKETCH_FREE)] = size_buf; +} + } // namespace dev #if defined(LANBONL8) diff --git a/src/dev/esp32/esp32.h b/src/dev/esp32/esp32.h index 968e22fd..cb217599 100644 --- a/src/dev/esp32/esp32.h +++ b/src/dev/esp32/esp32.h @@ -35,12 +35,14 @@ class Esp32Device : public BaseDevice { size_t get_free_heap() override; uint8_t get_heap_fragmentation() override; uint16_t get_cpu_frequency() override; + void get_info(JsonDocument& doc) override; bool is_system_pin(uint8_t pin) override; private: std::string _hostname; std::string _hardware_id; + uint32_t _sketch_size; // cached because function is slow uint8_t _backlight_pin; uint8_t _backlight_level;