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
LoopbackFrameListenerRegistry & getLoopbackFrameListenerRegistry()
Definition: dispatcher.hpp:207
std::uint8_t uint8_t
Definition: std.hpp:24
const DataTypeDescriptor & getDataTypeDescriptor() const
bool operator()(const TransferListener *listener) const
Definition: dispatcher.hpp:96
ListenerRegistry lsrv_req_
Definition: dispatcher.hpp:118
const CanIOManager & getCanIOManager() const
Definition: dispatcher.hpp:233
IRxFrameListener * getRxFrameListener() const
Definition: dispatcher.hpp:209
ListenerRegistry lsrv_resp_
Definition: dispatcher.hpp:119
unsigned getNumServiceResponseListeners() const
Definition: dispatcher.hpp:179
TransferPerfCounter & getTransferPerfCounter()
Definition: dispatcher.hpp:237
void installRxFrameListener(IRxFrameListener *listener)
Definition: dispatcher.hpp:211
LinkedListRoot< TransferListener > list_
Definition: dispatcher.hpp:89
void removeRxFrameListener()
Definition: dispatcher.hpp:210
bool isPassiveMode() const
Definition: dispatcher.hpp:228
Dispatcher(ICanDriver &driver, IPoolAllocator &allocator, ISystemClock &sysclock)
Definition: dispatcher.hpp:136
ISystemClock & sysclock_
Definition: dispatcher.hpp:83
unsigned getNumServiceRequestListeners() const
Definition: dispatcher.hpp:178
OutgoingTransferRegistry outgoing_transfer_reg_
Definition: dispatcher.hpp:84
CanIOManager & getCanIOManager()
Definition: dispatcher.hpp:234
const TransferPerfCounter & getTransferPerfCounter() const
Definition: dispatcher.hpp:236
ROSCPP_DECL void spin()
unsigned getLength() const
Definition: linked_list.hpp:89
ListenerRegistry lmsg_
Definition: dispatcher.hpp:117
DataTypeID getID() const
Definition: data_type.hpp:159
const LinkedListRoot< TransferListener > & getListOfServiceRequestListeners() const
Definition: dispatcher.hpp:192
LoopbackFrameListenerBase(Dispatcher &dispatcher)
Definition: dispatcher.hpp:32
const LinkedListRoot< TransferListener > & getListOfMessageListeners() const
Definition: dispatcher.hpp:188
uavcan::CanFrame frame
Definition: can.cpp:78
const LinkedListRoot< TransferListener > & getListOfServiceResponseListeners() const
Definition: dispatcher.hpp:196
unsigned getNumMessageListeners() const
Definition: dispatcher.hpp:177
TransferPerfCounter perf_
Definition: dispatcher.hpp:85
LoopbackFrameListenerRegistry loopback_listeners_
Definition: dispatcher.hpp:122
ROSCPP_DECL bool exists(const std::string &service_name, bool print_failure_reason)
const LinkedListRoot< TransferListener > & getList() const
Definition: dispatcher.hpp:114
LinkedListRoot< LoopbackFrameListenerBase > listeners_
Definition: dispatcher.hpp:51
ISystemClock & getSystemClock()
Definition: dispatcher.hpp:231
CanIOManager canio_
Definition: dispatcher.hpp:82
ROSCPP_DECL void spinOnce()
const ISystemClock & getSystemClock() const
Definition: dispatcher.hpp:230
NodeID getNodeID() const
Definition: dispatcher.hpp:222
IRxFrameListener * rx_listener_
Definition: dispatcher.hpp:123
OutgoingTransferRegistry & getOutgoingTransferRegistry()
Definition: dispatcher.hpp:204


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39