6 #ifndef ACE_TIME_SYSTEM_CLOCK_LOOP_H 7 #define ACE_TIME_SYSTEM_CLOCK_LOOP_H 10 #include "SystemClock.h" 12 class SystemClockLoopTest_loop;
59 Clock* referenceClock ,
61 uint16_t syncPeriodSeconds = 3600,
62 uint16_t initialSyncPeriodSeconds = 5,
63 uint16_t requestTimeoutMillis = 1000,
66 mSyncPeriodSeconds(syncPeriodSeconds),
67 mRequestTimeoutMillis(requestTimeoutMillis),
68 mTimingStats(timingStats),
69 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
77 if (mReferenceClock ==
nullptr)
return;
82 switch (mRequestStatus) {
85 mRequestStartMillis = nowMillis;
91 if (mTimingStats !=
nullptr) {
92 uint16_t elapsedMillis = nowMillis - mRequestStartMillis;
93 mTimingStats->update(elapsedMillis);
95 if (nowSeconds == kInvalidSeconds) {
99 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
100 mLastSyncMillis = nowMillis;
104 unsigned long waitMillis = nowMillis - mRequestStartMillis;
105 if (waitMillis >= mRequestTimeoutMillis) {
111 unsigned long millisSinceLastSync = nowMillis - mLastSyncMillis;
112 if (millisSinceLastSync >= mCurrentSyncPeriodSeconds * 1000UL) {
120 unsigned long waitMillis = nowMillis - mRequestStartMillis;
121 if (waitMillis >= mCurrentSyncPeriodSeconds * 1000UL) {
122 if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
123 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
125 mCurrentSyncPeriodSeconds *= 2;
135 friend class ::SystemClockLoopTest_loop;
141 uint16_t
const mSyncPeriodSeconds;
142 uint16_t
const mRequestTimeoutMillis;
145 unsigned long mLastSyncMillis;
146 unsigned long mRequestStartMillis;
147 uint16_t mCurrentSyncPeriodSeconds;
static const uint8_t kStatusWaitForRetry
Request received but is invalid, so retry with exponential backoff.
static const uint8_t kStatusReady
Ready to send request.
A Clock that uses the Arduino millis() function to advance the time returned to the user...
A subclass of SystemClock that sync with its mReferenceClock using a blocking mReferenceClock->getNow...
static const uint8_t kStatusSent
Request sent, waiting for response.
static const uint8_t kStatusOk
Request received and is valid.
virtual bool isResponseReady() const
Return true if a response is ready.
Helper class to collect timing statistics such as min, max, average.
void keepAlive()
Call this (or getNow() every 65.535 seconds or faster to keep the internal counter in sync with milli...
virtual unsigned long clockMillis() const
Return the Arduino millis().
SystemClockLoop(Clock *referenceClock, Clock *backupClock, uint16_t syncPeriodSeconds=3600, uint16_t initialSyncPeriodSeconds=5, uint16_t requestTimeoutMillis=1000, common::TimingStats *timingStats=nullptr)
Constructor.
void loop()
Call this from the global loop() method.
virtual void sendRequest() const
Send a time request asynchronously.
Base class for objects that provide and store time.
virtual acetime_t readResponse() const
Returns number of seconds since AceTime epoch (2000-01-01).
void syncNow(acetime_t epochSeconds)
Similar to setNow() except that backupNow() is called only if the backupClock is different from the r...