diff --git a/libuavcan/include/uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp b/libuavcan/include/uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp index 93e78d8a9e..6d351d6176 100644 --- a/libuavcan/include/uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp +++ b/libuavcan/include/uavcan/protocol/dynamic_node_id_server/node_discoverer.hpp @@ -113,6 +113,8 @@ class NodeDiscoverer : TimerBase */ enum { MaxAttemptsToGetNodeInfo = 5 }; + enum { TimerPollIntervalMs = 170 }; // ~ ceil(500 ms service timeout / 3) + enum { NumNodeStatusStaticReceivers = 64 }; /* @@ -319,7 +321,7 @@ class NodeDiscoverer : TimerBase if (!isRunning()) { - startPeriodic(get_node_info_client_.getRequestTimeout()); + startPeriodic(MonotonicDuration::fromMSec(TimerPollIntervalMs)); trace(TraceDiscoveryTimerStart, getPeriod().toUSec()); } } diff --git a/libuavcan/test/protocol/dynamic_node_id_server/node_discoverer.cpp b/libuavcan/test/protocol/dynamic_node_id_server/node_discoverer.cpp index 4c28113ead..9a469c4461 100644 --- a/libuavcan/test/protocol/dynamic_node_id_server/node_discoverer.cpp +++ b/libuavcan/test/protocol/dynamic_node_id_server/node_discoverer.cpp @@ -111,6 +111,7 @@ TEST(dynamic_node_id_server_NodeDiscoverer, Basic) /* * Publishing NodeStatus, discovery is disabled */ + std::cout << "!!! Publishing NodeStatus, discovery is disabled" << std::endl; handler.can_discover = false; uavcan::Publisher node_status_pub(nodes.b); @@ -132,48 +133,53 @@ TEST(dynamic_node_id_server_NodeDiscoverer, Basic) /* * Enabling discovery - the querying will continue despite the fact that NodeStatus messages are not arriving */ + std::cout << "!!! Enabling discovery" << std::endl; handler.can_discover = true; - nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(1400)); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(650)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNewNodeFound)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStart)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryTimerStop)); - ASSERT_LE(1, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); - ASSERT_LE(1, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); + ASSERT_EQ(2, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); + ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); ASSERT_TRUE(disc.hasUnknownNodes()); /* * Publishing NodeStatus */ + std::cout << "!!! Publishing NodeStatus" << std::endl; + node_status.uptime_sec += 5U; ASSERT_LE(0, node_status_pub.broadcast(node_status)); - nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(1400)); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(650)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNewNodeFound)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStart)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryTimerStop)); - ASSERT_LE(2, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); - ASSERT_LE(2, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); + ASSERT_EQ(3, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); + ASSERT_EQ(2, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); ASSERT_TRUE(disc.hasUnknownNodes()); /* * Publishing NodeStatus, discovery is enabled, GetNodeInfo mock server is initialized */ + std::cout << "!!! Publishing NodeStatus, discovery is enabled, GetNodeInfo mock server is initialized" << std::endl; + GetNodeInfoMockServer get_node_info_server(nodes.b); get_node_info_server.response.hardware_version.unique_id[0] = 123; // Arbitrary data get_node_info_server.response.hardware_version.unique_id[6] = 213; get_node_info_server.response.hardware_version.unique_id[14] = 52; ASSERT_LE(0, get_node_info_server.start()); - nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(1400)); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(400)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNewNodeFound)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStart)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStop)); - ASSERT_LE(3, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); - ASSERT_LE(2, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); + ASSERT_EQ(4, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); + ASSERT_EQ(3, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNodeFinalized)); ASSERT_FALSE(disc.hasUnknownNodes()); @@ -220,13 +226,13 @@ TEST(dynamic_node_id_server_NodeDiscoverer, RestartAndMaxAttempts) node_status.uptime_sec = 10; // Nonzero ASSERT_LE(0, node_status_pub.broadcast(node_status)); - nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(3400)); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(1650)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNewNodeFound)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStart)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryTimerStop)); - ASSERT_LE(3, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); - ASSERT_LE(3, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); + ASSERT_EQ(4, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); + ASSERT_EQ(3, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryNodeFinalized)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryNodeRestartDetected)); ASSERT_TRUE(disc.hasUnknownNodes()); @@ -238,13 +244,13 @@ TEST(dynamic_node_id_server_NodeDiscoverer, RestartAndMaxAttempts) node_status.uptime_sec = 9; // Less than previous ASSERT_LE(0, node_status_pub.broadcast(node_status)); - nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(3400)); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(1650)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNewNodeFound)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStart)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryTimerStop)); - ASSERT_LE(6, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); - ASSERT_LE(6, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); + ASSERT_EQ(7, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); + ASSERT_EQ(6, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); ASSERT_EQ(0, tracer.countEvents(TraceDiscoveryNodeFinalized)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNodeRestartDetected)); ASSERT_TRUE(disc.hasUnknownNodes()); @@ -252,13 +258,13 @@ TEST(dynamic_node_id_server_NodeDiscoverer, RestartAndMaxAttempts) /* * Waiting for timeout */ - nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(3400)); + nodes.spinBoth(uavcan::MonotonicDuration::fromMSec(1650)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNewNodeFound)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStart)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryTimerStop)); - ASSERT_LE(8, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); - ASSERT_LE(8, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); + ASSERT_EQ(8, tracer.countEvents(TraceDiscoveryGetNodeInfoRequest)); + ASSERT_EQ(8, tracer.countEvents(TraceDiscoveryGetNodeInfoFailure)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNodeFinalized)); ASSERT_EQ(1, tracer.countEvents(TraceDiscoveryNodeRestartDetected)); ASSERT_FALSE(disc.hasUnknownNodes());