Display error reason on ntp time sync fail

This commit is contained in:
jpirnay
2026-04-20 10:32:52 +02:00
parent f018ad03dd
commit bbafd4ce62
4 changed files with 60 additions and 6 deletions
+33 -2
View File
@@ -377,7 +377,32 @@ void applyTimezone(uint8_t timeZoneSetting) {
LOG_DBG("CLK", "Timezone applied: %s", TIMEZONES[index].tz); LOG_DBG("CLK", "Timezone applied: %s", TIMEZONES[index].tz);
} }
bool syncNtp() { static const char* sntpStatusName(sntp_sync_status_t status) {
switch (status) {
case SNTP_SYNC_STATUS_RESET:
return "reset";
case SNTP_SYNC_STATUS_IN_PROGRESS:
return "in progress";
case SNTP_SYNC_STATUS_COMPLETED:
return "completed";
default:
return "unknown";
}
}
bool syncNtp(char* errorBuf, size_t errorBufSize) {
if (errorBuf && errorBufSize > 0) {
errorBuf[0] = '\0';
}
if (WiFi.status() != WL_CONNECTED) {
if (errorBuf && errorBufSize > 0) {
snprintf(errorBuf, errorBufSize, "WiFi disconnected");
}
LOG_ERR("CLK", "NTP sync failed: WiFi disconnected");
return false;
}
time_t preSyncTime = time(nullptr); time_t preSyncTime = time(nullptr);
time_t prevSyncTime = nvsReadSyncTime(); time_t prevSyncTime = nvsReadSyncTime();
float prevSyncTemp = nvsReadLastSyncTemp(); float prevSyncTemp = nvsReadLastSyncTemp();
@@ -398,7 +423,11 @@ bool syncNtp() {
} }
if (retry >= maxRetries) { if (retry >= maxRetries) {
LOG_ERR("CLK", "NTP sync timeout"); const char* statusName = sntpStatusName(sntp_get_sync_status());
if (errorBuf && errorBufSize > 0) {
snprintf(errorBuf, errorBufSize, "NTP timeout (%s)", statusName);
}
LOG_ERR("CLK", "NTP sync timeout (%s)", statusName);
return false; return false;
} }
@@ -453,6 +482,8 @@ bool syncNtp() {
return true; return true;
} }
bool syncNtp() { return syncNtp(nullptr, 0); }
void saveBeforeSleep(bool keepLpAlive) { void saveBeforeSleep(bool keepLpAlive) {
if (!isSynced()) { if (!isSynced()) {
return; return;
+5
View File
@@ -1,5 +1,6 @@
#pragma once #pragma once
#include <cstddef>
#include <cstdint> #include <cstdint>
#include <ctime> #include <ctime>
@@ -30,6 +31,10 @@ namespace HalClock {
/// Returns true if the sync succeeded. /// Returns true if the sync succeeded.
bool syncNtp(); bool syncNtp();
/// Same as syncNtp(), but fills `errorBuf` with a short failure reason when
/// the sync fails.
bool syncNtp(char* errorBuf, size_t errorBufSize);
/// Apply timezone/DST rules via the POSIX TZ string for the given setting. /// Apply timezone/DST rules via the POSIX TZ string for the given setting.
void applyTimezone(uint8_t timeZoneSetting); void applyTimezone(uint8_t timeZoneSetting);
+21 -4
View File
@@ -7,6 +7,7 @@
#include <WiFi.h> #include <WiFi.h>
#include <cstdlib> #include <cstdlib>
#include <string>
#include "CrossPointSettings.h" #include "CrossPointSettings.h"
#include "MappedInputManager.h" #include "MappedInputManager.h"
@@ -93,8 +94,9 @@ void SyncTimeActivity::performSync() {
hadTimeBeforeSync = HalClock::isSynced(); hadTimeBeforeSync = HalClock::isSynced();
preSyncTime = hadTimeBeforeSync ? time(nullptr) : 0; preSyncTime = hadTimeBeforeSync ? time(nullptr) : 0;
prevSyncTime = HalClock::lastSyncTime(); prevSyncTime = HalClock::lastSyncTime();
syncErrorMsg[0] = '\0';
bool ok = HalClock::syncNtp(); bool ok = HalClock::syncNtp(syncErrorMsg, sizeof(syncErrorMsg));
if (ok && hadTimeBeforeSync) { if (ok && hadTimeBeforeSync) {
driftSeconds = (int32_t)(time(nullptr) - preSyncTime); driftSeconds = (int32_t)(time(nullptr) - preSyncTime);
@@ -184,10 +186,17 @@ void SyncTimeActivity::render(RenderLock&&) {
} }
if (state == FAILED) { if (state == FAILED) {
renderer.drawCenteredText(UI_10_FONT_ID, bodyRect.y + bodyRect.height / 2, tr(STR_TIME_SYNC_FAILED), true, int y = bodyRect.y + bodyRect.height / 2 - 10;
EpdFontFamily::BOLD); renderer.drawCenteredText(UI_10_FONT_ID, y, tr(STR_TIME_SYNC_FAILED), true, EpdFontFamily::BOLD);
const auto labels = mappedInput.mapLabels(tr(STR_BACK), "", "", ""); if (syncErrorMsg[0] != '\0') {
y += 25;
const std::string errorText =
renderer.truncatedText(UI_10_FONT_ID, syncErrorMsg, bodyRect.width, EpdFontFamily::REGULAR);
renderer.drawCenteredText(UI_10_FONT_ID, y, errorText.c_str(), true, EpdFontFamily::REGULAR);
}
const auto labels = mappedInput.mapLabels(tr(STR_BACK), tr(STR_RETRY), "", "");
GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4); GUI.drawButtonHints(renderer, labels.btn1, labels.btn2, labels.btn3, labels.btn4);
renderer.displayBuffer(); renderer.displayBuffer();
return; return;
@@ -198,6 +207,14 @@ void SyncTimeActivity::loop() {
if (state == SUCCESS || state == FAILED) { if (state == SUCCESS || state == FAILED) {
if (mappedInput.wasPressed(MappedInputManager::Button::Back)) { if (mappedInput.wasPressed(MappedInputManager::Button::Back)) {
finish(); finish();
return;
}
if (state == FAILED && mappedInput.wasPressed(MappedInputManager::Button::Confirm)) {
RenderLock lock(*this);
state = SYNCING;
requestUpdateAndWait();
performSync();
} }
} }
} }
@@ -19,6 +19,7 @@ class SyncTimeActivity final : public Activity {
time_t prevSyncTime = 0; time_t prevSyncTime = 0;
int32_t driftSeconds = 0; int32_t driftSeconds = 0;
bool hadTimeBeforeSync = false; bool hadTimeBeforeSync = false;
char syncErrorMsg[64] = {};
void onWifiSelectionComplete(bool success); void onWifiSelectionComplete(bool success);
void onWifiSelectionCancelled(); void onWifiSelectionCancelled();
void performSync(); void performSync();