FastLED 3.9.15
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#include "fl/stl/function.h"
15#include "fl/stl/noexcept.h"
16#endif
17
18namespace fl {
19namespace chrono {
20
35template<typename Rep, typename Period = fl::ratio<1>>
36class duration {
37public:
38 using rep = Rep;
39 using period = Period;
40
42 constexpr duration() FL_NOEXCEPT : mCount(0) {}
43
46 constexpr explicit duration(const Rep& count) FL_NOEXCEPT : mCount(count) {}
47
51 template<typename Rep2, typename Period2>
54
57 constexpr Rep count() const FL_NOEXCEPT { return mCount; }
58
59private:
60 Rep mCount;
61
63 template<typename ToRep, typename ToPeriod, typename FromRep, typename FromPeriod>
64 static constexpr ToRep duration_cast_impl(FromRep count) FL_NOEXCEPT {
65 // Convert from source period to destination period
66 // target_count = source_count * (FromPeriod / ToPeriod)
67 // Using: target = source * FromPeriod::num * ToPeriod::den / (FromPeriod::den * ToPeriod::num)
69 return static_cast<ToRep>(
70 static_cast<FromRep>(count) * static_cast<FromRep>(ratio::num) / static_cast<FromRep>(ratio::den)
71 );
72 }
73};
74
88template<typename ToDuration, typename Rep, typename Period>
89constexpr ToDuration duration_cast(const duration<Rep, Period>& d) FL_NOEXCEPT {
90 return ToDuration(d);
91}
92
93// Common duration type aliases using standard SI ratios
94// These are compatible with std::chrono duration types
95
98
101
104
107
110
113
122template<typename Clock, typename Duration = typename Clock::duration>
124public:
125 using clock = Clock;
126 using duration = Duration;
127 using rep = typename Duration::rep;
128 using period = typename Duration::period;
129
132
134 constexpr explicit time_point(const Duration& d) FL_NOEXCEPT : mDuration(d) {}
135
137 constexpr Duration time_since_epoch() const FL_NOEXCEPT { return mDuration; }
138
139 // Comparison operators
140 constexpr bool operator<=(const time_point& rhs) const FL_NOEXCEPT {
141 return mDuration.count() <= rhs.mDuration.count();
142 }
143 constexpr bool operator<(const time_point& rhs) const FL_NOEXCEPT {
144 return mDuration.count() < rhs.mDuration.count();
145 }
146 constexpr bool operator>=(const time_point& rhs) const FL_NOEXCEPT {
147 return mDuration.count() >= rhs.mDuration.count();
148 }
149 constexpr bool operator>(const time_point& rhs) const FL_NOEXCEPT {
150 return mDuration.count() > rhs.mDuration.count();
151 }
152 constexpr bool operator==(const time_point& rhs) const FL_NOEXCEPT {
153 return mDuration.count() == rhs.mDuration.count();
154 }
155 constexpr bool operator!=(const time_point& rhs) const FL_NOEXCEPT {
156 return mDuration.count() != rhs.mDuration.count();
157 }
158
160 constexpr Duration operator-(const time_point& rhs) const FL_NOEXCEPT {
161 return Duration(mDuration.count() - rhs.mDuration.count());
162 }
163
165 constexpr time_point operator+(const Duration& d) const FL_NOEXCEPT {
166 return time_point(Duration(mDuration.count() + d.count()));
167 }
168
170 constexpr time_point operator-(const Duration& d) const FL_NOEXCEPT {
171 return time_point(Duration(mDuration.count() - d.count()));
172 }
173
174private:
175 Duration mDuration;
176};
177
178// Forward declarations for clock types (now() implemented after fl::micros() declaration)
179struct steady_clock; // IWYU pragma: keep
180struct system_clock; // IWYU pragma: keep
181
196
212
213} // namespace chrono
214
216
259fl::u32 millis() FL_NOEXCEPT;
260
295fl::u32 micros() FL_NOEXCEPT;
296
297// Now that fl::micros() is declared, implement clock::now() methods
301
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_NOEXCEPT;
378
387void clear_time_provider() FL_NOEXCEPT;
388
398
420class MockTimeProvider {
421public:
424 explicit MockTimeProvider(fl::u32 initial_time = 0) FL_NOEXCEPT;
425
428 void advance(fl::u32 milliseconds) FL_NOEXCEPT;
429
432 void set_time(fl::u32 milliseconds) FL_NOEXCEPT;
433
436 fl::u32 current_time() const FL_NOEXCEPT;
437
440 fl::u32 operator()() const FL_NOEXCEPT;
441
442private:
443 fl::u32 mCurrentTime;
444};
445
446#endif // FASTLED_TESTING
447
448} // namespace fl
static constexpr ToRep duration_cast_impl(FromRep count) FL_NOEXCEPT
Definition chrono.h:64
constexpr duration(const duration< Rep2, Period2 > &d) FL_NOEXCEPT
Implicit conversion constructor from compatible duration types.
Definition chrono.h:52
constexpr duration(const Rep &count) FL_NOEXCEPT
Explicit constructor from tick count.
Definition chrono.h:46
constexpr duration() FL_NOEXCEPT
Default constructor - zero duration.
Definition chrono.h:42
constexpr fl::i64 count() const FL_NOEXCEPT
Definition chrono.h:57
Represents a time duration.
Definition chrono.h:36
constexpr bool operator>=(const time_point &rhs) const FL_NOEXCEPT
Definition chrono.h:146
constexpr bool operator==(const time_point &rhs) const FL_NOEXCEPT
Definition chrono.h:152
constexpr bool operator<(const time_point &rhs) const FL_NOEXCEPT
Definition chrono.h:143
constexpr bool operator>(const time_point &rhs) const FL_NOEXCEPT
Definition chrono.h:149
constexpr time_point(const Duration &d) FL_NOEXCEPT
Construct from a duration since epoch.
Definition chrono.h:134
constexpr time_point operator-(const Duration &d) const FL_NOEXCEPT
Subtract a duration from a time_point.
Definition chrono.h:170
typename Duration::rep rep
Definition chrono.h:127
constexpr bool operator!=(const time_point &rhs) const FL_NOEXCEPT
Definition chrono.h:155
constexpr Duration operator-(const time_point &rhs) const FL_NOEXCEPT
Subtract two time_points to get a duration.
Definition chrono.h:160
typename steady_clock::duration mDuration
Definition chrono.h:175
constexpr Duration time_since_epoch() const FL_NOEXCEPT
Get the duration since epoch.
Definition chrono.h:137
constexpr time_point() FL_NOEXCEPT
Default constructor - epoch time point.
Definition chrono.h:131
constexpr bool operator<=(const time_point &rhs) const FL_NOEXCEPT
Definition chrono.h:140
constexpr time_point operator+(const Duration &d) const FL_NOEXCEPT
Add a duration to a time_point.
Definition chrono.h:165
typename Duration::period period
Definition chrono.h:128
Represents a point in time relative to a clock.
Definition chrono.h:123
@ 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:97
duration< fl::i64, fl::micro > microseconds
Microseconds - duration with period of 1/1,000,000 seconds.
Definition chrono.h:100
constexpr ToDuration duration_cast(const duration< Rep, Period > &d) FL_NOEXCEPT
Cast one duration type to another.
Definition chrono.h:89
duration< fl::i32, fl::ratio< 3600 > > hours
Hours - duration with period of 3600 seconds.
Definition chrono.h:112
duration< fl::i64 > seconds
Seconds - duration with period of 1 second.
Definition chrono.h:106
duration< fl::i32, fl::ratio< 60 > > minutes
Minutes - duration with period of 60 seconds.
Definition chrono.h:109
duration< fl::i64, fl::milli > milliseconds
Milliseconds - duration with period of 1/1,000 seconds.
Definition chrono.h:103
fl::u64 time() FL_NOEXCEPT
Alias for millis64() - returns 64-bit millisecond time.
Definition chrono.h:346
void millis64_reset()
fl::u32 millis()
Universal millisecond timer - returns milliseconds since system startup.
fl::i64 i64
Definition s16x16x4.h:222
fl::u32 micros()
Universal microsecond timer - returns microseconds since system startup.
ratio< R1::num *R2::den, R1::den *R2::num > ratio_divide
Divide two ratios at compile time.
Definition ratio.h:34
fl::u64 millis64()
64-bit millisecond timer - returns milliseconds since system startup without wraparound
fl::u64 u64
Definition s16x16x4.h:221
Base definition for an LED controller.
Definition crgb.hpp:179
FastLED ratio implementation - compile-time rational arithmetic.
#define FL_NOEXCEPT
microseconds duration
Definition chrono.h:187
duration::period period
Definition chrono.h:189
duration::rep rep
Definition chrono.h:188
static time_point now() FL_NOEXCEPT
Returns the current time point (implemented after fl::micros() declaration)
Definition chrono.h:298
static constexpr bool is_steady
Definition chrono.h:191
fl::chrono::time_point< steady_clock > time_point
Definition chrono.h:190
Monotonic clock that never goes backwards.
Definition chrono.h:186
static time_point now() FL_NOEXCEPT
Returns the current time point (implemented after fl::micros() declaration)
Definition chrono.h:302
microseconds duration
Definition chrono.h:203
static constexpr bool is_steady
Definition chrono.h:207
fl::chrono::time_point< system_clock > time_point
Definition chrono.h:206
duration::rep rep
Definition chrono.h:204
duration::period period
Definition chrono.h:205
Wall clock (may not be monotonic)
Definition chrono.h:202
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