Use ntp time sync at end of wifi activities

This commit is contained in:
jpirnay
2026-03-26 21:55:28 +01:00
parent 7f9456e8c6
commit 92877f9c36
9 changed files with 37 additions and 62 deletions
+14
View File
@@ -3,6 +3,7 @@
#include <Arduino.h> #include <Arduino.h>
#include <Logging.h> #include <Logging.h>
#include <Preferences.h> #include <Preferences.h>
#include <WiFi.h>
#include <esp_private/esp_clk.h> #include <esp_private/esp_clk.h>
#include <esp_sntp.h> #include <esp_sntp.h>
#include <sys/time.h> #include <sys/time.h>
@@ -260,4 +261,17 @@ void formatLogTime(char* buf, size_t bufSize) {
snprintf(buf, bufSize, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); snprintf(buf, bufSize, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
} }
void wifiOff(bool skipNtpSync) {
if (!skipNtpSync && isApproximate() && WiFi.getMode() == WIFI_STA && WiFi.status() == WL_CONNECTED) {
syncNtp();
}
if (esp_sntp_enabled()) {
esp_sntp_stop();
}
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
}
} // namespace HalClock } // namespace HalClock
+5
View File
@@ -65,4 +65,9 @@ void formatTime(char* buf, size_t bufSize, bool use24h);
/// synced, or an empty string if not. /// synced, or an empty string if not.
void formatLogTime(char* buf, size_t bufSize); void formatLogTime(char* buf, size_t bufSize);
/// Tear down WiFi cleanly. When skipNtpSync is false (default) and the
/// clock is approximate, performs an opportunistic NTP sync before
/// disconnecting — essentially free since we already have a connection.
void wifiOff(bool skipNtpSync = false);
} // namespace HalClock } // namespace HalClock
@@ -2,6 +2,7 @@
#include <Epub.h> #include <Epub.h>
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h> #include <I18n.h>
#include <Logging.h> #include <Logging.h>
#include <OpdsStream.h> #include <OpdsStream.h>
@@ -39,8 +40,7 @@ void OpdsBookBrowserActivity::onEnter() {
void OpdsBookBrowserActivity::onExit() { void OpdsBookBrowserActivity::onExit() {
Activity::onExit(); Activity::onExit();
// Turn off WiFi when exiting HalClock::wifiOff();
WiFi.mode(WIFI_OFF);
entries.clear(); entries.clear();
navigationHistory.clear(); navigationHistory.clear();
@@ -3,6 +3,7 @@
#include <DNSServer.h> #include <DNSServer.h>
#include <ESPmDNS.h> #include <ESPmDNS.h>
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h> #include <I18n.h>
#include <WiFi.h> #include <WiFi.h>
#include <esp_task_wdt.h> #include <esp_task_wdt.h>
@@ -86,15 +87,12 @@ void CrossPointWebServerActivity::onExit() {
if (isApMode) { if (isApMode) {
LOG_DBG("WEBACT", "Stopping WiFi AP..."); LOG_DBG("WEBACT", "Stopping WiFi AP...");
WiFi.softAPdisconnect(true); WiFi.softAPdisconnect(true);
delay(30);
WiFi.mode(WIFI_OFF);
delay(30);
} else { } else {
LOG_DBG("WEBACT", "Disconnecting WiFi (graceful)..."); HalClock::wifiOff();
WiFi.disconnect(false); // false = don't erase credentials, send disconnect frame
} }
delay(30); // Allow disconnect frame to be sent
LOG_DBG("WEBACT", "Setting WiFi mode OFF...");
WiFi.mode(WIFI_OFF);
delay(30); // Allow WiFi hardware to power down
LOG_DBG("WEBACT", "Free heap at onExit end: %d bytes", ESP.getFreeHeap()); LOG_DBG("WEBACT", "Free heap at onExit end: %d bytes", ESP.getFreeHeap());
} }
+3 -16
View File
@@ -5,7 +5,6 @@
#include <I18n.h> #include <I18n.h>
#include <Logging.h> #include <Logging.h>
#include <WiFi.h> #include <WiFi.h>
#include <esp_sntp.h>
#include "KOReaderCredentialStore.h" #include "KOReaderCredentialStore.h"
#include "KOReaderDocumentId.h" #include "KOReaderDocumentId.h"
@@ -14,18 +13,6 @@
#include "components/UITheme.h" #include "components/UITheme.h"
#include "fontIds.h" #include "fontIds.h"
namespace {
void wifiOff() {
if (esp_sntp_enabled()) {
esp_sntp_stop();
}
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
}
} // namespace
void KOReaderSyncActivity::onWifiSelectionComplete(const bool success) { void KOReaderSyncActivity::onWifiSelectionComplete(const bool success) {
if (!success) { if (!success) {
LOG_DBG("KOSync", "WiFi connection failed, exiting"); LOG_DBG("KOSync", "WiFi connection failed, exiting");
@@ -149,7 +136,7 @@ void KOReaderSyncActivity::performUpload() {
const auto result = KOReaderSyncClient::updateProgress(progress); const auto result = KOReaderSyncClient::updateProgress(progress);
if (result != KOReaderSyncClient::OK) { if (result != KOReaderSyncClient::OK) {
wifiOff(); HalClock::wifiOff(true);
{ {
RenderLock lock(*this); RenderLock lock(*this);
state = SYNC_FAILED; state = SYNC_FAILED;
@@ -159,7 +146,7 @@ void KOReaderSyncActivity::performUpload() {
return; return;
} }
wifiOff(); HalClock::wifiOff(true);
{ {
RenderLock lock(*this); RenderLock lock(*this);
state = UPLOAD_COMPLETE; state = UPLOAD_COMPLETE;
@@ -193,7 +180,7 @@ void KOReaderSyncActivity::onEnter() {
void KOReaderSyncActivity::onExit() { void KOReaderSyncActivity::onExit() {
Activity::onExit(); Activity::onExit();
wifiOff(); HalClock::wifiOff(true);
} }
void KOReaderSyncActivity::render(RenderLock&&) { void KOReaderSyncActivity::render(RenderLock&&) {
@@ -6,7 +6,6 @@
#include <I18n.h> #include <I18n.h>
#include <Logging.h> #include <Logging.h>
#include <WiFi.h> #include <WiFi.h>
#include <esp_sntp.h>
#include <string> #include <string>
@@ -188,15 +187,6 @@ bool detectTimezoneSetting(uint8_t& outSetting, std::string& outIana, bool& outD
return true; return true;
} }
void wifiOff() {
if (esp_sntp_enabled()) {
esp_sntp_stop();
}
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
}
} // namespace } // namespace
void DetectTimezoneActivity::onEnter() { void DetectTimezoneActivity::onEnter() {
@@ -219,7 +209,7 @@ void DetectTimezoneActivity::onEnter() {
void DetectTimezoneActivity::onExit() { void DetectTimezoneActivity::onExit() {
Activity::onExit(); Activity::onExit();
wifiOff(); HalClock::wifiOff();
} }
void DetectTimezoneActivity::onWifiSelectionComplete(bool success) { void DetectTimezoneActivity::onWifiSelectionComplete(bool success) {
@@ -254,7 +244,7 @@ void DetectTimezoneActivity::performDetect() {
state = FAILED; state = FAILED;
} }
wifiOff(); HalClock::wifiOff();
requestUpdate(); requestUpdate();
} }
@@ -1,6 +1,7 @@
#include "KOReaderAuthActivity.h" #include "KOReaderAuthActivity.h"
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h> #include <I18n.h>
#include <WiFi.h> #include <WiFi.h>
@@ -65,11 +66,7 @@ void KOReaderAuthActivity::onEnter() {
void KOReaderAuthActivity::onExit() { void KOReaderAuthActivity::onExit() {
Activity::onExit(); Activity::onExit();
// Turn off wifi HalClock::wifiOff();
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
} }
void KOReaderAuthActivity::render(RenderLock&&) { void KOReaderAuthActivity::render(RenderLock&&) {
@@ -1,6 +1,7 @@
#include "OtaUpdateActivity.h" #include "OtaUpdateActivity.h"
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h> #include <I18n.h>
#include <WiFi.h> #include <WiFi.h>
@@ -66,11 +67,7 @@ void OtaUpdateActivity::onEnter() {
void OtaUpdateActivity::onExit() { void OtaUpdateActivity::onExit() {
Activity::onExit(); Activity::onExit();
// Turn off wifi HalClock::wifiOff();
WiFi.disconnect(false); // false = don't erase credentials, send disconnect frame
delay(100); // Allow disconnect frame to be sent
WiFi.mode(WIFI_OFF);
delay(100); // Allow WiFi hardware to fully power down
} }
void OtaUpdateActivity::render(RenderLock&&) { void OtaUpdateActivity::render(RenderLock&&) {
+2 -15
View File
@@ -5,7 +5,6 @@
#include <I18n.h> #include <I18n.h>
#include <Logging.h> #include <Logging.h>
#include <WiFi.h> #include <WiFi.h>
#include <esp_sntp.h>
#include "CrossPointSettings.h" #include "CrossPointSettings.h"
#include "MappedInputManager.h" #include "MappedInputManager.h"
@@ -13,18 +12,6 @@
#include "components/UITheme.h" #include "components/UITheme.h"
#include "fontIds.h" #include "fontIds.h"
namespace {
void wifiOff() {
if (esp_sntp_enabled()) {
esp_sntp_stop();
}
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
}
} // namespace
void SyncTimeActivity::onEnter() { void SyncTimeActivity::onEnter() {
Activity::onEnter(); Activity::onEnter();
@@ -45,7 +32,7 @@ void SyncTimeActivity::onEnter() {
void SyncTimeActivity::onExit() { void SyncTimeActivity::onExit() {
Activity::onExit(); Activity::onExit();
wifiOff(); HalClock::wifiOff(true);
} }
void SyncTimeActivity::onWifiSelectionComplete(bool success) { void SyncTimeActivity::onWifiSelectionComplete(bool success) {
@@ -68,7 +55,7 @@ void SyncTimeActivity::onWifiSelectionCancelled() { finish(); }
void SyncTimeActivity::performSync() { void SyncTimeActivity::performSync() {
bool ok = HalClock::syncNtp(); bool ok = HalClock::syncNtp();
wifiOff(); HalClock::wifiOff(true);
state = ok ? SUCCESS : FAILED; state = ok ? SUCCESS : FAILED;
requestUpdate(); requestUpdate();