TransferListener implemented and tested

This commit is contained in:
Pavel Kirienko
2014-02-13 13:01:08 +04:00
parent f78a2a452c
commit 2d2116f624
8 changed files with 584 additions and 83 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ namespace uavcan
/**
* Slow but memory efficient KV container.
* Type requirements:
* Both key and value must be copyable and default constructible.
* Both key and value must be copyable, assignable and default constructible.
* Key must implement a comparison operator.
* Key's default constructor must initialize the object into invalid state.
* Size of Key + Value + padding must not exceed MEM_POOL_BLOCK_SIZE.
@@ -17,7 +17,7 @@ namespace uavcan
class Crc16
{
static const uint16_t TABLE[256];
uint_fast16_t value_;
uint16_t value_;
public:
Crc16()
@@ -383,6 +383,13 @@ public:
if (dyn == NULL)
return NULL; // Epic fail.
dynamic_buffers_.insert(dyn);
UAVCAN_TRACE("TransferBufferManager", "Dynamic buffer created [st=%u, dyn=%u], %s",
getNumStaticBuffers(), getNumDynamicBuffers(), key.toString().c_str());
}
else
{
UAVCAN_TRACE("TransferBufferManager", "Static buffer created [st=%u, dyn=%u], %s",
getNumStaticBuffers(), getNumDynamicBuffers(), key.toString().c_str());
}
if (tbme)
@@ -400,6 +407,7 @@ public:
TransferBufferManagerEntry* const tbme = findFirstStatic(key);
if (tbme)
{
UAVCAN_TRACE("TransferBufferManager", "Static buffer deleted, %s", key.toString().c_str());
tbme->reset();
optimizeStorage();
return;
@@ -408,6 +416,7 @@ public:
DynamicTransferBuffer* dyn = findFirstDynamic(key);
if (dyn)
{
UAVCAN_TRACE("TransferBufferManager", "Dynamic buffer deleted, %s", key.toString().c_str());
dynamic_buffers_.remove(dyn);
DynamicTransferBuffer::destroy(dyn, allocator_);
}
@@ -113,7 +113,7 @@ public:
* This class should be derived by transfer receivers (subscribers, servers, callers).
*/
template <unsigned int MAX_BUF_SIZE, unsigned int NUM_STATIC_BUFS, unsigned int NUM_STATIC_RECEIVERS>
class TransferListener : protected TransferListenerBase, Noncopyable
class TransferListener : public TransferListenerBase, Noncopyable
{
typedef TransferBufferManager<MAX_BUF_SIZE, NUM_STATIC_BUFS> BufferManager;
BufferManager bufmgr_;
@@ -186,7 +186,9 @@ public:
: TransferListenerBase(data_type)
, bufmgr_(allocator)
, receivers_(allocator)
{ }
{
StaticAssert<(NUM_STATIC_RECEIVERS >= NUM_STATIC_BUFS)>::check(); // Otherwise it would be meaningless
}
~TransferListener()
{
@@ -46,8 +46,6 @@ private:
bool writePayload(const RxFrame& frame, TransferBufferBase& buf);
ResultCode receive(const RxFrame& frame, TransferBufferAccessor& tba);
TransferReceiver(const TransferReceiver&); // = delete (not needed)
public:
TransferReceiver()
: prev_transfer_ts_monotonic_(0)