FastLED 3.10.8
Loading...
Searching...
No Matches
chrono.h
Go to the documentation of this file.
1#pragma once
2
9
10#include "fl/stl/int.h"
11#include "fl/stl/ratio.h"
12
13#ifdef FASTLED_TESTING
14#define FL_CHRONO_HAS_TEST_TIME_PROVIDER 1
15#include "fl/stl/function.h"
16#include "fl/stl/noexcept.h"
17#else
18#define FL_CHRONO_HAS_TEST_TIME_PROVIDER 0
19#endif
20
21namespace fl {
22namespace chrono {
23
38template<typename Rep, typename Period = fl::ratio<1>>
39class duration {
40public:
41 using rep = Rep;
42 using period = Period;
43
45 constexpr duration() FL_NO_EXCEPT : mCount(0) {}
46
49 constexpr explicit duration(const Rep& count) FL_NO_EXCEPT : mCount(count) {}
50
54 template<typename Rep2, typename Period2>
57
60 constexpr Rep count() const FL_NO_EXCEPT { return mCount; }
61
62private:
63 Rep mCount;
64
66 template<typename ToRep, typename ToPeriod, typename FromRep, typename FromPeriod>
67 static constexpr ToRep duration_cast_impl(FromRep count) FL_NO_EXCEPT {
68 // Convert from source period to destination period
69 // target_count = source_count * (FromPeriod / ToPeriod)
70 // Using: target = source * FromPeriod::num * ToPeriod::den / (FromPeriod::den * ToPeriod::num)
72 return static_cast<ToRep>(
73 static_cast<FromRep>(count) * static_cast<FromRep>(ratio::num) / static_cast<FromRep>(ratio::den)
74 );
75 }
76};
77
91template<typename ToDuration, typename Rep, typename Period>
92constexpr ToDuration duration_cast(const duration<Rep, Period>& d) FL_NO_EXCEPT {
93 return ToDuration(d);
94}
95
96// Common duration type aliases using standard SI ratios
97// These are compatible with std::chrono duration types
98
101
104
107
110
113
116
125template<typename Clock, typename Duration = typename Clock::duration>
127public:
128 using clock = Clock;
129 using duration = Duration;
130 using rep = typename Duration::rep;
131 using period = typename Duration::period;
132
135
137 constexpr explicit time_point(const Duration& d) FL_NO_EXCEPT : mDuration(d) {}
138
140 constexpr Duration time_since_epoch() const FL_NO_EXCEPT { return mDuration; }
141
142 // Comparison operators
143 constexpr bool operator<=(const time_point& rhs) const FL_NO_EXCEPT {
144 return mDuration.count() <= rhs.mDuration.count();
145 }
146 constexpr bool operator<(const time_point& rhs) const FL_NO_EXCEPT {
147 return mDuration.count() < rhs.mDuration.count();
148 }
149 constexpr bool operator>=(const time_point& rhs) const FL_NO_EXCEPT {
150 return mDuration.count() >= rhs.mDuration.count();
151 }
152 constexpr bool operator>(const time_point& rhs) const FL_NO_EXCEPT {
153 return mDuration.count() > rhs.mDuration.count();
154 }
155 constexpr bool operator==(const time_point& rhs) const FL_NO_EXCEPT {
156 return mDuration.count() == rhs.mDuration.count();
157 }
158 constexpr bool operator!=(const time_point& rhs) const FL_NO_EXCEPT {
159 return mDuration.count() != rhs.mDuration.count();
160 }
161
163 constexpr Duration operator-(const time_point& rhs) const FL_NO_EXCEPT {
164 return Duration(mDuration.count() - rhs.mDuration.count());
165 }
166
168 constexpr time_point operator+(const Duration& d) const FL_NO_EXCEPT {
169 return time_point(Duration(mDuration.count() + d.count()));
170 }
171
173 constexpr time_point operator-(const Duration& d) const FL_NO_EXCEPT {
174 return time_point(Duration(mDuration.count() - d.count()));
175 }
176
177private:
178 Duration mDuration;
179};
180
181// Forward declarations for clock types (now() is implemented in chrono.cpp.hpp)
182struct steady_clock; // IWYU pragma: keep
183struct system_clock; // IWYU pragma: keep
184
199
215
216} // namespace chrono
217
219
262fl::u32 millis() FL_NO_EXCEPT;
263
298fl::u32 micros() FL_NO_EXCEPT;
299
305
337
347 return fl::millis64();
348}
349
350#ifdef FASTLED_TESTING
351
353using time_provider_t = fl::function<fl::u32()>;
354
377void inject_time_provider(const time_provider_t& provider) FL_NO_EXCEPT;
378
387void clear_time_provider() FL_NO_EXCEPT;
388
390void micros64_reset() FL_NO_EXCEPT;
391
401
423class MockTimeProvider {
424public:
427 explicit MockTimeProvider(fl::u32 initial_time = 0) FL_NO_EXCEPT;
428
431 void advance(fl::u32 milliseconds) FL_NO_EXCEPT;
432
435 void set_time(fl::u32 milliseconds) FL_NO_EXCEPT;
436
439 fl::u32 current_time() const FL_NO_EXCEPT;
440
443 fl::u32 operator()() const FL_NO_EXCEPT;
444
445private:
446 fl::u32 mCurrentTime;
447};
448
449#endif // FASTLED_TESTING
450
451} // namespace fl
constexpr duration() FL_NO_EXCEPT
Default constructor - zero duration.
Definition chrono.h:45
static constexpr ToRep duration_cast_impl(FromRep count) FL_NO_EXCEPT
Definition chrono.h:67
constexpr fl::i64 count() const FL_NO_EXCEPT
Definition chrono.h:60
constexpr duration(const Rep &count) FL_NO_EXCEPT
Explicit constructor from tick count.
Definition chrono.h:49
constexpr duration(const duration< Rep2, Period2 > &d) FL_NO_EXCEPT
Implicit conversion constructor from compatible duration types.
Definition chrono.h:55
Represents a time duration.
Definition chrono.h:39
constexpr bool operator>(const time_point &rhs) const FL_NO_EXCEPT
Definition chrono.h:152
constexpr bool operator>=(const time_point &rhs) const FL_NO_EXCEPT
Definition chrono.h:149
constexpr bool operator!=(const time_point &rhs) const FL_NO_EXCEPT
Definition chrono.h:158
constexpr time_point(const Duration &d) FL_NO_EXCEPT
Construct from a duration since epoch.
Definition chrono.h:137
constexpr Duration operator-(const time_point &rhs) const FL_NO_EXCEPT
Subtract two time_points to get a duration.
Definition chrono.h:163
constexpr time_point operator-(const Duration &d) const FL_NO_EXCEPT
Subtract a duration from a time_point.
Definition chrono.h:173
typename Duration::rep rep
Definition chrono.h:130
constexpr bool operator<=(const time_point &rhs) const FL_NO_EXCEPT
Definition chrono.h:143
constexpr time_point() FL_NO_EXCEPT
Default constructor - epoch time point.
Definition chrono.h:134
constexpr time_point operator+(const Duration &d) const FL_NO_EXCEPT
Add a duration to a time_point.
Definition chrono.h:168
typename steady_clock::duration mDuration
Definition chrono.h:178
constexpr bool operator==(const time_point &rhs) const FL_NO_EXCEPT
Definition chrono.h:155
constexpr bool operator<(const time_point &rhs) const FL_NO_EXCEPT
Definition chrono.h:146
constexpr Duration time_since_epoch() const FL_NO_EXCEPT
Get the duration since epoch.
Definition chrono.h:140
typename Duration::period period
Definition chrono.h:131
Represents a point in time relative to a clock.
Definition chrono.h:126
@ Clock
System Real Time - Timing Clock.
Definition midi_Defs.h:113
duration< fl::i64, fl::nano > nanoseconds
Nanoseconds - duration with period of 1/1,000,000,000 seconds.
Definition chrono.h:100
duration< fl::i64, fl::micro > microseconds
Microseconds - duration with period of 1/1,000,000 seconds.
Definition chrono.h:103
duration< fl::i32, fl::ratio< 3600 > > hours
Hours - duration with period of 3600 seconds.
Definition chrono.h:115
constexpr ToDuration duration_cast(const duration< Rep, Period > &d) FL_NO_EXCEPT
Cast one duration type to another.
Definition chrono.h:92
duration< fl::i64 > seconds
Seconds - duration with period of 1 second.
Definition chrono.h:109
duration< fl::i32, fl::ratio< 60 > > minutes
Minutes - duration with period of 60 seconds.
Definition chrono.h:112
duration< fl::i64, fl::milli > milliseconds
Milliseconds - duration with period of 1/1,000 seconds.
Definition chrono.h:106
void millis64_reset() FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
fl::u32 millis() FL_NO_EXCEPT
Universal millisecond timer - returns milliseconds since system startup.
fl::u64 time() FL_NO_EXCEPT
Alias for millis64() - returns 64-bit millisecond time.
Definition chrono.h:346
fl::u32 micros() FL_NO_EXCEPT
Universal microsecond timer - returns microseconds since system startup.
fl::u64 millis64() FL_NO_EXCEPT
64-bit millisecond timer - returns milliseconds since system startup without wraparound
ratio< R1::num *R2::den, R1::den *R2::num > ratio_divide
Divide two ratios at compile time.
Definition ratio.h:34
fl::u64 micros64() FL_NO_EXCEPT
64-bit monotonic microsecond timer.
Base definition for an LED controller.
Definition crgb.hpp:179
FastLED ratio implementation - compile-time rational arithmetic.
#define FL_NO_EXCEPT
fl::u64 u64
Definition stdint.h:220
static time_point now() FL_NO_EXCEPT
Returns the current time point.
microseconds duration
Definition chrono.h:190
duration::period period
Definition chrono.h:192
duration::rep rep
Definition chrono.h:191
static constexpr bool is_steady
Definition chrono.h:194
fl::chrono::time_point< steady_clock > time_point
Definition chrono.h:193
Monotonic clock that never goes backwards.
Definition chrono.h:189
microseconds duration
Definition chrono.h:206
static constexpr bool is_steady
Definition chrono.h:210
fl::chrono::time_point< system_clock > time_point
Definition chrono.h:209
duration::rep rep
Definition chrono.h:207
duration::period period
Definition chrono.h:208
Wall clock (may not be monotonic)
Definition chrono.h:205
static constexpr fl::i64 den
Definition ratio.h:25
static constexpr fl::i64 num
Definition ratio.h:24
Compile-time rational arithmetic.
Definition ratio.h:21