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
This commit is contained in:
cinsights 2020-12-31 10:39:19 +00:00
parent deb7ff5cc8
commit 476c02c139
2 changed files with 46 additions and 0 deletions

View File

@ -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);

View File

@ -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__)