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
Branches
Tags
1 merge request!133[PostDelayed] Removed template parameter for Ms time delay
Pipeline #5317 passed
......@@ -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);
......
......@@ -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.
......
......@@ -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")
{
......
......@@ -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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment