34 size_t MaxTimers = 64,
41 using duration =
typename ClockPolicy::duration;
55 return a.expiryTime > b.expiryTime;
62 template <
typename Rep,
typename Period>
66 time_point expiry = ClockPolicy::add(now, delay);
68 return allocateTimer(std::move(event), expiry, zeroInterval, priority,
false);
73 requires (!std::is_same_v<duration, std::chrono::microseconds> && !std::is_same_v<duration, std::chrono::milliseconds>)
76 time_point expiry = ClockPolicy::add(now, delay);
78 return allocateTimer(std::move(event), expiry, zeroInterval, priority,
false);
82 template <
typename Rep,
typename Period>
86 time_point expiry = ClockPolicy::add(now, interval);
87 if constexpr (std::is_same_v<duration, std::chrono::microseconds>) {
88 return allocateTimer(std::move(event), expiry, std::chrono::duration_cast<std::chrono::microseconds>(interval), priority,
true);
89 }
else if constexpr (std::is_same_v<duration, std::chrono::milliseconds>) {
90 return allocateTimer(std::move(event), expiry, std::chrono::duration_cast<std::chrono::milliseconds>(interval), priority,
true);
92 auto nativeInterval =
static_cast<duration>(std::chrono::duration_cast<std::chrono::microseconds>(interval).count());
93 return allocateTimer(std::move(event), expiry, nativeInterval, priority,
true);
99 requires (!std::is_same_v<duration, std::chrono::microseconds> && !std::is_same_v<duration, std::chrono::milliseconds>)
102 time_point expiry = ClockPolicy::add(now, interval);
103 return allocateTimer(std::move(event), expiry, interval, priority,
true);
115 auto* data = _heap.data();
116 const std::size_t n = _heap.size();
117 for (std::size_t i = 0; i < n; ++i) {
118 if (data[i].active && data[i].
id ==
id) {
119 data[i].active =
false;
121 if (_activeCount > 0) {
136 template <
typename EventSink>
139 if (_activeCount == 0 || _heap.empty()) {
143 std::size_t posted = 0;
145 while (!_heap.empty()) {
146 auto& top = _heap.top();
155 if (!ClockPolicy::isDue(now, top.expiryTime)) {
167 while (ClockPolicy::isDue(now, entry.
expiryTime)) {
170 _heap.push(std::move(entry));
172 if (_activeCount > 0) {
188 [[nodiscard]]
constexpr size_t capacity() const noexcept
196 if (_activeCount >= MaxTimers || _heap.full()) {
207 .event = std::move(event),
208 .expiryTime = expiryTime,
209 .interval = interval,
210 .priority = priority,
211 .isPeriodic = isPeriodic,
215 if (_heap.push(std::move(entry))) {
223 internal::StaticMinHeap<TimerEntry, MaxTimers, TimerComparator> _heap{};
224 size_t _activeCount = 0;
Hardware and simulated clock policies (Chrono, Manual, Tick, EspTimer, FreeRTOS).
Standard lifecycle events (QuitEvent, ErrorEvent, TimerEvent).
Bounded and multi-tier priority MPSC queueing policies.
Fixed-capacity zero-heap binary min-heap for deterministic priority queues and timers.
void post(EventVariant &&event, EventPriority priority=EventPriority::Normal) const
Post an event into the event sink with priority (rvalue overload).
Definition EventSink.hpp:44
Default host clock policy using std::chrono::steady_clock.
Definition ClockPolicies.hpp:44
Zero-heap Min-Heap Timer Scheduler for delayed and periodic events. Provides O(1) earliest-due timer ...
Definition TimerScheduler.hpp:37
TimerId scheduleDelayed(EventVariant event, const std::chrono::duration< Rep, Period > &delay, EventPriority priority=EventPriority::Normal)
Schedule a single-shot delayed event with std::chrono duration.
Definition TimerScheduler.hpp:63
ClockPolicy Clock
Definition TimerScheduler.hpp:39
bool cancelTimer(TimerId id) noexcept
Cancel an active timer by its TimerId handle.
Definition TimerScheduler.hpp:109
typename ClockPolicy::time_point time_point
Definition TimerScheduler.hpp:40
size_t activeCount() const noexcept
Get current number of active timers.
Definition TimerScheduler.hpp:182
constexpr size_t capacity() const noexcept
Get maximum timer capacity.
Definition TimerScheduler.hpp:188
TimerId schedulePeriodic(EventVariant event, const std::chrono::duration< Rep, Period > &interval, EventPriority priority=EventPriority::Normal)
Schedule a recurring periodic event with std::chrono duration.
Definition TimerScheduler.hpp:83
TimerId schedulePeriodic(EventVariant event, duration interval, EventPriority priority=EventPriority::Normal)
Schedule a recurring periodic event with native clock duration.
Definition TimerScheduler.hpp:98
std::size_t processDueTimers(EventSink &sink, time_point now=ClockPolicy::now())
Process all due timers and post their events into target event bus or sink. Uses O(1) early exit when...
Definition TimerScheduler.hpp:137
TimerId scheduleDelayed(EventVariant event, duration delay, EventPriority priority=EventPriority::Normal)
Schedule a single-shot delayed event with native clock duration.
Definition TimerScheduler.hpp:72
typename ClockPolicy::duration duration
Definition TimerScheduler.hpp:41
Definition Application.hpp:16
std::variant< QuitEvent, TickEvent, UpdateEvent, ErrorEvent, SignalEvent > DefaultEvents
Default variant list of core Corium events.
Definition Events.hpp:62
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
uint32_t TimerId
Definition TimerScheduler.hpp:22
constexpr TimerId INVALID_TIMER_ID
Definition TimerScheduler.hpp:23
Definition TimerScheduler.hpp:53
bool operator()(const TimerEntry &a, const TimerEntry &b) const noexcept
Definition TimerScheduler.hpp:54
Definition TimerScheduler.hpp:43
duration interval
Definition TimerScheduler.hpp:47
bool active
Definition TimerScheduler.hpp:50
bool isPeriodic
Definition TimerScheduler.hpp:49
EventVariant event
Definition TimerScheduler.hpp:45
time_point expiryTime
Definition TimerScheduler.hpp:46
EventPriority priority
Definition TimerScheduler.hpp:48