6 #ifndef ACE_TIME_SYSTEM_CLOCK_COROUTINE_H 7 #define ACE_TIME_SYSTEM_CLOCK_COROUTINE_H 10 #include <AceRoutine.h> 11 #include "../common/TimingStats.h" 12 #include "SystemClock.h" 14 class SystemClockCoroutineTest_runCoroutine;
61 Clock* referenceClock ,
63 uint16_t syncPeriodSeconds = 3600,
64 uint16_t initialSyncPeriodSeconds = 5,
65 uint16_t requestTimeoutMillis = 1000,
68 mSyncPeriodSeconds(syncPeriodSeconds),
69 mRequestTimeoutMillis(requestTimeoutMillis),
70 mTimingStats(timingStats),
71 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
82 if (mReferenceClock ==
nullptr)
return 0;
87 mRequestStartMillis = this->millis();
101 uint16_t waitMillis =
102 (uint16_t) this->millis() - mRequestStartMillis;
103 if (waitMillis >= mRequestTimeoutMillis) {
113 if (mRequestStatus == kStatusOk) {
115 if (mTimingStats !=
nullptr) {
116 uint16_t elapsedMillis =
117 (uint16_t) this->millis() - mRequestStartMillis;
118 mTimingStats->update(elapsedMillis);
121 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
124 COROUTINE_DELAY_SECONDS(mDelayLoopCounter, mCurrentSyncPeriodSeconds);
129 if (mRequestStatus == kStatusTimedOut) {
130 if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
131 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
133 mCurrentSyncPeriodSeconds *= 2;
143 friend class ::SystemClockCoroutineTest_runCoroutine;
149 uint16_t
const mSyncPeriodSeconds;
150 uint16_t
const mRequestTimeoutMillis;
153 uint16_t mRequestStartMillis;
154 uint16_t mCurrentSyncPeriodSeconds;
155 uint16_t mDelayLoopCounter;
static const uint8_t kStatusSent
Request has been sent and waiting for response.
A Clock that uses the Arduino millis() function to advance the time returned to the user...
static const uint8_t kStatusUnknown
Request state unknown.
static const uint8_t kStatusTimedOut
Request timed out.
int runCoroutine() override
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...
A version of SystemClock that mixes in the ace_routine::Coroutine class so that that the non-block me...
virtual void sendRequest() const
Send a time request asynchronously.
uint8_t getRequestStatus() const
Return the current request status.
Base class for objects that provide and store time.
virtual acetime_t readResponse() const
Returns number of seconds since AceTime epoch (2000-01-01).
static const uint8_t kStatusOk
Request received and valid.
void syncNow(acetime_t epochSeconds)
Similar to setNow() except that backupNow() is called only if the backupClock is different from the r...
SystemClockCoroutine(Clock *referenceClock, Clock *backupClock, uint16_t syncPeriodSeconds=3600, uint16_t initialSyncPeriodSeconds=5, uint16_t requestTimeoutMillis=1000, common::TimingStats *timingStats=nullptr)
Constructor.