29#ifndef ETL_CALLBACK_TIMER_LOCKED_INCLUDED
30#define ETL_CALLBACK_TIMER_LOCKED_INCLUDED
36#include "static_assert.h"
66 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
68 bool is_space = (number_of_registered_timers < Max_Timers);
77 if (
timer.
id == etl::timer::id::NO_TIMER)
81 ++number_of_registered_timers;
98 if (
id_ != etl::timer::id::NO_TIMER)
102 if (
timer.
id != etl::timer::id::NO_TIMER)
104 if (
timer.is_active())
107 active_list.remove(
timer.
id,
false);
108 remove_callback.call_if(
timer.
id);
114 --number_of_registered_timers;
148 for (
uint8_t i = 0
U; i < Max_Timers; ++i)
153 number_of_registered_timers = 0;
162 virtual bool tick(
uint32_t count) = 0;
172 if (
id_ != etl::timer::id::NO_TIMER)
177 if (
timer.
id != etl::timer::id::NO_TIMER)
180 if (
timer.period != etl::timer::state::Inactive)
183 if (
timer.is_active())
185 active_list.remove(
timer.
id,
false);
186 remove_callback.call_if(
timer.
id);
191 insert_callback.call_if(
timer.
id);
210 if (
id_ != etl::timer::id::NO_TIMER)
215 if (
timer.
id != etl::timer::id::NO_TIMER)
217 if (
timer.is_active())
220 active_list.remove(
timer.
id,
false);
221 remove_callback.call_if(
timer.
id);
276 bool result = !active_list.empty();
288 uint32_t delta =
static_cast<uint32_t>(etl::timer::interval::No_Active_Interval);
291 if (!active_list.empty())
293 delta = active_list.front().delta;
309 if (is_valid_timer_id(
id_))
317 if (
timer.
id != etl::timer::id::NO_TIMER)
319 result =
timer.is_active();
345 void clear_insert_callback()
347 insert_callback.clear();
351 void clear_remove_callback()
353 remove_callback.clear();
368 return this->priority > p.priority;
383 , delta(etl::timer::state::Inactive)
384 , id(etl::timer::id::NO_TIMER)
385 , previous(etl::timer::id::NO_TIMER)
386 , next(etl::timer::id::NO_TIMER)
400 , delta(
etl::
timer::state::Inactive)
402 , previous(
etl::
timer::id::NO_TIMER)
413 return delta != etl::timer::state::Inactive;
421 delta = etl::timer::state::Inactive;
427 etl::timer::id::type id;
446 number_of_registered_timers(0
U),
472 return head == etl::timer::id::NO_TIMER;
478 void insert(etl::timer::id::type
id_)
480 timer_data& timer = ptimers[
id_];
482 if (head == etl::timer::id::NO_TIMER)
487 timer.previous = etl::timer::id::NO_TIMER;
488 timer.next = etl::timer::id::NO_TIMER;
495 while (
test_id != etl::timer::id::NO_TIMER)
497 timer_data& test = ptimers[
test_id];
500 if (timer.delta <= test.delta)
508 timer.previous = test.previous;
509 test.previous = timer.id;
510 timer.next = test.id;
513 test.delta -= timer.delta;
515 if (timer.previous != etl::timer::id::NO_TIMER)
517 ptimers[timer.previous].next = timer.id;
523 timer.delta -= test.delta;
530 if (
test_id == etl::timer::id::NO_TIMER)
533 ptimers[tail].next = timer.id;
534 timer.previous = tail;
535 timer.next = etl::timer::id::NO_TIMER;
544 timer_data& timer = ptimers[
id_];
552 ptimers[timer.previous].next = timer.next;
557 tail = timer.previous;
561 ptimers[timer.next].previous = timer.previous;
567 if (timer.next != etl::timer::id::NO_TIMER)
569 ptimers[timer.next].delta += timer.delta;
573 timer.previous = etl::timer::id::NO_TIMER;
574 timer.next = etl::timer::id::NO_TIMER;
575 timer.delta = etl::timer::state::Inactive;
581 return ptimers[head];
585 const timer_data& front()
const
587 return ptimers[head];
591 etl::timer::id::type
begin()
598 etl::timer::id::type previous(etl::timer::id::type last)
600 current = ptimers[last].previous;
605 etl::timer::id::type next(etl::timer::id::type last)
607 current = ptimers[last].next;
614 etl::timer::id::type
id =
begin();
616 while (
id != etl::timer::id::NO_TIMER)
618 timer_data& timer = ptimers[id];
620 timer.next = etl::timer::id::NO_TIMER;
623 head = etl::timer::id::NO_TIMER;
624 tail = etl::timer::id::NO_TIMER;
625 current = etl::timer::id::NO_TIMER;
630 etl::timer::id::type head;
631 etl::timer::id::type tail;
632 etl::timer::id::type current;
634 timer_data*
const ptimers;
640 bool is_valid_timer_id(etl::timer::id::type
id_)
const
642 return (
id_ < Max_Timers);
646 timer_data*
const timer_array;
649 timer_list active_list;
654 try_lock_type try_lock;
658 event_callback_type insert_callback;
659 event_callback_type remove_callback;
663 template <u
int_least8_t>
664 friend class callback_timer_locked;
666 template <u
int_least8_t, u
int32_t>
667 friend class callback_timer_deferred_locked;
675 template <u
int_least8_t Max_Timers_>
680 ETL_STATIC_ASSERT(
Max_Timers_ <= 254U,
"No more than 254 timers are allowed");
724 while (
has_active && (count >= active_list.front().delta))
728 count -=
timer.delta;
730 active_list.remove(
timer.
id,
true);
731 remove_callback.call_if(
timer.
id);
733 if (
timer.callback.is_valid())
743 insert_callback.call_if(
timer.
id);
752 active_list.front().delta -= count;
The callback timer.
Definition callback_timer_locked.h:677
bool tick(uint32_t count) final
Handle the tick call.
Definition callback_timer_locked.h:713
callback_timer_locked()
Constructor.
Definition callback_timer_locked.h:696
callback_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition callback_timer_locked.h:704
Declaration.
Definition delegate_cpp03.h:191
Definition callback_timer_locked.h:359
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:273
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition callback_timer_locked.h:331
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition callback_timer_locked.h:339
icallback_timer_locked(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition callback_timer_locked.h:442
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_locked.h:205
void clear()
Clears the timer of data.
Definition callback_timer_locked.h:142
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:263
uint32_t time_to_next() const
Definition callback_timer_locked.h:286
etl::timer::id::type register_timer(const callback_type &callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition callback_timer_locked.h:62
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition callback_timer_locked.h:235
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition callback_timer_locked.h:249
bool is_running() const
Get the enable/disable state.
Definition callback_timer_locked.h:134
void enable(bool state_)
Enable/disable the timer.
Definition callback_timer_locked.h:126
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition callback_timer_locked.h:94
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition callback_timer_locked.h:167
bool is_active(etl::timer::id::type id_) const
Definition callback_timer_locked.h:304
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_locked.h:378
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_locked.h:394
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_locked.h:419
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_locked.h:411
Common definitions for the timer framework.
Definition timer.h:55