Experimental code to allow timer resyncing after NTP resync
Some checks are pending
Compile / Compile (push) Has started running
Some checks are pending
Compile / Compile (push) Has started running
This commit is contained in:
parent
3ada2fb9a9
commit
5367843ac1
3 changed files with 33 additions and 12 deletions
|
@ -269,6 +269,7 @@ void WatchFace::MenuNTPSyncSelected()
|
|||
ConnectWiFi();
|
||||
SyncNTPTime();
|
||||
DisconnectWiFi();
|
||||
m_RTC.Resync();
|
||||
|
||||
if (m_inMenu) {
|
||||
m_inMenu = false;
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue