36 listeners_.insert(listener);
42 listeners_.remove(listener);
77 if (mode == UniqueListener)
96 list_.remove(listener);
152 if (!frame.
parse(can_frame))
155 UAVCAN_TRACE(
"Dispatcher",
"Invalid CAN frame received: %s", can_frame.toString().c_str());
169 lmsg_.handleFrame(frame);
174 lsrv_req_.handleFrame(frame);
179 lsrv_resp_.handleFrame(frame);
202 if (!frame.
parse(can_frame))
204 UAVCAN_TRACE(
"Dispatcher",
"Invalid loopback CAN frame: %s", can_frame.toString().c_str());
209 loopback_listeners_.invokeListeners(frame);
216 rx_listener_->handleRxFrame(can_frame, flags);
223 int num_frames_processed = 0;
228 const int res = canio_.receive(frame, deadline, flags);
241 num_frames_processed++;
244 notifyRxFrameListener(frame, flags);
247 while (sysclock_.getMonotonic() < deadline);
249 return num_frames_processed;
254 int num_frames_processed = 0;
260 const int res = canio_.receive(frame,
MonotonicTime(), flags);
273 num_frames_processed++;
276 notifyRxFrameListener(frame, flags);
284 return num_frames_processed;
299 UAVCAN_TRACE(
"Dispatcher",
"Unable to send: frame is malformed: %s", frame.toString().c_str());
303 return canio_.send(can_frame, tx_deadline, blocking_deadline, iface_mask, flags);
308 outgoing_transfer_reg_.cleanup(ts);
310 lsrv_req_.cleanup(ts);
311 lsrv_resp_.cleanup(ts);
321 return lmsg_.add(listener, ListenerRegistry::ManyListeners);
331 return lsrv_req_.add(listener, ListenerRegistry::UniqueListener);
341 return lsrv_resp_.add(listener, ListenerRegistry::ManyListeners);
346 lmsg_.remove(listener);
351 lsrv_req_.remove(listener);
356 lsrv_resp_.remove(listener);
361 return lmsg_.exists(dtid);
371 return lsrv_req_.exists(dtid);
376 if (!self_node_id_is_set_)
379 self_node_id_is_set_ =
true;
void handleFrame(const CanRxFrame &can_frame)
LoopbackFrameListenerRegistry & getLoopbackFrameListenerRegistry()
TransferType getTransferType() const
bool doesExist(const LoopbackFrameListenerBase *listener) const
void notifyRxFrameListener(const CanRxFrame &can_frame, CanIOFlags flags)
const DataTypeDescriptor & getDataTypeDescriptor() const
int send(const Frame &frame, MonotonicTime tx_deadline, MonotonicTime blocking_deadline, CanIOFlags flags, uint8_t iface_mask)
bool registerServiceRequestListener(TransferListener *listener)
static const NodeID Broadcast
bool hasSubscriber(DataTypeID dtid) const
DataTypeID getDataTypeID() const
int spin(MonotonicTime deadline)
void unregisterServiceRequestListener(TransferListener *listener)
bool hasPublisher(DataTypeID dtid) const
void add(LoopbackFrameListenerBase *listener)
void invokeListeners(RxFrame &frame)
#define UAVCAN_TRACE(...)
NodeID getDstNodeID() const
bool hasServer(DataTypeID dtid) const
DataTypeKind getKind() const
void remove(TransferListener *listener)
T * getNextListNode() const
void unregisterServiceResponseListener(TransferListener *listener)
void remove(LoopbackFrameListenerBase *listener)
void cleanup(MonotonicTime ts)
void unregisterMessageListener(TransferListener *listener)
virtual void handleFrame(const RxFrame &frame)
NodeID getSrcNodeID() const
virtual void handleLoopbackFrame(const RxFrame &frame)=0
void handleFrame(const RxFrame &frame)
bool registerMessageListener(TransferListener *listener)
bool compile(CanFrame &can_frame) const
bool registerServiceResponseListener(TransferListener *listener)
void cleanup(MonotonicTime ts)
bool setNodeID(NodeID nid)
bool parse(const CanRxFrame &can_frame)
void handleLoopbackFrame(const CanRxFrame &can_frame)
void cleanup(MonotonicTime ts)
static const CanIOFlags CanIOFlagLoopback
bool add(TransferListener *listener, Mode mode)
bool exists(DataTypeID dtid) const
static const uavcan::int16_t ErrLogic
Internal logic error.