29#ifndef ETL_CALLBACK_TIMER_ATOMIC_INCLUDED
30#define ETL_CALLBACK_TIMER_ATOMIC_INCLUDED
36#include "static_assert.h"
49 template <
typename TSemaphore>
65 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
67 bool is_space = (number_of_registered_timers < Max_Timers);
76 if (
timer.
id == etl::timer::id::NO_TIMER)
80 ++number_of_registered_timers;
97 if (
id_ != etl::timer::id::NO_TIMER)
101 if (
timer.
id != etl::timer::id::NO_TIMER)
103 if (
timer.is_active())
106 active_list.remove(
timer.
id,
false);
107 remove_callback.call_if(
timer.
id);
113 --number_of_registered_timers;
147 for (
uint8_t i = 0
U; i < Max_Timers; ++i)
152 number_of_registered_timers = 0;
165 if (process_semaphore == 0
U)
172 while (
has_active && (count >= active_list.front().delta))
174 timer_data&
timer = active_list.front();
176 count -=
timer.delta;
178 active_list.remove(
timer.
id,
true);
179 remove_callback.call_if(
timer.
id);
181 if (
timer.callback.is_valid())
190 timer.delta = timer.period;
191 active_list.insert(timer.id);
192 insert_callback.call_if(timer.id);
201 active_list.front().delta -= count;
220 if (
id_ != etl::timer::id::NO_TIMER)
225 if (
timer.
id != etl::timer::id::NO_TIMER)
228 if (
timer.period != etl::timer::state::Inactive)
231 if (
timer.is_active())
233 active_list.remove(
timer.
id,
false);
234 remove_callback.call_if(
timer.
id);
239 insert_callback.call_if(
timer.
id);
258 if (
id_ != etl::timer::id::NO_TIMER)
263 if (
timer.
id != etl::timer::id::NO_TIMER)
265 if (
timer.is_active())
268 active_list.remove(
timer.
id,
false);
269 remove_callback.call_if(
timer.
id);
314 bool result = !active_list.empty();
326 uint32_t delta =
static_cast<uint32_t>(etl::timer::interval::No_Active_Interval);
329 if (!active_list.empty())
331 delta = active_list.front().delta;
347 if (is_valid_timer_id(
id_))
355 if (
timer.
id != etl::timer::id::NO_TIMER)
357 result =
timer.is_active();
383 void clear_insert_callback()
385 insert_callback.clear();
389 void clear_remove_callback()
391 remove_callback.clear();
404 , delta(etl::timer::state::Inactive)
405 , id(etl::timer::id::NO_TIMER)
406 , previous(etl::timer::id::NO_TIMER)
407 , next(etl::timer::id::NO_TIMER)
421 , delta(
etl::
timer::state::Inactive)
423 , previous(
etl::
timer::id::NO_TIMER)
434 return delta != etl::timer::state::Inactive;
442 delta = etl::timer::state::Inactive;
448 etl::timer::id::type id;
467 , process_semaphore(0
U)
468 , number_of_registered_timers(0
U)
478 bool is_valid_timer_id(etl::timer::id::type
id_)
const
480 return (
id_ < Max_Timers);
492 : head(
etl::timer::id::NO_TIMER)
493 , tail(
etl::timer::id::NO_TIMER)
494 , current(
etl::timer::id::NO_TIMER)
502 return head == etl::timer::id::NO_TIMER;
508 void insert(etl::timer::id::type
id_)
510 timer_data& timer = ptimers[
id_];
512 if (head == etl::timer::id::NO_TIMER)
517 timer.previous = etl::timer::id::NO_TIMER;
518 timer.next = etl::timer::id::NO_TIMER;
525 while (
test_id != etl::timer::id::NO_TIMER)
527 timer_data& test = ptimers[
test_id];
530 if (timer.delta <= test.delta)
538 timer.previous = test.previous;
539 test.previous = timer.id;
540 timer.next = test.id;
543 test.delta -= timer.delta;
545 if (timer.previous != etl::timer::id::NO_TIMER)
547 ptimers[timer.previous].next = timer.id;
553 timer.delta -= test.delta;
560 if (
test_id == etl::timer::id::NO_TIMER)
563 ptimers[tail].next = timer.id;
564 timer.previous = tail;
565 timer.next = etl::timer::id::NO_TIMER;
574 timer_data& timer = ptimers[
id_];
582 ptimers[timer.previous].next = timer.next;
587 tail = timer.previous;
591 ptimers[timer.next].previous = timer.previous;
597 if (timer.next != etl::timer::id::NO_TIMER)
599 ptimers[timer.next].delta += timer.delta;
603 timer.previous = etl::timer::id::NO_TIMER;
604 timer.next = etl::timer::id::NO_TIMER;
605 timer.delta = etl::timer::state::Inactive;
611 return ptimers[head];
615 const timer_data& front()
const
617 return ptimers[head];
621 etl::timer::id::type
begin()
628 etl::timer::id::type previous(etl::timer::id::type last)
630 current = ptimers[last].previous;
635 etl::timer::id::type next(etl::timer::id::type last)
637 current = ptimers[last].next;
644 etl::timer::id::type
id =
begin();
646 while (
id != etl::timer::id::NO_TIMER)
648 timer_data& timer = ptimers[id];
650 timer.next = etl::timer::id::NO_TIMER;
653 head = etl::timer::id::NO_TIMER;
654 tail = etl::timer::id::NO_TIMER;
655 current = etl::timer::id::NO_TIMER;
660 etl::timer::id::type head;
661 etl::timer::id::type tail;
662 etl::timer::id::type current;
664 timer_data*
const ptimers;
668 timer_data*
const timer_array;
671 timer_list active_list;
677 event_callback_type insert_callback;
678 event_callback_type remove_callback;
688 template <u
int_least8_t Max_Timers_,
typename TSemaphore>
693 ETL_STATIC_ASSERT(
Max_Timers_ <= 254U,
"No more than 254 timers are allowed");
The callback timer.
Definition callback_timer_atomic.h:690
callback_timer_atomic()
Constructor.
Definition callback_timer_atomic.h:698
Declaration.
Definition delegate_cpp03.h:191
Interface for callback timer.
Definition callback_timer_atomic.h:51
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition callback_timer_atomic.h:297
etl::timer::id::type register_timer(callback_type callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition callback_timer_atomic.h:61
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition callback_timer_atomic.h:369
bool is_active(etl::timer::id::type id_) const
Definition callback_timer_atomic.h:342
bool is_running() const
Get the enable/disable state.
Definition callback_timer_atomic.h:133
uint32_t time_to_next() const
Definition callback_timer_atomic.h:324
icallback_timer_atomic(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition callback_timer_atomic.h:463
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_atomic.h:253
bool has_active_timer() const
Check if there is an active timer.
Definition callback_timer_atomic.h:311
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition callback_timer_atomic.h:215
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition callback_timer_atomic.h:93
void enable(bool state_)
Enable/disable the timer.
Definition callback_timer_atomic.h:125
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition callback_timer_atomic.h:283
void clear()
Clears the timer of data.
Definition callback_timer_atomic.h:141
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition callback_timer_atomic.h:377
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition algorithm.h:2300
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:315
The configuration of a timer.
Definition callback_timer_atomic.h:399
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_atomic.h:415
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_atomic.h:432
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_atomic.h:440
Common definitions for the timer framework.
Definition timer.h:55