Revert "STM32 NuttX driver: Edge-triggered poll(), sort of fixes #35"

This reverts commit 22787651e6.
This commit is contained in:
Pavel Kirienko
2015-06-01 16:36:02 +03:00
parent 7518172f6e
commit 5442c0ac04
3 changed files with 33 additions and 14 deletions
@@ -194,7 +194,8 @@ class CanDriver : public uavcan::ICanDriver, uavcan::Noncopyable
public: public:
template <unsigned RxQueueCapacity> template <unsigned RxQueueCapacity>
CanDriver(CanRxItem (&rx_queue_storage)[UAVCAN_STM32_NUM_IFACES][RxQueueCapacity]) CanDriver(CanRxItem (&rx_queue_storage)[UAVCAN_STM32_NUM_IFACES][RxQueueCapacity])
: if0_(bxcan::Can[0], update_event_, 0, rx_queue_storage[0], RxQueueCapacity) : update_event_(*this)
, if0_(bxcan::Can[0], update_event_, 0, rx_queue_storage[0], RxQueueCapacity)
#if UAVCAN_STM32_NUM_IFACES > 1 #if UAVCAN_STM32_NUM_IFACES > 1
, if1_(bxcan::Can[1], update_event_, 1, rx_queue_storage[1], RxQueueCapacity) , if1_(bxcan::Can[1], update_event_, 1, rx_queue_storage[1], RxQueueCapacity)
#endif #endif
@@ -34,9 +34,11 @@ class BusEvent
chibios_rt::CounterSemaphore sem_; chibios_rt::CounterSemaphore sem_;
public: public:
BusEvent() BusEvent(CanDriver& can_driver)
: sem_(0) : sem_(0)
{ } {
(void)can_driver;
}
bool wait(uavcan::MonotonicDuration duration); bool wait(uavcan::MonotonicDuration duration);
@@ -56,15 +58,13 @@ public:
#elif UAVCAN_STM32_NUTTX #elif UAVCAN_STM32_NUTTX
/**
* All bus events are reported as POLLIN.
*/
class BusEvent : uavcan::Noncopyable class BusEvent : uavcan::Noncopyable
{ {
static const unsigned MaxPollWaiters = 8; static const unsigned MaxPollWaiters = 8;
::file_operations file_ops_; ::file_operations file_ops_;
::pollfd* pollset_[MaxPollWaiters]; ::pollfd* pollset_[MaxPollWaiters];
CanDriver& can_driver_;
bool signal_; bool signal_;
static int openTrampoline(::file* filp); static int openTrampoline(::file* filp);
@@ -75,13 +75,15 @@ class BusEvent : uavcan::Noncopyable
int close(::file* filp); int close(::file* filp);
int poll(::file* filp, ::pollfd* fds, bool setup); int poll(::file* filp, ::pollfd* fds, bool setup);
unsigned makePollMask() const;
int addPollWaiter(::pollfd* fds); int addPollWaiter(::pollfd* fds);
int removePollWaiter(::pollfd* fds); int removePollWaiter(::pollfd* fds);
public: public:
static const char* const DevName; static const char* const DevName;
BusEvent(); BusEvent(CanDriver& can_driver);
~BusEvent(); ~BusEvent();
bool wait(uavcan::MonotonicDuration duration); bool wait(uavcan::MonotonicDuration duration);
@@ -99,7 +99,7 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup)
ret = addPollWaiter(fds); ret = addPollWaiter(fds);
if (ret == 0) if (ret == 0)
{ {
fds->revents |= fds->events & POLLIN; fds->revents |= fds->events & makePollMask();
if (fds->revents != 0) if (fds->revents != 0)
{ {
(void)sem_post(fds->sem); (void)sem_post(fds->sem);
@@ -114,11 +114,26 @@ int BusEvent::poll(::file* filp, ::pollfd* fds, bool setup)
return ret; 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) int BusEvent::addPollWaiter(::pollfd* fds)
{ {
for (unsigned i = 0; i < MaxPollWaiters; i++) for (unsigned i = 0; i < MaxPollWaiters; i++)
{ {
if (pollset_[i] == NULL) if (pollset_[i] == nullptr)
{ {
pollset_[i] = fds; pollset_[i] = fds;
return 0; return 0;
@@ -133,15 +148,16 @@ int BusEvent::removePollWaiter(::pollfd* fds)
{ {
if (fds == pollset_[i]) if (fds == pollset_[i])
{ {
pollset_[i] = NULL; pollset_[i] = nullptr;
return 0; return 0;
} }
} }
return -EINVAL; return -EINVAL;
} }
BusEvent::BusEvent() BusEvent::BusEvent(CanDriver& can_driver)
: signal_(false) : can_driver_(can_driver)
, signal_(false)
{ {
std::memset(&file_ops_, 0, sizeof(file_ops_)); std::memset(&file_ops_, 0, sizeof(file_ops_));
std::memset(pollset_, 0, sizeof(pollset_)); std::memset(pollset_, 0, sizeof(pollset_));
@@ -185,9 +201,9 @@ void BusEvent::signalFromInterrupt()
for (unsigned i = 0; i < MaxPollWaiters; i++) for (unsigned i = 0; i < MaxPollWaiters; i++)
{ {
::pollfd* const fd = pollset_[i]; ::pollfd* const fd = pollset_[i];
if (fd != NULL) if (fd != nullptr)
{ {
fd->revents |= fd->events & POLLIN; fd->revents = fd->events & makePollMask();
if ((fd->revents != 0) && (fd->sem->semcount <= 0)) if ((fd->revents != 0) && (fd->sem->semcount <= 0))
{ {
(void)sem_post(fd->sem); (void)sem_post(fd->sem);