8#include <user_interface.h>
21static const char *
const TAG =
"debug";
30 "Software/System restart",
36static_assert(REASON_DEFAULT_RST == 0,
"Reset reason enum values must match table indices");
37static_assert(REASON_WDT_RST == 1,
"Reset reason enum values must match table indices");
38static_assert(REASON_EXCEPTION_RST == 2,
"Reset reason enum values must match table indices");
39static_assert(REASON_SOFT_WDT_RST == 3,
"Reset reason enum values must match table indices");
40static_assert(REASON_SOFT_RESTART == 4,
"Reset reason enum values must match table indices");
41static_assert(REASON_DEEP_SLEEP_AWAKE == 5,
"Reset reason enum values must match table indices");
42static_assert(REASON_EXT_SYS_RST == 6,
"Reset reason enum values must match table indices");
46static_assert(FM_QIO == 0,
"Flash mode enum values must match table indices");
47static_assert(FM_QOUT == 1,
"Flash mode enum values must match table indices");
48static_assert(FM_DIO == 2,
"Flash mode enum values must match table indices");
49static_assert(FM_DOUT == 3,
"Flash mode enum values must match table indices");
53static const LogString *get_reset_reason_str(uint32_t reason) {
54 return ResetReasonStrings::get_log_str(
static_cast<uint8_t
>(reason), ResetReasonStrings::LAST_INDEX);
58static constexpr size_t CORE_VERSION_BUFFER_SIZE = 12;
62static const char *get_core_version_str(std::span<char, CORE_VERSION_BUFFER_SIZE> buffer) {
66 snprintf_P(buffer.data(), CORE_VERSION_BUFFER_SIZE, PSTR(
"%08x"),
core_version);
71static constexpr size_t RESET_INFO_BUFFER_SIZE = 200;
75static const char *get_reset_info_str(std::span<char, RESET_INFO_BUFFER_SIZE> buffer, uint32_t reason) {
76 if (reason >= REASON_WDT_RST && reason <= REASON_SOFT_WDT_RST) {
77 snprintf_P(buffer.data(), RESET_INFO_BUFFER_SIZE,
78 PSTR(
"Fatal exception:%d flag:%d (%s) epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x"),
79 static_cast<int>(
resetInfo.exccause),
static_cast<int>(reason),
84 return LOG_STR_ARG(get_reset_reason_str(reason));
89 strncpy_P(buffer.data(), (PGM_P) get_reset_reason_str(
resetInfo.reason), RESET_REASON_BUFFER_SIZE - 1);
90 buffer[RESET_REASON_BUFFER_SIZE - 1] =
'\0';
100 return ESP.getFreeHeap();
104 constexpr size_t size = DEVICE_INFO_BUFFER_SIZE;
105 char *buf = buffer.data();
107 const LogString *flash_mode = FlashModeStrings::get_log_str(
108 static_cast<uint8_t
>(ESP.getFlashChipMode()),
109 FlashModeStrings::LAST_INDEX);
110 uint32_t flash_size = ESP.getFlashChipSize() / 1024;
111 uint32_t flash_speed = ESP.getFlashChipSpeed() / 1000000;
112 ESP_LOGD(TAG,
"Flash Chip: Size=%" PRIu32
"kB Speed=%" PRIu32
"MHz Mode=%s", flash_size, flash_speed,
113 LOG_STR_ARG(flash_mode));
114 pos = buf_append_printf(buf,
size,
pos,
"|Flash: %" PRIu32
"kB Speed:%" PRIu32
"MHz Mode:%s", flash_size, flash_speed,
115 LOG_STR_ARG(flash_mode));
117 char reason_buffer[RESET_REASON_BUFFER_SIZE];
119 char core_version_buffer[CORE_VERSION_BUFFER_SIZE];
120 char reset_info_buffer[RESET_INFO_BUFFER_SIZE];
123 uint8_t boot_version = ESP.getBootVersion();
124 uint8_t boot_mode = ESP.getBootMode();
125 uint8_t cpu_freq = ESP.getCpuFreqMHz();
126 uint32_t flash_chip_id = ESP.getFlashChipId();
127 const char *sdk_version = ESP.getSdkVersion();
131 "ESP8266 debug info:\n"
132 " Chip ID: 0x%08" PRIX32
"\n"
134 " Core Version: %s\n"
135 " Boot Version: %u\n"
137 " CPU Frequency: %u\n"
138 " Flash Chip ID: 0x%08" PRIX32
"\n"
139 " Reset Reason: %s\n"
141 chip_id, sdk_version, get_core_version_str(core_version_buffer), boot_version, boot_mode, cpu_freq,
142 flash_chip_id, reset_reason, get_reset_info_str(reset_info_buffer,
resetInfo.reason));
144 pos = buf_append_printf(buf,
size,
pos,
"|Chip: 0x%08" PRIX32, chip_id);
145 pos = buf_append_printf(buf,
size,
pos,
"|SDK: %s", sdk_version);
146 pos = buf_append_printf(buf,
size,
pos,
"|Core: %s", get_core_version_str(core_version_buffer));
147 pos = buf_append_printf(buf,
size,
pos,
"|Boot: %u", boot_version);
148 pos = buf_append_printf(buf,
size,
pos,
"|Mode: %u", boot_mode);
149 pos = buf_append_printf(buf,
size,
pos,
"|CPU: %u", cpu_freq);
150 pos = buf_append_printf(buf,
size,
pos,
"|Flash: 0x%08" PRIX32, flash_chip_id);
151 pos = buf_append_printf(buf,
size,
pos,
"|Reset: %s", reset_reason);
152 pos = buf_append_printf(buf,
size,
pos,
"|%s", get_reset_info_str(reset_info_buffer,
resetInfo.reason));
163#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
size_t get_device_info_(std::span< char, DEVICE_INFO_BUFFER_SIZE > buffer, size_t pos)
sensor::Sensor * fragmentation_sensor_
const char * get_wakeup_cause_(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
uint32_t get_free_heap_()
sensor::Sensor * block_sensor_
const char * get_reset_reason_(std::span< char, RESET_REASON_BUFFER_SIZE > buffer)
void publish_state(float state)
Publish a new state to the front-end.
struct rst_info resetInfo
const char * core_release
PROGMEM_STRING_TABLE(ResetReasonStrings, "Power On", "Hardware Watchdog", "Exception", "Software Watchdog", "Software/System restart", "Deep-Sleep Wake", "External System", "Unknown")
Providing packet encoding functions for exchanging data with a remote host.