From 11daaa398b930189d8f6db4c9d652eb834026913 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 21 Aug 2023 20:58:44 +0100 Subject: [PATCH] Added time_to_next() status function --- .gitignore | 1 + include/etl/callback_timer.h | 20 ++++++++-- include/etl/callback_timer_atomic.h | 20 +++++++++- include/etl/callback_timer_interrupt.h | 13 ++++++ include/etl/callback_timer_locked.h | 18 +++++++++ include/etl/message_timer.h | 20 +++++++++- include/etl/message_timer_atomic.h | 28 ++++++++++--- include/etl/message_timer_interrupt.h | 19 +++++++++ include/etl/message_timer_locked.h | 18 +++++++++ test/test_callback_timer.cpp | 48 ++++++++++++++++++++++ test/test_callback_timer_atomic.cpp | 50 ++++++++++++++++++++++- test/test_callback_timer_interrupt.cpp | 48 ++++++++++++++++++++++ test/test_callback_timer_locked.cpp | 53 +++++++++++++++++++++++++ test/test_message_timer.cpp | 50 +++++++++++++++++++++++ test/test_message_timer_atomic.cpp | 50 +++++++++++++++++++++++ test/test_message_timer_interrupt.cpp | 51 +++++++++++++++++++++++- test/test_message_timer_locked.cpp | 55 ++++++++++++++++++++++++++ 17 files changed, 549 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 6800e824..90cc26c9 100644 --- a/.gitignore +++ b/.gitignore @@ -384,3 +384,4 @@ test/vs2022/Debug MSVC C++ 20 - No Tests test/vs2022/enc_temp_folder test/vs2022/Debug MSVC C++20 - No virtual messages examples/MutexMessageRouter/.vs +support/time remaining test.xlsx diff --git a/include/etl/callback_timer.h b/include/etl/callback_timer.h index cc30ec99..24f422ff 100644 --- a/include/etl/callback_timer.h +++ b/include/etl/callback_timer.h @@ -139,7 +139,6 @@ namespace etl { } -#if ETL_USING_CPP11 //******************************************* /// ETL delegate callback //******************************************* @@ -157,7 +156,6 @@ namespace etl cbk_type(DELEGATE) { } -#endif //******************************************* /// Returns true if the timer is active. @@ -324,6 +322,12 @@ namespace etl return ptimers[head]; } + //******************************* + const etl::callback_timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { @@ -704,6 +708,16 @@ namespace etl return false; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + uint32_t delta = active_list.front().delta; + + return delta; + } + protected: //******************************************* @@ -742,7 +756,7 @@ namespace etl #endif #endif - etl::timer_semaphore_t process_semaphore; + mutable etl::timer_semaphore_t process_semaphore; #endif uint_least8_t registered_timers; diff --git a/include/etl/callback_timer_atomic.h b/include/etl/callback_timer_atomic.h index 860901dd..f5c6df84 100644 --- a/include/etl/callback_timer_atomic.h +++ b/include/etl/callback_timer_atomic.h @@ -297,6 +297,18 @@ namespace etl return false; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + ++process_semaphore; + uint32_t delta = active_list.front().delta; + --process_semaphore; + + return delta; + } + protected: //************************************************************************* @@ -509,6 +521,12 @@ namespace etl return ptimers[head]; } + //******************************* + const timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { @@ -563,7 +581,7 @@ namespace etl timer_list active_list; bool enabled; - TSemaphore process_semaphore; + mutable TSemaphore process_semaphore; uint_least8_t number_of_registered_timers; public: diff --git a/include/etl/callback_timer_interrupt.h b/include/etl/callback_timer_interrupt.h index 11658707..a07d6b98 100644 --- a/include/etl/callback_timer_interrupt.h +++ b/include/etl/callback_timer_interrupt.h @@ -300,6 +300,19 @@ namespace etl return false; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + TInterruptGuard guard; + (void)guard; // Silence 'unused variable warnings. + + uint32_t delta = active_list.front().delta; + + return delta; + } + protected: //************************************************************************* diff --git a/include/etl/callback_timer_locked.h b/include/etl/callback_timer_locked.h index ab4dfa0e..e97e674a 100644 --- a/include/etl/callback_timer_locked.h +++ b/include/etl/callback_timer_locked.h @@ -309,6 +309,18 @@ namespace etl unlock = unlock_; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + lock(); + uint32_t delta = active_list.front().delta; + unlock(); + + return delta; + } + protected: //************************************************************************* @@ -520,6 +532,12 @@ namespace etl return ptimers[head]; } + //******************************* + const timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { diff --git a/include/etl/message_timer.h b/include/etl/message_timer.h index 4655f1ab..6a3e2602 100644 --- a/include/etl/message_timer.h +++ b/include/etl/message_timer.h @@ -280,6 +280,12 @@ namespace etl return ptimers[head]; } + //******************************* + const etl::message_timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { @@ -583,6 +589,18 @@ namespace etl return false; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + ETL_DISABLE_TIMER_UPDATES; + uint32_t delta = active_list.front().delta; + ETL_ENABLE_TIMER_UPDATES; + + return delta; + } + protected: //******************************************* @@ -629,7 +647,7 @@ namespace etl #endif #endif - etl::timer_semaphore_t process_semaphore; + mutable etl::timer_semaphore_t process_semaphore; #endif uint_least8_t registered_timers; diff --git a/include/etl/message_timer_atomic.h b/include/etl/message_timer_atomic.h index 4f79904b..c8c27519 100644 --- a/include/etl/message_timer_atomic.h +++ b/include/etl/message_timer_atomic.h @@ -302,6 +302,18 @@ namespace etl return false; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + ++process_semaphore; + uint32_t delta = active_list.front().delta; + --process_semaphore; + + return delta; + } + protected: //************************************************************************* @@ -405,10 +417,10 @@ namespace etl //******************************* timer_list(timer_data* ptimers_) - : head(etl::timer::id::NO_TIMER), - tail(etl::timer::id::NO_TIMER), - current(etl::timer::id::NO_TIMER), - ptimers(ptimers_) + : head(etl::timer::id::NO_TIMER) + , tail(etl::timer::id::NO_TIMER) + , current(etl::timer::id::NO_TIMER) + , ptimers(ptimers_) { } @@ -527,6 +539,12 @@ namespace etl return ptimers[head]; } + //******************************* + const timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { @@ -581,7 +599,7 @@ namespace etl timer_list active_list; bool enabled; - TSemaphore process_semaphore; + mutable TSemaphore process_semaphore; uint_least8_t registered_timers; public: diff --git a/include/etl/message_timer_interrupt.h b/include/etl/message_timer_interrupt.h index e7a5a404..bf7da229 100644 --- a/include/etl/message_timer_interrupt.h +++ b/include/etl/message_timer_interrupt.h @@ -311,6 +311,19 @@ namespace etl return false; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + TInterruptGuard guard; + (void)guard; // Silence 'unused variable warnings. + + uint32_t delta = active_list.front().delta; + + return delta; + } + protected: //************************************************************************* @@ -535,6 +548,12 @@ namespace etl return ptimers[head]; } + //******************************* + const timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { diff --git a/include/etl/message_timer_locked.h b/include/etl/message_timer_locked.h index cd9f7e78..1e6a2b4b 100644 --- a/include/etl/message_timer_locked.h +++ b/include/etl/message_timer_locked.h @@ -318,6 +318,18 @@ namespace etl unlock = unlock_; } + //******************************************* + /// Get the time to the next timer event. + //******************************************* + uint32_t time_to_next() const + { + lock(); + + uint32_t delta = active_list.front().delta; + + return delta; + } + protected: //************************************************************************* @@ -542,6 +554,12 @@ namespace etl return ptimers[head]; } + //******************************* + const timer_data& front() const + { + return ptimers[head]; + } + //******************************* etl::timer::id::type begin() { diff --git a/test/test_callback_timer.cpp b/test/test_callback_timer.cpp index d2ba623b..394b022a 100644 --- a/test/test_callback_timer.cpp +++ b/test/test_callback_timer.cpp @@ -646,6 +646,54 @@ namespace CHECK_ARRAY_EQUAL(compare1.data(), free_tick_list1.data(), compare1.size()); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + etl::callback_timer<3> timer_controller; + + etl::timer::id::type id1 = timer_controller.register_timer(member_callback, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(free_function_callback, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(free_callback2, 11, etl::timer::mode::REPEATING); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* class test_object { diff --git a/test/test_callback_timer_atomic.cpp b/test/test_callback_timer_atomic.cpp index 90c36d2a..3e96507f 100644 --- a/test/test_callback_timer_atomic.cpp +++ b/test/test_callback_timer_atomic.cpp @@ -541,7 +541,7 @@ namespace etl::timer::id::type id1 = timer_controller.register_timer(member_callback1, 37, etl::timer::mode::REPEATING); etl::timer::id::type id2 = timer_controller.register_timer(free_function_callback1, 23, etl::timer::mode::REPEATING); - etl::timer::id::type id3 = timer_controller.register_timer(free_function_callback2, 11, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(free_function_callback2, 11, etl::timer::mode::REPEATING); test.tick_list.clear(); free_tick_list1.clear(); @@ -653,6 +653,54 @@ namespace CHECK_ARRAY_EQUAL(compare1.data(), free_tick_list1.data(), compare1.size()); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + etl::callback_timer_atomic<3, std::atomic_uint32_t> timer_controller; + + etl::timer::id::type id1 = timer_controller.register_timer(member_callback1, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(free_function_callback1, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(free_function_callback2, 11, etl::timer::mode::REPEATING); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* class test_object { diff --git a/test/test_callback_timer_interrupt.cpp b/test/test_callback_timer_interrupt.cpp index 70fc6f72..07268d1e 100644 --- a/test/test_callback_timer_interrupt.cpp +++ b/test/test_callback_timer_interrupt.cpp @@ -692,6 +692,54 @@ namespace CHECK_EQUAL(0U, ScopedGuard::guard_count); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + etl::callback_timer_interrupt<3, ScopedGuard> timer_controller; + + etl::timer::id::type id1 = timer_controller.register_timer(member_callback, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(free_function_callback, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(free_function_callback2, 11, etl::timer::mode::REPEATING); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* class test_object { diff --git a/test/test_callback_timer_locked.cpp b/test/test_callback_timer_locked.cpp index ad4bce95..2d22b94d 100644 --- a/test/test_callback_timer_locked.cpp +++ b/test/test_callback_timer_locked.cpp @@ -818,6 +818,59 @@ namespace CHECK_EQUAL(0U, locks.lock_count); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + locks.clear(); + try_lock_type try_lock = try_lock_type::create(); + lock_type lock = lock_type::create(); + unlock_type unlock = unlock_type::create(); + + etl::callback_timer_locked<3> timer_controller(try_lock, lock, unlock); + + etl::timer::id::type id1 = timer_controller.register_timer(member_callback, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(free_function_callback, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(free_function_callback2, 11, etl::timer::mode::REPEATING); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* #if REALTIME_TEST diff --git a/test/test_message_timer.cpp b/test/test_message_timer.cpp index d348dc56..e448dad5 100644 --- a/test/test_message_timer.cpp +++ b/test/test_message_timer.cpp @@ -593,6 +593,56 @@ namespace CHECK_ARRAY_EQUAL(compare1.data(), router1.message1.data(), compare1.size()); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + etl::message_timer<3> timer_controller; + + etl::timer::id::type id1 = timer_controller.register_timer(message1, router1, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(message2, router1, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(message3, router1, 11, etl::timer::mode::REPEATING); + + router1.clear(); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* #if REALTIME_TEST diff --git a/test/test_message_timer_atomic.cpp b/test/test_message_timer_atomic.cpp index 6d5c8316..01d6726c 100644 --- a/test/test_message_timer_atomic.cpp +++ b/test/test_message_timer_atomic.cpp @@ -593,6 +593,56 @@ namespace CHECK_ARRAY_EQUAL(compare1.data(), router1.message1.data(), compare1.size()); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + etl::message_timer_atomic<3, std::atomic_uint32_t> timer_controller; + + etl::timer::id::type id1 = timer_controller.register_timer(message1, router1, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(message2, router1, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(message3, router1, 11, etl::timer::mode::REPEATING); + + router1.clear(); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* #if REALTIME_TEST diff --git a/test/test_message_timer_interrupt.cpp b/test/test_message_timer_interrupt.cpp index 1d8fe5d5..0b9d9722 100644 --- a/test/test_message_timer_interrupt.cpp +++ b/test/test_message_timer_interrupt.cpp @@ -641,9 +641,56 @@ namespace } //************************************************************************* - - + TEST(message_timer_time_to_next) + { + etl::message_timer_interrupt<3, ScopedGuard> timer_controller; + etl::timer::id::type id1 = timer_controller.register_timer(message1, router1, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(message2, router1, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(message3, router1, 11, etl::timer::mode::REPEATING); + + router1.clear(); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + + //************************************************************************* class RouterLog : public etl::message_router { public: diff --git a/test/test_message_timer_locked.cpp b/test/test_message_timer_locked.cpp index 00dfb93a..18383756 100644 --- a/test/test_message_timer_locked.cpp +++ b/test/test_message_timer_locked.cpp @@ -715,6 +715,61 @@ namespace CHECK_EQUAL(0U, locks.lock_count); } + //************************************************************************* + TEST(message_timer_time_to_next) + { + locks.clear(); + try_lock_type try_lock = try_lock_type::create(); + lock_type lock = lock_type::create(); + unlock_type unlock = unlock_type::create(); + + etl::message_timer_locked<3> timer_controller(try_lock, lock, unlock); + + etl::timer::id::type id1 = timer_controller.register_timer(message1, router1, 37, etl::timer::mode::REPEATING); + etl::timer::id::type id2 = timer_controller.register_timer(message2, router1, 23, etl::timer::mode::REPEATING); + etl::timer::id::type id3 = timer_controller.register_timer(message3, router1, 11, etl::timer::mode::REPEATING); + + router1.clear(); + + timer_controller.start(id1); + timer_controller.start(id3); + timer_controller.start(id2); + + timer_controller.enable(true); + + CHECK_EQUAL(11, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(8, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(1, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(5, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(2, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(6, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(10, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(3, timer_controller.time_to_next()); + + timer_controller.tick(7); + CHECK_EQUAL(4, timer_controller.time_to_next()); + } + //************************************************************************* #if REALTIME_TEST