feat(rtc): wire timesync hooks and add persistSystemTimeToRTC
This commit is contained in:
@@ -46,3 +46,25 @@ void setupRTC() {
|
||||
(unsigned long)rtcEpoch);
|
||||
}
|
||||
}
|
||||
|
||||
// Plausibilitäts-Grenzen: 2025-01-01 .. 2100-01-01 (UTC).
|
||||
// Verhindert, dass kaputte Timestamps (0, negativ, 1970) die RTC korrumpieren.
|
||||
static constexpr uint32_t RTC_MIN_EPOCH = 1735689600UL; // 2025-01-01 00:00:00 UTC
|
||||
static constexpr uint32_t RTC_MAX_EPOCH = 4102444800UL; // 2100-01-01 00:00:00 UTC
|
||||
|
||||
void persistSystemTimeToRTC(time_t t) {
|
||||
if (!rtcAvailable) return;
|
||||
if ((uint32_t)t < RTC_MIN_EPOCH || (uint32_t)t >= RTC_MAX_EPOCH) {
|
||||
Serial.printf("[RTC] persist abgelehnt — Timestamp unplausibel: %ld\n",
|
||||
(long)t);
|
||||
return;
|
||||
}
|
||||
rtc.adjust(DateTime((uint32_t)t));
|
||||
Serial.printf("[RTC] in RTC geschrieben: %ld (UTC)\n", (long)t);
|
||||
}
|
||||
|
||||
// Weak-Hook-Override aus timesync.h — wird automatisch aufgerufen,
|
||||
// sobald irgendwo setSystemTime() Erfolg meldet.
|
||||
extern "C" void onSystemTimeSet(time_t t) {
|
||||
persistSystemTimeToRTC(t);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
|
||||
// Weak hooks — falls rtcsync.h kompiliert/gelinkt wird, überschreibt es diese.
|
||||
// Ohne rtcsync.h sind beide Symbole nullptr und werden nicht aufgerufen.
|
||||
extern "C" void onSystemTimeSet(time_t t) __attribute__((weak));
|
||||
extern "C" void appendTimeStatus(JsonDocument &doc) __attribute__((weak));
|
||||
|
||||
// Globale Zeitvariablen
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
@@ -24,7 +29,7 @@ String getCurrentTimeJSON() {
|
||||
gettimeofday(&tv, &tz);
|
||||
now = tv.tv_sec;
|
||||
|
||||
StaticJsonDocument<200> doc;
|
||||
JsonDocument doc;
|
||||
doc["timestamp"] = (long)now;
|
||||
doc["success"] = true;
|
||||
|
||||
@@ -33,13 +38,18 @@ String getCurrentTimeJSON() {
|
||||
char timeStr[64];
|
||||
strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", &timeinfo);
|
||||
doc["formatted"] = String(timeStr);
|
||||
doc["year"] = timeinfo.tm_year + 1900;
|
||||
doc["month"] = timeinfo.tm_mon + 1;
|
||||
doc["day"] = timeinfo.tm_mday;
|
||||
doc["hour"] = timeinfo.tm_hour;
|
||||
doc["year"] = timeinfo.tm_year + 1900;
|
||||
doc["month"] = timeinfo.tm_mon + 1;
|
||||
doc["day"] = timeinfo.tm_mday;
|
||||
doc["hour"] = timeinfo.tm_hour;
|
||||
doc["minute"] = timeinfo.tm_min;
|
||||
doc["second"] = timeinfo.tm_sec;
|
||||
|
||||
// Optionale RTC/Sync-Status-Felder, falls rtcsync.h gelinkt ist
|
||||
if (appendTimeStatus) {
|
||||
appendTimeStatus(doc);
|
||||
}
|
||||
|
||||
String response;
|
||||
serializeJson(doc, response);
|
||||
return response;
|
||||
@@ -76,6 +86,9 @@ bool setSystemTime(long timestamp) {
|
||||
|
||||
if (settimeofday(&tv, NULL) == 0) {
|
||||
Serial.println("Zeit erfolgreich gesetzt: " + String(timestamp));
|
||||
if (onSystemTimeSet) {
|
||||
onSystemTimeSet((time_t)timestamp);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
Serial.println("Fehler beim Setzen der Zeit");
|
||||
|
||||
Reference in New Issue
Block a user