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 class SystemClockSyncCoroutineTest;
44 uint16_t syncPeriodSeconds = 3600,
45 uint16_t initialSyncPeriodSeconds = 5,
46 uint16_t requestTimeoutMillis = 1000,
48 mSystemClock(systemClock),
49 mSyncPeriodSeconds(syncPeriodSeconds),
50 mRequestTimeoutMillis(requestTimeoutMillis),
51 mTimingStats(timingStats),
52 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
62 if (mSystemClock.mSyncTimeProvider ==
nullptr)
return 0;
67 mRequestStartTime = millis();
72 mRequestStatus = kStatusOk;
80 uint16_t waitTime = millis() - mRequestStartTime;
81 if (waitTime >= mRequestTimeoutMillis) {
82 mRequestStatus = kStatusTimedOut;
91 if (mRequestStatus == kStatusOk) {
92 acetime_t nowSeconds =
94 uint16_t elapsedTime = millis() - mRequestStartTime;
95 if (mTimingStats !=
nullptr) {
96 mTimingStats->update(elapsedTime);
98 mSystemClock.
sync(nowSeconds);
99 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
102 COROUTINE_DELAY_SECONDS(mDelayLoopCounter, mCurrentSyncPeriodSeconds);
107 if (mRequestStatus == kStatusTimedOut) {
108 if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
109 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
111 mCurrentSyncPeriodSeconds *= 2;
118 friend class ::SystemClockSyncCoroutineTest;
125 static const uint8_t kStatusOk = 0;
126 static const uint8_t kStatusTimedOut = 1;
129 uint16_t
const mSyncPeriodSeconds;
130 uint16_t
const mRequestTimeoutMillis;
133 uint16_t mRequestStartTime;
134 uint16_t mCurrentSyncPeriodSeconds;
135 uint8_t mRequestStatus;
136 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.