mirror of https://github.com/arendst/Tasmota.git
Add reset after four Quick Power Cycles
Add reset after four Quick Power Cycles (#6639)
This commit is contained in:
parent
a3c0451e41
commit
782563b3ae
|
@ -360,6 +360,36 @@ void SettingsSaveAll(void)
|
||||||
SettingsSave(0);
|
SettingsSave(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*********************************************************************************************\
|
||||||
|
* Quick power cycle monitoring
|
||||||
|
\*********************************************************************************************/
|
||||||
|
|
||||||
|
void UpdateQuickPowerCycle(bool update)
|
||||||
|
{
|
||||||
|
uint32_t pc_register;
|
||||||
|
uint32_t pc_location = SETTINGS_LOCATION - CFG_ROTATES;
|
||||||
|
|
||||||
|
ESP.flashRead(pc_location * SPI_FLASH_SEC_SIZE, (uint32*)&pc_register, sizeof(pc_register));
|
||||||
|
if (update && ((pc_register & 0xFFFFFFF0) == 0xFFA55AB0)) {
|
||||||
|
uint32_t counter = ((pc_register & 0xF) << 1) & 0xF;
|
||||||
|
if (0 == counter) { // 4 power cycles in a row
|
||||||
|
SettingsErase(2); // Quickly reset all settings including QuickPowerCycle flag
|
||||||
|
EspRestart(); // And restart
|
||||||
|
} else {
|
||||||
|
pc_register = 0xFFA55AB0 | counter;
|
||||||
|
ESP.flashWrite(pc_location * SPI_FLASH_SEC_SIZE, (uint32*)&pc_register, sizeof(pc_register));
|
||||||
|
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("QPC: Flag %02X"), counter); // Won't show as too early in power on sequence
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pc_register != 0xFFA55ABF) {
|
||||||
|
pc_register = 0xFFA55ABF;
|
||||||
|
// Assume flash is default all ones and setting a bit to zero does not need an erase
|
||||||
|
ESP.flashEraseSector(pc_location);
|
||||||
|
ESP.flashWrite(pc_location * SPI_FLASH_SEC_SIZE, (uint32*)&pc_register, sizeof(pc_register));
|
||||||
|
// AddLog_P2(LOG_LEVEL_DEBUG, PSTR("QPC: Reset")); // Won't show as too early in power on sequence
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Config Save - Save parameters to Flash ONLY if any parameter has changed
|
* Config Save - Save parameters to Flash ONLY if any parameter has changed
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
@ -486,6 +516,7 @@ void SettingsErase(uint8_t type)
|
||||||
/*
|
/*
|
||||||
0 = Erase from program end until end of physical flash
|
0 = Erase from program end until end of physical flash
|
||||||
1 = Erase SDK parameter area at end of linker memory model (0x0FDxxx - 0x0FFFFF) solving possible wifi errors
|
1 = Erase SDK parameter area at end of linker memory model (0x0FDxxx - 0x0FFFFF) solving possible wifi errors
|
||||||
|
2 = Erase Tasmota settings
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FIRMWARE_MINIMAL
|
#ifndef FIRMWARE_MINIMAL
|
||||||
|
@ -497,6 +528,10 @@ void SettingsErase(uint8_t type)
|
||||||
_sectorStart = SETTINGS_LOCATION +2; // SDK parameter area above EEPROM area (0x0FDxxx - 0x0FFFFF)
|
_sectorStart = SETTINGS_LOCATION +2; // SDK parameter area above EEPROM area (0x0FDxxx - 0x0FFFFF)
|
||||||
_sectorEnd = SETTINGS_LOCATION +5;
|
_sectorEnd = SETTINGS_LOCATION +5;
|
||||||
}
|
}
|
||||||
|
else if (2 == type) {
|
||||||
|
_sectorStart = SETTINGS_LOCATION - CFG_ROTATES; // Tasmota parameter area (0x0F4xxx - 0x0FBFFF)
|
||||||
|
_sectorEnd = SETTINGS_LOCATION +1;
|
||||||
|
}
|
||||||
|
|
||||||
bool _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level);
|
bool _serialoutput = (LOG_LEVEL_DEBUG_MORE <= seriallog_level);
|
||||||
|
|
||||||
|
|
|
@ -781,6 +781,7 @@ void PerformEverySecond(void)
|
||||||
if (BOOT_LOOP_TIME == uptime) {
|
if (BOOT_LOOP_TIME == uptime) {
|
||||||
RtcReboot.fast_reboot_count = 0;
|
RtcReboot.fast_reboot_count = 0;
|
||||||
RtcRebootSave();
|
RtcRebootSave();
|
||||||
|
UpdateQuickPowerCycle(false);
|
||||||
|
|
||||||
Settings.bootcount++; // Moved to here to stop flash writes during start-up
|
Settings.bootcount++; // Moved to here to stop flash writes during start-up
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_BOOT_COUNT " %d"), Settings.bootcount);
|
AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_BOOT_COUNT " %d"), Settings.bootcount);
|
||||||
|
@ -1471,7 +1472,10 @@ void setup(void)
|
||||||
global_state.data = 3; // Init global state (wifi_down, mqtt_down) to solve possible network issues
|
global_state.data = 3; // Init global state (wifi_down, mqtt_down) to solve possible network issues
|
||||||
|
|
||||||
RtcRebootLoad();
|
RtcRebootLoad();
|
||||||
if (!RtcRebootValid()) { RtcReboot.fast_reboot_count = 0; }
|
if (!RtcRebootValid()) {
|
||||||
|
RtcReboot.fast_reboot_count = 0;
|
||||||
|
UpdateQuickPowerCycle(true); // As RTC is invalid it must be a power cycle
|
||||||
|
}
|
||||||
RtcReboot.fast_reboot_count++;
|
RtcReboot.fast_reboot_count++;
|
||||||
RtcRebootSave();
|
RtcRebootSave();
|
||||||
|
|
||||||
|
@ -1545,6 +1549,8 @@ void setup(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateQuickPowerCycle(true); // Test location
|
||||||
|
|
||||||
Format(mqtt_client, Settings.mqtt_client, sizeof(mqtt_client));
|
Format(mqtt_client, Settings.mqtt_client, sizeof(mqtt_client));
|
||||||
Format(mqtt_topic, Settings.mqtt_topic, sizeof(mqtt_topic));
|
Format(mqtt_topic, Settings.mqtt_topic, sizeof(mqtt_topic));
|
||||||
if (strstr(Settings.hostname, "%") != nullptr) {
|
if (strstr(Settings.hostname, "%") != nullptr) {
|
||||||
|
|
Loading…
Reference in New Issue