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 <Logging.h>
#include <Preferences.h>
#include <WiFi.h>
#include <esp_private/esp_clk.h>
#include <esp_sntp.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);
}
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
+5
View File
@@ -65,4 +65,9 @@ void formatTime(char* buf, size_t bufSize, bool use24h);
/// synced, or an empty string if not.
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
@@ -2,6 +2,7 @@
#include <Epub.h>
#include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h>
#include <Logging.h>
#include <OpdsStream.h>
@@ -39,8 +40,7 @@ void OpdsBookBrowserActivity::onEnter() {
void OpdsBookBrowserActivity::onExit() {
Activity::onExit();
// Turn off WiFi when exiting
WiFi.mode(WIFI_OFF);
HalClock::wifiOff();
entries.clear();
navigationHistory.clear();
@@ -3,6 +3,7 @@
#include <DNSServer.h>
#include <ESPmDNS.h>
#include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h>
#include <WiFi.h>
#include <esp_task_wdt.h>
@@ -86,15 +87,12 @@ void CrossPointWebServerActivity::onExit() {
if (isApMode) {
LOG_DBG("WEBACT", "Stopping WiFi AP...");
WiFi.softAPdisconnect(true);
delay(30);
WiFi.mode(WIFI_OFF);
delay(30);
} else {
LOG_DBG("WEBACT", "Disconnecting WiFi (graceful)...");
WiFi.disconnect(false); // false = don't erase credentials, send disconnect frame
HalClock::wifiOff();
}
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());
}
+3 -16
View File
@@ -5,7 +5,6 @@
#include <I18n.h>
#include <Logging.h>
#include <WiFi.h>
#include <esp_sntp.h>
#include "KOReaderCredentialStore.h"
#include "KOReaderDocumentId.h"
@@ -14,18 +13,6 @@
#include "components/UITheme.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) {
if (!success) {
LOG_DBG("KOSync", "WiFi connection failed, exiting");
@@ -149,7 +136,7 @@ void KOReaderSyncActivity::performUpload() {
const auto result = KOReaderSyncClient::updateProgress(progress);
if (result != KOReaderSyncClient::OK) {
wifiOff();
HalClock::wifiOff(true);
{
RenderLock lock(*this);
state = SYNC_FAILED;
@@ -159,7 +146,7 @@ void KOReaderSyncActivity::performUpload() {
return;
}
wifiOff();
HalClock::wifiOff(true);
{
RenderLock lock(*this);
state = UPLOAD_COMPLETE;
@@ -193,7 +180,7 @@ void KOReaderSyncActivity::onEnter() {
void KOReaderSyncActivity::onExit() {
Activity::onExit();
wifiOff();
HalClock::wifiOff(true);
}
void KOReaderSyncActivity::render(RenderLock&&) {
@@ -6,7 +6,6 @@
#include <I18n.h>
#include <Logging.h>
#include <WiFi.h>
#include <esp_sntp.h>
#include <string>
@@ -188,15 +187,6 @@ bool detectTimezoneSetting(uint8_t& outSetting, std::string& outIana, bool& outD
return true;
}
void wifiOff() {
if (esp_sntp_enabled()) {
esp_sntp_stop();
}
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
}
} // namespace
void DetectTimezoneActivity::onEnter() {
@@ -219,7 +209,7 @@ void DetectTimezoneActivity::onEnter() {
void DetectTimezoneActivity::onExit() {
Activity::onExit();
wifiOff();
HalClock::wifiOff();
}
void DetectTimezoneActivity::onWifiSelectionComplete(bool success) {
@@ -254,7 +244,7 @@ void DetectTimezoneActivity::performDetect() {
state = FAILED;
}
wifiOff();
HalClock::wifiOff();
requestUpdate();
}
@@ -1,6 +1,7 @@
#include "KOReaderAuthActivity.h"
#include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h>
#include <WiFi.h>
@@ -65,11 +66,7 @@ void KOReaderAuthActivity::onEnter() {
void KOReaderAuthActivity::onExit() {
Activity::onExit();
// Turn off wifi
WiFi.disconnect(false);
delay(100);
WiFi.mode(WIFI_OFF);
delay(100);
HalClock::wifiOff();
}
void KOReaderAuthActivity::render(RenderLock&&) {
@@ -1,6 +1,7 @@
#include "OtaUpdateActivity.h"
#include <GfxRenderer.h>
#include <HalClock.h>
#include <I18n.h>
#include <WiFi.h>
@@ -66,11 +67,7 @@ void OtaUpdateActivity::onEnter() {
void OtaUpdateActivity::onExit() {
Activity::onExit();
// Turn off wifi
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
HalClock::wifiOff();
}
void OtaUpdateActivity::render(RenderLock&&) {
+2 -15
View File
@@ -5,7 +5,6 @@
#include <I18n.h>
#include <Logging.h>
#include <WiFi.h>
#include <esp_sntp.h>
#include "CrossPointSettings.h"
#include "MappedInputManager.h"
@@ -13,18 +12,6 @@
#include "components/UITheme.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() {
Activity::onEnter();
@@ -45,7 +32,7 @@ void SyncTimeActivity::onEnter() {
void SyncTimeActivity::onExit() {
Activity::onExit();
wifiOff();
HalClock::wifiOff(true);
}
void SyncTimeActivity::onWifiSelectionComplete(bool success) {
@@ -68,7 +55,7 @@ void SyncTimeActivity::onWifiSelectionCancelled() { finish(); }
void SyncTimeActivity::performSync() {
bool ok = HalClock::syncNtp();
wifiOff();
HalClock::wifiOff(true);
state = ok ? SUCCESS : FAILED;
requestUpdate();