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);
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 = 0
U; i < MAX_TIMERS; ++i)
149 number_of_registered_timers = 0;
162 if (process_semaphore == 0
U)
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);
196 active_list.front().delta -= count;
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);
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);
306 bool result = !active_list.empty();
318 uint32_t delta =
static_cast<uint32_t>(etl::timer::interval::No_Active_Interval);
321 if (!active_list.empty())
323 delta = active_list.front().delta;
339 if (is_valid_timer_id(
id_))
347 if (
timer.
id != etl::timer::id::NO_TIMER)
349 result =
timer.is_active();
368 , delta(etl::timer::state::Inactive)
369 , id(etl::timer::id::NO_TIMER)
370 , previous(etl::timer::id::NO_TIMER)
371 , next(etl::timer::id::NO_TIMER)
385 , delta(
etl::
timer::state::Inactive)
387 , previous(
etl::
timer::id::NO_TIMER)
398 return delta != etl::timer::state::Inactive;
406 delta = etl::timer::state::Inactive;
412 etl::timer::id::type id;
431 , process_semaphore(0
U)
432 , number_of_registered_timers(0
U)
442 bool is_valid_timer_id(etl::timer::id::type
id_)
const
444 return (
id_ < MAX_TIMERS);
456 : head(
etl::timer::id::NO_TIMER)
457 , tail(
etl::timer::id::NO_TIMER)
458 , current(
etl::timer::id::NO_TIMER)
466 return head == etl::timer::id::NO_TIMER;
472 void insert(etl::timer::id::type
id_)
474 timer_data& timer = ptimers[
id_];
476 if (head == etl::timer::id::NO_TIMER)
481 timer.previous = etl::timer::id::NO_TIMER;
482 timer.next = etl::timer::id::NO_TIMER;
489 while (
test_id != etl::timer::id::NO_TIMER)
491 timer_data& test = ptimers[
test_id];
494 if (timer.delta <= test.delta)
502 timer.previous = test.previous;
503 test.previous = timer.id;
504 timer.next = test.id;
507 test.delta -= timer.delta;
509 if (timer.previous != etl::timer::id::NO_TIMER)
511 ptimers[timer.previous].next = timer.id;
517 timer.delta -= test.delta;
524 if (
test_id == etl::timer::id::NO_TIMER)
527 ptimers[tail].next = timer.id;
528 timer.previous = tail;
529 timer.next = etl::timer::id::NO_TIMER;
538 timer_data& timer = ptimers[
id_];
546 ptimers[timer.previous].next = timer.next;
551 tail = timer.previous;
555 ptimers[timer.next].previous = timer.previous;
561 if (timer.next != etl::timer::id::NO_TIMER)
563 ptimers[timer.next].delta += timer.delta;
567 timer.previous = etl::timer::id::NO_TIMER;
568 timer.next = etl::timer::id::NO_TIMER;
569 timer.delta = etl::timer::state::Inactive;
575 return ptimers[head];
579 const timer_data& front()
const
581 return ptimers[head];
585 etl::timer::id::type
begin()
592 etl::timer::id::type previous(etl::timer::id::type last)
594 current = ptimers[last].previous;
599 etl::timer::id::type next(etl::timer::id::type last)
601 current = ptimers[last].next;
608 etl::timer::id::type
id =
begin();
610 while (
id != etl::timer::id::NO_TIMER)
612 timer_data& timer = ptimers[id];
614 timer.next = etl::timer::id::NO_TIMER;
617 head = etl::timer::id::NO_TIMER;
618 tail = etl::timer::id::NO_TIMER;
619 current = etl::timer::id::NO_TIMER;
624 etl::timer::id::type head;
625 etl::timer::id::type tail;
626 etl::timer::id::type current;
628 timer_data*
const ptimers;
632 timer_data*
const timer_array;
635 timer_list active_list;
649 template <u
int_least8_t MAX_TIMERS_,
typename TSemaphore>
654 ETL_STATIC_ASSERT(
MAX_TIMERS_ <= 254U,
"No more than 254 timers are allowed");
The callback timer.
Definition callback_timer_atomic.h:651
callback_timer_atomic()
Constructor.
Definition callback_timer_atomic.h:659
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: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:427
bool is_active(etl::timer::id::type id_) const
Definition callback_timer_atomic.h:334
bool is_running() const
Get the enable/disable state.
Definition callback_timer_atomic.h:130
uint32_t time_to_next() const
Definition callback_timer_atomic.h:316
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_atomic.h:246
bool has_active_timer() const
Check if there is an active timer.
Definition callback_timer_atomic.h:303
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:2300
bitset_ext
Definition absolute.h:38
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:314
The configuration of a timer.
Definition callback_timer_atomic.h:363
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_atomic.h:379
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_atomic.h:396
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_atomic.h:404
Common definitions for the timer framework.
Definition timer.h:55