diff --git a/dsdl/uavcan/protocol/550.NodeStatus.uavcan b/dsdl/uavcan/protocol/550.NodeStatus.uavcan index 49dad14703..0d777fc759 100644 --- a/dsdl/uavcan/protocol/550.NodeStatus.uavcan +++ b/dsdl/uavcan/protocol/550.NodeStatus.uavcan @@ -3,10 +3,11 @@ # Any UAVCAN node is required to publish this message periodically. # -uint16 PUBLICATION_PERIOD_MS = 1000 +uint16 MAX_PUBLICATION_PERIOD_MS = 1000 +uint16 MIN_PUBLICATION_PERIOD_MS = 20 # If a node fails to publish this message in this amount of time, it should be considered offline. -uint16 OFFLINE_TIMEOUT_MS = 5000 +uint16 OFFLINE_TIMEOUT_MS = 3000 # Uptime counter should never overflow. uint28 uptime_sec diff --git a/libuavcan/src/protocol/uc_network_compat_checker.cpp b/libuavcan/src/protocol/uc_network_compat_checker.cpp index 095343af11..4c215b29c8 100644 --- a/libuavcan/src/protocol/uc_network_compat_checker.cpp +++ b/libuavcan/src/protocol/uc_network_compat_checker.cpp @@ -16,8 +16,8 @@ namespace uavcan MonotonicDuration NetworkCompatibilityChecker::getNetworkDiscoveryDelay() const { - // Base duration is constant - NodeStatus publication period - MonotonicDuration dur = MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS); + // Base duration is constant - NodeStatus max publication period + MonotonicDuration dur = MonotonicDuration::fromMSec(protocol::NodeStatus::MAX_PUBLICATION_PERIOD_MS); // Additional duration depends on the node priority - gets larger with higher Node ID dur += MonotonicDuration::fromMSec(getNode().getNodeID().get() * 10); return dur; diff --git a/libuavcan/src/protocol/uc_node_status_provider.cpp b/libuavcan/src/protocol/uc_node_status_provider.cpp index 998564fa9e..32a5bacb7f 100644 --- a/libuavcan/src/protocol/uc_node_status_provider.cpp +++ b/libuavcan/src/protocol/uc_node_status_provider.cpp @@ -92,7 +92,7 @@ int NodeStatusProvider::startAndPublish() goto fail; } - setStatusPublishingPeriod(MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS)); + setStatusPublishingPeriod(MonotonicDuration::fromMSec(protocol::NodeStatus::MAX_PUBLICATION_PERIOD_MS)); return res; @@ -106,8 +106,8 @@ fail: void NodeStatusProvider::setStatusPublishingPeriod(uavcan::MonotonicDuration period) { - const MonotonicDuration maximum = MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS); - const MonotonicDuration minimum = MonotonicDuration::fromMSec(50); + const MonotonicDuration maximum = MonotonicDuration::fromMSec(protocol::NodeStatus::MAX_PUBLICATION_PERIOD_MS); + const MonotonicDuration minimum = MonotonicDuration::fromMSec(protocol::NodeStatus::MIN_PUBLICATION_PERIOD_MS); period = min(period, maximum); period = max(period, minimum); diff --git a/libuavcan/test/protocol/node_status_monitor.cpp b/libuavcan/test/protocol/node_status_monitor.cpp index eae83b3c24..654a8f24c7 100644 --- a/libuavcan/test/protocol/node_status_monitor.cpp +++ b/libuavcan/test/protocol/node_status_monitor.cpp @@ -106,19 +106,19 @@ TEST(NodeStatusMonitor, Basic) */ std::cout << "Starting timeout test, current monotime is " << clock_mock.monotonic << std::endl; - clock_mock.advance(1000000); + clock_mock.advance(500000); shortSpin(node); st = nsm.getNodeStatus(uavcan::NodeID(10)); ASSERT_TRUE(st.known); ASSERT_EQ(NodeStatus::STATUS_OK, st.status_code); - clock_mock.advance(1000000); + clock_mock.advance(500000); shortSpin(node); st = nsm.getNodeStatus(uavcan::NodeID(9)); ASSERT_TRUE(st.known); ASSERT_EQ(NodeStatus::STATUS_INITIALIZING, st.status_code); - clock_mock.advance(1000000); + clock_mock.advance(500000); shortSpin(node); st = nsm.getNodeStatus(uavcan::NodeID(11)); ASSERT_TRUE(st.known); @@ -127,7 +127,7 @@ TEST(NodeStatusMonitor, Basic) /* * Will timeout now */ - clock_mock.advance(2000000); + clock_mock.advance(4000000); shortSpin(node); st = nsm.getNodeStatus(uavcan::NodeID(10)); diff --git a/libuavcan/test/protocol/node_status_provider.cpp b/libuavcan/test/protocol/node_status_provider.cpp index e6185e5d19..eaa160b6e1 100644 --- a/libuavcan/test/protocol/node_status_provider.cpp +++ b/libuavcan/test/protocol/node_status_provider.cpp @@ -47,14 +47,15 @@ TEST(NodeStatusProvider, Basic) ASSERT_LE(0, nsp.startAndPublish()); // Checking the publishing rate settings - ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::PUBLICATION_PERIOD_MS), + ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::MAX_PUBLICATION_PERIOD_MS), nsp.getStatusPublishingPeriod()); nsp.setStatusPublishingPeriod(uavcan::MonotonicDuration()); - ASSERT_FALSE(nsp.getStatusPublishingPeriod().isZero()); + ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::MIN_PUBLICATION_PERIOD_MS), + nsp.getStatusPublishingPeriod()); nsp.setStatusPublishingPeriod(uavcan::MonotonicDuration::fromMSec(3600 * 1000 * 24)); - ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::PUBLICATION_PERIOD_MS), + ASSERT_EQ(uavcan::MonotonicDuration::fromMSec(uavcan::protocol::NodeStatus::MAX_PUBLICATION_PERIOD_MS), nsp.getStatusPublishingPeriod()); /*