dispatcher.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_DISPATCHER_HPP_INCLUDED
6 #define UAVCAN_TRANSPORT_DISPATCHER_HPP_INCLUDED
7 
8 #include <cassert>
9 #include <uavcan/error.hpp>
10 #include <uavcan/std.hpp>
11 #include <uavcan/build_config.hpp>
17 
18 namespace uavcan
19 {
20 
22 
23 #if !UAVCAN_TINY
24 
27 class UAVCAN_EXPORT LoopbackFrameListenerBase : public LinkedListNode<LoopbackFrameListenerBase>
28 {
30 
31 protected:
32  explicit LoopbackFrameListenerBase(Dispatcher& dispatcher)
33  : dispatcher_(dispatcher)
34  { }
35 
36  virtual ~LoopbackFrameListenerBase() { stopListening(); }
37 
38  void startListening();
39  void stopListening();
40  bool isListening() const;
41 
42  Dispatcher& getDispatcher() { return dispatcher_; }
43 
44 public:
45  virtual void handleLoopbackFrame(const RxFrame& frame) = 0;
46 };
47 
48 
50 {
52 
53 public:
54  void add(LoopbackFrameListenerBase* listener);
55  void remove(LoopbackFrameListenerBase* listener);
56  bool doesExist(const LoopbackFrameListenerBase* listener) const;
57  unsigned getNumListeners() const { return listeners_.getLength(); }
58 
59  void invokeListeners(RxFrame& frame);
60 };
61 
66 {
67 public:
68  virtual ~IRxFrameListener() { }
69 
73  virtual void handleRxFrame(const CanRxFrame& frame, CanIOFlags flags) = 0;
74 };
75 #endif
76 
81 {
86 
88  {
90 
92  {
93  const DataTypeID id_;
94  public:
95  explicit DataTypeIDInsertionComparator(DataTypeID id) : id_(id) { }
96  bool operator()(const TransferListener* listener) const
97  {
98  UAVCAN_ASSERT(listener);
99  return id_ > listener->getDataTypeDescriptor().getID();
100  }
101  };
102 
103  public:
104  enum Mode { UniqueListener, ManyListeners };
105 
106  bool add(TransferListener* listener, Mode mode);
107  void remove(TransferListener* listener);
108  bool exists(DataTypeID dtid) const;
109  void cleanup(MonotonicTime ts);
110  void handleFrame(const RxFrame& frame);
111 
112  unsigned getNumEntries() const { return list_.getLength(); }
113 
114  const LinkedListRoot<TransferListener>& getList() const { return list_; }
115  };
116 
120 
121 #if !UAVCAN_TINY
124 #endif
125 
128 
129  void handleFrame(const CanRxFrame& can_frame);
130 
131  void handleLoopbackFrame(const CanRxFrame& can_frame);
132 
133  void notifyRxFrameListener(const CanRxFrame& can_frame, CanIOFlags flags);
134 
135 public:
136  Dispatcher(ICanDriver& driver, IPoolAllocator& allocator, ISystemClock& sysclock)
137  : canio_(driver, allocator, sysclock)
138  , sysclock_(sysclock)
139  , outgoing_transfer_reg_(allocator)
140 #if !UAVCAN_TINY
141  , rx_listener_(UAVCAN_NULLPTR)
142 #endif
143  , self_node_id_(NodeID::Broadcast) // Default
144  , self_node_id_is_set_(false)
145  { }
146 
150  int spin(MonotonicTime deadline);
151 
155  int spinOnce();
156 
160  int send(const Frame& frame, MonotonicTime tx_deadline, MonotonicTime blocking_deadline,
161  CanIOFlags flags, uint8_t iface_mask);
162 
163  void cleanup(MonotonicTime ts);
164 
165  bool registerMessageListener(TransferListener* listener);
166  bool registerServiceRequestListener(TransferListener* listener);
167  bool registerServiceResponseListener(TransferListener* listener);
168 
169  void unregisterMessageListener(TransferListener* listener);
170  void unregisterServiceRequestListener(TransferListener* listener);
171  void unregisterServiceResponseListener(TransferListener* listener);
172 
173  bool hasSubscriber(DataTypeID dtid) const;
174  bool hasPublisher(DataTypeID dtid) const;
175  bool hasServer(DataTypeID dtid) const;
176 
177  unsigned getNumMessageListeners() const { return lmsg_.getNumEntries(); }
178  unsigned getNumServiceRequestListeners() const { return lsrv_req_.getNumEntries(); }
179  unsigned getNumServiceResponseListeners() const { return lsrv_resp_.getNumEntries(); }
180 
189  {
190  return lmsg_.getList();
191  }
193  {
194  return lsrv_req_.getList();
195  }
197  {
198  return lsrv_resp_.getList();
199  }
204  OutgoingTransferRegistry& getOutgoingTransferRegistry() { return outgoing_transfer_reg_; }
205 
206 #if !UAVCAN_TINY
208 
209  IRxFrameListener* getRxFrameListener() const { return rx_listener_; }
210  void removeRxFrameListener() { rx_listener_ = UAVCAN_NULLPTR; }
212  {
213  UAVCAN_ASSERT(listener != UAVCAN_NULLPTR);
214  rx_listener_ = listener;
215  }
216 #endif
217 
222  NodeID getNodeID() const { return self_node_id_; }
223  bool setNodeID(NodeID nid);
224 
228  bool isPassiveMode() const { return !getNodeID().isUnicast(); }
229 
230  const ISystemClock& getSystemClock() const { return sysclock_; }
231  ISystemClock& getSystemClock() { return sysclock_; }
232 
233  const CanIOManager& getCanIOManager() const { return canio_; }
234  CanIOManager& getCanIOManager() { return canio_; }
235 
236  const TransferPerfCounter& getTransferPerfCounter() const { return perf_; }
238 };
239 
240 }
241 
242 #endif // UAVCAN_TRANSPORT_DISPATCHER_HPP_INCLUDED
uavcan::Dispatcher::sysclock_
ISystemClock & sysclock_
Definition: dispatcher.hpp:83
uavcan::IRxFrameListener::~IRxFrameListener
virtual ~IRxFrameListener()
Definition: dispatcher.hpp:68
uavcan::LoopbackFrameListenerRegistry::listeners_
LinkedListRoot< LoopbackFrameListenerBase > listeners_
Definition: dispatcher.hpp:51
uavcan::TransferListener::getDataTypeDescriptor
const DataTypeDescriptor & getDataTypeDescriptor() const
Definition: transfer_listener.hpp:143
uavcan::Dispatcher::lsrv_resp_
ListenerRegistry lsrv_resp_
Definition: dispatcher.hpp:119
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::Dispatcher::removeRxFrameListener
void removeRxFrameListener()
Definition: dispatcher.hpp:210
uavcan::Dispatcher::ListenerRegistry::getList
const LinkedListRoot< TransferListener > & getList() const
Definition: dispatcher.hpp:114
exists
ROSCPP_DECL bool exists(const std::string &service_name, bool print_failure_reason)
uavcan::Noncopyable
Definition: templates.hpp:46
outgoing_transfer_registry.hpp
uavcan::Dispatcher::canio_
CanIOManager canio_
Definition: dispatcher.hpp:82
uavcan::LoopbackFrameListenerBase::dispatcher_
Dispatcher & dispatcher_
Definition: dispatcher.hpp:29
uavcan::Dispatcher::Dispatcher
Dispatcher(ICanDriver &driver, IPoolAllocator &allocator, ISystemClock &sysclock)
Definition: dispatcher.hpp:136
uavcan::LinkedListRoot::getLength
unsigned getLength() const
Definition: linked_list.hpp:89
uavcan::Dispatcher::getCanIOManager
CanIOManager & getCanIOManager()
Definition: dispatcher.hpp:234
uavcan::Dispatcher::lmsg_
ListenerRegistry lmsg_
Definition: dispatcher.hpp:117
uavcan::IRxFrameListener
Definition: dispatcher.hpp:65
uavcan::Dispatcher::ListenerRegistry::DataTypeIDInsertionComparator::operator()
bool operator()(const TransferListener *listener) const
Definition: dispatcher.hpp:96
uavcan::Dispatcher::ListenerRegistry::Mode
Mode
Definition: dispatcher.hpp:104
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::LoopbackFrameListenerRegistry
Definition: dispatcher.hpp:49
uavcan::Dispatcher::getNumServiceRequestListeners
unsigned getNumServiceRequestListeners() const
Definition: dispatcher.hpp:178
spinOnce
ROSCPP_DECL void spinOnce()
uavcan::ICanDriver
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:207
uavcan::Dispatcher::getSystemClock
ISystemClock & getSystemClock()
Definition: dispatcher.hpp:231
uavcan::Dispatcher::ListenerRegistry::list_
LinkedListRoot< TransferListener > list_
Definition: dispatcher.hpp:89
uavcan::CanRxFrame
Definition: can_io.hpp:25
std.hpp
uavcan::Dispatcher::getTransferPerfCounter
TransferPerfCounter & getTransferPerfCounter()
Definition: dispatcher.hpp:237
uavcan::Dispatcher::ListenerRegistry::DataTypeIDInsertionComparator
Definition: dispatcher.hpp:91
uavcan::Dispatcher::ListenerRegistry
Definition: dispatcher.hpp:87
uavcan::Dispatcher::getNumMessageListeners
unsigned getNumMessageListeners() const
Definition: dispatcher.hpp:177
uavcan::TransferPerfCounter
Definition: perf_counter.hpp:36
uavcan::Dispatcher::ListenerRegistry::UniqueListener
@ UniqueListener
Definition: dispatcher.hpp:104
uavcan::Dispatcher::self_node_id_
NodeID self_node_id_
Definition: dispatcher.hpp:126
uavcan::Dispatcher::loopback_listeners_
LoopbackFrameListenerRegistry loopback_listeners_
Definition: dispatcher.hpp:122
uavcan::Dispatcher::rx_listener_
IRxFrameListener * rx_listener_
Definition: dispatcher.hpp:123
uavcan::LoopbackFrameListenerRegistry::getNumListeners
unsigned getNumListeners() const
Definition: dispatcher.hpp:57
uavcan::LoopbackFrameListenerBase
Definition: dispatcher.hpp:27
uavcan::Dispatcher
Definition: dispatcher.hpp:80
uavcan::Dispatcher::getListOfMessageListeners
const LinkedListRoot< TransferListener > & getListOfMessageListeners() const
Definition: dispatcher.hpp:188
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::DataTypeID
Definition: data_type.hpp:47
transfer_listener.hpp
uavcan::RxFrame
Definition: frame.hpp:104
uavcan::LoopbackFrameListenerBase::~LoopbackFrameListenerBase
virtual ~LoopbackFrameListenerBase()
Definition: dispatcher.hpp:36
uavcan::CanIOManager
Definition: can_io.hpp:128
uavcan::Dispatcher::getListOfServiceRequestListeners
const LinkedListRoot< TransferListener > & getListOfServiceRequestListeners() const
Definition: dispatcher.hpp:192
can_io.hpp
uavcan::IPoolAllocator
Definition: dynamic_memory.hpp:21
uavcan::Dispatcher::self_node_id_is_set_
bool self_node_id_is_set_
Definition: dispatcher.hpp:127
uavcan::Dispatcher::getNumServiceResponseListeners
unsigned getNumServiceResponseListeners() const
Definition: dispatcher.hpp:179
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::Dispatcher::lsrv_req_
ListenerRegistry lsrv_req_
Definition: dispatcher.hpp:118
uavcan::Dispatcher::ListenerRegistry::DataTypeIDInsertionComparator::DataTypeIDInsertionComparator
DataTypeIDInsertionComparator(DataTypeID id)
Definition: dispatcher.hpp:95
uavcan::TransferListener
Definition: transfer_listener.hpp:99
build_config.hpp
frame
uavcan::CanFrame frame
Definition: can.cpp:78
uavcan::OutgoingTransferRegistry
Definition: outgoing_transfer_registry.hpp:64
linked_list.hpp
uavcan::Dispatcher::outgoing_transfer_reg_
OutgoingTransferRegistry outgoing_transfer_reg_
Definition: dispatcher.hpp:84
uavcan::Dispatcher::perf_
TransferPerfCounter perf_
Definition: dispatcher.hpp:85
uavcan::Frame
Definition: frame.hpp:17
uavcan::Dispatcher::getOutgoingTransferRegistry
OutgoingTransferRegistry & getOutgoingTransferRegistry()
Definition: dispatcher.hpp:204
uavcan::Dispatcher::ListenerRegistry::getNumEntries
unsigned getNumEntries() const
Definition: dispatcher.hpp:112
uavcan::Dispatcher::getLoopbackFrameListenerRegistry
LoopbackFrameListenerRegistry & getLoopbackFrameListenerRegistry()
Definition: dispatcher.hpp:207
uavcan::Dispatcher::getTransferPerfCounter
const TransferPerfCounter & getTransferPerfCounter() const
Definition: dispatcher.hpp:236
uavcan::LoopbackFrameListenerBase::LoopbackFrameListenerBase
LoopbackFrameListenerBase(Dispatcher &dispatcher)
Definition: dispatcher.hpp:32
uavcan::Dispatcher::getNodeID
NodeID getNodeID() const
Definition: dispatcher.hpp:222
uavcan::Dispatcher::getCanIOManager
const CanIOManager & getCanIOManager() const
Definition: dispatcher.hpp:233
uavcan::LinkedListRoot
Definition: linked_list.hpp:44
uavcan::DataTypeDescriptor::getID
DataTypeID getID() const
Definition: data_type.hpp:159
uavcan::CanIOFlags
uint16_t CanIOFlags
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:140
uavcan::Dispatcher::installRxFrameListener
void installRxFrameListener(IRxFrameListener *listener)
Definition: dispatcher.hpp:211
uavcan::Dispatcher::getRxFrameListener
IRxFrameListener * getRxFrameListener() const
Definition: dispatcher.hpp:209
spin
ROSCPP_DECL void spin()
uavcan::Dispatcher::getSystemClock
const ISystemClock & getSystemClock() const
Definition: dispatcher.hpp:230
uavcan::MonotonicTime
Definition: time.hpp:184
uavcan::LinkedListNode
Definition: linked_list.hpp:20
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::ISystemClock
Definition: system_clock.hpp:19
uavcan::Dispatcher::getListOfServiceResponseListeners
const LinkedListRoot< TransferListener > & getListOfServiceResponseListeners() const
Definition: dispatcher.hpp:196
UAVCAN_TINY
#define UAVCAN_TINY
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:118
uavcan::LoopbackFrameListenerBase::getDispatcher
Dispatcher & getDispatcher()
Definition: dispatcher.hpp:42
uavcan::Dispatcher::ListenerRegistry::DataTypeIDInsertionComparator::id_
const DataTypeID id_
Definition: dispatcher.hpp:93
uavcan::Dispatcher::isPassiveMode
bool isPassiveMode() const
Definition: dispatcher.hpp:228
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
perf_counter.hpp
error.hpp


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