mirror of https://github.com/ARMmbed/mbed-os.git
Updated event period handling and greentea test
non_periodic constant has been moved out of the Event class and made static within the events namespace so that it is available both internally within the class and externally. The MBED_ASSERT has been changed to MBED_WARNING. The greentea test has been updated: 1) timings reduced to make the test cases run faster 2) The call handler simplifiedpull/14087/head
parent
6b2a0fe1d4
commit
c0a57ba3b9
|
@ -20,6 +20,7 @@
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include "events/EventQueue.h"
|
#include "events/EventQueue.h"
|
||||||
#include "platform/mbed_assert.h"
|
#include "platform/mbed_assert.h"
|
||||||
|
#include "platform/mbed_error.h"
|
||||||
|
|
||||||
namespace events {
|
namespace events {
|
||||||
/** \defgroup events-public-api Events
|
/** \defgroup events-public-api Events
|
||||||
|
@ -27,6 +28,8 @@ namespace events {
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static constexpr std::chrono::duration<int, std::milli> non_periodic{-1};
|
||||||
|
|
||||||
/** Event
|
/** Event
|
||||||
*
|
*
|
||||||
* Representation of an event for fine-grain dispatch control
|
* Representation of an event for fine-grain dispatch control
|
||||||
|
@ -47,7 +50,6 @@ template <typename... ArgTs>
|
||||||
class Event<void(ArgTs...)> {
|
class Event<void(ArgTs...)> {
|
||||||
public:
|
public:
|
||||||
using duration = std::chrono::duration<int, std::milli>;
|
using duration = std::chrono::duration<int, std::milli>;
|
||||||
static constexpr duration non_periodic{-1};
|
|
||||||
|
|
||||||
/** Create an event
|
/** Create an event
|
||||||
*
|
*
|
||||||
|
@ -68,7 +70,7 @@ public:
|
||||||
_event->equeue = &q->_equeue;
|
_event->equeue = &q->_equeue;
|
||||||
_event->id = 0;
|
_event->id = 0;
|
||||||
_event->delay = duration(0);
|
_event->delay = duration(0);
|
||||||
_event->period = non_periodic;
|
_event->period = events::non_periodic;
|
||||||
|
|
||||||
_event->post = &Event::event_post<F>;
|
_event->post = &Event::event_post<F>;
|
||||||
_event->dtor = &Event::event_dtor<F>;
|
_event->dtor = &Event::event_dtor<F>;
|
||||||
|
@ -115,6 +117,8 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Configure the delay of an event
|
/** Configure the delay of an event
|
||||||
*
|
*
|
||||||
* @param d Delay (in milliseconds) before dispatching the event, expressed as a Chrono duration.
|
* @param d Delay (in milliseconds) before dispatching the event, expressed as a Chrono duration.
|
||||||
|
@ -147,13 +151,16 @@ public:
|
||||||
*/
|
*/
|
||||||
void period(duration p)
|
void period(duration p)
|
||||||
{
|
{
|
||||||
MBED_ASSERT(p > duration(0) || p == non_periodic);
|
|
||||||
if (_event) {
|
if (_event) {
|
||||||
if (p > duration(0)) {
|
if (p > duration(0)) {
|
||||||
_event->period = p;
|
_event->period = p;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_event->period = non_periodic;
|
if (p != events::non_periodic) {
|
||||||
|
MBED_WARNING(MBED_ERROR_INVALID_ARGUMENT,
|
||||||
|
"Invalid period specified, defaulting to non_periodic.");
|
||||||
|
}
|
||||||
|
_event->period = events::non_periodic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,12 +93,12 @@ void simple_posts_test##i() { \
|
||||||
TEST_ASSERT(touched); \
|
TEST_ASSERT(touched); \
|
||||||
\
|
\
|
||||||
touched = false; \
|
touched = false; \
|
||||||
queue.call_in(1, func##i,##__VA_ARGS__); \
|
queue.call_in(1ms, func##i,##__VA_ARGS__); \
|
||||||
queue.dispatch(2); \
|
queue.dispatch(2); \
|
||||||
TEST_ASSERT(touched); \
|
TEST_ASSERT(touched); \
|
||||||
\
|
\
|
||||||
touched = false; \
|
touched = false; \
|
||||||
queue.call_every(1, func##i,##__VA_ARGS__); \
|
queue.call_every(1ms, func##i,##__VA_ARGS__); \
|
||||||
queue.dispatch(2); \
|
queue.dispatch(2); \
|
||||||
TEST_ASSERT(touched); \
|
TEST_ASSERT(touched); \
|
||||||
}
|
}
|
||||||
|
@ -126,7 +126,7 @@ void call_in_test()
|
||||||
|
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
tickers[i].start();
|
tickers[i].start();
|
||||||
queue.call_in((i + 1) * 100, time_func, &tickers[i], (i + 1) * 100);
|
queue.call_in((i + 1) * 100ms, time_func, &tickers[i], (i + 1) * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
queue.dispatch(N * 100);
|
queue.dispatch(N * 100);
|
||||||
|
@ -141,7 +141,7 @@ void call_every_test()
|
||||||
|
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
tickers[i].start();
|
tickers[i].start();
|
||||||
queue.call_every((i + 1) * 100, time_func, &tickers[i], (i + 1) * 100);
|
queue.call_every((i + 1) * 100ms, time_func, &tickers[i], (i + 1) * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
queue.dispatch(N * 100);
|
queue.dispatch(N * 100);
|
||||||
|
@ -172,7 +172,7 @@ void cancel_test1()
|
||||||
int ids[N];
|
int ids[N];
|
||||||
|
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
ids[i] = queue.call_in(1000, no);
|
ids[i] = queue.call_in(1000ms, no);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = N - 1; i >= 0; i--) {
|
for (int i = N - 1; i >= 0; i--) {
|
||||||
|
@ -308,12 +308,12 @@ void time_left_test()
|
||||||
EventQueue queue(TEST_EQUEUE_SIZE);
|
EventQueue queue(TEST_EQUEUE_SIZE);
|
||||||
|
|
||||||
// Enque check events
|
// Enque check events
|
||||||
TEST_ASSERT(queue.call_in(50, check_time_left, &queue, 0, 100 - 50));
|
TEST_ASSERT(queue.call_in(50ms, check_time_left, &queue, 0, 100 - 50));
|
||||||
TEST_ASSERT(queue.call_in(200, check_time_left, &queue, 1, 200 - 200));
|
TEST_ASSERT(queue.call_in(200ms, check_time_left, &queue, 1, 200 - 200));
|
||||||
|
|
||||||
// Enque events to be checked
|
// Enque events to be checked
|
||||||
timeleft_events[0] = queue.call_in(100, time_left, &queue, 0);
|
timeleft_events[0] = queue.call_in(100ms, time_left, &queue, 0);
|
||||||
timeleft_events[1] = queue.call_in(200, time_left, &queue, 1);
|
timeleft_events[1] = queue.call_in(200ms, time_left, &queue, 1);
|
||||||
TEST_ASSERT(timeleft_events[0]);
|
TEST_ASSERT(timeleft_events[0]);
|
||||||
TEST_ASSERT(timeleft_events[1]);
|
TEST_ASSERT(timeleft_events[1]);
|
||||||
|
|
||||||
|
@ -373,18 +373,18 @@ void mixed_dynamic_static_events_queue_test()
|
||||||
|
|
||||||
EventTest e1_test;
|
EventTest e1_test;
|
||||||
Event<void()> e1 = queue.event(&e1_test, &EventTest::f0);
|
Event<void()> e1 = queue.event(&e1_test, &EventTest::f0);
|
||||||
e1.delay(10);
|
e1.delay(10ms);
|
||||||
e1.period(10);
|
e1.period(10ms);
|
||||||
int id1 = e1.post();
|
int id1 = e1.post();
|
||||||
TEST_ASSERT_NOT_EQUAL(0, id1);
|
TEST_ASSERT_NOT_EQUAL(0, id1);
|
||||||
EventTest e2_test;
|
EventTest e2_test;
|
||||||
Event<void()> e2 = queue.event(&e2_test, &EventTest::f1, 3);
|
Event<void()> e2 = queue.event(&e2_test, &EventTest::f1, 3);
|
||||||
e2.period(10);
|
e2.period(10ms);
|
||||||
int id2 = e2.post();
|
int id2 = e2.post();
|
||||||
TEST_ASSERT_NOT_EQUAL(0, id2);
|
TEST_ASSERT_NOT_EQUAL(0, id2);
|
||||||
EventTest e3_test;
|
EventTest e3_test;
|
||||||
Event<void()> e3 = queue.event(&e3_test, &EventTest::f5, 1, 2, 3, 4, 5);
|
Event<void()> e3 = queue.event(&e3_test, &EventTest::f5, 1, 2, 3, 4, 5);
|
||||||
e3.period(10);
|
e3.period(10ms);
|
||||||
int id3 = e3.post();
|
int id3 = e3.post();
|
||||||
TEST_ASSERT_NOT_EQUAL(0, id3);
|
TEST_ASSERT_NOT_EQUAL(0, id3);
|
||||||
|
|
||||||
|
@ -508,79 +508,90 @@ void static_events_queue_test()
|
||||||
TEST_ASSERT_EQUAL(15, test4.counter);
|
TEST_ASSERT_EQUAL(15, test4.counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static EventTest event_period;
|
static EventQueue period_tests_queue;
|
||||||
|
static long update_counter = 0;
|
||||||
|
|
||||||
|
void handler()
|
||||||
|
{
|
||||||
|
update_counter ++;
|
||||||
|
}
|
||||||
|
|
||||||
void event_period_tests()
|
void event_period_tests()
|
||||||
{
|
{
|
||||||
EventQueue queue;
|
|
||||||
|
|
||||||
// Test a non periodic event ie dispatched only once
|
// Test a non periodic event ie dispatched only once
|
||||||
|
|
||||||
Event<void(int)> event1(&queue, &event_period::f0);
|
Event<void()> event1(&period_tests_queue, handler);
|
||||||
event1.delay(100ms);
|
|
||||||
event1.period(Event::non_periodic);
|
|
||||||
event1.post()
|
|
||||||
|
|
||||||
queue.dispatch(800);
|
event1.delay(10ms);
|
||||||
|
event1.period(events::non_periodic);
|
||||||
|
event1.post();
|
||||||
|
|
||||||
// Wait 1000ms and check the event execution status
|
period_tests_queue.dispatch(80);
|
||||||
wait_us(1000 * 1000)
|
|
||||||
|
// Wait 100ms and check the event execution status
|
||||||
|
wait_us(100 * 1000);
|
||||||
|
|
||||||
// Event should only have been dispatched once and thus counter
|
// Event should only have been dispatched once and thus counter
|
||||||
// should be 1
|
// should be 1
|
||||||
TEST_ASSERT_EQUAL(1, event_period.counter);
|
TEST_ASSERT_EQUAL(1, update_counter);
|
||||||
|
|
||||||
// Test an event with an invalid -ve period.
|
// Test an event with an invalid negative period value.
|
||||||
|
|
||||||
event_period.counter = 0;
|
update_counter = 0;
|
||||||
Event<void(int)> event2(&queue, &event_period::f0);
|
|
||||||
event2.delay(100ms);
|
Event<void()> event2(&period_tests_queue, handler);
|
||||||
|
|
||||||
|
event2.delay(10ms);
|
||||||
event2.period(-10ms);
|
event2.period(-10ms);
|
||||||
event2.post()
|
event2.post();
|
||||||
|
|
||||||
queue.dispatch(800);
|
period_tests_queue.dispatch(80);
|
||||||
|
|
||||||
// Wait 1000ms and check the event execution status
|
// Wait 100ms and check the event execution status
|
||||||
wait_us(1000 * 1000)
|
wait_us(100 * 1000);
|
||||||
|
|
||||||
// Event should default to non_periodic and thus only have been
|
// Event should default to non_periodic and thus only have been
|
||||||
// dispatched once. Counter should be 1.
|
// dispatched once. Counter should be 1.
|
||||||
TEST_ASSERT_EQUAL(1, event_period.counter);
|
TEST_ASSERT_EQUAL(1, update_counter);
|
||||||
|
|
||||||
// Test an event with a zero period.
|
// Test an event with a zero period.
|
||||||
|
|
||||||
event_period.counter = 0;
|
update_counter = 0;
|
||||||
Event<void(int)> event3(&queue, &event_period::f0);
|
|
||||||
event3.delay(100ms);
|
Event<void()> event3(&period_tests_queue, handler);
|
||||||
|
|
||||||
|
event3.delay(10ms);
|
||||||
event3.period(0ms);
|
event3.period(0ms);
|
||||||
event3.post()
|
event3.post();
|
||||||
|
|
||||||
queue.dispatch(800);
|
period_tests_queue.dispatch(80);
|
||||||
|
|
||||||
// Wait 1000ms and check the event execution status
|
// Wait 100ms and check the event execution status
|
||||||
wait_us(1000 * 1000)
|
wait_us(100 * 1000);
|
||||||
|
|
||||||
// Event should default to non_periodic and thus only have been
|
// Event should default to non_periodic and thus only have been
|
||||||
// dispatched once. Counter should be 1.
|
// dispatched once. Counter should be 1.
|
||||||
TEST_ASSERT_EQUAL(1, event_period.counter);
|
TEST_ASSERT_EQUAL(1, update_counter);
|
||||||
|
|
||||||
// Test a periodic event ie dispatched a number of times
|
// Test a periodic event ie dispatched a number of times
|
||||||
event_period.counter = 0;
|
update_counter = 0;
|
||||||
Event<void(int)> event4(&queue, &event_period::f0);
|
|
||||||
event4.delay(100ms);
|
|
||||||
event4.period(200ms);
|
|
||||||
event4.post()
|
|
||||||
|
|
||||||
queue.dispatch(800);
|
Event<void()> event4(&period_tests_queue, handler);
|
||||||
|
|
||||||
// Wait 1000ms and check the event execution status
|
event4.delay(10ms);
|
||||||
wait_us(1000 * 1000)
|
event4.period(20ms);
|
||||||
|
event4.post();
|
||||||
|
|
||||||
// The event should be first dispatched after 100ms and then
|
period_tests_queue.dispatch(80);
|
||||||
// every subsequent 200ms until the dispatcher has completed.
|
|
||||||
|
// Wait 100ms and check the event execution status
|
||||||
|
wait_us(100 * 1000);
|
||||||
|
|
||||||
|
// The event should be first dispatched after 10ms and then
|
||||||
|
// every subsequent 20ms until the dispatcher has completed.
|
||||||
// Thus the counter should be incremented after :
|
// Thus the counter should be incremented after :
|
||||||
// 100ms, 300ms, 500ms and 700ms
|
// 10ms, 30ms, 50ms and 70ms
|
||||||
TEST_ASSERT_EQUAL(4, event_period.counter);
|
TEST_ASSERT_EQUAL(4, update_counter);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -611,7 +622,7 @@ const Case cases[] = {
|
||||||
|
|
||||||
Case("Testing time_left", time_left_test),
|
Case("Testing time_left", time_left_test),
|
||||||
Case("Testing mixed dynamic & static events queue", mixed_dynamic_static_events_queue_test),
|
Case("Testing mixed dynamic & static events queue", mixed_dynamic_static_events_queue_test),
|
||||||
Case("Testing static events queue", static_events_queue_test)
|
Case("Testing static events queue", static_events_queue_test),
|
||||||
Case("Testing event period values", event_period_tests)
|
Case("Testing event period values", event_period_tests)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue