mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-12 16:23:33 +08:00
Added slave time sync suppression, which allows to use slave and master on the same node. Shall be documented later.
This commit is contained in:
@@ -30,6 +30,7 @@ class GlobalTimeSyncSlave : Noncopyable
|
||||
NodeID master_nid_;
|
||||
TransferID prev_tid_;
|
||||
uint8_t prev_iface_index_;
|
||||
bool suppressed_;
|
||||
|
||||
ISystemClock& getSystemClock() const { return sub_.getNode().getSystemClock(); }
|
||||
|
||||
@@ -46,10 +47,14 @@ public:
|
||||
: sub_(node)
|
||||
, state_(Update)
|
||||
, prev_iface_index_(0xFF)
|
||||
, suppressed_(false)
|
||||
{ }
|
||||
|
||||
int start();
|
||||
|
||||
void suppress(bool suppressed) { suppressed_ = suppressed; }
|
||||
bool isSuppressed() const { return suppressed_; }
|
||||
|
||||
bool isActive() const;
|
||||
|
||||
NodeID getMasterNodeID() const;
|
||||
|
||||
@@ -18,7 +18,10 @@ void GlobalTimeSyncSlave::adjustFromMsg(const ReceivedDataStructure<protocol::Gl
|
||||
static_cast<long long>(adjustment.toUSec()),
|
||||
int(msg.getSrcNodeID().get()), int(msg.getIfaceIndex()));
|
||||
|
||||
getSystemClock().adjustUtc(adjustment);
|
||||
if (!suppressed_)
|
||||
{
|
||||
getSystemClock().adjustUtc(adjustment);
|
||||
}
|
||||
last_adjustment_ts_ = msg.getMonotonicTimestamp();
|
||||
state_ = Update;
|
||||
}
|
||||
|
||||
@@ -274,3 +274,39 @@ TEST(GlobalTimeSyncSlave, Validation)
|
||||
ASSERT_EQ(5000, slave_clock.utc);
|
||||
std::cout << slave_clock.monotonic << std::endl;
|
||||
}
|
||||
|
||||
|
||||
TEST(GlobalTimeSyncSlave, Suppression)
|
||||
{
|
||||
SystemClockMock slave_clock;
|
||||
slave_clock.monotonic = 1000000;
|
||||
slave_clock.preserve_utc = true;
|
||||
|
||||
CanDriverMock slave_can(3, slave_clock);
|
||||
for (int i = 0; i < slave_can.getNumIfaces(); i++)
|
||||
{
|
||||
slave_can.ifaces.at(i).enable_utc_timestamping = true;
|
||||
}
|
||||
|
||||
TestNode node(slave_can, slave_clock, 64);
|
||||
|
||||
uavcan::GlobalTimeSyncSlave gtss(node);
|
||||
uavcan::Publisher<uavcan::protocol::GlobalTimeSync> gts_pub(node);
|
||||
|
||||
ASSERT_LE(0, gtss.start());
|
||||
ASSERT_EQ(0, slave_clock.utc);
|
||||
|
||||
gtss.suppress(true);
|
||||
|
||||
broadcastSyncMsg(slave_can.ifaces.at(0), 0, 8, 0); // Locked on this
|
||||
broadcastSyncMsg(slave_can.ifaces.at(1), 2000, 8, 0); // Ignored
|
||||
ASSERT_LE(0, node.spin(uavcan::MonotonicDuration::fromMSec(10)));
|
||||
|
||||
broadcastSyncMsg(slave_can.ifaces.at(0), 1000, 8, 1); // Adjust 1000 ahead
|
||||
broadcastSyncMsg(slave_can.ifaces.at(1), 2000, 8, 1); // Ignored
|
||||
ASSERT_LE(0, node.spin(uavcan::MonotonicDuration::fromMSec(10)));
|
||||
|
||||
ASSERT_TRUE(gtss.isActive());
|
||||
ASSERT_EQ(8, gtss.getMasterNodeID().get());
|
||||
ASSERT_EQ(0, slave_clock.utc); // The clock shall not be asjusted
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user