29#ifndef ETL_CALLBACK_TIMER_ATOMIC_INCLUDED
30#define ETL_CALLBACK_TIMER_ATOMIC_INCLUDED
36#include "static_assert.h"
49 template <
typename TSemaphore>
63 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
65 bool is_space = (number_of_registered_timers < MAX_TIMERS);
70 for (uint_least8_t i = 0U; i < MAX_TIMERS; ++i)
74 if (
timer.
id == etl::timer::id::NO_TIMER)
78 ++number_of_registered_timers;
95 if (id_ != etl::timer::id::NO_TIMER)
99 if (
timer.
id != etl::timer::id::NO_TIMER)
101 if (
timer.is_active())
104 active_list.remove(
timer.
id,
false);
110 --number_of_registered_timers;
144 for (uint8_t i = 0U; i < MAX_TIMERS; ++i)
149 number_of_registered_timers = 0;
158 bool tick(uint32_t count)
162 if (process_semaphore == 0U)
165 bool has_active = !active_list.empty();
169 while (has_active && (count >= active_list.front().delta))
171 timer_data&
timer = active_list.front();
173 count -=
timer.delta;
175 active_list.remove(
timer.
id,
true);
177 if (
timer.callback.is_valid())
186 timer.delta = timer.period;
187 active_list.insert(timer.id);
190 has_active = !active_list.empty();
196 active_list.front().delta -= count;
210 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
215 if (id_ != etl::timer::id::NO_TIMER)
220 if (
timer.
id != etl::timer::id::NO_TIMER)
223 if (
timer.period != etl::timer::state::INACTIVE)
226 if (
timer.is_active())
228 active_list.remove(
timer.
id,
false);
246 bool stop(etl::timer::id::type id_)
251 if (id_ != etl::timer::id::NO_TIMER)
256 if (
timer.
id != etl::timer::id::NO_TIMER)
258 if (
timer.is_active())
261 active_list.remove(
timer.
id,
false);
279 timer_array[id_].period = period_;
289 bool set_mode(etl::timer::id::type id_,
bool repeating_)
293 timer_array[id_].repeating = repeating_;
310 , delta(etl::timer::state::INACTIVE)
311 , id(etl::timer::id::NO_TIMER)
312 , previous(etl::timer::id::NO_TIMER)
313 , next(etl::timer::id::NO_TIMER)
327 , delta(
etl::
timer::state::INACTIVE)
329 , previous(
etl::
timer::id::NO_TIMER)
331 , repeating(repeating_)
340 return delta != etl::timer::state::INACTIVE;
348 delta = etl::timer::state::INACTIVE;
354 etl::timer::id::type id;
355 uint_least8_t previous;
370 : timer_array(timer_array_)
371 , active_list(timer_array_)
373 , process_semaphore(0U)
374 , number_of_registered_timers(0U)
375 , MAX_TIMERS(MAX_TIMERS_)
389 timer_list(timer_data* ptimers_)
400 return head == etl::timer::id::NO_TIMER;
406 void insert(etl::timer::id::type id_)
408 timer_data& timer = ptimers[id_];
410 if (head == etl::timer::id::NO_TIMER)
415 timer.previous = etl::timer::id::NO_TIMER;
416 timer.next = etl::timer::id::NO_TIMER;
421 etl::timer::id::type test_id =
begin();
423 while (test_id != etl::timer::id::NO_TIMER)
425 timer_data& test = ptimers[test_id];
428 if (timer.delta <= test.delta)
436 timer.previous = test.previous;
437 test.previous = timer.id;
438 timer.next = test.id;
441 test.delta -= timer.delta;
443 if (timer.previous != etl::timer::id::NO_TIMER)
445 ptimers[timer.previous].next = timer.id;
451 timer.delta -= test.delta;
454 test_id = next(test_id);
458 if (test_id == etl::timer::id::NO_TIMER)
461 ptimers[tail].next = timer.id;
462 timer.previous = tail;
463 timer.next = etl::timer::id::NO_TIMER;
470 void remove(etl::timer::id::type id_,
bool has_expired)
472 timer_data& timer = ptimers[id_];
480 ptimers[timer.previous].next = timer.next;
485 tail = timer.previous;
489 ptimers[timer.next].previous = timer.previous;
495 if (timer.next != etl::timer::id::NO_TIMER)
497 ptimers[timer.next].delta += timer.delta;
501 timer.previous = etl::timer::id::NO_TIMER;
502 timer.next = etl::timer::id::NO_TIMER;
503 timer.delta = etl::timer::state::INACTIVE;
509 return ptimers[head];
513 etl::timer::id::type
begin()
520 etl::timer::id::type previous(etl::timer::id::type last)
522 current = ptimers[last].previous;
527 etl::timer::id::type next(etl::timer::id::type last)
529 current = ptimers[last].next;
536 etl::timer::id::type
id =
begin();
538 while (
id != etl::timer::id::NO_TIMER)
540 timer_data& timer = ptimers[id];
542 timer.next = etl::timer::id::NO_TIMER;
545 head = etl::timer::id::NO_TIMER;
546 tail = etl::timer::id::NO_TIMER;
547 current = etl::timer::id::NO_TIMER;
552 etl::timer::id::type head;
553 etl::timer::id::type tail;
554 etl::timer::id::type current;
556 timer_data*
const ptimers;
560 timer_data*
const timer_array;
563 timer_list active_list;
566 TSemaphore process_semaphore;
567 uint_least8_t number_of_registered_timers;
571 const uint_least8_t MAX_TIMERS;
577 template <u
int_least8_t MAX_TIMERS_,
typename TSemaphore>
582 ETL_STATIC_ASSERT(MAX_TIMERS_ <= 254U,
"No more than 254 timers are allowed");
The callback timer.
Definition: callback_timer_atomic.h:579
callback_timer_atomic()
Constructor.
Definition: callback_timer_atomic.h:587
Definition: callback.h:45
Declaration.
Definition: delegate_cpp03.h:175
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:289
etl::timer::id::type register_timer(callback_type callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition: callback_timer_atomic.h:59
icallback_timer_atomic(timer_data *const timer_array_, const uint_least8_t MAX_TIMERS_)
Constructor.
Definition: callback_timer_atomic.h:369
bool is_running() const
Get the enable/disable state.
Definition: callback_timer_atomic.h:130
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition: callback_timer_atomic.h:246
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition: callback_timer_atomic.h:210
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition: callback_timer_atomic.h:91
void enable(bool state_)
Enable/disable the timer.
Definition: callback_timer_atomic.h:122
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition: callback_timer_atomic.h:275
void clear()
Clears the timer of data.
Definition: callback_timer_atomic.h:138
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition: algorithm.h:1934
bitset_ext
Definition: absolute.h:38
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition: iterator.h:931
The configuration of a timer.
Definition: callback_timer_atomic.h:305
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition: callback_timer_atomic.h:321
bool is_active() const
Returns true if the timer is active.
Definition: callback_timer_atomic.h:338
void set_inactive()
Sets the timer to the inactive state.
Definition: callback_timer_atomic.h:346
Common definitions for the timer framework.
Definition: timer.h:55