Go to the documentation of this file.
36 return frame.toString();
42 obj->~CanTxQueueEntry();
89 if (next->data->frame ==
frame) {
93 next = head->equal_keys;
107 if (timestamp >= tx_deadline) {
108 UAVCAN_TRACE(
"CanTxQueue",
"Push rejected: already expired");
115 UAVCAN_TRACE(
"CanTxQueue",
"Push rejected: OOM (CanTxQueueEntry)");
126 UAVCAN_TRACE(
"CanTxQueue",
"Push rejected: OOM (AvlTree::Node)");
150 return maxNode->data;
168 while(n->data->isExpired(timestamp)) {
173 while(n->right !=
UAVCAN_NULLPTR && n->right->data->isExpired(timestamp)) {
201 const int res = iface->
send(
frame, tx_deadline, flags);
204 UAVCAN_TRACE(
"CanIOManager",
"Send failed: code %i, iface %i, frame %s",
205 res, iface_index,
frame.toString().c_str());
235 const int res =
driver_.
select(inout_masks, pending_tx, blocking_deadline);
248 : driver_(driver), sysclock_(sysclock), num_ifaces_(driver.getNumIfaces())
255 if (mem_blocks_per_iface == 0)
259 UAVCAN_TRACE(
"CanIOManager",
"Memory blocks per iface: %u, total: %u",
265 (allocator, sysclock, mem_blocks_per_iface);
276 write_mask =
uint8_t(write_mask | (1 << i));
302 iface_mask &= all_ifaces_mask;
304 if (blocking_deadline > tx_deadline)
306 blocking_deadline = tx_deadline;
325 for (
int i = 0; i < num_ifaces; i++)
331 if (iface_mask & (1 << i))
333 bool has_priority =
false;
341 pending_tx[i] = has_priority ? peek_frame : &
frame;
345 pending_tx[i] = peek_frame;
349 const int select_res =
callSelect(masks, pending_tx, blocking_deadline);
358 for (
uint8_t i = 0; i < num_ifaces; i++)
360 if (masks.
write & (1 << i))
363 if (iface_mask & (1 << i))
375 iface_mask &=
uint8_t(~(1 << i));
392 if (masks.
write == 0 || timed_out)
396 UAVCAN_TRACE(
"CanIOManager",
"Send: Premature timeout in select(), will try again");
399 for (
uint8_t i = 0; i < num_ifaces; i++)
401 if (iface_mask & (1 << i))
423 for (
int i = 0; i < num_ifaces; i++)
429 const int select_res =
callSelect(masks, pending_tx, blocking_deadline);
437 for (
uint8_t i = 0; i < num_ifaces; i++)
439 if (masks.
write & (1 << i))
447 for (
uint8_t i = 0; i < num_ifaces; i++)
449 if (masks.
read & (1 << i))
470 return (res < 0) ? -ErrDriver : res;
bool linkedListContains(Node *head, const CanFrame &frame) const
virtual int16_t send(const CanFrame &frame, MonotonicTime tx_deadline, CanIOFlags flags)=0
AvlTree::Node * searchForNonExpiredMax(Node *n)
IfaceFrameCounters counters_[MaxCanIfaces]
void remove(CanTxQueueEntry *entry)
virtual uint16_t getBlockCapacity() const =0
static const CanIOFlags CanIOFlagLoopback
void removeEntry(T *data)
#define UAVCAN_TRACE(...)
uint32_t rejected_frames_cnt_
CanIfacePerfCounters getIfacePerfCounters(uint8_t iface_index) const
int sendFromTxQueue(uint8_t iface_index)
virtual int16_t select(CanSelectMasks &inout_masks, const CanFrame *(&pending_tx)[MaxCanIfaces], MonotonicTime blocking_deadline)=0
void push(const CanFrame &frame, MonotonicTime tx_deadline, CanIOFlags flags)
virtual void * allocate(std::size_t size)
static const uavcan::int16_t ErrLogic
Internal logic error.
virtual void deallocate(const void *ptr)=0
bool priorityLowerThan(const CanFrame &rhs) const
uint8_t getNumIfaces() const
LimitedPoolAllocator allocator_
int send(const CanFrame &frame, MonotonicTime tx_deadline, MonotonicTime blocking_deadline, uint8_t iface_mask, CanIOFlags flags)
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Node * removeNode(Node *node, T *data)
static std::string toString(long x)
void safeIncrementRejectedFrames()
static void destroy(CanTxQueueEntry *&obj, IPoolAllocator &allocator)
int receive(CanRxFrame &out_frame, MonotonicTime blocking_deadline, CanIOFlags &out_flags)
virtual uint64_t getErrorCount() const =0
LazyConstructor< CanTxQueue > tx_queues_[MaxCanIfaces]
int sendToIface(uint8_t iface_index, const CanFrame &frame, MonotonicTime tx_deadline, CanIOFlags flags)
bool contains(const CanFrame &frame) const
virtual ICanIface * getIface(uint8_t iface_index)=0
CanIOManager(ICanDriver &driver, IPoolAllocator &allocator, ISystemClock &sysclock, std::size_t mem_blocks_per_iface=0)
void postOrderTraverseEntryCleanup(Node *n)
const uint8_t num_ifaces_
UAVCAN_EXPORT void handleFatalError(const char *msg)
virtual int16_t receive(CanFrame &out_frame, MonotonicTime &out_ts_monotonic, UtcTime &out_ts_utc, CanIOFlags &out_flags)=0
bool topPriorityHigherOrEqual(const CanFrame &rhs_frame)
bool priorityHigherThan(const CanFrame &rhs) const
void toString(char buf[StringBufSize]) const
Prints time in seconds with microsecond resolution.
virtual MonotonicTime getMonotonic() const =0
uint8_t makePendingTxMask() const
int callSelect(CanSelectMasks &inout_masks, const CanFrame *(&pending_tx)[MaxCanIfaces], MonotonicTime blocking_deadline)