dispatcher.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <memory>
6 #include <vector>
7 #include <gtest/gtest.h>
9 #include "can/can.hpp"
11 
12 
14 {
16 
17 public:
19  : IncomingTransferEmulatorBase(dst_node_id)
20  , target_(target)
21  { }
22 
24  {
25  CanIfaceMock* const iface = static_cast<CanIfaceMock*>(target_.getIface(frame.getIfaceIndex()));
26  EXPECT_TRUE(iface);
27  if (iface)
28  {
29  iface->pushRx(frame);
30  }
31  }
32 };
33 
34 
36 {
37  std::vector<uavcan::CanRxFrame> rx_frames;
38 
40  {
41  std::cout << "RX frame [flags=" << flags << "]: " << frame.toString() << std::endl;
42  if ((flags & uavcan::CanIOFlagLoopback) == 0)
43  {
44  rx_frames.push_back(frame);
45  }
46  }
47 };
48 
49 
50 static const uavcan::NodeID SELF_NODE_ID(64);
51 
52 
53 TEST(Dispatcher, Reception)
54 {
56 
57  SystemClockMock clockmock(100);
58  CanDriverMock driver(2, clockmock);
59 
60  uavcan::Dispatcher dispatcher(driver, pool, clockmock);
61  ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once
62  ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID));
63  ASSERT_EQ(SELF_NODE_ID, dispatcher.getNodeID());
64 
65  DispatcherTransferEmulator emulator(driver, SELF_NODE_ID);
66 
67  /*
68  * RX listener
69  */
70  RxFrameListener rx_listener;
71  ASSERT_FALSE(dispatcher.getRxFrameListener());
72  dispatcher.installRxFrameListener(&rx_listener);
73  ASSERT_TRUE(dispatcher.getRxFrameListener());
74  ASSERT_TRUE(rx_listener.rx_frames.empty());
75 
76  /*
77  * Test environment
78  */
79  static const uavcan::DataTypeDescriptor TYPES[4] =
80  {
81  makeDataType(uavcan::DataTypeKindMessage, 1),
82  makeDataType(uavcan::DataTypeKindMessage, 2),
83  makeDataType(uavcan::DataTypeKindService, 1),
84  makeDataType(uavcan::DataTypeKindService, 1)
85  };
86 
87  typedef std::unique_ptr<TestListener> TestListenerPtr;
88  static const int MaxBufSize = 512;
89  static const int NumSubscribers = 6;
90  TestListenerPtr subscribers[NumSubscribers] =
91  {
92  TestListenerPtr(new TestListener(dispatcher.getTransferPerfCounter(), TYPES[0], MaxBufSize, pool)), // msg
93  TestListenerPtr(new TestListener(dispatcher.getTransferPerfCounter(), TYPES[0], MaxBufSize, pool)), // msg // Two similar
94  TestListenerPtr(new TestListener(dispatcher.getTransferPerfCounter(), TYPES[1], MaxBufSize, pool)), // msg
95  TestListenerPtr(new TestListener(dispatcher.getTransferPerfCounter(), TYPES[2], MaxBufSize, pool)), // srv
96  TestListenerPtr(new TestListener(dispatcher.getTransferPerfCounter(), TYPES[3], MaxBufSize, pool)), // srv
97  TestListenerPtr(new TestListener(dispatcher.getTransferPerfCounter(), TYPES[3], MaxBufSize, pool)) // srv // Repeat again
98  };
99 
100  static const std::string DATA[6] =
101  {
102  "Yes, man is mortal, but that would be only half the trouble. "
103  "The worst of it is that he's sometimes unexpectedly mortal - there's the trick!",
104 
105  "In fact, I'm beginning to fear that this confusion will go on for a long time. "
106  "And all because he writes down what I said incorrectly.",
107 
108  "I had the pleasure of meeting that young man at the Patriarch's Ponds. "
109  "He almost drove me mad myself, proving to me that I don't exist. But you do believe that it is really I?",
110 
111  "He was a dreamer, a thinker, a speculative philosopher... or, as his wife would have it, an idiot.",
112 
113  "The only way to get ideas for stories is to drink way too much coffee and buy a desk that doesn't "
114  "collapse when you beat your head against it",
115 
116  ""
117  };
118 
119  for (unsigned i = 0; i < sizeof(DATA) / sizeof(DATA[0]); i++)
120  {
121  std::cout << "Size of test data chunk " << i << ": " << DATA[i].length() << std::endl;
122  }
123 
124  const Transfer transfers[8] =
125  {
126  emulator.makeTransfer(0, uavcan::TransferTypeMessageBroadcast, 10, DATA[0], TYPES[0]),
127  emulator.makeTransfer(5, uavcan::TransferTypeMessageBroadcast, 11, DATA[1], TYPES[1]),
128  emulator.makeTransfer(10, uavcan::TransferTypeServiceRequest, 12, DATA[2], TYPES[2]),
129  emulator.makeTransfer(15, uavcan::TransferTypeServiceResponse, 13, DATA[4], TYPES[3]),
130  emulator.makeTransfer(20, uavcan::TransferTypeMessageBroadcast, 14, DATA[3], TYPES[0]),
131  emulator.makeTransfer(25, uavcan::TransferTypeMessageBroadcast, 15, DATA[5], TYPES[1]),
132  // Wrongly addressed:
133  emulator.makeTransfer(29, uavcan::TransferTypeServiceResponse, 10, DATA[0], TYPES[3], 100),
134  emulator.makeTransfer(31, uavcan::TransferTypeServiceRequest, 11, DATA[4], TYPES[2], 101)
135  };
136 
137  /*
138  * Registration
139  */
140  for (int i = 0; i < NumSubscribers; i++)
141  {
142  ASSERT_FALSE(dispatcher.hasSubscriber(subscribers[i]->getDataTypeDescriptor().getID()));
143  ASSERT_FALSE(dispatcher.hasPublisher(subscribers[i]->getDataTypeDescriptor().getID()));
144  ASSERT_FALSE(dispatcher.hasServer(subscribers[i]->getDataTypeDescriptor().getID()));
145  }
146 
147  ASSERT_TRUE(dispatcher.registerMessageListener(subscribers[0].get()));
148  ASSERT_TRUE(dispatcher.registerMessageListener(subscribers[1].get()));
149  ASSERT_TRUE(dispatcher.registerMessageListener(subscribers[2].get()));
150  ASSERT_TRUE(dispatcher.registerServiceRequestListener(subscribers[3].get()));
151  ASSERT_TRUE(dispatcher.registerServiceResponseListener(subscribers[4].get()));
152  ASSERT_TRUE(dispatcher.registerServiceResponseListener(subscribers[5].get()));
153 
154  for (int i = 0; i < NumSubscribers; i++)
155  {
156  ASSERT_FALSE(dispatcher.hasPublisher(subscribers[i]->getDataTypeDescriptor().getID()));
157  }
158 
159  // Subscribers
160  ASSERT_TRUE(dispatcher.hasSubscriber(subscribers[0]->getDataTypeDescriptor().getID()));
161  ASSERT_TRUE(dispatcher.hasSubscriber(subscribers[1]->getDataTypeDescriptor().getID()));
162  ASSERT_TRUE(dispatcher.hasSubscriber(subscribers[2]->getDataTypeDescriptor().getID()));
163 
164  // Servers
165  ASSERT_TRUE(dispatcher.hasServer(subscribers[3]->getDataTypeDescriptor().getID()));
166 
167  /*
168  * Sending the transfers
169  */
170  // Multiple service request listeners are not allowed
171  ASSERT_FALSE(dispatcher.registerServiceRequestListener(subscribers[3].get()));
172 
173  // Item count validation
174  ASSERT_EQ(3, dispatcher.getNumMessageListeners());
175  ASSERT_EQ(1, dispatcher.getNumServiceRequestListeners());
176  ASSERT_EQ(2, dispatcher.getNumServiceResponseListeners());
177 
178  for (int i = 0; i < NumSubscribers; i++)
179  {
180  ASSERT_TRUE(subscribers[i]->isEmpty());
181  }
182 
183  emulator.send(transfers);
184  emulator.send(transfers); // Just for fun, they will be ignored anyway.
185 
186  while (true)
187  {
188  const int res = dispatcher.spinOnce();
189  ASSERT_LE(0, res);
190  clockmock.advance(100);
191  if (res == 0)
192  {
193  break;
194  }
195  }
196 
197  /*
198  * Matching.
199  */
200  ASSERT_TRUE(subscribers[0]->matchAndPop(transfers[4]));
201  ASSERT_TRUE(subscribers[0]->matchAndPop(transfers[0]));
202 
203  ASSERT_TRUE(subscribers[1]->matchAndPop(transfers[4]));
204  ASSERT_TRUE(subscribers[1]->matchAndPop(transfers[0]));
205 
206  ASSERT_TRUE(subscribers[2]->matchAndPop(transfers[5]));
207  ASSERT_TRUE(subscribers[2]->matchAndPop(transfers[1]));
208 
209  ASSERT_TRUE(subscribers[3]->matchAndPop(transfers[2]));
210 
211  ASSERT_TRUE(subscribers[4]->matchAndPop(transfers[3]));
212 
213  ASSERT_TRUE(subscribers[5]->matchAndPop(transfers[3]));
214 
215  for (int i = 0; i < NumSubscribers; i++)
216  {
217  ASSERT_TRUE(subscribers[i]->isEmpty());
218  }
219 
220  /*
221  * Unregistering all transfers
222  */
223  dispatcher.unregisterMessageListener(subscribers[0].get());
224  dispatcher.unregisterMessageListener(subscribers[1].get());
225  dispatcher.unregisterMessageListener(subscribers[2].get());
226  dispatcher.unregisterServiceRequestListener(subscribers[3].get());
227  dispatcher.unregisterServiceResponseListener(subscribers[4].get());
228  dispatcher.unregisterServiceResponseListener(subscribers[5].get());
229 
230  ASSERT_EQ(0, dispatcher.getNumMessageListeners());
231  ASSERT_EQ(0, dispatcher.getNumServiceRequestListeners());
232  ASSERT_EQ(0, dispatcher.getNumServiceResponseListeners());
233 
234  /*
235  * Perf counters
236  */
237  EXPECT_LT(0, dispatcher.getTransferPerfCounter().getErrorCount()); // Repeated transfers
238  EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getTxTransferCount());
239  EXPECT_EQ(9, dispatcher.getTransferPerfCounter().getRxTransferCount());
240 
241  /*
242  * RX listener
243  */
244  std::cout << "Num received frames: " << rx_listener.rx_frames.size() << std::endl;
245  ASSERT_EQ(292, rx_listener.rx_frames.size());
246 }
247 
248 
249 TEST(Dispatcher, Transmission)
250 {
252 
253  SystemClockMock clockmock(100);
254  CanDriverMock driver(2, clockmock);
255 
256  uavcan::Dispatcher dispatcher(driver, pool, clockmock);
257  ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once
258  ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID));
259 
260  /*
261  * RX listener
262  */
263  RxFrameListener rx_listener;
264  dispatcher.installRxFrameListener(&rx_listener);
265 
266  /*
267  * Transmission
268  */
269  static const uavcan::MonotonicTime TX_DEADLINE = tsMono(123456);
270 
271  // uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
272  // uint_fast8_t frame_index, TransferID transfer_id, bool last_frame = false
274  frame.setPayload(reinterpret_cast<const uint8_t*>("123"), 3);
275 
276  ASSERT_FALSE(dispatcher.hasPublisher(123));
277  ASSERT_FALSE(dispatcher.hasPublisher(456));
279  ASSERT_TRUE(dispatcher.getOutgoingTransferRegistry().accessOrCreate(otr_key,
281  ASSERT_TRUE(dispatcher.hasPublisher(123));
282  ASSERT_FALSE(dispatcher.hasPublisher(456));
283 
284  ASSERT_EQ(2, dispatcher.send(frame, TX_DEADLINE, tsMono(0), 0, 0xFF));
285 
286  /*
287  * Validation
288  */
289  uavcan::CanFrame expected_can_frame;
290  ASSERT_TRUE(frame.compile(expected_can_frame));
291 
292  ASSERT_TRUE(driver.ifaces.at(0).matchAndPopTx(expected_can_frame, TX_DEADLINE));
293  ASSERT_TRUE(driver.ifaces.at(1).matchAndPopTx(expected_can_frame, TX_DEADLINE));
294 
295  ASSERT_TRUE(driver.ifaces.at(0).tx.empty());
296  ASSERT_TRUE(driver.ifaces.at(1).tx.empty());
297 
298  /*
299  * Perf counters - all empty because dispatcher itself does not count TX transfers
300  */
301  EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getErrorCount());
302  EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getTxTransferCount());
303  EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getRxTransferCount());
304 
305  /*
306  * RX listener
307  */
308  ASSERT_TRUE(rx_listener.rx_frames.empty());
309 }
310 
311 
313 {
314  NullAllocator poolmgr;
315 
316  SystemClockMock clockmock(100);
317  CanDriverMock driver(2, clockmock);
318 
319  uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock);
320  ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID)); // Can be set only once
321  ASSERT_FALSE(dispatcher.setNodeID(SELF_NODE_ID));
322 
323  clockmock.monotonic_auto_advance = 100;
324 
325  ASSERT_EQ(100, clockmock.monotonic);
326  ASSERT_EQ(0, dispatcher.spin(tsMono(1000)));
327  ASSERT_LE(1000, clockmock.monotonic);
328  ASSERT_EQ(0, dispatcher.spinOnce());
329  ASSERT_LE(1000, clockmock.monotonic);
330  ASSERT_EQ(0, dispatcher.spin(tsMono(1100)));
331  ASSERT_LE(1100, clockmock.monotonic);
332 }
333 
334 
336 {
338  unsigned count;
339 
341  : uavcan::LoopbackFrameListenerBase(dispatcher)
342  , count(0)
343  { }
344 
347 
349  {
350  std::cout << "DispatcherTestLoopbackFrameListener: " << frame.toString() << std::endl;
351  last_frame = frame;
352  count++;
353  }
354 };
355 
356 TEST(Dispatcher, Loopback)
357 {
358  NullAllocator poolmgr;
359 
360  SystemClockMock clockmock(100);
361  CanDriverMock driver(2, clockmock);
362 
363  uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock);
364  ASSERT_TRUE(dispatcher.setNodeID(SELF_NODE_ID));
365 
366  {
367  DispatcherTestLoopbackFrameListener listener(dispatcher);
368  ASSERT_FALSE(listener.isListening());
369  listener.startListening();
370  ASSERT_TRUE(listener.isListening());
371 
372  // uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
373  // uint_fast8_t frame_index, TransferID transfer_id, bool last_frame = false
375  frame.setPayload(reinterpret_cast<const uint8_t*>("123"), 3);
376 
377  ASSERT_TRUE(listener.last_frame == uavcan::RxFrame());
378 
379  ASSERT_LE(0, dispatcher.send(frame, tsMono(1000), tsMono(0),
381 
382  ASSERT_EQ(0, dispatcher.spin(tsMono(1000)));
383 
384  ASSERT_TRUE(listener.last_frame != uavcan::RxFrame());
385  ASSERT_TRUE(listener.last_frame == frame);
386  ASSERT_EQ(1, listener.last_frame.getIfaceIndex()); // Last iface
387  ASSERT_EQ(2, listener.count);
388 
389  ASSERT_EQ(1, dispatcher.getLoopbackFrameListenerRegistry().getNumListeners());
390  }
391  ASSERT_EQ(0, dispatcher.getLoopbackFrameListenerRegistry().getNumListeners());
392 }
uavcan::Dispatcher::registerServiceResponseListener
bool registerServiceResponseListener(TransferListener *listener)
Definition: uc_dispatcher.cpp:334
uavcan::LoopbackFrameListenerBase::startListening
void startListening()
Definition: uc_dispatcher.cpp:15
IncomingTransferEmulatorBase::send
void send(const std::vector< std::vector< uavcan::RxFrame > > &sers)
Definition: transfer_test_helpers.hpp:273
DispatcherTestLoopbackFrameListener::count
unsigned count
Definition: dispatcher.cpp:338
IncomingTransferEmulatorBase::makeTransfer
Transfer makeTransfer(uavcan::TransferPriority priority, uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string &payload, const uavcan::DataTypeDescriptor &type, uavcan::NodeID dst_node_id_override=uavcan::NodeID())
Definition: transfer_test_helpers.hpp:257
TEST
TEST(Dispatcher, Reception)
Definition: dispatcher.cpp:53
RxFrameListener::handleRxFrame
virtual void handleRxFrame(const uavcan::CanRxFrame &frame, uavcan::CanIOFlags flags)
Definition: dispatcher.cpp:39
uavcan::TimeBase< MonotonicTime, MonotonicDuration >::fromMSec
static MonotonicTime fromMSec(uint64_t ms)
Definition: time.hpp:118
uavcan::DataTypeKindService
@ DataTypeKindService
Definition: data_type.hpp:21
DispatcherTestLoopbackFrameListener
Definition: dispatcher.cpp:335
get
ROSCPP_DECL bool get(const std::string &key, bool &b)
uavcan::RxFrame::getIfaceIndex
uint8_t getIfaceIndex() const
Definition: frame.hpp:135
uavcan::Dispatcher::registerMessageListener
bool registerMessageListener(TransferListener *listener)
Definition: uc_dispatcher.cpp:314
uavcan::IRxFrameListener
Definition: dispatcher.hpp:65
uavcan::LoopbackFrameListenerBase::isListening
bool isListening() const
Definition: uc_dispatcher.cpp:25
SystemClockMock::advance
void advance(uint64_t usec) const
Definition: libuavcan/libuavcan/test/clock.hpp:28
uavcan::TransferTypeServiceResponse
@ TransferTypeServiceResponse
Definition: transfer.hpp:20
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::OutgoingTransferRegistryKey
Definition: outgoing_transfer_registry.hpp:19
DispatcherTestLoopbackFrameListener::DispatcherTestLoopbackFrameListener
DispatcherTestLoopbackFrameListener(uavcan::Dispatcher &dispatcher)
Definition: dispatcher.cpp:340
uavcan::Dispatcher::setNodeID
bool setNodeID(NodeID nid)
Definition: uc_dispatcher.cpp:374
DispatcherTransferEmulator::DispatcherTransferEmulator
DispatcherTransferEmulator(CanDriverMock &target, uavcan::NodeID dst_node_id=127)
Definition: dispatcher.cpp:18
uavcan::Dispatcher::getNumServiceRequestListeners
unsigned getNumServiceRequestListeners() const
Definition: dispatcher.hpp:178
uavcan::CanFrame
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:24
SystemClockMock::monotonic
uint64_t monotonic
Definition: libuavcan/libuavcan/test/clock.hpp:15
uavcan::TransferPerfCounter::getErrorCount
const uint64_t & getErrorCount() const
Definition: perf_counter.hpp:65
uavcan::CanIOFlagLoopback
static const CanIOFlags CanIOFlagLoopback
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:141
uavcan::CanRxFrame
Definition: can_io.hpp:25
TestListener
Definition: transfer_test_helpers.hpp:120
uavcan::OutgoingTransferRegistry::accessOrCreate
TransferID * accessOrCreate(const OutgoingTransferRegistryKey &key, MonotonicTime new_deadline)
Definition: uc_outgoing_transfer_registry.cpp:27
uavcan::TransferTypeServiceRequest
@ TransferTypeServiceRequest
Definition: transfer.hpp:21
uavcan::Dispatcher
class UAVCAN_EXPORT Dispatcher
Definition: dispatcher.hpp:21
SELF_NODE_ID
static const uavcan::NodeID SELF_NODE_ID(64)
uavcan::Dispatcher::spinOnce
int spinOnce()
Definition: uc_dispatcher.cpp:252
uavcan::PoolAllocator< uavcan::MemPoolBlockSize *100, uavcan::MemPoolBlockSize >
uavcan::TransferPerfCounter::getRxTransferCount
const uint64_t & getRxTransferCount() const
Definition: perf_counter.hpp:64
Transfer
Definition: transfer_test_helpers.hpp:16
DispatcherTestLoopbackFrameListener::last_frame
uavcan::RxFrame last_frame
Definition: dispatcher.cpp:337
uavcan::Dispatcher::getNumMessageListeners
unsigned getNumMessageListeners() const
Definition: dispatcher.hpp:177
CanIfaceMock::pushRx
void pushRx(const uavcan::CanFrame &frame)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:68
dispatcher.hpp
uavcan::LoopbackFrameListenerRegistry::getNumListeners
unsigned getNumListeners() const
Definition: dispatcher.hpp:57
uavcan::LoopbackFrameListenerBase
Definition: dispatcher.hpp:27
uavcan::Dispatcher
Definition: dispatcher.hpp:80
CanDriverMock::ifaces
std::vector< CanIfaceMock > ifaces
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:193
uavcan::Dispatcher::spin
int spin(MonotonicTime deadline)
Definition: uc_dispatcher.cpp:221
uavcan::Dispatcher::hasPublisher
bool hasPublisher(DataTypeID dtid) const
Definition: uc_dispatcher.cpp:364
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::DataTypeDescriptor
Definition: data_type.hpp:130
uavcan::TransferTypeMessageBroadcast
@ TransferTypeMessageBroadcast
Definition: transfer.hpp:22
uavcan::RxFrame
Definition: frame.hpp:104
can.hpp
uavcan::Dispatcher::getNumServiceResponseListeners
unsigned getNumServiceResponseListeners() const
Definition: dispatcher.hpp:179
transfer_test_helpers.hpp
uavcan::Dispatcher::hasSubscriber
bool hasSubscriber(DataTypeID dtid) const
Definition: uc_dispatcher.cpp:359
NullAllocator
Definition: transfer_test_helpers.hpp:314
uavcan::Dispatcher::unregisterServiceRequestListener
void unregisterServiceRequestListener(TransferListener *listener)
Definition: uc_dispatcher.cpp:349
DispatcherTransferEmulator::sendOneFrame
void sendOneFrame(const uavcan::RxFrame &frame)
Definition: dispatcher.cpp:23
frame
uavcan::CanFrame frame
Definition: can.cpp:78
CanDriverMock
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:190
uavcan::Dispatcher::send
int send(const Frame &frame, MonotonicTime tx_deadline, MonotonicTime blocking_deadline, CanIOFlags flags, uint8_t iface_mask)
Definition: uc_dispatcher.cpp:287
tsMono
uavcan::MonotonicTime tsMono(uint64_t usec)
Definition: libuavcan/libuavcan/test/clock.hpp:97
uavcan::TransferPerfCounter::getTxTransferCount
const uint64_t & getTxTransferCount() const
Definition: perf_counter.hpp:63
uavcan::Frame
Definition: frame.hpp:17
uavcan::Dispatcher::getOutgoingTransferRegistry
OutgoingTransferRegistry & getOutgoingTransferRegistry()
Definition: dispatcher.hpp:204
uavcan::Dispatcher::registerServiceRequestListener
bool registerServiceRequestListener(TransferListener *listener)
Definition: uc_dispatcher.cpp:324
uavcan::Dispatcher::getLoopbackFrameListenerRegistry
LoopbackFrameListenerRegistry & getLoopbackFrameListenerRegistry()
Definition: dispatcher.hpp:207
uavcan::LoopbackFrameListenerBase::LoopbackFrameListenerBase
LoopbackFrameListenerBase(Dispatcher &dispatcher)
Definition: dispatcher.hpp:32
uavcan::Dispatcher::getTransferPerfCounter
const TransferPerfCounter & getTransferPerfCounter() const
Definition: dispatcher.hpp:236
uavcan::Dispatcher::getNodeID
NodeID getNodeID() const
Definition: dispatcher.hpp:222
CanDriverMock::getIface
virtual uavcan::ICanIface * getIface(uavcan::uint8_t iface_index)
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:272
DispatcherTestLoopbackFrameListener::handleLoopbackFrame
void handleLoopbackFrame(const uavcan::RxFrame &frame)
Definition: dispatcher.cpp:348
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
CanIfaceMock
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:18
SystemClockMock
Definition: libuavcan/libuavcan/test/clock.hpp:12
uavcan::MonotonicTime
Definition: time.hpp:184
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
IncomingTransferEmulatorBase
Definition: transfer_test_helpers.hpp:244
uavcan::DataTypeKindMessage
@ DataTypeKindMessage
Definition: data_type.hpp:22
SystemClockMock::monotonic_auto_advance
uint64_t monotonic_auto_advance
Definition: libuavcan/libuavcan/test/clock.hpp:18
uavcan::Dispatcher::hasServer
bool hasServer(DataTypeID dtid) const
Definition: uc_dispatcher.cpp:369
RxFrameListener
Definition: dispatcher.cpp:35
uavcan::Dispatcher::unregisterServiceResponseListener
void unregisterServiceResponseListener(TransferListener *listener)
Definition: uc_dispatcher.cpp:354
uavcan::Dispatcher::unregisterMessageListener
void unregisterMessageListener(TransferListener *listener)
Definition: uc_dispatcher.cpp:344
RxFrameListener::rx_frames
std::vector< uavcan::CanRxFrame > rx_frames
Definition: dispatcher.cpp:37
DispatcherTransferEmulator
Definition: dispatcher.cpp:13
DispatcherTransferEmulator::target_
CanDriverMock & target_
Definition: dispatcher.cpp:15


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