publisher.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
7 #include <root_ns_a/MavlinkMessage.hpp>
8 #include "../clock.hpp"
9 #include "../transport/can/can.hpp"
10 #include "test_node.hpp"
11 
12 
13 TEST(Publisher, Basic)
14 {
15  SystemClockMock clock_mock(100);
16  CanDriverMock can_driver(2, clock_mock);
17  TestNode node(can_driver, clock_mock, 1);
18 
20 
21  ASSERT_FALSE(publisher.getTransferSender().isInitialized());
22 
23  std::cout <<
24  "sizeof(uavcan::Publisher<root_ns_a::MavlinkMessage>): " <<
26 
27  // Manual type registration - we can't rely on the GDTR state
30 
31  /*
32  * Message layout:
33  * uint8 seq
34  * uint8 sysid
35  * uint8 compid
36  * uint8 msgid
37  * uint8[<256] payload
38  */
39  root_ns_a::MavlinkMessage msg;
40  msg.seq = 0x42;
41  msg.sysid = 0x72;
42  msg.compid = 0x08;
43  msg.msgid = 0xa5;
44  msg.payload = "Msg";
45 
46  const uint8_t expected_transfer_payload[] = {0x42, 0x72, 0x08, 0xa5, 'M', 's', 'g'};
47  const uint64_t tx_timeout_usec = uint64_t(publisher.getDefaultTxTimeout().toUSec());
48 
49  /*
50  * Broadcast
51  */
52  {
53  ASSERT_LT(0, publisher.broadcast(msg));
54 
55  // uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
56  // uint_fast8_t frame_index, TransferID transfer_id, bool last_frame = false
57  uavcan::Frame expected_frame(root_ns_a::MavlinkMessage::DefaultDataTypeID, uavcan::TransferTypeMessageBroadcast,
58  node.getNodeID(), uavcan::NodeID::Broadcast, 0);
59  expected_frame.setPayload(expected_transfer_payload, 7);
60  expected_frame.setStartOfTransfer(true);
61  expected_frame.setEndOfTransfer(true);
62 
63  uavcan::CanFrame expected_can_frame;
64  ASSERT_TRUE(expected_frame.compile(expected_can_frame));
65 
66  ASSERT_TRUE(can_driver.ifaces[0].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
67  ASSERT_TRUE(can_driver.ifaces[1].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
68  ASSERT_TRUE(can_driver.ifaces[0].tx.empty());
69  ASSERT_TRUE(can_driver.ifaces[1].tx.empty());
70 
71  // Second shot - checking the transfer ID
72  publisher.setPriority(10);
73  ASSERT_LT(0, publisher.broadcast(msg));
74 
75  expected_frame = uavcan::Frame(root_ns_a::MavlinkMessage::DefaultDataTypeID,
77  node.getNodeID(), uavcan::NodeID::Broadcast, 1);
78  expected_frame.setStartOfTransfer(true);
79  expected_frame.setEndOfTransfer(true);
80  expected_frame.setPayload(expected_transfer_payload, 7);
81  expected_frame.setPriority(10);
82  ASSERT_TRUE(expected_frame.compile(expected_can_frame));
83 
84  ASSERT_TRUE(can_driver.ifaces[0].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
85  ASSERT_TRUE(can_driver.ifaces[1].matchAndPopTx(expected_can_frame, tx_timeout_usec + 100));
86  ASSERT_TRUE(can_driver.ifaces[0].tx.empty());
87  ASSERT_TRUE(can_driver.ifaces[1].tx.empty());
88  }
89 
90  clock_mock.advance(1000);
91 
92  /*
93  * Misc
94  */
95  ASSERT_TRUE(uavcan::GlobalDataTypeRegistry::instance().isFrozen());
96  ASSERT_TRUE(publisher.getTransferSender().isInitialized());
97 }
uavcan::Frame::setPayload
uint8_t setPayload(const uint8_t *data, unsigned len)
Definition: uc_frame.cpp:16
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
uavcan::DefaultDataTypeRegistrator
Definition: global_data_type_registry.hpp:186
uavcan::Publisher
Definition: publisher.hpp:18
uavcan::Frame::compile
bool compile(CanFrame &can_frame) const
Definition: uc_frame.cpp:112
SystemClockMock::advance
void advance(uint64_t usec) const
Definition: libuavcan/libuavcan/test/clock.hpp:28
uavcan::CanFrame
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:24
publisher.hpp
TestNode
Definition: test_node.hpp:20
uavcan::Frame::setEndOfTransfer
void setEndOfTransfer(bool x)
Definition: frame.hpp:82
CanDriverMock::ifaces
std::vector< CanIfaceMock > ifaces
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:193
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::TransferTypeMessageBroadcast
@ TransferTypeMessageBroadcast
Definition: transfer.hpp:22
uavcan::Frame::setPriority
void setPriority(TransferPriority priority)
Definition: frame.hpp:63
uavcan::GenericPublisherBase::getTransferSender
TransferSender & getTransferSender()
Definition: generic_publisher.hpp:51
uavcan::NodeID::Broadcast
static const NodeID Broadcast
Definition: transfer.hpp:122
test_node.hpp
uavcan::Publisher::getDefaultTxTimeout
static MonotonicDuration getDefaultTxTimeout()
Definition: publisher.hpp:68
TEST
TEST(Publisher, Basic)
Definition: publisher.cpp:13
CanDriverMock
Definition: libuavcan/libuavcan/test/transport/can/can.hpp:190
uavcan::Frame
Definition: frame.hpp:17
uavcan::Publisher::broadcast
int broadcast(const DataType &message)
Definition: publisher.hpp:52
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
SystemClockMock
Definition: libuavcan/libuavcan/test/clock.hpp:12
uavcan::GlobalDataTypeRegistry::instance
static GlobalDataTypeRegistry & instance()
Definition: uc_global_data_type_registry.cpp:128
uavcan::GenericPublisherBase::setPriority
void setPriority(const TransferPriority prio)
Definition: generic_publisher.hpp:74
uavcan::Frame::setStartOfTransfer
void setStartOfTransfer(bool x)
Definition: frame.hpp:81


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