diff --git a/tasmota/support.ino b/tasmota/support.ino index 0520a04d2..77103272a 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -20,6 +20,26 @@ IPAddress syslog_host_addr; // Syslog host IP address uint32_t syslog_host_hash = 0; // Syslog host name hash +extern "C" { +extern struct rst_info resetInfo; +} + +uint32_t ResetReason(void) +{ + /* + user_interface.h + REASON_DEFAULT_RST = 0, // normal startup by power on + REASON_WDT_RST = 1, // hardware watch dog reset + REASON_EXCEPTION_RST = 2, // exception reset, GPIO status won’t change + REASON_SOFT_WDT_RST = 3, // software watch dog reset, GPIO status won’t change + REASON_SOFT_RESTART = 4, // software restart ,system_restart , GPIO status won’t change + REASON_DEEP_SLEEP_AWAKE = 5, // wake up from deep-sleep + REASON_EXT_SYS_RST = 6 // external system reset + */ + + return resetInfo.reason; +} + /*********************************************************************************************\ * Watchdog extension (https://github.com/esp8266/Arduino/issues/1532) \*********************************************************************************************/ diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index 4451047bd..f90d7cff1 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -615,7 +615,6 @@ void WifiShutdown(void) void EspRestart(void) { WifiShutdown(); - RtcRebootReset(); // ESP.restart(); // This results in exception 3 on restarts on core 2.3.0 ESP.reset(); } diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 4d50d9cf7..1469caa2c 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -1500,10 +1500,6 @@ void GpioInit(void) XdrvCall(FUNC_PRE_INIT); } -extern "C" { -extern struct rst_info resetInfo; -} - void setup(void) { global_state.data = 3; // Init global state (wifi_down, mqtt_down) to solve possible network issues @@ -1582,7 +1578,7 @@ void setup(void) Settings.module = SONOFF_BASIC; // Reset module to Sonoff Basic // Settings.last_module = SONOFF_BASIC; } - AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_LOG_SOME_SETTINGS_RESET " (%d)"), RtcReboot.fast_reboot_count); + AddLog_P2(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION D_LOG_SOME_SETTINGS_RESET " (%d)"), RtcReboot.fast_reboot_count); } } @@ -1605,7 +1601,7 @@ void setup(void) if (POWER_ALL_ALWAYS_ON == Settings.poweronstate) { SetDevicePower(1, SRC_RESTART); } else { - if ((resetInfo.reason == REASON_DEFAULT_RST) || (resetInfo.reason == REASON_EXT_SYS_RST)) { + if ((ResetReason() == REASON_DEFAULT_RST) || (ResetReason() == REASON_EXT_SYS_RST)) { switch (Settings.poweronstate) { case POWER_ALL_OFF: case POWER_ALL_OFF_PULSETIME_ON: diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index 11987518c..7fbd3837d 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -59,15 +59,15 @@ bool DeepSleepEnabled(void) return true; } -void DeepSleepInit(void) +void DeepSleepReInit(void) { - if (DeepSleepEnabled()) { - RtcRebootReset(); + if ((ResetReason() == REASON_DEEP_SLEEP_AWAKE) && DeepSleepEnabled()) { if ((RtcSettings.ultradeepsleep > MAX_DEEPSLEEP_CYCLE) && (RtcSettings.ultradeepsleep < 1700000000)) { // Go back to sleep after 60 minutes if requested deepsleep has not been reached RtcSettings.ultradeepsleep = RtcSettings.ultradeepsleep - MAX_DEEPSLEEP_CYCLE; AddLog_P2(LOG_LEVEL_ERROR, PSTR("DSL: Remain DeepSleep %d"), RtcSettings.ultradeepsleep); RtcSettingsSave(); + RtcRebootReset(); ESP.deepSleep(100 * RtcSettings.deepsleep_slip * (MAX_DEEPSLEEP_CYCLE < RtcSettings.ultradeepsleep ? MAX_DEEPSLEEP_CYCLE : RtcSettings.ultradeepsleep), WAKE_RF_DEFAULT); yield(); // Sleeping @@ -198,7 +198,7 @@ bool Xdrv29(uint8_t function) result = DecodeCommand(kDeepsleepCommands, DeepsleepCommand); break; case FUNC_PRE_INIT: - DeepSleepInit(); + DeepSleepReInit(); break; } return result;