6 #ifndef ACE_TIME_SYSTEM_CLOCK_COROUTINE_H 7 #define ACE_TIME_SYSTEM_CLOCK_COROUTINE_H 10 #ifdef ACE_ROUTINE_VERSION 13 #include <AceRoutine.h> 14 #include "../common/TimingStats.h" 15 #include "SystemClock.h" 17 class SystemClockCoroutineTest_runCoroutine;
64 Clock* referenceClock ,
66 uint16_t syncPeriodSeconds = 3600,
67 uint16_t initialSyncPeriodSeconds = 5,
68 uint16_t requestTimeoutMillis = 1000,
71 mSyncPeriodSeconds(syncPeriodSeconds),
72 mRequestTimeoutMillis(requestTimeoutMillis),
73 mTimingStats(timingStats),
74 mCurrentSyncPeriodSeconds(initialSyncPeriodSeconds) {}
85 if (mReferenceClock ==
nullptr)
return 0;
90 mRequestStartMillis = coroutineMillis();
104 uint16_t waitMillis =
105 (uint16_t) coroutineMillis() - mRequestStartMillis;
106 if (waitMillis >= mRequestTimeoutMillis) {
116 if (mRequestStatus == kStatusOk) {
118 if (mTimingStats !=
nullptr) {
119 uint16_t elapsedMillis =
120 (uint16_t) coroutineMillis() - mRequestStartMillis;
121 mTimingStats->update(elapsedMillis);
124 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
127 COROUTINE_DELAY_SECONDS(mCurrentSyncPeriodSeconds);
132 if (mRequestStatus == kStatusTimedOut) {
133 if (mCurrentSyncPeriodSeconds >= mSyncPeriodSeconds / 2) {
134 mCurrentSyncPeriodSeconds = mSyncPeriodSeconds;
136 mCurrentSyncPeriodSeconds *= 2;
146 friend class ::SystemClockCoroutineTest_runCoroutine;
152 uint16_t
const mSyncPeriodSeconds;
153 uint16_t
const mRequestTimeoutMillis;
156 uint16_t mRequestStartMillis;
157 uint16_t mCurrentSyncPeriodSeconds;
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.