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:
Pavel Kirienko
2014-04-01 17:35:32 +04:00
parent 2dc8525823
commit e2fa613917
3 changed files with 45 additions and 1 deletions
@@ -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
}