From 6e2ce0d289b8030a613a330c5b1cd210cd4d3f87 Mon Sep 17 00:00:00 2001 From: Chip Weinberger Date: Tue, 15 Nov 2022 03:58:16 -0800 Subject: [PATCH] refactor(esp_system) add user configurable reboot delay in seconds Closes https://github.com/espressif/esp-idf/pull/9962 --- components/esp_system/Kconfig | 8 ++++++++ components/esp_system/panic.c | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/components/esp_system/Kconfig b/components/esp_system/Kconfig index 7afd44373e..7999623d16 100644 --- a/components/esp_system/Kconfig +++ b/components/esp_system/Kconfig @@ -48,6 +48,14 @@ menu "ESP System Settings" Invoke gdbstub on the serial port, allowing for gdb to attach to it and to do a debug on runtime. endchoice + config ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS + int "Panic reboot delay (Seconds)" + default 0 + depends on ESP_SYSTEM_PANIC_PRINT_REBOOT || ESP_SYSTEM_PANIC_SILENT_REBOOT + help + After the panic handler executes, you can specify a number of seconds to + wait before the device reboots. + config ESP_SYSTEM_SINGLE_CORE_MODE bool default n diff --git a/components/esp_system/panic.c b/components/esp_system/panic.c index eabd1ed300..a5f48a205f 100644 --- a/components/esp_system/panic.c +++ b/components/esp_system/panic.c @@ -383,6 +383,27 @@ void esp_panic_handler(panic_info_t *info) wdt_hal_write_protect_enable(&rtc_wdt_ctx); #if CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT || CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT +#if CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS + + disable_all_wdts(); + + panic_print_str("Waiting to reboot...\r\n"); + + for(int i = 0; i < CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS; i++) { + + // Display a progress countdown. + // Only print every 5th second so users terminal is still "calm". + if (i % 5 == 0) { + panic_print_dec(CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS - i); + panic_print_str(" seconds...\r\n"); + } + + esp_rom_delay_us(1000000); + } + + esp_panic_handler_reconfigure_wdts(); +#endif /* CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS */ + if (esp_reset_reason_get_hint() == ESP_RST_UNKNOWN) { switch (info->exception) { case PANIC_EXCEPTION_IWDT: