mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-01 02:21:35 +08:00
libuavcan passive mode support
This commit is contained in:
@@ -26,6 +26,7 @@ const int16_t ErrInvalidTransferListener = 7;
|
|||||||
const int16_t ErrNotInited = 8;
|
const int16_t ErrNotInited = 8;
|
||||||
const int16_t ErrRecursiveCall = 9;
|
const int16_t ErrRecursiveCall = 9;
|
||||||
const int16_t ErrLogic = 10;
|
const int16_t ErrLogic = 10;
|
||||||
|
const int16_t ErrPassiveMode = 11;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ public:
|
|||||||
return getScheduler().getDispatcher().setNodeID(nid);
|
return getScheduler().getDispatcher().setNodeID(nid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isPassiveMode() const { return getScheduler().getDispatcher().isPassiveMode(); }
|
||||||
|
|
||||||
int spin(MonotonicTime deadline)
|
int spin(MonotonicTime deadline)
|
||||||
{
|
{
|
||||||
return getScheduler().spin(deadline);
|
return getScheduler().spin(deadline);
|
||||||
|
|||||||
@@ -141,6 +141,8 @@ public:
|
|||||||
NodeID getNodeID() const { return self_node_id_; }
|
NodeID getNodeID() const { return self_node_id_; }
|
||||||
bool setNodeID(NodeID nid);
|
bool setNodeID(NodeID nid);
|
||||||
|
|
||||||
|
bool isPassiveMode() const { return !getNodeID().isUnicast(); }
|
||||||
|
|
||||||
const ISystemClock& getSystemClock() const { return sysclock_; }
|
const ISystemClock& getSystemClock() const { return sysclock_; }
|
||||||
ISystemClock& getSystemClock() { return sysclock_; }
|
ISystemClock& getSystemClock() { return sysclock_; }
|
||||||
|
|
||||||
|
|||||||
@@ -62,10 +62,15 @@ int NodeStatusProvider::startAndPublish()
|
|||||||
return -ErrNotInited;
|
return -ErrNotInited;
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = publish(); // Initial broadcast
|
int res = -1;
|
||||||
if (res < 0)
|
|
||||||
|
if (!getNode().isPassiveMode())
|
||||||
{
|
{
|
||||||
goto fail;
|
res = publish(); // Initial broadcast
|
||||||
|
if (res < 0)
|
||||||
|
{
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res = gdr_sub_.start(GlobalDiscoveryRequestCallback(this, &NodeStatusProvider::handleGlobalDiscoveryRequest));
|
res = gdr_sub_.start(GlobalDiscoveryRequestCallback(this, &NodeStatusProvider::handleGlobalDiscoveryRequest));
|
||||||
@@ -80,7 +85,10 @@ int NodeStatusProvider::startAndPublish()
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
TimerBase::startPeriodic(MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS));
|
if (!getNode().isPassiveMode())
|
||||||
|
{
|
||||||
|
TimerBase::startPeriodic(MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS));
|
||||||
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,11 @@ int TransferSender::send(const uint8_t* payload, int payload_len, MonotonicTime
|
|||||||
MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id,
|
MonotonicTime blocking_deadline, TransferType transfer_type, NodeID dst_node_id,
|
||||||
TransferID tid)
|
TransferID tid)
|
||||||
{
|
{
|
||||||
|
if (dispatcher_.isPassiveMode())
|
||||||
|
{
|
||||||
|
return -ErrPassiveMode;
|
||||||
|
}
|
||||||
|
|
||||||
dispatcher_.getTransferPerfCounter().addTxTransfer();
|
dispatcher_.getTransferPerfCounter().addTxTransfer();
|
||||||
|
|
||||||
Frame frame(data_type_.getID(), transfer_type, dispatcher_.getNodeID(), dst_node_id, 0, tid);
|
Frame frame(data_type_.getID(), transfer_type, dispatcher_.getNodeID(), dst_node_id, 0, tid);
|
||||||
|
|||||||
@@ -218,3 +218,28 @@ TEST(TransferSender, Loopback)
|
|||||||
EXPECT_EQ(1, dispatcher.getTransferPerfCounter().getTxTransferCount());
|
EXPECT_EQ(1, dispatcher.getTransferPerfCounter().getTxTransferCount());
|
||||||
EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getRxTransferCount());
|
EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getRxTransferCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(TransferSender, PassiveMode)
|
||||||
|
{
|
||||||
|
uavcan::PoolManager<1> poolmgr;
|
||||||
|
|
||||||
|
SystemClockMock clockmock(100);
|
||||||
|
CanDriverMock driver(2, clockmock);
|
||||||
|
|
||||||
|
uavcan::OutgoingTransferRegistry<8> out_trans_reg(poolmgr);
|
||||||
|
|
||||||
|
uavcan::Dispatcher dispatcher(driver, poolmgr, clockmock, out_trans_reg);
|
||||||
|
|
||||||
|
uavcan::TransferSender sender(dispatcher, makeDataType(uavcan::DataTypeKindMessage, 123),
|
||||||
|
uavcan::CanTxQueue::Volatile);
|
||||||
|
|
||||||
|
static const uint8_t Payload[] = {1, 2, 3, 4, 5};
|
||||||
|
|
||||||
|
ASSERT_EQ(-uavcan::ErrPassiveMode,
|
||||||
|
sender.send(Payload, sizeof(Payload), tsMono(1000), uavcan::MonotonicTime(),
|
||||||
|
uavcan::TransferTypeMessageBroadcast, uavcan::NodeID::Broadcast));
|
||||||
|
|
||||||
|
EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getErrorCount());
|
||||||
|
EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getTxTransferCount());
|
||||||
|
EXPECT_EQ(0, dispatcher.getTransferPerfCounter().getRxTransferCount());
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user