Skip to content
Snippets Groups Projects
Commit 1a2eaa4f authored by Matteo Pignataro's avatar Matteo Pignataro
Browse files

[PostDelayed] Removed template parameter for Ms time delay

parent 6d2b5782
No related branches found
No related tags found
No related merge requests found
...@@ -56,6 +56,43 @@ void EventBroker::post(const Event& ev, uint8_t topic, ...@@ -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) void EventBroker::removeDelayed(uint16_t id)
{ {
Lock<FastMutex> lock(mtxDelayedEvents); Lock<FastMutex> lock(mtxDelayedEvents);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#pragma once #pragma once
#include <assert.h>
#include <diagnostic/PrintLogger.h> #include <diagnostic/PrintLogger.h>
#include <events/Event.h> #include <events/Event.h>
#include <events/FSM.h> #include <events/FSM.h>
...@@ -79,41 +80,7 @@ public: ...@@ -79,41 +80,7 @@ public:
* @param delayMs Delay in milliseconds. * @param delayMs Delay in milliseconds.
* @return Unique id of the delayed event. * @return Unique id of the delayed event.
*/ */
template <unsigned int delayMs> uint16_t postDelayed(const Event& ev, uint8_t topic, 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;
}
/** /**
* Removes a delayed event before it is posted. * Removes a delayed event before it is posted.
......
...@@ -211,8 +211,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture, "EventBroker - Events can be dalayed") ...@@ -211,8 +211,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture, "EventBroker - Events can be dalayed")
long long start = getTick(); long long start = getTick();
// Post delayed event by 1000 ms // Post delayed event by 1000 ms
broker.postDelayed<1000>(ev, TOPIC_1); broker.postDelayed(ev, TOPIC_1, 1000);
broker.postDelayed<3000>(ev, TOPIC_2); broker.postDelayed(ev, TOPIC_2, 3000);
REQUIRE(expectEvent(EV_A, TOPIC_1, start + 1000, 2, broker)); REQUIRE(expectEvent(EV_A, TOPIC_1, start + 1000, 2, broker));
REQUIRE(expectEvent(EV_A, TOPIC_2, start + 3000, 2, broker)); REQUIRE(expectEvent(EV_A, TOPIC_2, start + 3000, 2, broker));
...@@ -225,8 +225,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture, ...@@ -225,8 +225,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture,
long long start = getTick(); long long start = getTick();
// Post delayed event by 1000 ms // Post delayed event by 1000 ms
uint16_t delayed = broker.postDelayed<1000>(ev, TOPIC_1); uint16_t delayed = broker.postDelayed(ev, TOPIC_1, 1000);
broker.postDelayed<3000>(ev, TOPIC_2); broker.postDelayed(ev, TOPIC_2, 3000);
SECTION("Individual events can be removed") SECTION("Individual events can be removed")
{ {
......
...@@ -208,8 +208,8 @@ private: ...@@ -208,8 +208,8 @@ private:
v = 1; v = 1;
// Post EV_D to itself in 1 seconds // Post EV_D to itself in 1 seconds
delayed_ev_id = EventBroker::getInstance().postDelayed<1000>( delayed_ev_id = EventBroker::getInstance().postDelayed(
Event{EV_D}, TOPIC_T1); Event{EV_D}, TOPIC_T1, 1000);
break; break;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment