diff --git a/src/shared/events/EventBroker.cpp b/src/shared/events/EventBroker.cpp index 04b8570f76b9146bc5aa9b671ef8764a887f3ce0..96fe93c762b795ac5f32b32fe90d12db35fc6095 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 7bad9f06f9028553f50110e51da55c02658f19cc..7437d623070bea3d1636528f1e55f92becb8b224 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 18a9eb65c348d484a29c2c7823be366e4cc042d0..9590563db8b32f2c7694cc4dd4a287580068193d 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 f603cdfec09f72e09864f4dbeaf43e08264c9b6d..facd7f6b63279efb7017a1560f09535c22803a6d 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; }