1 #ifndef ACE_TIME_SYSTEM_CLOCK_SYNC_COROUTINE_H 2 #define ACE_TIME_SYSTEM_CLOCK_SYNC_COROUTINE_H 5 #include "../common/TimingStats.h" 6 #include "SystemClock.h" 8 class SystemClockSyncCoroutineTest;
36 uint16_t syncPeriodSeconds = 3600,
37 uint16_t initialSyncPeriodSeconds = 5,
38 uint16_t requestTimeoutMillis = 1000,
40 mSystemClock(systemClock),
41 mSyncPeriodSeconds(syncPeriodSeconds),
42 mInitialSyncPeriodSeconds(initialSyncPeriodSeconds),
43 mRequestTimeoutMillis(requestTimeoutMillis),
44 mTimingStats(timingStats),
45 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
55 if (mSystemClock.mSyncTimeProvider ==
nullptr)
return 0;
60 mRequestStartTime = millis();
65 mRequestStatus = kStatusOk;
73 uint16_t waitTime = millis() - mRequestStartTime;
74 if (waitTime >= mRequestTimeoutMillis) {
75 mRequestStatus = kStatusTimedOut;
84 if (mRequestStatus == kStatusOk) {
85 acetime_t nowSeconds =
87 uint16_t elapsedTime = millis() - mRequestStartTime;
88 if (mTimingStats !=
nullptr) {
89 mTimingStats->update(elapsedTime);
91 mSystemClock.
sync(nowSeconds);
92 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
95 COROUTINE_DELAY_SECONDS(mDelayLoopCounter, mCurrentSyncPeriodSeconds);
100 if (mRequestStatus == kStatusTimedOut) {
101 if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
102 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
104 mCurrentSyncPeriodSeconds *= 2;
111 friend class ::SystemClockSyncCoroutineTest;
113 static const uint8_t kStatusOk = 0;
114 static const uint8_t kStatusTimedOut = 1;
117 uint16_t
const mSyncPeriodSeconds;
118 uint16_t
const mInitialSyncPeriodSeconds;
119 uint16_t
const mRequestTimeoutMillis;
122 uint16_t mRequestStartTime;
123 uint16_t mCurrentSyncPeriodSeconds;
124 uint8_t mRequestStatus;
125 uint16_t mDelayLoopCounter;
A coroutine that syncs the SystemClock with its syncTimeProvider.
A TimeKeeper that uses the Arduino millis() function to advance the time returned to the user...
virtual bool isResponseReady() const
Return true if a response is ready.
void sync(acetime_t epochSeconds)
Similar to setNow() except that backupNow() is called only if the backupTimeKeeper is different from ...
Helper class to collect timing statistics such as min, max, average.
virtual void sendRequest() const
Send a time request asynchronously.
virtual acetime_t readResponse() const
Returns number of seconds since AceTime epoch (2000-01-01).
int runCoroutine() override
SystemClockSyncCoroutine(SystemClock &systemClock, uint16_t syncPeriodSeconds=3600, uint16_t initialSyncPeriodSeconds=5, uint16_t requestTimeoutMillis=1000, common::TimingStats *timingStats=nullptr)
Constructor.