5 #include <gtest/gtest.h> 8 #include <root_ns_a/EmptyMessage.hpp> 9 #include <root_ns_a/MavlinkMessage.hpp> 10 #include "../clock.hpp" 11 #include "../transport/can/can.hpp" 15 template <
typename DataType>
31 : ts_monotonic(s.getMonotonicTimestamp())
32 , ts_utc(s.getUtcTimestamp())
33 , transfer_type(s.getTransferType())
34 , transfer_id(s.getTransferID())
35 , src_node_id(s.getSrcNodeID())
36 , iface_index(s.getIfaceIndex())
42 std::vector<ReceivedDataStructureCopy>
extended;
46 extended.push_back(msg);
51 simple.push_back(msg);
81 "sizeof(uavcan::Subscriber<root_ns_a::MavlinkMessage, Listener::ExtendedBinder>): " <<
97 root_ns_a::MavlinkMessage expected_msg;
98 expected_msg.seq = 0x42;
99 expected_msg.sysid = 0x72;
100 expected_msg.compid = 0x08;
101 expected_msg.msgid = 0xa5;
102 expected_msg.payload =
"Msg";
104 const uint8_t transfer_payload[] = {0x42, 0x72, 0x08, 0xa5,
'M',
's',
'g'};
109 std::vector<uavcan::RxFrame> rx_frames;
110 for (
uint8_t i = 0; i < 4; i++)
123 rx_frames.push_back(rx_frame);
131 ASSERT_EQ(0, sub_extended.
start(listener.bindExtended()));
132 ASSERT_EQ(0, sub_extended2.
start(listener.bindExtended()));
133 ASSERT_EQ(0, sub_simple.
start(listener.bindSimple()));
134 ASSERT_EQ(0, sub_simple2.
start(listener.bindSimple()));
138 sub_extended2.
stop();
143 for (
unsigned i = 0; i < rx_frames.size(); i++)
145 can_driver.
ifaces[0].pushRx(rx_frames[i]);
146 can_driver.
ifaces[1].pushRx(rx_frames[i]);
154 ASSERT_EQ(listener.extended.size(), rx_frames.size());
155 for (
unsigned i = 0; i < rx_frames.size(); i++)
157 const Listener::ReceivedDataStructureCopy
s = listener.extended.at(i);
158 ASSERT_TRUE(s.msg == expected_msg);
159 ASSERT_EQ(rx_frames[i].getSrcNodeID(), s.src_node_id);
160 ASSERT_EQ(rx_frames[i].getTransferID(), s.transfer_id);
161 ASSERT_EQ(rx_frames[i].getTransferType(), s.transfer_type);
162 ASSERT_EQ(rx_frames[i].getMonotonicTimestamp(), s.ts_monotonic);
163 ASSERT_EQ(rx_frames[i].getIfaceIndex(), s.iface_index);
166 ASSERT_EQ(listener.simple.size(), rx_frames.size());
167 for (
unsigned i = 0; i < rx_frames.size(); i++)
169 ASSERT_TRUE(listener.simple.at(i) == expected_msg);
181 sub_extended2.
stop();
191 FAIL() <<
"I just went mad";
213 for (
uint8_t i = 0; i < 4; i++)
223 can_driver.
ifaces[0].pushRx(rx_frame);
224 can_driver.
ifaces[1].pushRx(rx_frame);
237 TEST(Subscriber, SingleFrameTransfer)
252 "sizeof(uavcan::Subscriber<root_ns_a::EmptyMessage, Listener::SimpleBinder>): " <<
257 sub.
start(listener.bindSimple());
259 for (
uint8_t i = 0; i < 4; i++)
269 can_driver.
ifaces[0].pushRx(rx_frame);
270 can_driver.
ifaces[1].pushRx(rx_frame);
277 ASSERT_EQ(4, listener.simple.size());
278 for (
unsigned i = 0; i < 4; i++)
280 ASSERT_TRUE(listener.simple.at(i) == root_ns_a::EmptyMessage());
static void panickingSink(const uavcan::ReceivedDataStructure< root_ns_a::MavlinkMessage > &)
SubscriptionListener< DataType > SelfType
uavcan::TransferType transfer_type
virtual uavcan::MonotonicTime getMonotonic() const
Dispatcher & getDispatcher()
void setStartOfTransfer(bool x)
ExtendedBinder bindExtended()
static const NodeID Broadcast
uint8_t setPayload(const uint8_t *data, unsigned len)
SimpleBinder bindSimple()
std::vector< DataType > simple
uavcan::MethodBinder< SelfType *, void(SelfType::*)(ReceivedDataStructure &)> ExtendedBinder
Implicitly convertible to/from uavcan.Timestamp.
uavcan::TransferID transfer_id
virtual uavcan::UtcTime getUtc() const
uavcan::NodeID src_node_id
int spin(MonotonicTime deadline)
uavcan::MonotonicTime ts_monotonic
void receiveSimple(DataType &msg)
int start(const Callback &callback)
static GlobalDataTypeRegistry & instance()
uavcan::MethodBinder< SelfType *, void(SelfType::*)(DataType &)> SimpleBinder
uavcan::uint8_t iface_index
uavcan::ReceivedDataStructure< DataType > ReceivedDataStructure
std::vector< ReceivedDataStructureCopy > extended
unsigned getNumMessageListeners() const
uavcan::MonotonicDuration durMono(int64_t usec)
void receiveExtended(ReceivedDataStructure &msg)
ReceivedDataStructureCopy(const ReceivedDataStructure &s)
void setEndOfTransfer(bool x)
std::vector< CanIfaceMock > ifaces
uint32_t getFailureCount() const