19 return -ErrInvalidParam;
39 return -ErrInvalidParam;
45 if ((offset + len) >
size_)
50 (void)
copy(data, data + len,
data_ + offset);
70 (void)
snprintf(buf,
sizeof(buf),
"nid=%i tt=%i",
int(node_id_.get()),
int(transfer_type_));
71 return std::string(buf);
86 return new (praw)
Block;
100 unsigned& total_offset,
unsigned& left_to_read)
103 for (
unsigned i = 0; (i < Block::Size) && (left_to_read > 0); i++, total_offset++)
105 if (total_offset >= target_offset)
114 unsigned& total_offset,
unsigned& left_to_write)
117 for (
unsigned i = 0; (i < Block::Size) && (left_to_write > 0); i++, total_offset++)
119 if (total_offset >= target_offset)
156 return -ErrInvalidParam;
169 unsigned total_offset = 0;
170 unsigned left_to_read = len;
172 Block* p = blocks_.get();
175 p->
read(outptr, offset, total_offset, left_to_read);
176 if (left_to_read == 0)
192 return -ErrInvalidParam;
195 if (offset >= max_size_)
199 if ((offset + len) > max_size_)
201 len = max_size_ - offset;
205 unsigned total_offset = 0;
206 unsigned left_to_write = len;
208 Block* p = blocks_.get();
214 last_written_block = p;
215 p->
write(inptr, offset, total_offset, left_to_write);
216 if (left_to_write == 0)
224 while (left_to_write > 0)
230 Block* new_block = Block::instantiate(allocator_);
244 blocks_.insert(new_block);
246 last_written_block = new_block;
249 new_block->
write(inptr, offset, total_offset, left_to_write);
253 const unsigned actually_written = len - left_to_write;
255 return int(actually_written);
262 Block* p = blocks_.get();
267 Block::destroy(p, allocator_);
296 buffers_.remove(dyn);
309 return findFirst(key);
327 buffers_.insert(tbme);
329 UAVCAN_TRACE(
"TransferBufferManager",
"Buffer created [num=%u], %s", getNumBuffers(), key.toString().c_str());
346 UAVCAN_TRACE(
"TransferBufferManager",
"Buffer deleted, %s", key.toString().c_str());
347 buffers_.remove(dyn);
354 return getNumBuffers() == 0;
359 return buffers_.getLength();
static TransferBufferManagerEntry * instantiate(IPoolAllocator &allocator, uint16_t max_size)
virtual void deallocate(const void *ptr)=0
virtual int write(unsigned offset, const uint8_t *data, unsigned len)
ITransferBuffer * create(const TransferBufferManagerKey &key)
void setNextListNode(T *node)
void write(const uint8_t *&inptr, unsigned target_offset, unsigned &total_offset, unsigned &left_to_write)
void reset(const TransferBufferManagerKey &key=TransferBufferManagerKey())
const TransferBufferManagerKey & getKey() const
TransferBufferManagerEntry * findFirst(const TransferBufferManagerKey &key)
virtual int read(unsigned offset, uint8_t *data, unsigned len) const
virtual int read(unsigned offset, uint8_t *data, unsigned len) const
#define UAVCAN_TRACE(...)
UAVCAN_EXPORT void fill(ForwardIt first, ForwardIt last, const T &value)
static void destroy(TransferBufferManagerEntry *&obj, IPoolAllocator &allocator)
static std::string toString(long x)
T * getNextListNode() const
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
UAVCAN_EXPORT const T & max(const T &a, const T &b)
unsigned getNumBuffers() const
static Block * instantiate(IPoolAllocator &allocator)
virtual ~TransferBufferManagerEntry()
virtual void * allocate(std::size_t size)=0
void remove(const TransferBufferManagerKey &key)
void read(uint8_t *&outptr, unsigned target_offset, unsigned &total_offset, unsigned &left_to_read)
static void destroy(Block *&obj, IPoolAllocator &allocator)
int snprintf(char *out, std::size_t maxlen, const char *format,...)
ITransferBuffer * access(const TransferBufferManagerKey &key)
virtual int write(unsigned offset, const uint8_t *data, unsigned len)