From 0dc18f9623ea722352bcc276265a5049f16b7e09 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Mon, 1 Jun 2015 16:45:12 +0300 Subject: [PATCH] Fixed STM32 NuttX driver --- .../driver/include/uavcan_stm32/thread.hpp | 5 +-- .../stm32/driver/src/uc_stm32_thread.cpp | 31 +++++++------------ 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp index d2c6869ddc..1ad2d30716 100644 --- a/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp +++ b/libuavcan_drivers/stm32/driver/include/uavcan_stm32/thread.hpp @@ -58,6 +58,9 @@ public: #elif UAVCAN_STM32_NUTTX +/** + * All bus events are reported as POLLIN. + */ class BusEvent : uavcan::Noncopyable { static const unsigned MaxPollWaiters = 8; @@ -75,8 +78,6 @@ 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); diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp index c24885968d..88fd0b37ed 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp @@ -99,7 +99,13 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup) ret = addPollWaiter(fds); if (ret == 0) { - fds->revents |= fds->events & makePollMask(); + /* + * Two events can be reported via POLLIN: + * - The RX queue is not empty. This event is level-triggered. + * - Transmission complete. This event is edge-triggered. + * FIXME Since TX event is edge-triggered, it can be lost between poll() calls. + */ + fds->revents |= fds->events & ((can_driver_.makeSelectMasks().read == 0) ? 0 : POLLIN); if (fds->revents != 0) { (void)sem_post(fds->sem); @@ -114,26 +120,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,7 +139,7 @@ int BusEvent::removePollWaiter(::pollfd* fds) { if (fds == pollset_[i]) { - pollset_[i] = nullptr; + pollset_[i] = NULL; return 0; } } @@ -201,9 +192,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);