6 #ifndef ACE_TIME_SYSTEM_CLOCK_SYNC_COROUTINE_H 7 #define ACE_TIME_SYSTEM_CLOCK_SYNC_COROUTINE_H 10 #include "../common/TimingStats.h" 11 #include "SystemClock.h" 13 extern "C" unsigned long millis();
15 class SystemClockSyncCoroutineTest;
46 uint16_t syncPeriodSeconds = 3600,
47 uint16_t initialSyncPeriodSeconds = 5,
48 uint16_t requestTimeoutMillis = 1000,
50 mSystemClock(systemClock),
51 mSyncPeriodSeconds(syncPeriodSeconds),
52 mRequestTimeoutMillis(requestTimeoutMillis),
53 mTimingStats(timingStats),
54 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
64 if (mSystemClock.mSyncTimeProvider ==
nullptr)
return 0;
69 mRequestStartTime = millis();
74 mRequestStatus = kStatusOk;
82 uint16_t waitTime = millis() - mRequestStartTime;
83 if (waitTime >= mRequestTimeoutMillis) {
84 mRequestStatus = kStatusTimedOut;
93 if (mRequestStatus == kStatusOk) {
94 acetime_t nowSeconds =
96 uint16_t elapsedTime = millis() - mRequestStartTime;
97 if (mTimingStats !=
nullptr) {
98 mTimingStats->update(elapsedTime);
100 mSystemClock.
sync(nowSeconds);
101 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
104 COROUTINE_DELAY_SECONDS(mDelayLoopCounter, mCurrentSyncPeriodSeconds);
109 if (mRequestStatus == kStatusTimedOut) {
110 if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
111 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
113 mCurrentSyncPeriodSeconds *= 2;
120 friend class ::SystemClockSyncCoroutineTest;
127 static const uint8_t kStatusOk = 0;
128 static const uint8_t kStatusTimedOut = 1;
131 uint16_t
const mSyncPeriodSeconds;
132 uint16_t
const mRequestTimeoutMillis;
135 uint16_t mRequestStartTime;
136 uint16_t mCurrentSyncPeriodSeconds;
137 uint8_t mRequestStatus;
138 uint16_t mDelayLoopCounter;
A coroutine that syncs the SystemClock with its mSyncTimeProvider.
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.