diff --git a/libraries/AP_HAL_ChibiOS/EventSource.cpp b/libraries/AP_HAL_ChibiOS/EventSource.cpp new file mode 100644 index 00000000000..7409baba0f3 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/EventSource.cpp @@ -0,0 +1,34 @@ +#include "EventSource.h" +#include + +using namespace ChibiOS; + +#if CH_CFG_USE_EVENTS == TRUE + +bool EventSource::wait(uint64_t duration, AP_HAL::EventHandle *evt_handle) +{ + chibios_rt::EventListener evt_listener; + eventmask_t evt_mask = evt_handle->get_evt_mask(); + msg_t ret = msg_t(); + ch_evt_src_.registerMask(&evt_listener, evt_mask); + if (duration == 0) { + ret = chEvtWaitAnyTimeout(evt_mask, TIME_IMMEDIATE); + } else { + ret = chEvtWaitAnyTimeout(evt_mask, chTimeUS2I(duration)); + } + ch_evt_src_.unregister(&evt_listener); + return ret == MSG_OK; +} + +void EventSource::signal(uint32_t evt_mask) +{ + ch_evt_src_.broadcastFlags(evt_mask); +} + +void EventSource::signalI(uint32_t evt_mask) +{ + chSysLockFromISR(); + ch_evt_src_.broadcastFlagsI(evt_mask); + chSysUnlockFromISR(); +} +#endif diff --git a/libraries/AP_HAL_ChibiOS/EventSource.h b/libraries/AP_HAL_ChibiOS/EventSource.h new file mode 100644 index 00000000000..a3b497b9313 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/EventSource.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include +#include "AP_HAL_ChibiOS_Namespace.h" +#include + +#if CH_CFG_USE_EVENTS == TRUE +class ChibiOS::EventSource : public AP_HAL::EventSource { + // Single event source to be shared across multiple users + chibios_rt::EventSource ch_evt_src_; + +public: + // generate event from thread context + void signal(uint32_t evt_mask) override; + + // generate event from interrupt context + void signalI(uint32_t evt_mask) override; + + // Wait on an Event handle, method for internal use by EventHandle + bool wait(uint64_t duration, AP_HAL::EventHandle* evt_handle) override; +}; +#endif