From 7c4902deb56844904d946bcbca49b0beb6c16bf4 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Thu, 20 Feb 2014 14:06:09 +0400 Subject: [PATCH] StaticTransferBuffer extracted for standalone usage --- .../internal/transport/transfer_buffer.hpp | 60 ++++++++++++++----- libuavcan/test/transport/transfer_buffer.cpp | 4 +- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp index fbb77e68bd..6373089133 100644 --- a/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp +++ b/libuavcan/include/uavcan/internal/transport/transfer_buffer.hpp @@ -142,22 +142,14 @@ public: #pragma pack(pop) /** - * Statically allocated storage + * Standalone static buffer */ template -class StaticTransferBuffer : public TransferBufferManagerEntry +class StaticTransferBuffer : public ITransferBuffer { uint8_t data_[SIZE]; unsigned int max_write_pos_; - void resetImpl() - { - max_write_pos_ = 0; -#if UAVCAN_DEBUG - std::fill(data_, data_ + SIZE, 0); -#endif - } - public: StaticTransferBuffer() : max_write_pos_(0) @@ -199,6 +191,42 @@ public: return len; } + void reset() + { + max_write_pos_ = 0; +#if UAVCAN_DEBUG + std::fill(data_, data_ + SIZE, 0); +#endif + } + + uint8_t* getRawPtr() { return data_; } + void setMaxWritePos(unsigned int value) { max_write_pos_ = value; } +}; + +/** + * Statically allocated storage for buffer manager + */ +template +class StaticTransferBufferManagerEntry : public TransferBufferManagerEntry +{ + StaticTransferBuffer buf_; + + void resetImpl() + { + buf_.reset(); + } + +public: + int read(unsigned int offset, uint8_t* data, unsigned int len) const + { + return buf_.read(offset, data, len); + } + + int write(unsigned int offset, const uint8_t* data, unsigned int len) + { + return buf_.write(offset, data, len); + } + bool migrateFrom(const TransferBufferManagerEntry* tbme) { if (tbme == NULL || tbme->isEmpty()) @@ -208,14 +236,14 @@ public: } // Resetting self and moving all data from the source - reset(tbme->getKey()); - const int res = tbme->read(0, data_, SIZE); + TransferBufferManagerEntry::reset(tbme->getKey()); + const int res = tbme->read(0, buf_.getRawPtr(), SIZE); if (res < 0) { - reset(); + TransferBufferManagerEntry::reset(); return false; } - max_write_pos_ = res; + buf_.setMaxWritePos(res); if (res < int(SIZE)) return true; @@ -223,7 +251,7 @@ public: uint8_t dummy = 0; if (tbme->read(SIZE, &dummy, 1) > 0) { - reset(); // Damn, the buffer was too large + TransferBufferManagerEntry::reset(); // Damn, the buffer was too large return false; } return true; @@ -268,7 +296,7 @@ public: template class TransferBufferManager : public ITransferBufferManager, Noncopyable { - typedef StaticTransferBuffer StaticBufferType; + typedef StaticTransferBufferManagerEntry StaticBufferType; StaticBufferType static_buffers_[NUM_STATIC_BUFS]; LinkedListRoot dynamic_buffers_; diff --git a/libuavcan/test/transport/transfer_buffer.cpp b/libuavcan/test/transport/transfer_buffer.cpp index e7a0151225..b74a040051 100644 --- a/libuavcan/test/transport/transfer_buffer.cpp +++ b/libuavcan/test/transport/transfer_buffer.cpp @@ -85,8 +85,8 @@ static const int TEST_BUFFER_SIZE = 200; TEST(StaticTransferBuffer, Basic) { - using uavcan::StaticTransferBuffer; - StaticTransferBuffer buf; + using uavcan::StaticTransferBufferManagerEntry; + StaticTransferBufferManagerEntry buf; uint8_t local_buffer[TEST_BUFFER_SIZE * 2]; const uint8_t* const test_data_ptr = reinterpret_cast(TEST_DATA.c_str());