From 22787651e699c58b18258a8cb01249b0f5f329cb Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Mon, 1 Jun 2015 13:58:20 +0300 Subject: [PATCH] STM32 NuttX driver: Edge-triggered poll(), sort of fixes #35 --- .../stm32/driver/include/uavcan_stm32/can.hpp | 3 +- .../driver/include/uavcan_stm32/thread.hpp | 14 ++++----- .../stm32/driver/src/uc_stm32_thread.cpp | 30 +++++-------------- 3 files changed, 14 insertions(+), 33 deletions(-) diff --git a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/can.hpp b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/can.hpp index 45e022bf38..170d69b820 100644 --- a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/can.hpp +++ b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/can.hpp @@ -194,8 +194,7 @@ class CanDriver : public uavcan::ICanDriver, uavcan::Noncopyable public: template CanDriver(CanRxItem (&rx_queue_storage)[UAVCAN_STM32_NUM_IFACES][RxQueueCapacity]) - : update_event_(*this) - , if0_(bxcan::Can[0], update_event_, 0, rx_queue_storage[0], RxQueueCapacity) + : if0_(bxcan::Can[0], update_event_, 0, rx_queue_storage[0], RxQueueCapacity) #if UAVCAN_STM32_NUM_IFACES > 1 , if1_(bxcan::Can[1], update_event_, 1, rx_queue_storage[1], RxQueueCapacity) #endif diff --git a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp index d2c6869ddc..5d084d6a94 100644 --- a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp +++ b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp @@ -34,11 +34,9 @@ class BusEvent chibios_rt::CounterSemaphore sem_; public: - BusEvent(CanDriver& can_driver) + BusEvent() : sem_(0) - { - (void)can_driver; - } + { } bool wait(uavcan::MonotonicDuration duration); @@ -58,13 +56,15 @@ public: #elif UAVCAN_STM32_NUTTX +/** + * All bus events are reported as POLLIN. + */ class BusEvent : uavcan::Noncopyable { static const unsigned MaxPollWaiters = 8; ::file_operations file_ops_; ::pollfd* pollset_[MaxPollWaiters]; - CanDriver& can_driver_; bool signal_; static int openTrampoline(::file* filp); @@ -75,15 +75,13 @@ class BusEvent : uavcan::Noncopyable int close(::file* filp); int poll(::file* filp, ::pollfd* fds, bool setup); - unsigned makePollMask() const; - int addPollWaiter(::pollfd* fds); int removePollWaiter(::pollfd* fds); public: static const char* const DevName; - BusEvent(CanDriver& can_driver); + BusEvent(); ~BusEvent(); bool wait(uavcan::MonotonicDuration duration); diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp index c24885968d..4c7c16927e 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp @@ -99,7 +99,7 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup) ret = addPollWaiter(fds); if (ret == 0) { - fds->revents |= fds->events & makePollMask(); + fds->revents |= fds->events & POLLIN; if (fds->revents != 0) { (void)sem_post(fds->sem); @@ -114,26 +114,11 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup) return ret; } -unsigned BusEvent::makePollMask() const -{ - const uavcan::CanSelectMasks select_masks = can_driver_.makeSelectMasks(); - unsigned poll_mask = 0; - if (select_masks.read != 0) - { - poll_mask |= POLLIN; - } - if (select_masks.write != 0) - { - poll_mask |= POLLOUT; - } - return poll_mask; -} - int BusEvent::addPollWaiter(::pollfd* fds) { for (unsigned i = 0; i < MaxPollWaiters; i++) { - if (pollset_[i] == nullptr) + if (pollset_[i] == NULL) { pollset_[i] = fds; return 0; @@ -148,16 +133,15 @@ int BusEvent::removePollWaiter(::pollfd* fds) { if (fds == pollset_[i]) { - pollset_[i] = nullptr; + pollset_[i] = NULL; return 0; } } return -EINVAL; } -BusEvent::BusEvent(CanDriver& can_driver) - : can_driver_(can_driver) - , signal_(false) +BusEvent::BusEvent() + : signal_(false) { std::memset(&file_ops_, 0, sizeof(file_ops_)); std::memset(pollset_, 0, sizeof(pollset_)); @@ -201,9 +185,9 @@ void BusEvent::signalFromInterrupt() for (unsigned i = 0; i < MaxPollWaiters; i++) { ::pollfd* const fd = pollset_[i]; - if (fd != nullptr) + if (fd != NULL) { - fd->revents = fd->events & makePollMask(); + fd->revents |= fd->events & POLLIN; if ((fd->revents != 0) && (fd->sem->semcount <= 0)) { (void)sem_post(fd->sem);