Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
ClockPolicies.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <chrono>
10#include <cstdint>
11#include <type_traits>
12
13#if defined(ESP_PLATFORM) || defined(ARDUINO_ARCH_ESP32)
14#include <esp_timer.h>
15#define CORIUM_NATIVE_ESP_TIMER 1
16#endif
17
18#if defined(FREERTOS) || defined(INC_FREERTOS_H)
19#include <freertos/FreeRTOS.h>
20#include <freertos/task.h>
21#define CORIUM_NATIVE_FREERTOS 1
22#endif
23
24namespace corium {
25
26class ChronoClockPolicy;
27
28namespace internal {
29
30template <typename T, typename = void>
34
35template <typename T>
36struct get_timer_clock_policy<T, std::void_t<typename T::clock_policy>> {
37 using type = typename T::clock_policy;
38};
39
40} // namespace internal
41
45public:
46 using time_point = std::chrono::steady_clock::time_point;
47 using duration = std::chrono::microseconds;
48
49 [[nodiscard]] static time_point now() noexcept
50 {
51 return std::chrono::steady_clock::now();
52 }
53
54 template <typename Rep, typename Period>
55 [[nodiscard]] static time_point add(time_point tp, const std::chrono::duration<Rep, Period>& d) noexcept
56 {
57 return tp + std::chrono::duration_cast<std::chrono::steady_clock::duration>(d);
58 }
59
60 [[nodiscard]] static bool isDue(time_point now, time_point expiry) noexcept
61 {
62 return now >= expiry;
63 }
64};
65
69public:
70 using time_point = uint64_t;
71 using duration = uint64_t;
72
73 [[nodiscard]] static time_point now() noexcept
74 {
75 return _currentTime;
76 }
77
78 static void set(time_point t) noexcept
79 {
80 _currentTime = t;
81 }
82
83 static void advance(duration delta) noexcept
84 {
85 _currentTime += delta;
86 }
87
88 static void reset() noexcept
89 {
90 _currentTime = 0;
91 }
92
93 template <typename Rep, typename Period>
94 [[nodiscard]] static time_point add(time_point tp, const std::chrono::duration<Rep, Period>& d) noexcept
95 {
96 return tp + static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::microseconds>(d).count());
97 }
98
99 [[nodiscard]] static time_point add(time_point tp, duration delta) noexcept
100 {
101 return tp + delta;
102 }
103
104 [[nodiscard]] static bool isDue(time_point now, time_point expiry) noexcept
105 {
106 return now >= expiry;
107 }
108
109private:
110 static inline time_point _currentTime = 0;
111};
112
115template <typename Provider>
117public:
118 using time_point = uint64_t;
119 using duration = uint64_t;
120
121 [[nodiscard]] static time_point now() noexcept
122 {
123 return Provider::nowUs();
124 }
125
126 template <typename Rep, typename Period>
127 [[nodiscard]] static time_point add(time_point tp, const std::chrono::duration<Rep, Period>& d) noexcept
128 {
129 return tp + static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::microseconds>(d).count());
130 }
131
132 [[nodiscard]] static time_point add(time_point tp, duration delta) noexcept
133 {
134 return tp + delta;
135 }
136
137 [[nodiscard]] static bool isDue(time_point now, time_point expiry) noexcept
138 {
139 return now >= expiry;
140 }
141};
142
145template <typename Provider>
147public:
148 using time_point = uint32_t;
149 using duration = uint32_t;
150
151 [[nodiscard]] static time_point now() noexcept
152 {
153 return Provider::nowMs();
154 }
155
156 template <typename Rep, typename Period>
157 [[nodiscard]] static time_point add(time_point tp, const std::chrono::duration<Rep, Period>& d) noexcept
158 {
159 return tp + static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::milliseconds>(d).count());
160 }
161
162 [[nodiscard]] static time_point add(time_point tp, duration delta) noexcept
163 {
164 return tp + delta;
165 }
166
167 [[nodiscard]] static bool isDue(time_point now, time_point expiry) noexcept
168 {
169 return now >= expiry;
170 }
171};
172
175public:
176 using time_point = uint64_t;
177 using duration = uint64_t;
178
179 [[nodiscard]] static time_point now() noexcept
180 {
181#if defined(CORIUM_NATIVE_ESP_TIMER)
182 int64_t t = esp_timer_get_time();
183 return t > 0 ? static_cast<uint64_t>(t) : 0;
184#else
185 return static_cast<uint64_t>(
186 std::chrono::duration_cast<std::chrono::microseconds>(
187 std::chrono::steady_clock::now().time_since_epoch()
188 ).count()
189 );
190#endif
191 }
192
193 template <typename Rep, typename Period>
194 [[nodiscard]] static time_point add(time_point tp, const std::chrono::duration<Rep, Period>& d) noexcept
195 {
196 return tp + static_cast<uint64_t>(std::chrono::duration_cast<std::chrono::microseconds>(d).count());
197 }
198
199 [[nodiscard]] static time_point add(time_point tp, duration delta) noexcept
200 {
201 return tp + delta;
202 }
203
204 [[nodiscard]] static bool isDue(time_point now, time_point expiry) noexcept
205 {
206 return now >= expiry;
207 }
208};
209
212public:
213 using time_point = uint32_t;
214 using duration = uint32_t;
215
216 [[nodiscard]] static time_point now() noexcept
217 {
218#if defined(CORIUM_NATIVE_FREERTOS)
219 return static_cast<uint32_t>(xTaskGetTickCount());
220#else
221 return static_cast<uint32_t>(
222 std::chrono::duration_cast<std::chrono::milliseconds>(
223 std::chrono::steady_clock::now().time_since_epoch()
224 ).count()
225 );
226#endif
227 }
228
229 template <typename Rep, typename Period>
230 [[nodiscard]] static time_point add(time_point tp, const std::chrono::duration<Rep, Period>& d) noexcept
231 {
232 return tp + static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::milliseconds>(d).count());
233 }
234
235 [[nodiscard]] static time_point add(time_point tp, duration delta) noexcept
236 {
237 return tp + delta;
238 }
239
240 [[nodiscard]] static bool isDue(time_point now, time_point expiry) noexcept
241 {
242 return now >= expiry;
243 }
244};
245
246} // namespace corium
Default host clock policy using std::chrono::steady_clock.
Definition ClockPolicies.hpp:44
std::chrono::microseconds duration
Definition ClockPolicies.hpp:47
static bool isDue(time_point now, time_point expiry) noexcept
Definition ClockPolicies.hpp:60
static time_point now() noexcept
Definition ClockPolicies.hpp:49
std::chrono::steady_clock::time_point time_point
Definition ClockPolicies.hpp:46
static time_point add(time_point tp, const std::chrono::duration< Rep, Period > &d) noexcept
Definition ClockPolicies.hpp:55
Native ESP32 Hardware Timer clock policy using esp_timer_get_time() (64-bit microsecond counter).
Definition ClockPolicies.hpp:174
uint64_t time_point
Definition ClockPolicies.hpp:176
uint64_t duration
Definition ClockPolicies.hpp:177
static time_point now() noexcept
Definition ClockPolicies.hpp:179
static bool isDue(time_point now, time_point expiry) noexcept
Definition ClockPolicies.hpp:204
static time_point add(time_point tp, const std::chrono::duration< Rep, Period > &d) noexcept
Definition ClockPolicies.hpp:194
static time_point add(time_point tp, duration delta) noexcept
Definition ClockPolicies.hpp:199
FreeRTOS RTOS Tick clock policy using xTaskGetTickCount().
Definition ClockPolicies.hpp:211
static time_point now() noexcept
Definition ClockPolicies.hpp:216
static bool isDue(time_point now, time_point expiry) noexcept
Definition ClockPolicies.hpp:240
static time_point add(time_point tp, duration delta) noexcept
Definition ClockPolicies.hpp:235
static time_point add(time_point tp, const std::chrono::duration< Rep, Period > &d) noexcept
Definition ClockPolicies.hpp:230
uint32_t duration
Definition ClockPolicies.hpp:214
uint32_t time_point
Definition ClockPolicies.hpp:213
Deterministic, manually-advanced clock policy for unit tests and simulation.
Definition ClockPolicies.hpp:68
static time_point add(time_point tp, const std::chrono::duration< Rep, Period > &d) noexcept
Definition ClockPolicies.hpp:94
uint64_t duration
Definition ClockPolicies.hpp:71
static void reset() noexcept
Definition ClockPolicies.hpp:88
static void set(time_point t) noexcept
Definition ClockPolicies.hpp:78
uint64_t time_point
Definition ClockPolicies.hpp:70
static bool isDue(time_point now, time_point expiry) noexcept
Definition ClockPolicies.hpp:104
static void advance(duration delta) noexcept
Definition ClockPolicies.hpp:83
static time_point add(time_point tp, duration delta) noexcept
Definition ClockPolicies.hpp:99
static time_point now() noexcept
Definition ClockPolicies.hpp:73
Clock policy driven by a custom microsecond tick provider.
Definition ClockPolicies.hpp:116
static time_point add(time_point tp, const std::chrono::duration< Rep, Period > &d) noexcept
Definition ClockPolicies.hpp:127
static time_point add(time_point tp, duration delta) noexcept
Definition ClockPolicies.hpp:132
uint64_t duration
Definition ClockPolicies.hpp:119
static time_point now() noexcept
Definition ClockPolicies.hpp:121
uint64_t time_point
Definition ClockPolicies.hpp:118
static bool isDue(time_point now, time_point expiry) noexcept
Definition ClockPolicies.hpp:137
Clock policy driven by a custom millisecond tick provider (e.g. millis(), HAL_GetTick()).
Definition ClockPolicies.hpp:146
static time_point add(time_point tp, const std::chrono::duration< Rep, Period > &d) noexcept
Definition ClockPolicies.hpp:157
static time_point now() noexcept
Definition ClockPolicies.hpp:151
static time_point add(time_point tp, duration delta) noexcept
Definition ClockPolicies.hpp:162
uint32_t duration
Definition ClockPolicies.hpp:149
static bool isDue(time_point now, time_point expiry) noexcept
Definition ClockPolicies.hpp:167
uint32_t time_point
Definition ClockPolicies.hpp:148
Definition Application.hpp:16
Definition ClockPolicies.hpp:31