From 7929efec0d4e2990c77d71a195701450601f0734 Mon Sep 17 00:00:00 2001 From: Siddharth Purohit Date: Sun, 31 May 2020 17:50:46 +0530 Subject: [PATCH] HAL_ChibiOS: add EventSource HAL --- libraries/AP_HAL_ChibiOS/EventSource.cpp | 34 ++++++++++++++++++++++++ libraries/AP_HAL_ChibiOS/EventSource.h | 25 +++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 libraries/AP_HAL_ChibiOS/EventSource.cpp create mode 100644 libraries/AP_HAL_ChibiOS/EventSource.h 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