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) {
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);
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;