From 476c02c139bed2dad4d0756ce18ea56ae6a8c618 Mon Sep 17 00:00:00 2001 From: cinsights Date: Thu, 31 Dec 2020 10:39:19 +0000 Subject: [PATCH] Add new get/set flags and dispatch function to Events git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@14009 27425a3e-05d8-49a3-a47f-9c15f0e5edd8 --- os/rt/include/chevents.h | 18 ++++++++++++++++++ os/rt/src/chevents.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/os/rt/include/chevents.h b/os/rt/include/chevents.h index 46546af51..d146eb865 100644 --- a/os/rt/include/chevents.h +++ b/os/rt/include/chevents.h @@ -82,10 +82,25 @@ typedef struct event_source { */ typedef void (*evhandler_t)(eventid_t id); +/** + * @brief Event Handler extended dispatch function. + */ +typedef void (*evtdispatch_t)(eventid_t id, void* user); + /*===========================================================================*/ /* Module macros. */ /*===========================================================================*/ +/** + * @brief Get listener mask. + */ +#define chEvtGetListenerMaskX(elp) ((elp)->wflags) + +/** + * @brief Set listener mask. + */ +#define chEvtSetListenerMaskX(elp, flags) ((elp)->wflags = (flags)) + /** * @brief All events allowed mask. */ @@ -135,6 +150,9 @@ extern "C" { void chEvtBroadcastFlags(event_source_t *esp, eventflags_t flags); void chEvtBroadcastFlagsI(event_source_t *esp, eventflags_t flags); void chEvtDispatch(const evhandler_t *handlers, eventmask_t events); + void chEvtUserDispatch(const evtdispatch_t *handlers, + eventmask_t events, + void* user); #if (CH_CFG_OPTIMIZE_SPEED == TRUE) || (CH_CFG_USE_EVENTS_TIMEOUT == FALSE) eventmask_t chEvtWaitOne(eventmask_t events); eventmask_t chEvtWaitAny(eventmask_t events); diff --git a/os/rt/src/chevents.c b/os/rt/src/chevents.c index e3bbe5abf..5e262d196 100644 --- a/os/rt/src/chevents.c +++ b/os/rt/src/chevents.c @@ -379,6 +379,34 @@ void chEvtDispatch(const evhandler_t *handlers, eventmask_t events) { } } +/** + * @brief Invokes event handlers associated with event flags mask with + * optional user data. + * + * @param[in] handlers an array of @p evtdispatch_t. The array must have size + * equal to the number of bits in @p eventmask_t. + * @param[in] events mask of events to be dispatched + * @param[in] user user defined field (normally pointer to data) + * . + * @api + */ +void chEvtUserDispatch(const evtdispatch_t *handlers, + eventmask_t events, void* user) { + eventid_t eid; + + chDbgCheck(handlers != NULL); + + eid = (eventid_t)0; + while (events != (eventmask_t)0) { + if ((events & EVENT_MASK(eid)) != (eventmask_t)0) { + chDbgAssert(handlers[eid] != NULL, "null handler"); + events &= ~EVENT_MASK(eid); + handlers[eid](eid, user); + } + eid++; + } +} + #if (CH_CFG_OPTIMIZE_SPEED == TRUE) || \ (CH_CFG_USE_EVENTS_TIMEOUT == FALSE) || \ defined(__DOXYGEN__)