Experimental code to allow timer resyncing after NTP resync
Some checks are pending
Compile / Compile (push) Has started running

This commit is contained in:
Lewis Jackson 2023-05-31 21:20:55 +03:00
parent 3ada2fb9a9
commit 5367843ac1
3 changed files with 33 additions and 12 deletions

View file

@ -269,6 +269,7 @@ void WatchFace::MenuNTPSyncSelected()
ConnectWiFi();
SyncNTPTime();
DisconnectWiFi();
m_RTC.Resync();
if (m_inMenu) {
m_inMenu = false;

View file

@ -13,10 +13,6 @@ WatchyRTC::WatchyRTC()
void WatchyRTC::Init()
{
tmElements_t tm;
Get(tm, 0);
rtc_pcf.initClock();
Set(tm);
}
void WatchyRTC::Get(tmElements_t & tm, int offsetInSeconds)
@ -43,14 +39,7 @@ void WatchyRTC::Set(tmElements_t tm)
void WatchyRTC::SetTimer()
{
if (!m_timerSet) {
rtc_pcf.getDateTime();
// Sleep just long enough to get to a multiple of the update interval, makes updates happen on exact turn of the minute
int seconds = UPDATE_INTERVAL - (rtc_pcf.getSecond() % UPDATE_INTERVAL);
// Non repeating
rtc_pcf.setTimer(seconds, TMR_1Hz, false);
m_timerSet = true;
m_initialTimer = true;
Resync();
}
}
@ -133,10 +122,40 @@ bool WatchyRTC::CheckWakeup()
interval = UPDATE_INTERVAL;
}
// Timer doesn't work reliably unless it's cleared first
rtc_pcf.clearTimer();
rtc_pcf.setTimer(interval, frequency, true);
return true;
}
return true;
}
void WatchyRTC::Resync()
{
rtc_pcf.getDateTime();
// Sleep just long enough to get to a multiple of the update interval, makes updates happen on exact turn of the minute
int seconds = UPDATE_INTERVAL - (rtc_pcf.getSecond() % UPDATE_INTERVAL);
if (seconds < 0) {
seconds = 0;
}
// Timer doesn't work reliably unless it's cleared first
rtc_pcf.clearTimer();
if (seconds == 0) {
// If there's no time to wait, just call CheckWakeup() immediately and it'll set the repeating timer
m_timerSet = true;
m_initialTimer = true;
CheckWakeup();
} else {
rtc_pcf.setTimer(seconds, TMR_1Hz, false);
m_timerSet = true;
m_initialTimer = true;
}
seconds = 0;
}

View file

@ -20,6 +20,7 @@ public:
void Set(tmElements_t tm);
void SetTimer();
bool CheckWakeup(); // Checks to really wake up or not, also resets the timer after the initial sleep
void Resync(); // Resync the timer cycle, both initially and after RTC resync
static void OffsetTime(tmElements_t & tm, int offsetInSeconds);