5 #include <gtest/gtest.h> 10 TEST(DynamicNodeIDClient, Basic)
24 uavcan::protocol::HardwareVersion::FieldTypes::unique_id unique_id;
26 ASSERT_LE(-uavcan::ErrInvalidParam, dnidac.
start(unique_id));
36 ASSERT_LE(0, dnidac.
start(unique_id, PreferredNodeID));
46 ASSERT_LE(0, dynid_sub.start());
47 dynid_sub.subscriber.allowAnonymousTransfers();
53 ASSERT_TRUE(dynid_sub.collector.msg.get());
54 std::cout <<
"First-stage request:\n" << *dynid_sub.collector.msg << std::endl;
55 ASSERT_EQ(PreferredNodeID.get(), dynid_sub.collector.msg->node_id);
56 ASSERT_TRUE(dynid_sub.collector.msg->first_part_of_unique_id);
57 ASSERT_TRUE(
uavcan::equal(dynid_sub.collector.msg->unique_id.begin(),
58 dynid_sub.collector.msg->unique_id.end(),
60 dynid_sub.collector.msg.reset();
64 ASSERT_TRUE(dynid_sub.collector.msg.get());
65 dynid_sub.collector.msg.reset();
75 ASSERT_LE(0, dynid_pub.init());
80 for (
int i = 0; i < 10; i++)
82 uavcan::protocol::dynamic_node_id::Allocation msg;
83 ASSERT_LE(0, dynid_pub.broadcast(msg));
85 ASSERT_FALSE(dynid_sub.collector.msg.get());
91 const uint8_t BytesPerRequest = uavcan::protocol::dynamic_node_id::Allocation::MAX_LENGTH_OF_UNIQUE_ID_IN_REQUEST;
93 uavcan::protocol::dynamic_node_id::Allocation msg;
94 msg.unique_id.resize(BytesPerRequest);
95 uavcan::copy(unique_id.begin(), unique_id.begin() + BytesPerRequest, msg.unique_id.begin());
97 std::cout <<
"First-stage offer:\n" << msg << std::endl;
99 ASSERT_FALSE(dynid_sub.collector.msg.get());
100 ASSERT_LE(0, dynid_pub.broadcast(msg));
103 ASSERT_TRUE(dynid_sub.collector.msg.get());
104 std::cout <<
"Second-stage request:\n" << *dynid_sub.collector.msg << std::endl;
105 ASSERT_EQ(PreferredNodeID.get(), dynid_sub.collector.msg->node_id);
106 ASSERT_FALSE(dynid_sub.collector.msg->first_part_of_unique_id);
107 ASSERT_TRUE(
uavcan::equal(dynid_sub.collector.msg->unique_id.begin(),
108 dynid_sub.collector.msg->unique_id.end(),
109 unique_id.begin() + BytesPerRequest));
110 dynid_sub.collector.msg.reset();
117 uavcan::protocol::dynamic_node_id::Allocation msg;
118 msg.unique_id.resize(BytesPerRequest * 2);
119 uavcan::copy(unique_id.begin(), unique_id.begin() + BytesPerRequest * 2, msg.unique_id.begin());
121 std::cout <<
"Second-stage offer:\n" << msg << std::endl;
123 ASSERT_FALSE(dynid_sub.collector.msg.get());
124 ASSERT_LE(0, dynid_pub.broadcast(msg));
127 ASSERT_TRUE(dynid_sub.collector.msg.get());
128 std::cout <<
"Last request:\n" << *dynid_sub.collector.msg << std::endl;
129 ASSERT_EQ(PreferredNodeID.get(), dynid_sub.collector.msg->node_id);
130 ASSERT_FALSE(dynid_sub.collector.msg->first_part_of_unique_id);
131 ASSERT_TRUE(
uavcan::equal(dynid_sub.collector.msg->unique_id.begin(),
132 dynid_sub.collector.msg->unique_id.end(),
133 unique_id.begin() + BytesPerRequest * 2));
134 dynid_sub.collector.msg.reset();
145 uavcan::protocol::dynamic_node_id::Allocation msg;
146 msg.unique_id.resize(16);
148 uavcan::copy(unique_id.begin(), unique_id.end(), msg.unique_id.begin());
150 ASSERT_FALSE(dynid_sub.collector.msg.get());
151 ASSERT_LE(0, dynid_pub.broadcast(msg));
153 ASSERT_FALSE(dynid_sub.collector.msg.get());
162 TEST(DynamicNodeIDClient, NonPassiveMode)
172 uavcan::protocol::HardwareVersion::FieldTypes::unique_id unique_id;
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
static const NodeID Broadcast
bool isAllocationComplete() const
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
NodeID getAllocatedNodeID() const
static GlobalDataTypeRegistry & instance()
NodeID getAllocatorNodeID() const
TEST(DynamicNodeIDClient, Basic)
static MonotonicDuration fromMSec(int64_t ms)
int spinBoth(uavcan::MonotonicDuration duration)
int start(const UniqueID &unique_id, const NodeID preferred_node_id=NodeID::Broadcast, const TransferPriority transfer_priority=TransferPriority::OneHigherThanLowest)
static const uavcan::int16_t ErrLogic
Internal logic error.