Renaming: NodeInitializer --> NetworkCompatibilityChecker

This commit is contained in:
Pavel Kirienko
2014-04-12 21:40:30 +04:00
parent d8c37584c0
commit dd5908dad8
8 changed files with 51 additions and 49 deletions
+7 -7
View File
@@ -17,7 +17,7 @@
#include <uavcan/protocol/node_status_provider.hpp> #include <uavcan/protocol/node_status_provider.hpp>
#include <uavcan/protocol/restart_request_server.hpp> #include <uavcan/protocol/restart_request_server.hpp>
#include <uavcan/protocol/transport_stats_provider.hpp> #include <uavcan/protocol/transport_stats_provider.hpp>
#include <uavcan/protocol/node_initializer.hpp> #include <uavcan/protocol/network_compat_checker.hpp>
#if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11) #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
# error UAVCAN_CPP_VERSION # error UAVCAN_CPP_VERSION
@@ -51,7 +51,7 @@ class UAVCAN_EXPORT Node : public INode
bool started_; bool started_;
int initNetwork(NodeInitializationResult& node_init_result); int initNetwork(NetworkCompatibilityCheckResult& node_init_result);
protected: protected:
virtual void registerInternalFailure(const char* msg) virtual void registerInternalFailure(const char* msg)
@@ -99,7 +99,7 @@ public:
bool isStarted() const { return started_; } bool isStarted() const { return started_; }
int start(NodeInitializationResult& node_init_result); int start(NetworkCompatibilityCheckResult& node_init_result);
/* /*
* Initialization methods * Initialization methods
@@ -174,14 +174,14 @@ public:
template <std::size_t MemPoolSize_, unsigned OutgoingTransferRegistryStaticEntries, template <std::size_t MemPoolSize_, unsigned OutgoingTransferRegistryStaticEntries,
unsigned OutgoingTransferMaxPayloadLen> unsigned OutgoingTransferMaxPayloadLen>
int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMaxPayloadLen>:: int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMaxPayloadLen>::
initNetwork(NodeInitializationResult& node_init_result) initNetwork(NetworkCompatibilityCheckResult& node_init_result)
{ {
int res = NodeInitializer::publishGlobalDiscoveryRequest(*this); int res = NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(*this);
if (res < 0) if (res < 0)
{ {
return res; return res;
} }
NodeInitializer initializer(*this); NetworkCompatibilityChecker initializer(*this);
StaticAssert<(sizeof(initializer) < 1200)>::check(); StaticAssert<(sizeof(initializer) < 1200)>::check();
res = initializer.execute(); res = initializer.execute();
node_init_result = initializer.getResult(); node_init_result = initializer.getResult();
@@ -191,7 +191,7 @@ initNetwork(NodeInitializationResult& node_init_result)
template <std::size_t MemPoolSize_, unsigned OutgoingTransferRegistryStaticEntries, template <std::size_t MemPoolSize_, unsigned OutgoingTransferRegistryStaticEntries,
unsigned OutgoingTransferMaxPayloadLen> unsigned OutgoingTransferMaxPayloadLen>
int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMaxPayloadLen>:: int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMaxPayloadLen>::
start(NodeInitializationResult& node_init_result) start(NetworkCompatibilityCheckResult& node_init_result)
{ {
if (started_) if (started_)
{ {
@@ -14,7 +14,7 @@
namespace uavcan namespace uavcan
{ {
struct UAVCAN_EXPORT NodeInitializationResult struct UAVCAN_EXPORT NetworkCompatibilityCheckResult
{ {
NodeID conflicting_node; NodeID conflicting_node;
bool isOk() const { return !conflicting_node.isValid(); } bool isOk() const { return !conflicting_node.isValid(); }
@@ -24,21 +24,21 @@ struct UAVCAN_EXPORT NodeInitializationResult
* This class does not issue GlobalDiscoveryRequest, assuming that it was done already by the caller. * This class does not issue GlobalDiscoveryRequest, assuming that it was done already by the caller.
* Instantiated object can execute() only once. Objects of this class are intended for stack allocation. * Instantiated object can execute() only once. Objects of this class are intended for stack allocation.
*/ */
class UAVCAN_EXPORT NodeInitializer : Noncopyable class UAVCAN_EXPORT NetworkCompatibilityChecker : Noncopyable
{ {
typedef std::bitset<NodeID::Max + 1> NodeIDMask; typedef std::bitset<NodeID::Max + 1> NodeIDMask;
typedef MethodBinder<NodeInitializer*, typedef MethodBinder<NetworkCompatibilityChecker*,
void (NodeInitializer::*)(const ReceivedDataStructure<protocol::NodeStatus>&)> void (NetworkCompatibilityChecker::*)(const ReceivedDataStructure<protocol::NodeStatus>&)>
NodeStatusCallback; NodeStatusCallback;
typedef MethodBinder<NodeInitializer*, typedef MethodBinder<NetworkCompatibilityChecker*,
void (NodeInitializer::*)(ServiceCallResult<protocol::ComputeAggregateTypeSignature>&)> void (NetworkCompatibilityChecker::*)(ServiceCallResult<protocol::ComputeAggregateTypeSignature>&)>
CATSResponseCallback; CATSResponseCallback;
Subscriber<protocol::NodeStatus, NodeStatusCallback> ns_sub_; Subscriber<protocol::NodeStatus, NodeStatusCallback> ns_sub_;
ServiceClient<protocol::ComputeAggregateTypeSignature, CATSResponseCallback> cats_cln_; ServiceClient<protocol::ComputeAggregateTypeSignature, CATSResponseCallback> cats_cln_;
NodeIDMask nid_mask_present_; NodeIDMask nid_mask_present_;
NodeIDMask nid_mask_checked_; NodeIDMask nid_mask_checked_;
NodeInitializationResult result_; NetworkCompatibilityCheckResult result_;
DataTypeKind checking_dtkind_; DataTypeKind checking_dtkind_;
bool last_cats_request_ok_; bool last_cats_request_ok_;
@@ -59,7 +59,7 @@ class UAVCAN_EXPORT NodeInitializer : Noncopyable
int checkNodes(); int checkNodes();
public: public:
NodeInitializer(INode& node) NetworkCompatibilityChecker(INode& node)
: ns_sub_(node) : ns_sub_(node)
, cats_cln_(node) , cats_cln_(node)
, checking_dtkind_(DataTypeKindService) , checking_dtkind_(DataTypeKindService)
@@ -68,7 +68,7 @@ public:
int execute(); int execute();
const NodeInitializationResult& getResult() const { return result_; } const NetworkCompatibilityCheckResult& getResult() const { return result_; }
static int publishGlobalDiscoveryRequest(INode& node); static int publishGlobalDiscoveryRequest(INode& node);
}; };
@@ -4,14 +4,14 @@
#include <cassert> #include <cassert>
#include <uavcan/debug.hpp> #include <uavcan/debug.hpp>
#include <uavcan/protocol/node_initializer.hpp> #include <uavcan/protocol/network_compat_checker.hpp>
#include <uavcan/node/publisher.hpp> #include <uavcan/node/publisher.hpp>
#include <uavcan/protocol/GlobalDiscoveryRequest.hpp> #include <uavcan/protocol/GlobalDiscoveryRequest.hpp>
namespace uavcan namespace uavcan
{ {
MonotonicDuration NodeInitializer::getNetworkDiscoveryDelay() const MonotonicDuration NetworkCompatibilityChecker::getNetworkDiscoveryDelay() const
{ {
// Base duration is constant - NodeStatus publication period // Base duration is constant - NodeStatus publication period
MonotonicDuration dur = MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS); MonotonicDuration dur = MonotonicDuration::fromMSec(protocol::NodeStatus::PUBLICATION_PERIOD_MS);
@@ -20,7 +20,7 @@ MonotonicDuration NodeInitializer::getNetworkDiscoveryDelay() const
return dur; return dur;
} }
NodeID NodeInitializer::findNextUncheckedNode() NodeID NetworkCompatibilityChecker::findNextUncheckedNode()
{ {
for (int i = 1; i <= NodeID::Max; i++) for (int i = 1; i <= NodeID::Max; i++)
{ {
@@ -33,7 +33,7 @@ NodeID NodeInitializer::findNextUncheckedNode()
return NodeID(); return NodeID();
} }
int NodeInitializer::waitForCATSResponse() int NetworkCompatibilityChecker::waitForCATSResponse()
{ {
while (cats_cln_.isPending()) while (cats_cln_.isPending())
{ {
@@ -46,7 +46,7 @@ int NodeInitializer::waitForCATSResponse()
return 0; return 0;
} }
void NodeInitializer::handleNodeStatus(const ReceivedDataStructure<protocol::NodeStatus>& msg) void NetworkCompatibilityChecker::handleNodeStatus(const ReceivedDataStructure<protocol::NodeStatus>& msg)
{ {
if (!nid_mask_present_.test(msg.getSrcNodeID().get())) if (!nid_mask_present_.test(msg.getSrcNodeID().get()))
{ {
@@ -61,7 +61,7 @@ void NodeInitializer::handleNodeStatus(const ReceivedDataStructure<protocol::Nod
} }
} }
void NodeInitializer::handleCATSResponse(ServiceCallResult<protocol::ComputeAggregateTypeSignature>& resp) void NetworkCompatibilityChecker::handleCATSResponse(ServiceCallResult<protocol::ComputeAggregateTypeSignature>& resp)
{ {
last_cats_request_ok_ = resp.isSuccessful(); last_cats_request_ok_ = resp.isSuccessful();
if (last_cats_request_ok_) if (last_cats_request_ok_)
@@ -80,7 +80,7 @@ void NodeInitializer::handleCATSResponse(ServiceCallResult<protocol::ComputeAggr
} }
} }
int NodeInitializer::checkOneNodeOneDataTypeKind(NodeID nid, DataTypeKind kind) int NetworkCompatibilityChecker::checkOneNodeOneDataTypeKind(NodeID nid, DataTypeKind kind)
{ {
StaticAssert<DataTypeKindMessage == int(protocol::DataTypeKind::MESSAGE)>::check(); StaticAssert<DataTypeKindMessage == int(protocol::DataTypeKind::MESSAGE)>::check();
StaticAssert<DataTypeKindService == int(protocol::DataTypeKind::SERVICE)>::check(); StaticAssert<DataTypeKindService == int(protocol::DataTypeKind::SERVICE)>::check();
@@ -110,7 +110,7 @@ int NodeInitializer::checkOneNodeOneDataTypeKind(NodeID nid, DataTypeKind kind)
return 0; return 0;
} }
int NodeInitializer::checkOneNode(NodeID nid) int NetworkCompatibilityChecker::checkOneNode(NodeID nid)
{ {
if (nid == getNode().getNodeID()) if (nid == getNode().getNodeID())
{ {
@@ -126,7 +126,7 @@ int NodeInitializer::checkOneNode(NodeID nid)
return checkOneNodeOneDataTypeKind(nid, DataTypeKindService); return checkOneNodeOneDataTypeKind(nid, DataTypeKindService);
} }
int NodeInitializer::checkNodes() int NetworkCompatibilityChecker::checkNodes()
{ {
nid_mask_checked_.reset(); nid_mask_checked_.reset();
while (true) while (true)
@@ -150,7 +150,7 @@ int NodeInitializer::checkNodes()
return 0; return 0;
} }
int NodeInitializer::execute() int NetworkCompatibilityChecker::execute()
{ {
int res = 0; int res = 0;
@@ -160,13 +160,13 @@ int NodeInitializer::execute()
goto exit; goto exit;
} }
res = ns_sub_.start(NodeStatusCallback(this, &NodeInitializer::handleNodeStatus)); res = ns_sub_.start(NodeStatusCallback(this, &NetworkCompatibilityChecker::handleNodeStatus));
if (res < 0) if (res < 0)
{ {
goto exit; goto exit;
} }
cats_cln_.setCallback(CATSResponseCallback(this, &NodeInitializer::handleCATSResponse)); cats_cln_.setCallback(CATSResponseCallback(this, &NetworkCompatibilityChecker::handleCATSResponse));
res = cats_cln_.init(); res = cats_cln_.init();
if (res < 0) if (res < 0)
{ {
@@ -187,7 +187,7 @@ exit:
return res; return res;
} }
int NodeInitializer::publishGlobalDiscoveryRequest(INode& node) int NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(INode& node)
{ {
Publisher<protocol::GlobalDiscoveryRequest> pub(node); Publisher<protocol::GlobalDiscoveryRequest> pub(node);
return pub.broadcast(protocol::GlobalDiscoveryRequest()); return pub.broadcast(protocol::GlobalDiscoveryRequest());
+1 -1
View File
@@ -58,7 +58,7 @@ TEST(Node, Basic)
/* /*
* Init the second node - network is empty * Init the second node - network is empty
*/ */
uavcan::NodeInitializationResult result; uavcan::NetworkCompatibilityCheckResult result;
ASSERT_LE(0, node2.start(result)); ASSERT_LE(0, node2.start(result));
ASSERT_FALSE(node_status_monitor.findNodeWithWorstStatus().isValid()); ASSERT_FALSE(node_status_monitor.findNodeWithWorstStatus().isValid());
@@ -3,7 +3,7 @@
*/ */
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <uavcan/protocol/node_initializer.hpp> #include <uavcan/protocol/network_compat_checker.hpp>
#include <uavcan/protocol/node_status_provider.hpp> #include <uavcan/protocol/node_status_provider.hpp>
#include <uavcan/protocol/data_type_info_provider.hpp> #include <uavcan/protocol/data_type_info_provider.hpp>
#include <uavcan/protocol/GlobalDiscoveryRequest.hpp> #include <uavcan/protocol/GlobalDiscoveryRequest.hpp>
@@ -45,27 +45,29 @@ struct NodeInitializerRemoteContext
}; };
TEST(NodeInitializer, Size) TEST(NetworkCompatibilityChecker, Size)
{ {
std::cout << "sizeof(uavcan::NodeInitializer): " << sizeof(uavcan::NodeInitializer) << std::endl; // Objects are subject for stack allocation, hence the size matters
ASSERT_TRUE(sizeof(uavcan::NodeInitializer) < 2048); std::cout << "sizeof(uavcan::NetworkCompatibilityChecker): "
<< sizeof(uavcan::NetworkCompatibilityChecker) << std::endl;
ASSERT_TRUE(sizeof(uavcan::NetworkCompatibilityChecker) < 2048);
} }
TEST(NodeInitializer, EmptyNetwork) TEST(NetworkCompatibilityChecker, EmptyNetwork)
{ {
registerTypes(); registerTypes();
InterlinkedTestNodesWithSysClock nodes; InterlinkedTestNodesWithSysClock nodes;
ASSERT_LE(0, uavcan::NodeInitializer::publishGlobalDiscoveryRequest(nodes.a)); ASSERT_LE(0, uavcan::NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(nodes.a));
uavcan::NodeInitializer ni(nodes.a); uavcan::NetworkCompatibilityChecker ni(nodes.a);
ASSERT_LE(0, ni.execute()); ASSERT_LE(0, ni.execute());
ASSERT_TRUE(ni.getResult().isOk()); ASSERT_TRUE(ni.getResult().isOk());
} }
TEST(NodeInitializer, Success) TEST(NetworkCompatibilityChecker, Success)
{ {
registerTypes(); registerTypes();
InterlinkedTestNodesWithSysClock nodes; InterlinkedTestNodesWithSysClock nodes;
@@ -75,29 +77,29 @@ TEST(NodeInitializer, Success)
BackgroundSpinner bgspinner(nodes.b, nodes.a); BackgroundSpinner bgspinner(nodes.b, nodes.a);
bgspinner.startPeriodic(uavcan::MonotonicDuration::fromMSec(10)); bgspinner.startPeriodic(uavcan::MonotonicDuration::fromMSec(10));
ASSERT_LE(0, uavcan::NodeInitializer::publishGlobalDiscoveryRequest(nodes.a)); ASSERT_LE(0, uavcan::NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(nodes.a));
uavcan::NodeInitializer ni(nodes.a); uavcan::NetworkCompatibilityChecker ni(nodes.a);
ASSERT_LE(0, ni.execute()); ASSERT_LE(0, ni.execute());
ASSERT_TRUE(ni.getResult().isOk()); ASSERT_TRUE(ni.getResult().isOk());
} }
TEST(NodeInitializer, RequestTimeout) TEST(NetworkCompatibilityChecker, RequestTimeout)
{ {
registerTypes(); registerTypes();
InterlinkedTestNodesWithSysClock nodes; InterlinkedTestNodesWithSysClock nodes;
NodeInitializerRemoteContext remote(nodes.b); NodeInitializerRemoteContext remote(nodes.b);
remote.start(); remote.start();
ASSERT_LE(0, uavcan::NodeInitializer::publishGlobalDiscoveryRequest(nodes.a)); ASSERT_LE(0, uavcan::NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(nodes.a));
uavcan::NodeInitializer ni(nodes.a); uavcan::NetworkCompatibilityChecker ni(nodes.a);
ASSERT_GT(0, ni.execute()); // There is no background spinner, so CATS request will time out ASSERT_GT(0, ni.execute()); // There is no background spinner, so CATS request will time out
} }
TEST(NodeInitializer, NodeIDCollision) TEST(NetworkCompatibilityChecker, NodeIDCollision)
{ {
registerTypes(); registerTypes();
InterlinkedTestNodesWithSysClock nodes(8, 8); // Same NID InterlinkedTestNodesWithSysClock nodes(8, 8); // Same NID
@@ -107,9 +109,9 @@ TEST(NodeInitializer, NodeIDCollision)
BackgroundSpinner bgspinner(nodes.b, nodes.a); BackgroundSpinner bgspinner(nodes.b, nodes.a);
bgspinner.startPeriodic(uavcan::MonotonicDuration::fromMSec(10)); bgspinner.startPeriodic(uavcan::MonotonicDuration::fromMSec(10));
ASSERT_LE(0, uavcan::NodeInitializer::publishGlobalDiscoveryRequest(nodes.a)); ASSERT_LE(0, uavcan::NetworkCompatibilityChecker::publishGlobalDiscoveryRequest(nodes.a));
uavcan::NodeInitializer ni(nodes.a); uavcan::NetworkCompatibilityChecker ni(nodes.a);
ASSERT_LE(0, ni.execute()); ASSERT_LE(0, ni.execute());
ASSERT_FALSE(ni.getResult().isOk()); ASSERT_FALSE(ni.getResult().isOk());
ASSERT_EQ(8, ni.getResult().conflicting_node.get()); ASSERT_EQ(8, ni.getResult().conflicting_node.get());
+1 -1
View File
@@ -24,7 +24,7 @@ static uavcan_linux::NodePtr initNode(const std::vector<std::string>& ifaces, ua
* Starting the node. This may take a few seconds. * Starting the node. This may take a few seconds.
*/ */
std::cout << "Starting the node..." << std::endl; std::cout << "Starting the node..." << std::endl;
uavcan::NodeInitializationResult init_result; uavcan::NetworkCompatibilityCheckResult init_result;
const int start_res = node->start(init_result); const int start_res = node->start(init_result);
std::cout << "Start returned: " << start_res << std::endl; std::cout << "Start returned: " << start_res << std::endl;
ENFORCE(0 == start_res); ENFORCE(0 == start_res);
@@ -109,7 +109,7 @@ static uavcan_linux::NodePtr initNode(const std::vector<std::string>& ifaces, ua
node->setNodeID(nid); node->setNodeID(nid);
node->setName(name.c_str()); node->setName(name.c_str());
uavcan::NodeInitializationResult init_result; uavcan::NetworkCompatibilityCheckResult init_result;
const int start_res = node->start(init_result); const int start_res = node->start(init_result);
ENFORCE(0 == start_res); ENFORCE(0 == start_res);
if (!init_result.isOk()) if (!init_result.isOk())
@@ -17,7 +17,7 @@ static uavcan_linux::NodePtr initNode(const std::vector<std::string>& ifaces, ua
node->setNodeID(nid); node->setNodeID(nid);
node->setName(name.c_str()); node->setName(name.c_str());
uavcan::NodeInitializationResult init_result; uavcan::NetworkCompatibilityCheckResult init_result;
const int start_res = node->start(init_result); const int start_res = node->start(init_result);
ENFORCE(0 == start_res); ENFORCE(0 == start_res);
if (!init_result.isOk()) if (!init_result.isOk())