From 1a2eaa4f7f12cb8173e08947cbcd45fd0dd88857 Mon Sep 17 00:00:00 2001 From: Matteo Pignataro <matteo.pignataro@skywarder.eu> Date: Tue, 2 May 2023 08:52:53 +0000 Subject: [PATCH] [PostDelayed] Removed template parameter for Ms time delay --- src/shared/events/EventBroker.cpp | 37 ++++++++++++++++++++++++++++ src/shared/events/EventBroker.h | 37 ++-------------------------- src/tests/catch/test-eventbroker.cpp | 8 +++--- src/tests/events/fsm/test-fsm.h | 4 +-- 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/src/shared/events/EventBroker.cpp b/src/shared/events/EventBroker.cpp index 04b8570f7..96fe93c76 100644 --- a/src/shared/events/EventBroker.cpp +++ b/src/shared/events/EventBroker.cpp @@ -56,6 +56,43 @@ void EventBroker::post(const Event& ev, uint8_t topic, } } +uint16_t EventBroker::postDelayed(const Event& ev, uint8_t topic, + unsigned int delayMs) +{ + D(assert(delayMs >= EVENT_BROKER_MIN_DELAY && + "delayMs must be longer or equal to EVENT_BROKER_MIN_DELAY")); + + delayMs = std::max(delayMs, EVENT_BROKER_MIN_DELAY); + + Lock<FastMutex> lock(mtxDelayedEvents); + + // Delay in system ticks + long long delayTicks = + static_cast<long long>(delayMs * miosix::TICK_FREQ / 1000); + + DelayedEvent dev{eventCounter++, ev, topic, getTick() + delayTicks}; + bool added = false; + + // Add the new event in the list, ordered by deadline (first = nearest + // deadline) + for (auto it = delayedEvents.begin(); it != delayedEvents.end(); it++) + { + if (dev.deadline < (*it).deadline) + { + delayedEvents.insert(it, dev); + added = true; + break; + } + } + + if (!added) // In case this is the last/only event in the list + { + delayedEvents.push_back(dev); + } + + return dev.schedId; +} + void EventBroker::removeDelayed(uint16_t id) { Lock<FastMutex> lock(mtxDelayedEvents); diff --git a/src/shared/events/EventBroker.h b/src/shared/events/EventBroker.h index 7bad9f06f..7437d6230 100644 --- a/src/shared/events/EventBroker.h +++ b/src/shared/events/EventBroker.h @@ -22,6 +22,7 @@ #pragma once +#include <assert.h> #include <diagnostic/PrintLogger.h> #include <events/Event.h> #include <events/FSM.h> @@ -79,41 +80,7 @@ public: * @param delayMs Delay in milliseconds. * @return Unique id of the delayed event. */ - template <unsigned int delayMs> - uint16_t postDelayed(const Event& ev, uint8_t topic) - { - static_assert( - delayMs >= EVENT_BROKER_MIN_DELAY, - "delayMs must be longer or equal to EVENT_BROKER_MIN_DELAY"); - - Lock<FastMutex> lock(mtxDelayedEvents); - - // Delay in system ticks - long long delayTicks = - static_cast<long long>(delayMs * miosix::TICK_FREQ / 1000); - - DelayedEvent dev{eventCounter++, ev, topic, getTick() + delayTicks}; - bool added = false; - - // Add the new event in the list, ordered by deadline (first = nearest - // deadline) - for (auto it = delayedEvents.begin(); it != delayedEvents.end(); it++) - { - if (dev.deadline < (*it).deadline) - { - delayedEvents.insert(it, dev); - added = true; - break; - } - } - - if (!added) // In case this is the last/only event in the list - { - delayedEvents.push_back(dev); - } - - return dev.schedId; - } + uint16_t postDelayed(const Event& ev, uint8_t topic, unsigned int delayMs); /** * Removes a delayed event before it is posted. diff --git a/src/tests/catch/test-eventbroker.cpp b/src/tests/catch/test-eventbroker.cpp index 18a9eb65c..9590563db 100644 --- a/src/tests/catch/test-eventbroker.cpp +++ b/src/tests/catch/test-eventbroker.cpp @@ -211,8 +211,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture, "EventBroker - Events can be dalayed") long long start = getTick(); // Post delayed event by 1000 ms - broker.postDelayed<1000>(ev, TOPIC_1); - broker.postDelayed<3000>(ev, TOPIC_2); + broker.postDelayed(ev, TOPIC_1, 1000); + broker.postDelayed(ev, TOPIC_2, 3000); REQUIRE(expectEvent(EV_A, TOPIC_1, start + 1000, 2, broker)); REQUIRE(expectEvent(EV_A, TOPIC_2, start + 3000, 2, broker)); @@ -225,8 +225,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture, long long start = getTick(); // Post delayed event by 1000 ms - uint16_t delayed = broker.postDelayed<1000>(ev, TOPIC_1); - broker.postDelayed<3000>(ev, TOPIC_2); + uint16_t delayed = broker.postDelayed(ev, TOPIC_1, 1000); + broker.postDelayed(ev, TOPIC_2, 3000); SECTION("Individual events can be removed") { diff --git a/src/tests/events/fsm/test-fsm.h b/src/tests/events/fsm/test-fsm.h index f603cdfec..facd7f6b6 100644 --- a/src/tests/events/fsm/test-fsm.h +++ b/src/tests/events/fsm/test-fsm.h @@ -208,8 +208,8 @@ private: v = 1; // Post EV_D to itself in 1 seconds - delayed_ev_id = EventBroker::getInstance().postDelayed<1000>( - Event{EV_D}, TOPIC_T1); + delayed_ev_id = EventBroker::getInstance().postDelayed( + Event{EV_D}, TOPIC_T1, 1000); break; } -- GitLab