29#ifndef ETL_CALLBACK_TIMER_LOCKED_INCLUDED
30#define ETL_CALLBACK_TIMER_LOCKED_INCLUDED
37#include "static_assert.h"
56 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
61 etl::timer::id::type
register_timer(
const callback_type& callback_, uint32_t period_,
bool repeating_)
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);
105 remove_callback.call_if(
timer.
id);
111 --number_of_registered_timers;
145 for (uint8_t i = 0U; i < Max_Timers; ++i)
150 number_of_registered_timers = 0;
159 virtual bool tick(uint32_t count) = 0;
164 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
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);
183 remove_callback.call_if(
timer.
id);
188 insert_callback.call_if(
timer.
id);
202 bool stop(etl::timer::id::type id_)
207 if (id_ != etl::timer::id::NO_TIMER)
212 if (
timer.
id != etl::timer::id::NO_TIMER)
214 if (
timer.is_active())
217 active_list.remove(
timer.
id,
false);
218 remove_callback.call_if(
timer.
id);
236 timer_array[id_].period = period_;
246 bool set_mode(etl::timer::id::type id_,
bool repeating_)
250 timer_array[id_].repeating = repeating_;
260 void set_locks(try_lock_type try_lock_, lock_type lock_, lock_type unlock_)
262 try_lock = try_lock_;
273 bool result = !active_list.empty();
286 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
289 if (!active_list.empty())
291 delta = active_list.front().delta;
307 if (is_valid_timer_id(id_))
315 if (
timer.
id != etl::timer::id::NO_TIMER)
317 result =
timer.is_active();
331 insert_callback = insert_;
339 remove_callback = remove_;
343 void clear_insert_callback()
345 insert_callback.clear();
349 void clear_remove_callback()
351 remove_callback.clear();
360 callback_node(callback_type& callback_, uint_least8_t priority_)
361 : callback(callback_)
362 , priority(priority_)
366 bool operator<(
const callback_node& p)
const
368 return this->priority > p.priority;
372 callback_type callback;
373 uint_least8_t priority;
384 , delta(etl::timer::state::Inactive)
385 , id(etl::timer::id::NO_TIMER)
386 , previous(etl::timer::id::NO_TIMER)
387 , next(etl::timer::id::NO_TIMER)
395 timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_,
bool repeating_)
396 : callback(callback_)
398 , delta(
etl::
timer::state::Inactive)
400 , previous(
etl::
timer::id::NO_TIMER)
402 , repeating(repeating_)
411 return delta != etl::timer::state::Inactive;
419 delta = etl::timer::state::Inactive;
425 etl::timer::id::type id;
426 uint_least8_t previous;
441 : timer_array(timer_array_)
442 , active_list(timer_array_)
444 , number_of_registered_timers(0U)
445 , Max_Timers(Max_Timers_)
459 timer_list(timer_data* ptimers_)
469 return head == etl::timer::id::NO_TIMER;
475 void insert(etl::timer::id::type id_)
477 timer_data& timer = ptimers[id_];
479 if (head == etl::timer::id::NO_TIMER)
484 timer.previous = etl::timer::id::NO_TIMER;
485 timer.next = etl::timer::id::NO_TIMER;
490 etl::timer::id::type test_id = begin();
492 while (test_id != etl::timer::id::NO_TIMER)
494 timer_data& test = ptimers[test_id];
497 if (timer.delta <= test.delta)
505 timer.previous = test.previous;
506 test.previous = timer.id;
507 timer.next = test.id;
510 test.delta -= timer.delta;
512 if (timer.previous != etl::timer::id::NO_TIMER)
514 ptimers[timer.previous].next = timer.id;
520 timer.delta -= test.delta;
523 test_id = next(test_id);
527 if (test_id == etl::timer::id::NO_TIMER)
530 ptimers[tail].next = timer.id;
531 timer.previous = tail;
532 timer.next = etl::timer::id::NO_TIMER;
539 void remove(etl::timer::id::type id_,
bool has_expired)
541 timer_data& timer = ptimers[id_];
549 ptimers[timer.previous].next = timer.next;
554 tail = timer.previous;
558 ptimers[timer.next].previous = timer.previous;
564 if (timer.next != etl::timer::id::NO_TIMER)
566 ptimers[timer.next].delta += timer.delta;
570 timer.previous = etl::timer::id::NO_TIMER;
571 timer.next = etl::timer::id::NO_TIMER;
572 timer.delta = etl::timer::state::Inactive;
578 return ptimers[head];
582 const timer_data& front()
const
584 return ptimers[head];
588 etl::timer::id::type begin()
594 etl::timer::id::type next(etl::timer::id::type last)
596 return ptimers[last].next;
602 etl::timer::id::type
id = begin();
604 while (
id != etl::timer::id::NO_TIMER)
606 timer_data& timer = ptimers[id];
608 timer.next = etl::timer::id::NO_TIMER;
611 head = etl::timer::id::NO_TIMER;
612 tail = etl::timer::id::NO_TIMER;
617 etl::timer::id::type head;
618 etl::timer::id::type tail;
620 timer_data*
const ptimers;
626 bool is_valid_timer_id(etl::timer::id::type id_)
const
628 return (id_ < Max_Timers);
635 timer_list active_list;
638 uint_least8_t number_of_registered_timers;
640 try_lock_type try_lock;
644 event_callback_type insert_callback;
645 event_callback_type remove_callback;
649 template <u
int_least8_t>
650 friend class callback_timer_locked;
652 template <u
int_least8_t, u
int32_t>
653 friend class callback_timer_deferred_locked;
655 const uint_least8_t Max_Timers;
661 template <u
int_least8_t Max_Timers_>
666 ETL_STATIC_ASSERT(Max_Timers_ <= 254U,
"No more than 254 timers are allowed");
668 typedef icallback_timer_locked::callback_type callback_type;
669 typedef icallback_timer_locked::try_lock_type try_lock_type;
670 typedef icallback_timer_locked::lock_type lock_type;
671 typedef icallback_timer_locked::unlock_type unlock_type;
693 this->
set_locks(try_lock_, lock_, unlock_);
706 bool has_active = !active_list.empty();
710 while (has_active && (count >= active_list.front().delta))
714 count -=
timer.delta;
716 active_list.remove(
timer.
id,
true);
717 remove_callback.call_if(
timer.
id);
719 if (
timer.callback.is_valid())
729 insert_callback.call_if(
timer.
id);
732 has_active = !active_list.empty();
738 active_list.front().delta -= count;
753 timer_data timer_array[Max_Timers_];
callback_timer_locked()
Constructor.
Definition callback_timer_locked.h:682
bool tick(uint32_t count) ETL_FINAL
Handle the tick call.
Definition callback_timer_locked.h:699
callback_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition callback_timer_locked.h:690
Declaration.
Definition delegate_cpp03.h:191
Definition callback_timer_locked.h:357
Interface for callback timer.
Definition callback_timer_locked.h:48
bool has_active_timer() const
Check if there is an active timer.
Definition callback_timer_locked.h:270
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition callback_timer_locked.h:329
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition callback_timer_locked.h:337
icallback_timer_locked(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition callback_timer_locked.h:440
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_locked.h:202
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:260
uint32_t time_to_next() const
Definition callback_timer_locked.h:284
etl::timer::id::type register_timer(const callback_type &callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition callback_timer_locked.h:61
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition callback_timer_locked.h:232
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition callback_timer_locked.h:246
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
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition callback_timer_locked.h:91
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:302
Definition circular_iterator.h:599
The configuration of a timer.
Definition callback_timer_locked.h:379
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_locked.h:395
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_locked.h:417
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_locked.h:409
Common definitions for the timer framework.
Definition timer.h:55