29#ifndef ETL_CALLBACK_TIMER_LOCKED_INCLUDED
30#define ETL_CALLBACK_TIMER_LOCKED_INCLUDED
36#include "static_assert.h"
64 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
66 bool is_space = (number_of_registered_timers < MAX_TIMERS);
75 if (
timer.
id == etl::timer::id::NO_TIMER)
79 ++number_of_registered_timers;
96 if (
id_ != etl::timer::id::NO_TIMER)
100 if (
timer.
id != etl::timer::id::NO_TIMER)
102 if (
timer.is_active())
105 active_list.remove(
timer.
id,
false);
111 --number_of_registered_timers;
145 for (
uint8_t i = 0
U; i < MAX_TIMERS; ++i)
150 number_of_registered_timers = 0;
159 virtual bool tick(
uint32_t count) = 0;
169 if (
id_ != etl::timer::id::NO_TIMER)
174 if (
timer.
id != etl::timer::id::NO_TIMER)
177 if (
timer.period != etl::timer::state::Inactive)
180 if (
timer.is_active())
182 active_list.remove(
timer.
id,
false);
205 if (
id_ != etl::timer::id::NO_TIMER)
210 if (
timer.
id != etl::timer::id::NO_TIMER)
212 if (
timer.is_active())
215 active_list.remove(
timer.
id,
false);
270 bool result = !active_list.empty();
282 uint32_t delta =
static_cast<uint32_t>(etl::timer::interval::No_Active_Interval);
285 if (!active_list.empty())
287 delta = active_list.front().delta;
303 if (is_valid_timer_id(
id_))
311 if (
timer.
id != etl::timer::id::NO_TIMER)
313 result =
timer.is_active();
332 , delta(etl::timer::state::Inactive)
333 , id(etl::timer::id::NO_TIMER)
334 , previous(etl::timer::id::NO_TIMER)
335 , next(etl::timer::id::NO_TIMER)
349 , delta(
etl::
timer::state::Inactive)
351 , previous(
etl::
timer::id::NO_TIMER)
362 return delta != etl::timer::state::Inactive;
370 delta = etl::timer::state::Inactive;
376 etl::timer::id::type id;
395 number_of_registered_timers(0
U),
421 return head == etl::timer::id::NO_TIMER;
427 void insert(etl::timer::id::type
id_)
429 timer_data& timer = ptimers[
id_];
431 if (head == etl::timer::id::NO_TIMER)
436 timer.previous = etl::timer::id::NO_TIMER;
437 timer.next = etl::timer::id::NO_TIMER;
444 while (
test_id != etl::timer::id::NO_TIMER)
446 timer_data& test = ptimers[
test_id];
449 if (timer.delta <= test.delta)
457 timer.previous = test.previous;
458 test.previous = timer.id;
459 timer.next = test.id;
462 test.delta -= timer.delta;
464 if (timer.previous != etl::timer::id::NO_TIMER)
466 ptimers[timer.previous].next = timer.id;
472 timer.delta -= test.delta;
479 if (
test_id == etl::timer::id::NO_TIMER)
482 ptimers[tail].next = timer.id;
483 timer.previous = tail;
484 timer.next = etl::timer::id::NO_TIMER;
493 timer_data& timer = ptimers[
id_];
501 ptimers[timer.previous].next = timer.next;
506 tail = timer.previous;
510 ptimers[timer.next].previous = timer.previous;
516 if (timer.next != etl::timer::id::NO_TIMER)
518 ptimers[timer.next].delta += timer.delta;
522 timer.previous = etl::timer::id::NO_TIMER;
523 timer.next = etl::timer::id::NO_TIMER;
524 timer.delta = etl::timer::state::Inactive;
530 return ptimers[head];
534 const timer_data& front()
const
536 return ptimers[head];
540 etl::timer::id::type
begin()
547 etl::timer::id::type previous(etl::timer::id::type last)
549 current = ptimers[last].previous;
554 etl::timer::id::type next(etl::timer::id::type last)
556 current = ptimers[last].next;
563 etl::timer::id::type
id =
begin();
565 while (
id != etl::timer::id::NO_TIMER)
567 timer_data& timer = ptimers[id];
569 timer.next = etl::timer::id::NO_TIMER;
572 head = etl::timer::id::NO_TIMER;
573 tail = etl::timer::id::NO_TIMER;
574 current = etl::timer::id::NO_TIMER;
579 etl::timer::id::type head;
580 etl::timer::id::type tail;
581 etl::timer::id::type current;
583 timer_data*
const ptimers;
589 bool is_valid_timer_id(etl::timer::id::type
id_)
const
591 return (
id_ < MAX_TIMERS);
595 timer_data*
const timer_array;
598 timer_list active_list;
603 try_lock_type try_lock;
608 template <u
int_least8_t>
609 friend class callback_timer_locked;
611 template <u
int_least8_t, u
int32_t>
612 friend class callback_timer_deferred_locked;
620 template <u
int_least8_t MAX_TIMERS_>
625 ETL_STATIC_ASSERT(
MAX_TIMERS_ <= 254U,
"No more than 254 timers are allowed");
662 while (
has_active && (count >= active_list.front().delta))
664 timer_data&
timer = active_list.front();
666 count -=
timer.delta;
668 active_list.remove(
timer.
id,
true);
670 if (
timer.callback.is_valid())
678 timer.delta = timer.period;
679 active_list.insert(timer.id);
688 active_list.front().delta -= count;
The callback timer.
Definition callback_timer_locked.h:622
callback_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition callback_timer_locked.h:643
callback_timer_locked()
Constructor.
Definition callback_timer_locked.h:635
Declaration.
Definition delegate_cpp03.h:191
Interface for callback timer.
Definition callback_timer_locked.h:49
bool has_active_timer() const
Check if there is an active timer.
Definition callback_timer_locked.h:267
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_locked.h:200
void clear()
Clears the timer of data.
Definition callback_timer_locked.h:139
void set_locks(try_lock_type try_lock_, lock_type lock_, lock_type unlock_)
Sets the lock and unlock delegates.
Definition callback_timer_locked.h:257
uint32_t time_to_next() const
Definition callback_timer_locked.h:280
etl::timer::id::type register_timer(const callback_type &callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition callback_timer_locked.h:60
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition callback_timer_locked.h:229
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition callback_timer_locked.h:243
bool is_running() const
Get the enable/disable state.
Definition callback_timer_locked.h:131
void enable(bool state_)
Enable/disable the timer.
Definition callback_timer_locked.h:123
icallback_timer_locked(timer_data *const timer_array_, const uint_least8_t MAX_TIMERS_)
Constructor.
Definition callback_timer_locked.h:391
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition callback_timer_locked.h:92
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition callback_timer_locked.h:164
bool is_active(etl::timer::id::type id_) const
Definition callback_timer_locked.h:298
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_locked.h:327
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_locked.h:343
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_locked.h:368
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_locked.h:360
Common definitions for the timer framework.
Definition timer.h:55