From e476a957a8a06950e26e7a2a1a55e6f476db7017 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Sat, 12 Apr 2014 22:10:26 +0400 Subject: [PATCH] NetworkCompatibilityChecker will not be executed at each Node<>::start(), there's special method for that - Node<>::checkNetworkCompatibility() --- libuavcan/include/uavcan/node/node.hpp | 52 ++++++++++--------- libuavcan/test/node/node.cpp | 8 ++- libuavcan_drivers/linux/test/test_node.cpp | 12 +++-- .../linux/test/test_node_status_monitor.cpp | 10 +--- .../linux/test/test_time_sync.cpp | 5 +- .../stm32/test_stm32f107/src/main.cpp | 19 ++++--- 6 files changed, 60 insertions(+), 46 deletions(-) diff --git a/libuavcan/include/uavcan/node/node.hpp b/libuavcan/include/uavcan/node/node.hpp index 6a4ffc32de..92ffba92e6 100644 --- a/libuavcan/include/uavcan/node/node.hpp +++ b/libuavcan/include/uavcan/node/node.hpp @@ -51,8 +51,6 @@ class UAVCAN_EXPORT Node : public INode bool started_; - int initNetwork(NetworkCompatibilityCheckResult& node_init_result); - protected: virtual void registerInternalFailure(const char* msg) { @@ -99,7 +97,9 @@ public: bool isStarted() const { return started_; } - int start(NetworkCompatibilityCheckResult& node_init_result); + int start(); + + int checkNetworkCompatibility(NetworkCompatibilityCheckResult& result); /* * Initialization methods @@ -173,25 +173,7 @@ public: template -int Node:: -initNetwork(NetworkCompatibilityCheckResult& node_init_result) -{ - int res = NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(*this); - if (res < 0) - { - return res; - } - NetworkCompatibilityChecker initializer(*this); - StaticAssert<(sizeof(initializer) < 1200)>::check(); - res = initializer.execute(); - node_init_result = initializer.getResult(); - return res; -} - -template -int Node:: -start(NetworkCompatibilityCheckResult& node_init_result) +int Node::start() { if (started_) { @@ -225,12 +207,34 @@ start(NetworkCompatibilityCheckResult& node_init_result) { goto fail; } - res = initNetwork(node_init_result); - started_ = (res >= 0) && node_init_result.isOk(); + started_ = res >= 0; return res; fail: assert(res < 0); return res; } +template +int Node:: +checkNetworkCompatibility(NetworkCompatibilityCheckResult& result) +{ + if (!started_) + { + return -ErrNotInited; + } + + int res = NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(*this); + if (res < 0) + { + return res; + } + + NetworkCompatibilityChecker checker(*this); + StaticAssert<(sizeof(checker) < 2048)>::check(); + res = checker.execute(); + result = checker.getResult(); + return res; +} + } diff --git a/libuavcan/test/node/node.cpp b/libuavcan/test/node/node.cpp index 3cb0f3c2af..038e258398 100644 --- a/libuavcan/test/node/node.cpp +++ b/libuavcan/test/node/node.cpp @@ -59,7 +59,9 @@ TEST(Node, Basic) * Init the second node - network is empty */ uavcan::NetworkCompatibilityCheckResult result; - ASSERT_LE(0, node2.start(result)); + ASSERT_LE(0, node2.start()); + ASSERT_LE(0, node2.checkNetworkCompatibility(result)); + ASSERT_TRUE(result.isOk()); ASSERT_FALSE(node_status_monitor.findNodeWithWorstStatus().isValid()); @@ -68,7 +70,9 @@ TEST(Node, Basic) */ ASSERT_FALSE(node1.isStarted()); ASSERT_EQ(-uavcan::ErrNotInited, node1.spin(uavcan::MonotonicDuration::fromMSec(20))); - ASSERT_LE(0, node1.start(result)); + ASSERT_LE(0, node1.start()); + ASSERT_LE(0, node1.checkNetworkCompatibility(result)); + ASSERT_TRUE(result.isOk()); ASSERT_TRUE(node1.isStarted()); ASSERT_EQ(1, node_status_monitor.findNodeWithWorstStatus().get()); diff --git a/libuavcan_drivers/linux/test/test_node.cpp b/libuavcan_drivers/linux/test/test_node.cpp index ebdbbeb553..ac206956eb 100644 --- a/libuavcan_drivers/linux/test/test_node.cpp +++ b/libuavcan_drivers/linux/test/test_node.cpp @@ -21,17 +21,23 @@ static uavcan_linux::NodePtr initNode(const std::vector& ifaces, ua node->getLogger().setLevel(uavcan::protocol::debug::LogLevel::DEBUG); /* - * Starting the node. This may take a few seconds. + * Starting the node. */ std::cout << "Starting the node..." << std::endl; - uavcan::NetworkCompatibilityCheckResult init_result; - const int start_res = node->start(init_result); + const int start_res = node->start(); std::cout << "Start returned: " << start_res << std::endl; ENFORCE(0 == start_res); + + /* + * Checking if our node conflicts with other nodes. This may take a few seconds. + */ + uavcan::NetworkCompatibilityCheckResult init_result; + ENFORCE(0 == node->checkNetworkCompatibility(init_result)); if (!init_result.isOk()) { throw std::runtime_error("Network conflict with node " + std::to_string(init_result.conflicting_node.get())); } + std::cout << "Node started successfully" << std::endl; /* diff --git a/libuavcan_drivers/linux/test/test_node_status_monitor.cpp b/libuavcan_drivers/linux/test/test_node_status_monitor.cpp index a2f7518dab..0b980b17a1 100644 --- a/libuavcan_drivers/linux/test/test_node_status_monitor.cpp +++ b/libuavcan_drivers/linux/test/test_node_status_monitor.cpp @@ -108,15 +108,7 @@ static uavcan_linux::NodePtr initNode(const std::vector& ifaces, ua auto node = uavcan_linux::makeNode(ifaces); node->setNodeID(nid); node->setName(name.c_str()); - - uavcan::NetworkCompatibilityCheckResult init_result; - const int start_res = node->start(init_result); - ENFORCE(0 == start_res); - if (!init_result.isOk()) - { - throw std::runtime_error("Network conflict with node " + std::to_string(init_result.conflicting_node.get())); - } - + ENFORCE(0 == node->start()); // This node doesn't check its network compatibility node->setStatusOk(); return node; } diff --git a/libuavcan_drivers/linux/test/test_time_sync.cpp b/libuavcan_drivers/linux/test/test_time_sync.cpp index ae09aa6c4c..8da3e2ad1b 100644 --- a/libuavcan_drivers/linux/test/test_time_sync.cpp +++ b/libuavcan_drivers/linux/test/test_time_sync.cpp @@ -17,9 +17,10 @@ static uavcan_linux::NodePtr initNode(const std::vector& ifaces, ua node->setNodeID(nid); node->setName(name.c_str()); + ENFORCE(0 == node->start()); + uavcan::NetworkCompatibilityCheckResult init_result; - const int start_res = node->start(init_result); - ENFORCE(0 == start_res); + ENFORCE(0 == node->checkNetworkCompatibility(init_result)); if (!init_result.isOk()) { throw std::runtime_error("Network conflict with node " + std::to_string(init_result.conflicting_node.get())); diff --git a/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp b/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp index a4b8329a6f..4c202f2ac2 100644 --- a/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp +++ b/libuavcan_drivers/stm32/test_stm32f107/src/main.cpp @@ -81,16 +81,23 @@ public: */ while (true) { - uavcan::NodeInitializationResult init_result; - const int uavcan_start_res = node.start(init_result); + // Calling start() multiple times is OK - only the first successfull call will be effective + int res = node.start(); - if (uavcan_start_res < 0) + uavcan::NetworkCompatibilityCheckResult ncc_result; + if (res >= 0) { - lowsyslog("Node initialization failure: %i, will try agin soon\n", uavcan_start_res); + lowsyslog("Checking network compatibility...\n"); + res = node.checkNetworkCompatibility(ncc_result); } - else if (!init_result.isOk()) + + if (res < 0) { - lowsyslog("Network conflict with %u, will try again soon\n", init_result.conflicting_node.get()); + lowsyslog("Node initialization failure: %i, will try agin soon\n", res); + } + else if (!ncc_result.isOk()) + { + lowsyslog("Network conflict with %u, will try again soon\n", ncc_result.conflicting_node.get()); } else {