AceTime  0.3
Date and time classes for Arduino that support timezones from the TZ Database, and a system clock that can synchronize from an NTP server or an RTC chip.
SystemClockSyncLoop.h
1 #ifndef ACE_TIME_SYSTEM_CLOCK_SYNC_LOOP_H
2 #define ACE_TIME_SYSTEM_CLOCK_SYNC_LOOP_H
3 
4 #include <stdint.h>
5 #include "SystemClock.h"
6 
7 namespace ace_time {
8 namespace clock {
9 
15  public:
28  uint16_t syncPeriodSeconds = 3600,
29  uint16_t initialSyncPeriodSeconds = 5,
30  uint16_t requestTimeoutMillis = 1000):
31  mSystemClock(systemClock),
32  mSyncPeriodSeconds(syncPeriodSeconds),
33  mInitialSyncPeriodSeconds(initialSyncPeriodSeconds),
34  mRequestTimeoutMillis(requestTimeoutMillis),
35  mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
36 
41  void loop() {
42  if (mSystemClock.mSyncTimeProvider == nullptr) return;
43 
44  unsigned long nowMillis = millis();
45  unsigned long timeSinceLastSync = nowMillis - mLastSyncMillis;
46 
47  if (timeSinceLastSync >= mCurrentSyncPeriodSeconds * 1000UL
48  || mSystemClock.getNow() == 0) {
49  acetime_t nowSeconds = mSystemClock.mSyncTimeProvider->getNow();
50 
51  if (nowSeconds == 0) {
52  // retry with exponential backoff
53  if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
54  mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
55  } else {
56  mCurrentSyncPeriodSeconds *= 2;
57  }
58  } else {
59  mSystemClock.sync(nowSeconds);
60  mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
61  }
62 
63  mLastSyncMillis = nowMillis;
64  }
65  }
66 
71  uint16_t getSecondsSinceLastSync() const {
72  unsigned long elapsedMillis = millis() - mLastSyncMillis;
73  return elapsedMillis / 1000;
74  }
75 
76  private:
77  SystemClock& mSystemClock;
78  uint16_t const mSyncPeriodSeconds;
79  uint16_t const mInitialSyncPeriodSeconds;
80  uint16_t const mRequestTimeoutMillis;
81 
82  unsigned long mLastSyncMillis = 0; // should be the same type as millis()
83  uint16_t mCurrentSyncPeriodSeconds;
84 };
85 
86 }
87 }
88 
89 #endif
uint16_t getSecondsSinceLastSync() const
Return the number of seconds since last sync.
acetime_t getNow() const override
Return the number of seconds since the AceTime epoch (2000-01-01T00:00:00Z).
Definition: SystemClock.h:67
SystemClockSyncLoop(SystemClock &systemClock, uint16_t syncPeriodSeconds=3600, uint16_t initialSyncPeriodSeconds=5, uint16_t requestTimeoutMillis=1000)
Constructor.
A TimeKeeper that uses the Arduino millis() function to advance the time returned to the user...
Definition: SystemClock.h:45
A class that periodically that syncs the SystemClock with its syncTimeProvider.
void loop()
If AceRoutine coroutine infrastructure is not used, then call this from the global loop() method...
void sync(acetime_t epochSeconds)
Similar to setNow() except that backupNow() is called only if the backupTimeKeeper is different from ...
Definition: SystemClock.h:96
virtual acetime_t getNow() const =0
Return the number of seconds since the AceTime epoch (2000-01-01T00:00:00Z).