1 #ifndef ACE_TIME_SYSTEM_TIME_SYNC_COROUTINE_H 2 #define ACE_TIME_SYSTEM_TIME_SYNC_COROUTINE_H 5 #include "../common/TimingStats.h" 6 #include "SystemTimeKeeper.h" 8 class SystemTimeSyncCoroutineTest;
36 uint16_t syncPeriodSeconds = 3600,
37 uint16_t initialSyncPeriodSeconds = 5,
38 uint16_t requestTimeoutMillis = 1000,
40 mSystemTimeKeeper(systemTimeKeeper),
41 mSyncPeriodSeconds(syncPeriodSeconds),
42 mInitialSyncPeriodSeconds(initialSyncPeriodSeconds),
43 mRequestTimeoutMillis(requestTimeoutMillis),
44 mTimingStats(timingStats),
45 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
55 if (mSystemTimeKeeper.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 mSystemTimeKeeper.
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 ::SystemTimeSyncCoroutineTest;
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;
int runCoroutine() override
virtual acetime_t readResponse() const
Returns number of seconds since AceTime epoch (2000-01-01).
virtual void sendRequest() const
Send a time request asynchronously.
void sync(acetime_t epochSeconds)
Similar to setNow() except that backupNow() is called only if the backupTimeKeeper is different from ...
SystemTimeSyncCoroutine(SystemTimeKeeper &systemTimeKeeper, uint16_t syncPeriodSeconds=3600, uint16_t initialSyncPeriodSeconds=5, uint16_t requestTimeoutMillis=1000, common::TimingStats *timingStats=nullptr)
Constructor.
Helper class to collect timing statistics such as min, max, average.
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.
A coroutine that syncs the SystemTimeKeeper with its syncTimeProvider.