Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers node.cpp Source File

node.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include <uavcan/node/node.hpp>
00007 #include <uavcan/node/sub_node.hpp> // Compilability test
00008 #include <uavcan/protocol/node_status_monitor.hpp>
00009 #include "test_node.hpp"
00010 #include "../protocol/helpers.hpp"
00011 
00012 static void registerTypes()
00013 {
00014     uavcan::GlobalDataTypeRegistry::instance().reset();
00015     uavcan::DefaultDataTypeRegistrator<uavcan::protocol::NodeStatus> _reg2;
00016     uavcan::DefaultDataTypeRegistrator<uavcan::protocol::GetNodeInfo> _reg4;
00017     uavcan::DefaultDataTypeRegistrator<uavcan::protocol::GetDataTypeInfo> _reg5;
00018     uavcan::DefaultDataTypeRegistrator<uavcan::protocol::debug::LogMessage> _reg6;
00019     uavcan::DefaultDataTypeRegistrator<uavcan::protocol::GetTransportStats> _reg7;
00020     uavcan::DefaultDataTypeRegistrator<uavcan::protocol::RestartNode> _reg8;
00021 }
00022 
00023 
00024 TEST(Node, Basic)
00025 {
00026     registerTypes();
00027     InterlinkedTestNodesWithSysClock nodes;
00028 
00029     uavcan::protocol::SoftwareVersion swver;
00030     swver.major = 0;
00031     swver.minor = 1;
00032     swver.vcs_commit = 0xDEADBEEF;
00033 
00034     std::cout << "sizeof(uavcan::Node<0>): " << sizeof(uavcan::Node<0>) << std::endl;
00035 
00036     /*
00037      * uavcan::Node
00038      */
00039     uavcan::Node<1024> node1(nodes.can_a, nodes.clock_a);
00040     node1.setName("com.example");
00041     node1.setNodeID(1);
00042     node1.setSoftwareVersion(swver);
00043 
00044     /*
00045      * Companion test node
00046      */
00047     uavcan::Node<1024> node2(nodes.can_b, nodes.clock_b);
00048     node2.setName("foobar");
00049     node2.setNodeID(2);
00050     node2.setSoftwareVersion(swver);
00051 
00052     BackgroundSpinner bgspinner(node2, node1);
00053     bgspinner.startPeriodic(uavcan::MonotonicDuration::fromMSec(10));
00054 
00055     uavcan::NodeStatusMonitor node_status_monitor(node2);
00056     ASSERT_LE(0, node_status_monitor.start());
00057 
00058     /*
00059      * Init the second node - network is empty
00060      */
00061     ASSERT_LE(0, node2.start());
00062     ASSERT_FALSE(node_status_monitor.findNodeWithWorstHealth().isValid());
00063 
00064     /*
00065      * Init the first node
00066      */
00067     ASSERT_FALSE(node1.isStarted());
00068     ASSERT_EQ(-uavcan::ErrNotInited, node1.spin(uavcan::MonotonicDuration::fromMSec(20)));
00069     ASSERT_LE(0, node1.start());
00070     ASSERT_TRUE(node1.isStarted());
00071 
00072     ASSERT_LE(0, node1.spin(uavcan::MonotonicDuration::fromMSec(2000)));
00073 
00074     ASSERT_EQ(1, node_status_monitor.findNodeWithWorstHealth().get());
00075 
00076     /*
00077      * Some logging
00078      */
00079     SubscriberWithCollector<uavcan::protocol::debug::LogMessage> log_sub(node2);
00080     ASSERT_LE(0, log_sub.start());
00081 
00082     node1.getLogger().setLevel(uavcan::protocol::debug::LogLevel::DEBUG);
00083     node1.logInfo("test", "6 * 9 = 42");
00084 
00085     ASSERT_LE(0, node1.spin(uavcan::MonotonicDuration::fromMSec(20)));
00086     ASSERT_LE(0, node2.spin(uavcan::MonotonicDuration::fromMSec(20)));
00087 
00088     ASSERT_TRUE(log_sub.collector.msg.get());
00089     std::cout << *log_sub.collector.msg << std::endl;
00090 }