Refactored TransferListener - all logic moved into non-generic subclass and implemented in *.cpp

This commit is contained in:
Pavel Kirienko
2014-04-09 15:06:27 +04:00
parent a8e0037363
commit 311ae8dca1
3 changed files with 78 additions and 82 deletions
@@ -74,6 +74,27 @@ int MultiFrameIncomingTransfer::read(unsigned offset, uint8_t* data, unsigned le
return tbb->read(offset, data, len);
}
/*
* TransferListenerBase::TimedOutReceiverPredicate
*/
bool TransferListenerBase::TimedOutReceiverPredicate::operator()(const TransferBufferManagerKey& key,
const TransferReceiver& value) const
{
if (value.isTimedOut(ts_))
{
UAVCAN_TRACE("TransferListener", "Timed out receiver: %s", key.toString().c_str());
/*
* TransferReceivers do not own their buffers - this helps the Map<> container to copy them
* around quickly and safely (using default assignment operator). Downside is that we need to
* destroy the buffers manually.
* Maybe it is not good that the predicate has side effects, but I ran out of better ideas.
*/
bufmgr_.remove(key);
return true;
}
return false;
}
/*
* TransferListenerBase
*/
@@ -151,4 +172,34 @@ void TransferListenerBase::handleReception(TransferReceiver& receiver, const RxF
}
}
void TransferListenerBase::cleanup(MonotonicTime ts)
{
receivers_.removeWhere(TimedOutReceiverPredicate(ts, bufmgr_));
assert(receivers_.isEmpty() ? bufmgr_.isEmpty() : 1);
}
void TransferListenerBase::handleFrame(const RxFrame& frame)
{
const TransferBufferManagerKey key(frame.getSrcNodeID(), frame.getTransferType());
TransferReceiver* recv = receivers_.access(key);
if (recv == NULL)
{
if (!frame.isFirst())
{
return;
}
TransferReceiver new_recv;
recv = receivers_.insert(key, new_recv);
if (recv == NULL)
{
UAVCAN_TRACE("TransferListener", "Receiver registration failed; frame %s", frame.toString().c_str());
return;
}
}
TransferBufferAccessor tba(bufmgr_, key);
handleReception(*recv, frame, tba);
}
}