diff --git a/sys/event/event.c b/sys/event/event.c index 96579d0a7d..56c1ae5b94 100644 --- a/sys/event/event.c +++ b/sys/event/event.c @@ -115,14 +115,12 @@ event_t *event_wait(event_queue_t *queue) } #ifdef MODULE_XTIMER -event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout) +static event_t *_wait_timeout(event_queue_t *queue, xtimer_t *timer) { assert(queue); event_t *result; - xtimer_t timer; thread_flags_t flags = 0; - xtimer_set_timeout_flag(&timer, timeout); do { result = event_get(queue); if (result == NULL) { @@ -131,11 +129,27 @@ event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout) } while ((result == NULL) && (flags & THREAD_FLAG_EVENT)); if (result) { - xtimer_remove(&timer); + xtimer_remove(timer); } return result; } + +event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout) +{ + xtimer_t timer; + + xtimer_set_timeout_flag(&timer, timeout); + return _wait_timeout(queue, &timer); +} + +event_t *event_wait_timeout64(event_queue_t *queue, uint64_t timeout) +{ + xtimer_t timer; + + xtimer_set_timeout_flag64(&timer, timeout); + return _wait_timeout(queue, &timer); +} #endif void event_loop(event_queue_t *queue) diff --git a/sys/include/event.h b/sys/include/event.h index 292f64af8c..2814a16347 100644 --- a/sys/include/event.h +++ b/sys/include/event.h @@ -242,6 +242,17 @@ event_t *event_wait(event_queue_t *queue); * @return NULL if timeout expired before an event was posted */ event_t *event_wait_timeout(event_queue_t *queue, uint32_t timeout); + +/** + * @brief Get next event from event queue, blocking until timeout expires + * + * @param[in] queue queue to query for an event + * @param[in] timeout maximum time to wait for an event to be posted in us + * + * @return pointer to next event if event was taken from the queue + * @return NULL if timeout expired before an event was posted + */ +event_t *event_wait_timeout64(event_queue_t *queue, uint64_t timeout); #endif /** diff --git a/tests/event_wait_timeout/main.c b/tests/event_wait_timeout/main.c index 00b76bcb4d..3bf64901fe 100644 --- a/tests/event_wait_timeout/main.c +++ b/tests/event_wait_timeout/main.c @@ -25,6 +25,7 @@ #include "xtimer.h" #include "thread_flags.h" +#define STATIC_TIMEOUT (10U * US_PER_MS) /* 10ms */ #define TIMEOUT (50U * US_PER_MS) /* 50ms */ #define PRIO (THREAD_PRIORITY_MAIN - 5) #define STACKSIZE (THREAD_STACKSIZE_DEFAULT) @@ -80,6 +81,33 @@ int main(void) puts("[FAILED]"); return 1; } + tmp_evt = event_wait_timeout64(&tmp_eq, 0); + if (tmp_evt != NULL) { + puts("[FAILED]"); + return 1; + } + + /* test return in a predefined amount of time */ + puts("waiting for event with 10ms timeout..."); + uint32_t before = xtimer_now_usec(); + tmp_evt = event_wait_timeout(&tmp_eq, STATIC_TIMEOUT); + if (tmp_evt != NULL) { + puts("[FAILED]"); + return 1; + } + uint32_t diff = xtimer_now_usec() - before; + printf("event_wait time out after %"PRIu32"us\n", diff); + + puts("waiting for event with 10ms timeout (using uint64)..."); + uint64_t static_timeout = STATIC_TIMEOUT; + before = xtimer_now_usec(); + tmp_evt = event_wait_timeout64(&tmp_eq, static_timeout); + if (tmp_evt != NULL) { + puts("[FAILED]"); + return 1; + } + diff = xtimer_now_usec() - before; + printf("event_wait time out after %"PRIu32"us\n", diff); thread_create(_stack, sizeof(_stack), PRIO, 0, _cnt_thread, NULL, "cnt"); /* first, wait 155ms -> should lead to 3 timeout wakeups */