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:
parent
deb7ff5cc8
commit
476c02c139
|
@ -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);
|
||||
|
|
|
@ -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__)
|
||||
|
|
Loading…
Reference in New Issue