From 009b167d1da2277434276d0b11b80015332f826b Mon Sep 17 00:00:00 2001 From: iranl Date: Thu, 19 Jun 2025 14:09:48 +0200 Subject: [PATCH] TWDT --- src/HomeAssistantDiscovery.cpp | 30 ++++++-- src/NukiNetwork.cpp | 78 ++++++++++++++----- src/NukiNetworkLock.cpp | 6 ++ src/NukiNetworkOpener.cpp | 6 ++ src/NukiOpenerWrapper.cpp | 45 ++++++++--- src/NukiWrapper.cpp | 83 +++++++++++++++----- src/SerialReader.cpp | 6 ++ src/WebCfgServer.cpp | 7 +- src/main.cpp | 106 ++++++++++++++++---------- src/networkDevices/EthernetDevice.cpp | 21 ++++- src/networkDevices/WifiDevice.cpp | 47 ++++++++++-- 11 files changed, 328 insertions(+), 107 deletions(-) diff --git a/src/HomeAssistantDiscovery.cpp b/src/HomeAssistantDiscovery.cpp index a56a21d..0e4a5fd 100644 --- a/src/HomeAssistantDiscovery.cpp +++ b/src/HomeAssistantDiscovery.cpp @@ -25,7 +25,10 @@ HomeAssistantDiscovery::HomeAssistantDiscovery(NetworkDevice* device, Preference char uidString[20]; itoa(_preferences->getUInt(preference_device_id_lock, 0), uidString, 10); removeHASSConfig(uidString); - delay(3000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(3000 / portTICK_PERIOD_MS); } else if(savedDevId != curDevId) { @@ -38,10 +41,16 @@ HomeAssistantDiscovery::HomeAssistantDiscovery(NetworkDevice* device, Preference char uidString[20]; itoa(_preferences->getUInt(preference_device_id_lock, 0), uidString, 10); removeHASSConfig(uidString); - delay(3000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(3000 / portTICK_PERIOD_MS); itoa(savedDevId, uidString, 10); removeHASSConfig(uidString); - delay(3000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(3000 / portTICK_PERIOD_MS); } sprintf(_nukiHubUidString, "%" PRIu64, curDevId); @@ -93,7 +102,10 @@ void HomeAssistantDiscovery::setupHASS(int type, uint32_t nukiId, char* nukiName void HomeAssistantDiscovery::disableHASS() { removeHASSConfig(_nukiHubUidString); - delay(3000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(3000 / portTICK_PERIOD_MS); char uidString[20]; @@ -101,13 +113,19 @@ void HomeAssistantDiscovery::disableHASS() { itoa(_preferences->getUInt(preference_nuki_id_lock, 0), uidString, 16); removeHASSConfig(uidString); - delay(3000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(3000 / portTICK_PERIOD_MS); } if(_preferences->getUInt(preference_nuki_id_opener, 0) != 0) { itoa(_preferences->getUInt(preference_nuki_id_opener, 0), uidString, 16); removeHASSConfig(uidString); - delay(3000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(3000 / portTICK_PERIOD_MS); } } diff --git a/src/NukiNetwork.cpp b/src/NukiNetwork.cpp index 487644e..1d2f83e 100644 --- a/src/NukiNetwork.cpp +++ b/src/NukiNetwork.cpp @@ -470,7 +470,10 @@ bool NukiNetwork::update() bool success = reconnect(); if(!success) { - delay(2000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2000 / portTICK_PERIOD_MS); _mqttConnectCounter++; return false; } @@ -479,14 +482,20 @@ bool NukiNetwork::update() if(forceEnableWebServer && !_webEnabled) { forceEnableWebServer = false; - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); setRestartServices(false); } else if(!_webEnabled) { forceEnableWebServer = false; } - delay(2000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2000 / portTICK_PERIOD_MS); } if(!_device->isConnected() || !_device->mqttConnected() ) @@ -498,10 +507,16 @@ bool NukiNetwork::update() forceEnableWebServer = true; } Log->println("Network timeout has been reached, restarting ..."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::NetworkTimeoutWatchdog); } - delay(2000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2000 / portTICK_PERIOD_MS); return false; } @@ -729,7 +744,10 @@ bool NukiNetwork::reconnect(bool force) while(!_connectReplyReceived && espMillis() < timeout) { - delay(50); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(50 / portTICK_PERIOD_MS); _device->update(); if(_keepAliveCallback != nullptr) { @@ -742,7 +760,10 @@ bool NukiNetwork::reconnect(bool force) Log->println("MQTT connected"); _mqttConnectedTs = millis(); _mqttConnectionState = 1; - delay(100); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(100 / portTICK_PERIOD_MS); _device->mqttOnMessage(onMqttDataReceivedCallback); if(_firstConnect) @@ -987,7 +1008,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns { Log->println("Restart requested via MQTT."); clearWifiFallback(); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::RequestedViaMqtt); } else if(comparePrefixedPath(topic, mqtt_topic_update) && strcmp(data, "1") == 0 && _preferences->getBool(preference_update_from_mqtt, false) && !mqttRecentlyConnected()) @@ -1040,7 +1064,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns _preferences->putString(preference_ota_updater_url, GITHUB_LATEST_UPDATER_BINARY_URL); _preferences->putString(preference_ota_main_url, GITHUB_LATEST_RELEASE_BINARY_URL); Log->println("Updating to latest release version."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::OTAReboot); } } @@ -1055,7 +1082,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns _preferences->putString(preference_ota_updater_url, GITHUB_BETA_UPDATER_BINARY_URL); _preferences->putString(preference_ota_main_url, GITHUB_BETA_RELEASE_BINARY_URL); Log->println("Updating to latest beta version."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::OTAReboot); } } @@ -1070,7 +1100,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns _preferences->putString(preference_ota_updater_url, GITHUB_MASTER_UPDATER_BINARY_URL); _preferences->putString(preference_ota_main_url, GITHUB_MASTER_RELEASE_BINARY_URL); Log->println("Updating to latest developmemt version."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::OTAReboot); } } @@ -1085,7 +1118,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns _preferences->putString(preference_ota_updater_url, GITHUB_LATEST_UPDATER_BINARY_URL); _preferences->putString(preference_ota_main_url, GITHUB_LATEST_RELEASE_BINARY_URL); Log->println("Updating to latest release version."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::OTAReboot); } } @@ -1122,7 +1158,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns _preferences->putBool(preference_webserver_enabled, false); } clearWifiFallback(); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); setRestartServices(false); } else if(comparePrefixedPath(topic, mqtt_topic_nuki_hub_config_action) && !mqttRecentlyConnected()) @@ -1173,10 +1212,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns while (duoResult == 2) { duoResult = _importExport->checkDuoApprove(); - delay(2000); - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_reset(); - #endif + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2000 / portTICK_PERIOD_MS); } } @@ -1293,7 +1332,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns serializeJson(json, _buffer, _bufferSize); publishString(_maintenancePathPrefix, mqtt_topic_nuki_hub_config_json, _buffer, false); publishString(_maintenancePathPrefix, mqtt_topic_nuki_hub_config_action, "--", true); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::ConfigurationUpdated); } else diff --git a/src/NukiNetworkLock.cpp b/src/NukiNetworkLock.cpp index b7189c4..e02f0db 100644 --- a/src/NukiNetworkLock.cpp +++ b/src/NukiNetworkLock.cpp @@ -7,6 +7,7 @@ #include "RestartReason.h" #include #include +#include "hal/wdt_hal.h" extern bool forceEnableWebServer; extern const uint8_t x509_crt_imported_bundle_bin_start[] asm("_binary_x509_crt_bundle_start"); @@ -160,6 +161,11 @@ void NukiNetworkLock::initialize() bool NukiNetworkLock::update() { + wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT(); + wdt_hal_write_protect_disable(&rtc_wdt_ctx); + wdt_hal_feed(&rtc_wdt_ctx); + wdt_hal_write_protect_enable(&rtc_wdt_ctx); + bool ret = false; if(_nukiOfficial->hasOffStateToPublish()) diff --git a/src/NukiNetworkOpener.cpp b/src/NukiNetworkOpener.cpp index 8574ebd..53dc37f 100644 --- a/src/NukiNetworkOpener.cpp +++ b/src/NukiNetworkOpener.cpp @@ -5,6 +5,7 @@ #include "Logger.h" #include "Config.h" #include +#include "hal/wdt_hal.h" NukiNetworkOpener::NukiNetworkOpener(NukiNetwork* network, Preferences* preferences, char* buffer, size_t bufferSize) : _preferences(preferences), @@ -131,6 +132,11 @@ void NukiNetworkOpener::initialize() void NukiNetworkOpener::update() { + wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT(); + wdt_hal_write_protect_disable(&rtc_wdt_ctx); + wdt_hal_feed(&rtc_wdt_ctx); + wdt_hal_write_protect_enable(&rtc_wdt_ctx); + if(_resetRingStateTs != 0 && espMillis() >= _resetRingStateTs) { _resetRingStateTs = 0; diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp index 30e9d3a..8207749 100644 --- a/src/NukiOpenerWrapper.cpp +++ b/src/NukiOpenerWrapper.cpp @@ -247,7 +247,10 @@ void NukiOpenerWrapper::update() } else { - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); return; } } @@ -265,7 +268,10 @@ void NukiOpenerWrapper::update() Log->print("No BLE beacon received from the opener for "); Log->print((ts - lastReceivedBeaconTs) / 1000); Log->println(" seconds, signalling to restart BLE controller."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); _restartController = 2; } @@ -298,7 +304,10 @@ void NukiOpenerWrapper::update() _network->publishRetry(std::to_string(retryCount + 1)); - delay(_retryDelay); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(_retryDelay / portTICK_PERIOD_MS); ++retryCount; } @@ -594,7 +603,10 @@ void NukiOpenerWrapper::updateBatteryState() { Log->print("Querying opener battery state: "); result = _nukiOpener.requestBatteryReport(&_batteryReport); - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); if(result != Nuki::CmdResult::Success) { ++retryCount; @@ -766,7 +778,10 @@ void NukiOpenerWrapper::updateAuthData(bool retrieved) if(result == Nuki::CmdResult::Success) { _waitAuthLogUpdateTs = espMillis() + 5000; - delay(100); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(100 / portTICK_PERIOD_MS); std::list log; _nukiOpener.getLogEntries(&log); @@ -993,7 +1008,10 @@ void NukiOpenerWrapper::updateAuth(bool retrieved) { Log->print("Querying opener authorization: "); result = _nukiOpener.retrieveAuthorizationEntries(0, _preferences->getInt(preference_auth_max_entries, MAX_AUTH)); - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); if(result != Nuki::CmdResult::Success) { ++retryCount; @@ -3032,7 +3050,10 @@ void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value) if(resultKp == Nuki::CmdResult::Success) { - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); std::list entries; _nukiOpener.getKeypadEntries(&entries); @@ -3398,7 +3419,10 @@ void NukiOpenerWrapper::onTimeControlCommandReceived(const char *value) if(resultTc == Nuki::CmdResult::Success) { - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); std::list timeControlEntries; _nukiOpener.getTimeControlEntries(&timeControlEntries); @@ -3854,7 +3878,10 @@ void NukiOpenerWrapper::onAuthCommandReceived(const char *value) if(resultAuth == Nuki::CmdResult::Success) { - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); std::list entries; _nukiOpener.getAuthorizationEntries(&entries); diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp index a138432..075ab04 100644 --- a/src/NukiWrapper.cpp +++ b/src/NukiWrapper.cpp @@ -263,7 +263,10 @@ void NukiWrapper::update(bool reboot) } else { - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); return; } } @@ -281,7 +284,10 @@ void NukiWrapper::update(bool reboot) Log->print("No BLE beacon received from the lock for "); Log->print((ts - lastReceivedBeaconTs) / 1000); Log->println(" seconds, signalling to restart BLE controller."); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); _restartController = 2; } @@ -318,7 +324,10 @@ void NukiWrapper::update(bool reboot) _network->publishRetry(std::to_string(retryCount + 1)); - delay(_retryDelay); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(_retryDelay / portTICK_PERIOD_MS); ++retryCount; } @@ -801,8 +810,10 @@ void NukiWrapper::updateDebug() Log->println(result); count = 0; while (count < 5) { - delay(1000); - esp_task_wdt_reset(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); count++; } @@ -821,8 +832,10 @@ void NukiWrapper::updateDebug() count = 0; while (count < 15) { - delay(1000); - esp_task_wdt_reset(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); count++; } @@ -841,8 +854,10 @@ void NukiWrapper::updateDebug() count = 0; while (count < 20) { - delay(1000); - esp_task_wdt_reset(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); count++; } @@ -921,7 +936,10 @@ void NukiWrapper::updateAuthData(bool retrieved) if(result == Nuki::CmdResult::Success) { _waitAuthLogUpdateTs = espMillis() + 5000; - delay(100); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(100 / portTICK_PERIOD_MS); std::list log; _nukiLock.getLogEntries(&log); @@ -1146,7 +1164,10 @@ void NukiWrapper::updateAuth(bool retrieved) { Log->print("Querying lock authorization: "); result = _nukiLock.retrieveAuthorizationEntries(0, _preferences->getInt(preference_auth_max_entries, MAX_AUTH)); - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); if(result != Nuki::CmdResult::Success) { ++retryCount; @@ -3279,7 +3300,10 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value) if(resultKp == Nuki::CmdResult::Success) { - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); std::list entries; _nukiLock.getKeypadEntries(&entries); @@ -3646,7 +3670,10 @@ void NukiWrapper::onTimeControlCommandReceived(const char *value) if(resultTc == Nuki::CmdResult::Success) { - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); std::list timeControlEntries; _nukiLock.getTimeControlEntries(&timeControlEntries); @@ -3862,7 +3889,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value) if(idExists) { result = _nukiLock.deleteAuthorizationEntry(authId); - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); Log->print("Delete authorization: "); Log->println((int)result); } @@ -4082,7 +4112,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value) } result = _nukiLock.addAuthorizationEntry(entry); - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); Log->print("Add authorization: "); Log->println((int)result); } @@ -4105,7 +4138,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value) if(resultAuth == Nuki::CmdResult::Success) { - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); std::list entries; _nukiLock.getAuthorizationEntries(&entries); @@ -4248,7 +4284,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value) } result = _nukiLock.updateAuthorizationEntry(entry); - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); Log->print("Update authorization: "); Log->println((int)result); } @@ -4360,7 +4399,10 @@ void NukiWrapper::readConfig() { ++retryCount; Log->println("Failed to retrieve lock config, retrying in 1s"); - delay(1000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); } else { @@ -4388,7 +4430,10 @@ void NukiWrapper::readAdvancedConfig() { ++retryCount; Log->println("Failed to retrieve lock advanced config, retrying in 1s"); - delay(1000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); } else { diff --git a/src/SerialReader.cpp b/src/SerialReader.cpp index ac949bd..eb88124 100644 --- a/src/SerialReader.cpp +++ b/src/SerialReader.cpp @@ -1,6 +1,7 @@ #include "SerialReader.h" #include "RestartReason.h" #include "EspMillis.h" +#include "hal/wdt_hal.h" SerialReader::SerialReader(ImportExport *importExport, NukiNetwork* network) : _importExport(importExport), @@ -11,6 +12,11 @@ SerialReader::SerialReader(ImportExport *importExport, NukiNetwork* network) void SerialReader::update() { + wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT(); + wdt_hal_write_protect_disable(&rtc_wdt_ctx); + wdt_hal_feed(&rtc_wdt_ctx); + wdt_hal_write_protect_enable(&rtc_wdt_ctx); + if(Serial.available()) { String line = Serial.readStringUntil('\n'); diff --git a/src/WebCfgServer.cpp b/src/WebCfgServer.cpp index 8dec350..99fd3b4 100644 --- a/src/WebCfgServer.cpp +++ b/src/WebCfgServer.cpp @@ -1512,7 +1512,10 @@ bool WebCfgServer::processWiFi(PsychicRequest *request, PsychicResponse* resp, S int loop = 0; while(!_network->isConnected() && loop < 150) { - delay(100); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(100 / portTICK_PERIOD_MS); loop++; } @@ -1803,7 +1806,7 @@ void WebCfgServer::waitAndProcess(const bool blocking, const uint32_t duration) } else { - vTaskDelay( 50 / portTICK_PERIOD_MS); + vTaskDelay(50 / portTICK_PERIOD_MS); } } } diff --git a/src/main.cpp b/src/main.cpp index 86efc9b..90627b3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,6 +30,7 @@ bool nuki_hub_https_server_enabled = false; #include "NukiNetworkLock.h" #include "NukiOpenerWrapper.h" #include "Gpio.h" +#include "Gpio.h" #include "CharBuffer.h" #include "NukiDeviceId.h" #include "WebCfgServer.h" @@ -456,7 +457,10 @@ void restartServices(bool reconnect) Log->println("Deinit BLE device done"); } - delay(2000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2000 / portTICK_PERIOD_MS); if(lockEnabled || openerEnabled) { @@ -498,6 +502,11 @@ void restartServices(bool reconnect) Log->println("Restarting Nuki opener done"); } + + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2000 / portTICK_PERIOD_MS); bleDone = true; if(webStarted || webSSLStarted) @@ -545,6 +554,10 @@ void networkTask(void *pvParameters) } #endif network->update(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(50 / portTICK_PERIOD_MS); bool connected = network->isConnected(); if(connected && reroute) @@ -588,11 +601,19 @@ void networkTask(void *pvParameters) if(connected && lockStarted) { rebootLock = networkLock->update(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(50 / portTICK_PERIOD_MS); } if(connected && openerStarted) { networkOpener->update(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(50 / portTICK_PERIOD_MS); } } #endif @@ -614,26 +635,36 @@ void networkTask(void *pvParameters) restartEsp(RestartReason::RestartTimer); } - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_reset(); - #endif + + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(50 / portTICK_PERIOD_MS); } } #ifndef NUKI_HUB_UPDATER void nukiTask(void *pvParameters) { + esp_task_wdt_add(NULL); + if (preferences->getBool(preference_mqtt_ssl_enabled, false)) { #if defined(CONFIG_SOC_SPIRAM_SUPPORTED) && defined(CONFIG_SPIRAM) if (esp_psram_get_size() <= 0) { Log->println("Waiting 20 seconds to start BLE because of MQTT SSL"); - delay(20000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(20000 / portTICK_PERIOD_MS); } #else Log->println("Waiting 20 seconds to start BLE because of MQTT SSL"); - delay(20000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(20000 / portTICK_PERIOD_MS); #endif } int64_t nukiLoopTs = 0; @@ -645,14 +676,20 @@ void nukiTask(void *pvParameters) if(bleScannerStarted) { bleScanner->update(); - delay(20); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(20 / portTICK_PERIOD_MS); } bool needsPairing = (lockStarted && !nuki->isPaired()) || (openerStarted && !nukiOpener->isPaired()); if (needsPairing) { - delay(2500); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(2500 / portTICK_PERIOD_MS); } else if (!whiteListed) { @@ -739,9 +776,10 @@ void nukiTask(void *pvParameters) Log->println("nukiTask is running"); nukiLoopTs = espMillis(); } - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_reset(); - #endif + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(50 / portTICK_PERIOD_MS); } } @@ -832,6 +870,8 @@ esp_err_t _http_event_handler(esp_http_client_event_t *evt) void otaTask(void *pvParameter) { + esp_task_wdt_add(NULL); + partitionType = checkPartition(); String updateUrl; @@ -885,14 +925,17 @@ void otaTask(void *pvParameter) { Log->println("Firmware upgrade failed, retrying in 5 seconds"); retryCount++; - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_reset(); - #endif - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); continue; } while (1) { + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } vTaskDelay(1000 / portTICK_PERIOD_MS); } } @@ -904,15 +947,13 @@ void otaTask(void *pvParameter) void setupTasks(bool ota) { // configMAX_PRIORITIES is 25 - #if !defined(CONFIG_IDF_TARGET_ESP32C5) esp_task_wdt_config_t twdt_config = { .timeout_ms = 300000, - .idle_core_mask = 0, + .idle_core_mask = (1 << CONFIG_FREERTOS_NUMBER_OF_CORES) - 1, .trigger_panic = true, }; esp_task_wdt_reconfigure(&twdt_config); - #endif esp_chip_info_t info; esp_chip_info(&info); @@ -923,26 +964,17 @@ void setupTasks(bool ota) if(ota) { xTaskCreatePinnedToCore(otaTask, "ota", 8192, NULL, 2, &otaTaskHandle, (espCores > 1) ? 1 : 0); - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_add(otaTaskHandle); - #endif } else { if(!disableNetwork) { xTaskCreatePinnedToCore(networkTask, "ntw", preferences->getInt(preference_task_size_network, NETWORK_TASK_SIZE), NULL, 3, &networkTaskHandle, (espCores > 1) ? 1 : 0); - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_add(networkTaskHandle); - #endif } #ifndef NUKI_HUB_UPDATER if(!network->isApOpen() && (lockEnabled || openerEnabled)) { xTaskCreatePinnedToCore(nukiTask, "nuki", preferences->getInt(preference_task_size_nuki, NUKI_TASK_SIZE), NULL, 2, &nukiTaskHandle, 0); - #if !defined(CONFIG_IDF_TARGET_ESP32C5) - esp_task_wdt_add(nukiTaskHandle); - #endif } #endif } @@ -951,7 +983,10 @@ void setupTasks(bool ota) void logCoreDump() { coredumpPrinted = false; - delay(500); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(500 / portTICK_PERIOD_MS); Log->println("Printing coredump and saving to coredump.hex on SPIFFS"); size_t size = 0; size_t address = 0; @@ -1272,13 +1307,7 @@ void setup() Log->println(lockEnabled ? F("Nuki Lock enabled") : F("Nuki Lock disabled")); if(lockEnabled) { - nukiOfficial = new NukiOfficial(preferences); - networkLock = new NukiNetworkLock(network, nukiOfficial, preferences, CharBuffer::get(), buffer_size); - - if(!disableNetwork) - { - networkLock->initialize(); - } + startNuki(true); nuki = new NukiWrapper("NukiHub", deviceIdLock, bleScanner, networkLock, nukiOfficial, gpio, preferences, CharBuffer::get(), buffer_size); nuki->initialize(); @@ -1287,12 +1316,7 @@ void setup() Log->println(openerEnabled ? F("Nuki Opener enabled") : F("Nuki Opener disabled")); if(openerEnabled) { - networkOpener = new NukiNetworkOpener(network, preferences, CharBuffer::get(), buffer_size); - - if(!disableNetwork) - { - networkOpener->initialize(); - } + startNuki(false); nukiOpener = new NukiOpenerWrapper("NukiHub", deviceIdOpener, bleScanner, networkOpener, gpio, preferences, CharBuffer::get(), buffer_size); nukiOpener->initialize(); diff --git a/src/networkDevices/EthernetDevice.cpp b/src/networkDevices/EthernetDevice.cpp index 9319b95..04df634 100644 --- a/src/networkDevices/EthernetDevice.cpp +++ b/src/networkDevices/EthernetDevice.cpp @@ -1,3 +1,4 @@ +#include "esp_task_wdt.h" #include "EthernetDevice.h" #include "../PreferencesKeys.h" #include "../Logger.h" @@ -68,14 +69,20 @@ const String EthernetDevice::deviceName() const void EthernetDevice::initialize() { - delay(250); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(250 / portTICK_PERIOD_MS); if(ethCriticalFailure) { ethCriticalFailure = false; Log->println("Failed to initialize ethernet hardware"); Log->println("Network device has a critical failure, enable fallback to Wi-Fi and reboot."); wifiFallback = true; - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::NetworkDeviceCriticalFailure); return; } @@ -140,7 +147,10 @@ void EthernetDevice::initialize() Log->println("Failed to initialize ethernet hardware"); Log->println("Network device has a critical failure, enable fallback to Wi-Fi and reboot."); wifiFallback = true; - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::NetworkDeviceCriticalFailure); return; } @@ -222,7 +232,10 @@ void EthernetDevice::onNetworkEvent(arduino_event_id_t event, arduino_event_info void EthernetDevice::reconfigure() { - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::ReconfigureETH); } diff --git a/src/networkDevices/WifiDevice.cpp b/src/networkDevices/WifiDevice.cpp index f518b46..642a1d8 100644 --- a/src/networkDevices/WifiDevice.cpp +++ b/src/networkDevices/WifiDevice.cpp @@ -1,3 +1,4 @@ +#include "esp_task_wdt.h" #include "WifiDevice.h" #include "../PreferencesKeys.h" #include "../Logger.h" @@ -50,7 +51,10 @@ void WifiDevice::initialize() WiFi.disconnect(true); WiFi.mode(WIFI_STA); WiFi.disconnect(); - delay(5000); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(5000 / portTICK_PERIOD_MS); Log->println("Dummy WiFi device for Hosted on P4 done"); } return; @@ -63,12 +67,21 @@ void WifiDevice::scan(bool passive, bool async) WiFi.disconnect(true); WiFi.mode(WIFI_STA); WiFi.disconnect(); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); } WiFi.scanDelete(); WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + if(async) { Log->println("Wi-Fi async scan started"); @@ -94,9 +107,15 @@ void WifiDevice::openAP() Log->println("Starting AP with SSID NukiHub and Password NukiHubESP32"); _startAP = false; WiFi.mode(WIFI_AP); - delay(500); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(500 / portTICK_PERIOD_MS); WiFi.softAPsetHostname(_hostname.c_str()); - delay(500); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(500 / portTICK_PERIOD_MS); WiFi.softAP("NukiHub", "NukiHubESP32"); //if(MDNS.begin(_hostname.c_str())){ @@ -109,7 +128,10 @@ bool WifiDevice::connect() { WiFi.mode(WIFI_STA); WiFi.setHostname(_hostname.c_str()); - delay(500); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(500 / portTICK_PERIOD_MS); int bestConnection = -1; @@ -162,10 +184,13 @@ bool WifiDevice::connect() Log->print("WiFi connecting"); int loop = 0; - while(!isConnected() && loop < 150) + while(!isConnected() && loop < 600) { Log->print("."); - delay(100); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(25 / portTICK_PERIOD_MS); loop++; } Log->println(""); @@ -177,7 +202,10 @@ bool WifiDevice::connect() if(_preferences->getBool(preference_restart_on_disconnect, false) && (espMillis() > 60000)) { Log->println("Restart on disconnect watchdog triggered, rebooting"); - delay(100); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(100 / portTICK_PERIOD_MS); restartEsp(RestartReason::RestartOnDisconnectWatchdog); } else @@ -201,7 +229,10 @@ void WifiDevice::reconfigure() { _preferences->putString(preference_wifi_ssid, ""); _preferences->putString(preference_wifi_pass, ""); - delay(200); + if (esp_task_wdt_status(NULL) == ESP_OK) { + esp_task_wdt_reset(); + } + vTaskDelay(200 / portTICK_PERIOD_MS); restartEsp(RestartReason::ReconfigureWifi); }