diff --git a/src/rtcsync.h b/src/rtcsync.h new file mode 100644 index 0000000..8607f43 --- /dev/null +++ b/src/rtcsync.h @@ -0,0 +1,48 @@ +// PCF8523-RTC-Modul mit NTP-Sync und Fallback. +// Header-only nach Projekt-Pattern: Globale Objekte werden hier definiert. +// Dieser Header darf NUR in master.cpp inkludiert werden. +#pragma once +#include +#include +#include + +// Globale RTC-Instanz und Status-Flags +RTC_PCF8523 rtc; +bool rtcAvailable = false; +bool ntpEverSynced = false; +time_t lastNtpSyncEpoch = 0; +bool lastStaConnected = false; + +// I2C-Init, PCF8523-Detektion, und Systemzeit-Fallback aus RTC. +// Soft-Fail: bei nicht gefundener Hardware bleibt rtcAvailable=false. +void setupRTC() { + Wire.begin(); + if (!rtc.begin()) { + Serial.println("[RTC] PCF8523 nicht gefunden — RTC-Funktionen deaktiviert"); + rtcAvailable = false; + return; + } + if (!rtc.initialized() || rtc.lostPower()) { + Serial.println("[RTC] PCF8523 erkannt, aber Akku-Backup ungültig (lostPower)"); + } + rtc.start(); + rtcAvailable = true; + Serial.println("[RTC] PCF8523 initialisiert"); + + // Systemzeit aus RTC vorbelegen — wird ggf. später durch NTP übersteuert. + // RTC speichert UTC, settimeofday erwartet UTC. Kein Offset nötig. + DateTime nowRtc = rtc.now(); + uint32_t rtcEpoch = nowRtc.unixtime(); + // Plausibilität: RTC sollte mindestens 2025 zeigen, sonst ist sie ungestellt. + if (rtcEpoch >= 1735689600UL) { + struct timeval tv; + tv.tv_sec = (time_t)rtcEpoch; + tv.tv_usec = 0; + settimeofday(&tv, NULL); + Serial.printf("[RTC] Systemzeit aus RTC gesetzt: %lu (UTC)\n", + (unsigned long)rtcEpoch); + } else { + Serial.printf("[RTC] RTC-Zeit unplausibel (%lu) — nicht übernommen\n", + (unsigned long)rtcEpoch); + } +}