mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-05-22 08:27:36 +08:00
INode class. Publisher, Subscriber, ServiceServer, ServiceClient now accept INode in constructor instead of the bunch of independent params. Self NodeID now being configured via setNodeID() method instead of constructor param
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include <root_ns_a/EmptyMessage.hpp>
|
||||
#include "../clock.hpp"
|
||||
#include "../transport/can/can.hpp"
|
||||
#include "test_node.hpp"
|
||||
|
||||
|
||||
template <typename DataType>
|
||||
@@ -59,27 +60,20 @@ struct SubscriptionListener
|
||||
|
||||
TEST(Subscriber, Basic)
|
||||
{
|
||||
uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 8, uavcan::MemPoolBlockSize> pool;
|
||||
uavcan::PoolManager<1> poolmgr;
|
||||
poolmgr.addPool(&pool);
|
||||
|
||||
// Manual type registration - we can't rely on the GDTR state
|
||||
uavcan::GlobalDataTypeRegistry::instance().reset();
|
||||
uavcan::DefaultDataTypeRegistrator<uavcan::mavlink::Message> _registrator;
|
||||
|
||||
SystemClockDriver clock_driver;
|
||||
CanDriverMock can_driver(2, clock_driver);
|
||||
|
||||
uavcan::OutgoingTransferRegistry<8> out_trans_reg(poolmgr);
|
||||
|
||||
uavcan::Scheduler sch(can_driver, poolmgr, clock_driver, out_trans_reg, uavcan::NodeID(1));
|
||||
TestNode node(can_driver, clock_driver, 1);
|
||||
|
||||
typedef SubscriptionListener<uavcan::mavlink::Message> Listener;
|
||||
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::ExtendedBinder> sub_extended(sch, poolmgr);
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::ExtendedBinder> sub_extended2(sch, poolmgr); // Not used
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::SimpleBinder> sub_simple(sch, poolmgr);
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::SimpleBinder> sub_simple2(sch, poolmgr); // Not used
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::ExtendedBinder> sub_extended(node);
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::ExtendedBinder> sub_extended2(node); // Not used
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::SimpleBinder> sub_simple(node);
|
||||
uavcan::Subscriber<uavcan::mavlink::Message, Listener::SimpleBinder> sub_simple2(node); // Not used
|
||||
|
||||
std::cout <<
|
||||
"sizeof(uavcan::Subscriber<uavcan::mavlink::Message, Listener::ExtendedBinder>): " <<
|
||||
@@ -115,7 +109,7 @@ TEST(Subscriber, Basic)
|
||||
{
|
||||
uavcan::TransferType tt = (i & 1) ? uavcan::TransferTypeMessageUnicast : uavcan::TransferTypeMessageBroadcast;
|
||||
uavcan::NodeID dni = (tt == uavcan::TransferTypeMessageBroadcast) ?
|
||||
uavcan::NodeID::Broadcast : sch.getDispatcher().getSelfNodeID();
|
||||
uavcan::NodeID::Broadcast : node.getDispatcher().getNodeID();
|
||||
// uint_fast16_t data_type_id, TransferType transfer_type, NodeID src_node_id, NodeID dst_node_id,
|
||||
// uint_fast8_t frame_index, TransferID transfer_id, bool last_frame
|
||||
uavcan::Frame frame(uavcan::mavlink::Message::DefaultDataTypeID, tt, uavcan::NodeID(i + 100), dni, 0, i, true);
|
||||
@@ -127,19 +121,19 @@ TEST(Subscriber, Basic)
|
||||
/*
|
||||
* Reception
|
||||
*/
|
||||
ASSERT_EQ(0, sch.getDispatcher().getNumMessageListeners());
|
||||
ASSERT_EQ(0, node.getDispatcher().getNumMessageListeners());
|
||||
|
||||
ASSERT_EQ(1, sub_extended.start(listener.bindExtended()));
|
||||
ASSERT_EQ(1, sub_extended2.start(listener.bindExtended()));
|
||||
ASSERT_EQ(1, sub_simple.start(listener.bindSimple()));
|
||||
ASSERT_EQ(1, sub_simple2.start(listener.bindSimple()));
|
||||
|
||||
ASSERT_EQ(4, sch.getDispatcher().getNumMessageListeners());
|
||||
ASSERT_EQ(4, node.getDispatcher().getNumMessageListeners());
|
||||
|
||||
sub_extended2.stop(); // These are not used - making sure they aren't receiving anything
|
||||
sub_simple2.stop();
|
||||
|
||||
ASSERT_EQ(2, sch.getDispatcher().getNumMessageListeners());
|
||||
ASSERT_EQ(2, node.getDispatcher().getNumMessageListeners());
|
||||
|
||||
for (unsigned int i = 0; i < rx_frames.size(); i++)
|
||||
{
|
||||
@@ -147,7 +141,7 @@ TEST(Subscriber, Basic)
|
||||
can_driver.ifaces[1].pushRx(rx_frames[i]);
|
||||
}
|
||||
|
||||
ASSERT_LE(0, sch.spin(clock_driver.getMonotonic() + durMono(10000)));
|
||||
ASSERT_LE(0, node.spin(clock_driver.getMonotonic() + durMono(10000)));
|
||||
|
||||
/*
|
||||
* Validation
|
||||
@@ -175,14 +169,14 @@ TEST(Subscriber, Basic)
|
||||
/*
|
||||
* Unregistration
|
||||
*/
|
||||
ASSERT_EQ(2, sch.getDispatcher().getNumMessageListeners());
|
||||
ASSERT_EQ(2, node.getDispatcher().getNumMessageListeners());
|
||||
|
||||
sub_extended.stop();
|
||||
sub_extended2.stop();
|
||||
sub_simple.stop();
|
||||
sub_simple2.stop();
|
||||
|
||||
ASSERT_EQ(0, sch.getDispatcher().getNumMessageListeners());
|
||||
ASSERT_EQ(0, node.getDispatcher().getNumMessageListeners());
|
||||
}
|
||||
|
||||
|
||||
@@ -194,26 +188,19 @@ static void panickingSink(const uavcan::ReceivedDataStructure<uavcan::mavlink::M
|
||||
|
||||
TEST(Subscriber, FailureCount)
|
||||
{
|
||||
uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 8, uavcan::MemPoolBlockSize> pool;
|
||||
uavcan::PoolManager<1> poolmgr;
|
||||
poolmgr.addPool(&pool);
|
||||
|
||||
// Manual type registration - we can't rely on the GDTR state
|
||||
uavcan::GlobalDataTypeRegistry::instance().reset();
|
||||
uavcan::DefaultDataTypeRegistrator<uavcan::mavlink::Message> _registrator;
|
||||
|
||||
SystemClockDriver clock_driver;
|
||||
CanDriverMock can_driver(2, clock_driver);
|
||||
|
||||
uavcan::OutgoingTransferRegistry<8> out_trans_reg(poolmgr);
|
||||
|
||||
uavcan::Scheduler sch(can_driver, poolmgr, clock_driver, out_trans_reg, uavcan::NodeID(1));
|
||||
TestNode node(can_driver, clock_driver, 1);
|
||||
|
||||
{
|
||||
uavcan::Subscriber<uavcan::mavlink::Message> sub(sch, poolmgr);
|
||||
ASSERT_EQ(0, sch.getDispatcher().getNumMessageListeners());
|
||||
uavcan::Subscriber<uavcan::mavlink::Message> sub(node);
|
||||
ASSERT_EQ(0, node.getDispatcher().getNumMessageListeners());
|
||||
sub.start(panickingSink);
|
||||
ASSERT_EQ(1, sch.getDispatcher().getNumMessageListeners());
|
||||
ASSERT_EQ(1, node.getDispatcher().getNumMessageListeners());
|
||||
|
||||
ASSERT_EQ(0, sub.getFailureCount());
|
||||
|
||||
@@ -229,36 +216,29 @@ TEST(Subscriber, FailureCount)
|
||||
can_driver.ifaces[1].pushRx(rx_frame);
|
||||
}
|
||||
|
||||
ASSERT_LE(0, sch.spin(clock_driver.getMonotonic() + durMono(10000)));
|
||||
ASSERT_LE(0, node.spin(clock_driver.getMonotonic() + durMono(10000)));
|
||||
|
||||
ASSERT_EQ(4, sub.getFailureCount());
|
||||
|
||||
ASSERT_EQ(1, sch.getDispatcher().getNumMessageListeners()); // Still there
|
||||
ASSERT_EQ(1, node.getDispatcher().getNumMessageListeners()); // Still there
|
||||
}
|
||||
ASSERT_EQ(0, sch.getDispatcher().getNumMessageListeners()); // Removed
|
||||
ASSERT_EQ(0, node.getDispatcher().getNumMessageListeners()); // Removed
|
||||
}
|
||||
|
||||
|
||||
TEST(Subscriber, SingleFrameTransfer)
|
||||
{
|
||||
uavcan::PoolAllocator<uavcan::MemPoolBlockSize * 8, uavcan::MemPoolBlockSize> pool;
|
||||
uavcan::PoolManager<1> poolmgr;
|
||||
poolmgr.addPool(&pool);
|
||||
|
||||
// Manual type registration - we can't rely on the GDTR state
|
||||
uavcan::GlobalDataTypeRegistry::instance().reset();
|
||||
uavcan::DefaultDataTypeRegistrator<root_ns_a::EmptyMessage> _registrator;
|
||||
|
||||
SystemClockDriver clock_driver;
|
||||
CanDriverMock can_driver(2, clock_driver);
|
||||
|
||||
uavcan::OutgoingTransferRegistry<8> out_trans_reg(poolmgr);
|
||||
|
||||
uavcan::Scheduler sch(can_driver, poolmgr, clock_driver, out_trans_reg, uavcan::NodeID(1));
|
||||
TestNode node(can_driver, clock_driver, 1);
|
||||
|
||||
typedef SubscriptionListener<root_ns_a::EmptyMessage> Listener;
|
||||
|
||||
uavcan::Subscriber<root_ns_a::EmptyMessage, Listener::SimpleBinder> sub(sch, poolmgr);
|
||||
uavcan::Subscriber<root_ns_a::EmptyMessage, Listener::SimpleBinder> sub(node);
|
||||
|
||||
std::cout <<
|
||||
"sizeof(uavcan::Subscriber<root_ns_a::EmptyMessage, Listener::SimpleBinder>): " <<
|
||||
@@ -280,7 +260,7 @@ TEST(Subscriber, SingleFrameTransfer)
|
||||
can_driver.ifaces[1].pushRx(rx_frame);
|
||||
}
|
||||
|
||||
ASSERT_LE(0, sch.spin(clock_driver.getMonotonic() + durMono(10000)));
|
||||
ASSERT_LE(0, node.spin(clock_driver.getMonotonic() + durMono(10000)));
|
||||
|
||||
ASSERT_EQ(0, sub.getFailureCount());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user