transfer_buffer.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_TRANSPORT_TRANSFER_BUFFER_HPP_INCLUDED
6 #define UAVCAN_TRANSPORT_TRANSFER_BUFFER_HPP_INCLUDED
7 
8 #include <uavcan/std.hpp>
9 #include <uavcan/error.hpp>
14 #include <uavcan/build_config.hpp>
15 #include <uavcan/debug.hpp>
16 
17 namespace uavcan
18 {
23 {
24  uint8_t* const data_;
25  const uint16_t size_;
27 
28 public:
30  data_(buf),
31  size_(buf_size),
33  { }
34 
35  virtual int read(unsigned offset, uint8_t* data, unsigned len) const;
36  virtual int write(unsigned offset, const uint8_t* data, unsigned len);
37 
38  void reset();
39 
40  uint16_t getSize() const { return size_; }
41 
42  uint8_t* getRawPtr() { return data_; }
43  const uint8_t* getRawPtr() const { return data_; }
44 
46  void setMaxWritePos(uint16_t value) { max_write_pos_ = value; }
47 };
48 
49 template <uint16_t Size>
51 {
52  uint8_t buffer_[Size];
53 public:
55  {
56  StaticAssert<(Size > 0)>::check();
57  }
58 };
59 
64 {
67 
68 public:
70  : transfer_type_(TransferType(0))
71  {
72  UAVCAN_ASSERT(isEmpty());
73  }
74 
76  : node_id_(node_id)
77  , transfer_type_(ttype)
78  {
79  UAVCAN_ASSERT(!isEmpty());
80  }
81 
82  bool operator==(const TransferBufferManagerKey& rhs) const
83  {
84  return node_id_ == rhs.node_id_ && transfer_type_ == rhs.transfer_type_;
85  }
86 
87  bool isEmpty() const { return !node_id_.isValid(); }
88 
89  NodeID getNodeID() const { return node_id_; }
90  TransferType getTransferType() const { return TransferType(transfer_type_); }
91 
92 #if UAVCAN_TOSTRING
93  std::string toString() const;
94 #endif
95 };
96 
103  , public LinkedListNode<TransferBufferManagerEntry>
104 {
105  struct Block : LinkedListNode<Block>
106  {
107  enum { Size = MemPoolBlockSize - sizeof(LinkedListNode<Block>) };
108  uint8_t data[static_cast<unsigned>(Size)];
109 
110  static Block* instantiate(IPoolAllocator& allocator);
111  static void destroy(Block*& obj, IPoolAllocator& allocator);
112 
113  void read(uint8_t*& outptr, unsigned target_offset,
114  unsigned& total_offset, unsigned& left_to_read);
115  void write(const uint8_t*& inptr, unsigned target_offset,
116  unsigned& total_offset, unsigned& left_to_write);
117  };
118 
120  LinkedListRoot<Block> blocks_; // Blocks are ordered from lower to higher buffer offset
124 
125 public:
127  allocator_(allocator),
128  max_write_pos_(0),
129  max_size_(max_size)
130  {
131  StaticAssert<(Block::Size > 8)>::check();
134  }
135 
136  virtual ~TransferBufferManagerEntry() { reset(); }
137 
138  static TransferBufferManagerEntry* instantiate(IPoolAllocator& allocator, uint16_t max_size);
139  static void destroy(TransferBufferManagerEntry*& obj, IPoolAllocator& allocator);
140 
141  virtual int read(unsigned offset, uint8_t* data, unsigned len) const;
142  virtual int write(unsigned offset, const uint8_t* data, unsigned len);
143 
144  void reset(const TransferBufferManagerKey& key = TransferBufferManagerKey());
145 
146  const TransferBufferManagerKey& getKey() const { return key_; }
147  bool isEmpty() const { return key_.isEmpty(); }
148 };
149 
154 {
158 
160 
161 public:
162  TransferBufferManager(uint16_t max_buf_size, IPoolAllocator& allocator) :
163  allocator_(allocator),
164  max_buf_size_(max_buf_size)
165  { }
166 
168 
171  void remove(const TransferBufferManagerKey& key);
172  bool isEmpty() const;
173 
174  unsigned getNumBuffers() const;
175 };
176 
181 {
184 
185 public:
187  bufmgr_(bufmgr),
188  key_(key)
189  {
190  UAVCAN_ASSERT(!key.isEmpty());
191  }
192  ITransferBuffer* access() { return bufmgr_.access(key_); }
193  ITransferBuffer* create() { return bufmgr_.create(key_); }
194  void remove() { bufmgr_.remove(key_); }
195 };
196 
197 }
198 
199 #endif // UAVCAN_TRANSPORT_TRANSFER_BUFFER_HPP_INCLUDED
check
ROSCPP_DECL bool check()
uavcan::TransferBufferAccessor::create
ITransferBuffer * create()
Definition: transfer_buffer.hpp:193
uavcan::TransferBufferAccessor::access
ITransferBuffer * access()
Definition: transfer_buffer.hpp:192
uavcan::StaticTransferBufferImpl::data_
uint8_t *const data_
Definition: transfer_buffer.hpp:24
uavcan::TransferBufferAccessor::bufmgr_
TransferBufferManager & bufmgr_
Definition: transfer_buffer.hpp:182
uavcan::Noncopyable
Definition: templates.hpp:46
uavcan::NodeID::isValid
bool isValid() const
Definition: transfer.hpp:134
uavcan::TransferBufferManagerEntry::allocator_
IPoolAllocator & allocator_
Definition: transfer_buffer.hpp:119
uavcan::StaticTransferBufferImpl
Definition: transfer_buffer.hpp:22
debug.hpp
uavcan::TransferBufferManagerKey::TransferBufferManagerKey
TransferBufferManagerKey()
Definition: transfer_buffer.hpp:69
uavcan::StaticTransferBufferImpl::reset
void reset()
Definition: uc_transfer_buffer.cpp:55
uavcan::ITransferBuffer
Definition: abstract_transfer_buffer.hpp:16
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::TransferType
TransferType
Definition: transfer.hpp:18
uavcan::TransferBufferManager::buffers_
LinkedListRoot< TransferBufferManagerEntry > buffers_
Definition: transfer_buffer.hpp:155
dynamic_memory.hpp
uavcan::TransferBufferManagerKey::transfer_type_
uint8_t transfer_type_
Definition: transfer_buffer.hpp:66
uavcan::TransferBufferManager::create
ITransferBuffer * create(const TransferBufferManagerKey &key)
Definition: uc_transfer_buffer.cpp:312
uavcan::StaticAssert
struct UAVCAN_EXPORT StaticAssert
Definition: templates.hpp:29
std.hpp
uavcan::TransferBufferAccessor
Definition: transfer_buffer.hpp:180
uavcan::uint16_t
std::uint16_t uint16_t
Definition: std.hpp:25
uavcan::TransferBufferManagerKey
Definition: transfer_buffer.hpp:63
uavcan::TransferBufferManager::findFirst
TransferBufferManagerEntry * findFirst(const TransferBufferManagerKey &key)
Definition: uc_transfer_buffer.cpp:275
uavcan::TransferBufferManagerKey::getNodeID
NodeID getNodeID() const
Definition: transfer_buffer.hpp:89
uavcan::TransferBufferManagerKey::TransferBufferManagerKey
TransferBufferManagerKey(NodeID node_id, TransferType ttype)
Definition: transfer_buffer.hpp:75
uavcan::TransferBufferManager::remove
void remove(const TransferBufferManagerKey &key)
Definition: uc_transfer_buffer.cpp:339
uavcan::TransferBufferManagerEntry
Definition: transfer_buffer.hpp:102
uavcan::StaticTransferBufferImpl::write
virtual int write(unsigned offset, const uint8_t *data, unsigned len)
Definition: uc_transfer_buffer.cpp:34
uavcan::IsDynamicallyAllocatable::check
static void check()
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:246
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
frame.hpp
uavcan::TransferBufferManagerEntry::getKey
const TransferBufferManagerKey & getKey() const
Definition: transfer_buffer.hpp:146
uavcan::TransferBufferManagerEntry::~TransferBufferManagerEntry
virtual ~TransferBufferManagerEntry()
Definition: transfer_buffer.hpp:136
uavcan::TransferBufferManager::allocator_
IPoolAllocator & allocator_
Definition: transfer_buffer.hpp:156
uavcan::TransferBufferManagerKey::isEmpty
bool isEmpty() const
Definition: transfer_buffer.hpp:87
uavcan::IPoolAllocator
Definition: dynamic_memory.hpp:21
uavcan::TransferBufferManager
Definition: transfer_buffer.hpp:153
uavcan::StaticTransferBufferImpl::getMaxWritePos
uint16_t getMaxWritePos() const
Definition: transfer_buffer.hpp:45
toString
static std::string toString(long x)
Definition: multiset.cpp:16
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::StaticTransferBuffer
Definition: transfer_buffer.hpp:50
uavcan::TransferBufferAccessor::key_
const TransferBufferManagerKey key_
Definition: transfer_buffer.hpp:183
uavcan::TransferBufferManager::~TransferBufferManager
~TransferBufferManager()
Definition: uc_transfer_buffer.cpp:290
uavcan::TransferBufferManagerEntry::TransferBufferManagerEntry
TransferBufferManagerEntry(IPoolAllocator &allocator, uint16_t max_size)
Definition: transfer_buffer.hpp:126
build_config.hpp
abstract_transfer_buffer.hpp
uavcan::TransferBufferManager::getNumBuffers
unsigned getNumBuffers() const
Definition: uc_transfer_buffer.cpp:357
uavcan::StaticTransferBufferImpl::StaticTransferBufferImpl
StaticTransferBufferImpl(uint8_t *buf, uint16_t buf_size)
Definition: transfer_buffer.hpp:29
uavcan::StaticTransferBufferImpl::setMaxWritePos
void setMaxWritePos(uint16_t value)
Definition: transfer_buffer.hpp:46
uavcan::MemPoolBlockSize
static const unsigned MemPoolBlockSize
Safe default that should be OK for any platform.
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:228
uavcan::StaticTransferBuffer::StaticTransferBuffer
StaticTransferBuffer()
Definition: transfer_buffer.hpp:54
linked_list.hpp
uavcan::TransferBufferManagerEntry::blocks_
LinkedListRoot< Block > blocks_
Definition: transfer_buffer.hpp:120
uavcan::TransferBufferManagerEntry::max_size_
const uint16_t max_size_
Definition: transfer_buffer.hpp:122
uavcan::StaticTransferBufferImpl::getRawPtr
uint8_t * getRawPtr()
Definition: transfer_buffer.hpp:42
uavcan::LinkedListRoot
Definition: linked_list.hpp:44
uavcan::TransferBufferManagerEntry::max_write_pos_
uint16_t max_write_pos_
Definition: transfer_buffer.hpp:121
uavcan::TransferBufferManagerKey::node_id_
NodeID node_id_
Definition: transfer_buffer.hpp:65
uavcan::TransferBufferManager::isEmpty
bool isEmpty() const
Definition: uc_transfer_buffer.cpp:352
uavcan::TransferBufferManager::TransferBufferManager
TransferBufferManager(uint16_t max_buf_size, IPoolAllocator &allocator)
Definition: transfer_buffer.hpp:162
uavcan::TransferBufferManagerKey::getTransferType
TransferType getTransferType() const
Definition: transfer_buffer.hpp:90
uavcan::TransferBufferManagerEntry::isEmpty
bool isEmpty() const
Definition: transfer_buffer.hpp:147
uavcan::StaticTransferBufferImpl::getRawPtr
const uint8_t * getRawPtr() const
Definition: transfer_buffer.hpp:43
uavcan::StaticTransferBufferImpl::size_
const uint16_t size_
Definition: transfer_buffer.hpp:25
uavcan::LinkedListNode
Definition: linked_list.hpp:20
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::TransferBufferAccessor::TransferBufferAccessor
TransferBufferAccessor(TransferBufferManager &bufmgr, TransferBufferManagerKey key)
Definition: transfer_buffer.hpp:186
uavcan::TransferBufferManagerKey::operator==
bool operator==(const TransferBufferManagerKey &rhs) const
Definition: transfer_buffer.hpp:82
uavcan::TransferBufferManager::access
ITransferBuffer * access(const TransferBufferManagerKey &key)
Definition: uc_transfer_buffer.cpp:302
uavcan::TransferBufferManagerEntry::Block
Definition: transfer_buffer.hpp:105
uavcan::StaticTransferBufferImpl::getSize
uint16_t getSize() const
Definition: transfer_buffer.hpp:40
uavcan::TransferBufferManager::max_buf_size_
const uint16_t max_buf_size_
Definition: transfer_buffer.hpp:157
uavcan::StaticTransferBufferImpl::max_write_pos_
uint16_t max_write_pos_
Definition: transfer_buffer.hpp:26
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
uavcan::TransferBufferAccessor::remove
void remove()
Definition: transfer_buffer.hpp:194
error.hpp
uavcan::TransferBufferManagerEntry::key_
TransferBufferManagerKey key_
Definition: transfer_buffer.hpp:123
uavcan::StaticTransferBufferImpl::read
virtual int read(unsigned offset, uint8_t *data, unsigned len) const
Definition: uc_transfer_buffer.cpp:14


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03