test_node.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <iostream>
8 #include "debug.hpp"
9 
10 static uavcan_linux::NodePtr initNode(const std::vector<std::string>& ifaces, uavcan::NodeID nid,
11  const std::string& name)
12 {
13  auto node = uavcan_linux::makeNode(ifaces);
14 
15  /*
16  * Configuring the node.
17  */
18  node->setNodeID(nid);
19  node->setName(name.c_str());
20 
21  node->getLogger().setLevel(uavcan::protocol::debug::LogLevel::DEBUG);
22 
23  /*
24  * Starting the node.
25  */
26  std::cout << "Starting the node..." << std::endl;
27  const int start_res = node->start();
28  std::cout << "Start returned: " << start_res << std::endl;
29  ENFORCE(0 == start_res);
30 
31  std::cout << "Node started successfully" << std::endl;
32 
33  /*
34  * Say Hi to the world.
35  */
36  node->setModeOperational();
37  node->logInfo("init", "Hello world! I'm [%*], NID %*",
38  node->getNodeStatusProvider().getName().c_str(), int(node->getNodeID().get()));
39  return node;
40 }
41 
43 {
44  /*
45  * Subscribing to the UAVCAN logging topic
46  */
48  {
49  std::cout << msg << std::endl;
50  };
51  auto log_sub = node->makeSubscriber<uavcan::protocol::debug::LogMessage>(log_handler);
52 
53  /*
54  * Printing when other nodes enter the network or change status
55  */
56  struct NodeStatusMonitor : public uavcan::NodeStatusMonitor
57  {
59 
60  void handleNodeStatusChange(const NodeStatusChangeEvent& event) override
61  {
62  std::cout << "Remote node NID " << int(event.node_id.get()) << " changed status: "
63  << event.old_status.toString() << " --> "
64  << event.status.toString() << std::endl;
65  }
66  };
67 
68  NodeStatusMonitor nsm(*node);
69  ENFORCE(0 == nsm.start());
70 
71  /*
72  * Adding a stupid timer that does nothing once a minute
73  */
74  auto do_nothing_once_a_minute = [&node](const uavcan::TimerEvent&)
75  {
76  node->logInfo("timer", "Another minute passed...");
77  // coverity[dont_call]
78  node->setVendorSpecificStatusCode(static_cast<std::uint16_t>(std::rand())); // Setting to an arbitrary value
79  };
80  auto timer = node->makeTimer(uavcan::MonotonicDuration::fromMSec(60000), do_nothing_once_a_minute);
81 
82  /*
83  * Spinning forever
84  */
85  while (true)
86  {
87  const int res = node->spin(uavcan::MonotonicDuration::getInfinite());
88  if (res < 0)
89  {
90  node->logError("spin", "Error %*", res);
91  }
92  }
93 }
94 
95 int main(int argc, const char** argv)
96 {
97  try
98  {
99  if (argc < 3)
100  {
101  std::cerr << "Usage:\n\t" << argv[0] << " <node-id> <can-iface-name-1> [can-iface-name-N...]" << std::endl;
102  return 1;
103  }
104  const int self_node_id = std::stoi(argv[1]);
105  std::vector<std::string> iface_names;
106  for (int i = 2; i < argc; i++)
107  {
108  iface_names.emplace_back(argv[i]);
109  }
110  uavcan_linux::NodePtr node = initNode(iface_names, self_node_id, "org.uavcan.linux_test_node");
111  std::cout << "Node initialized successfully" << std::endl;
112  runForever(node);
113  return 0;
114  }
115  catch (const std::exception& ex)
116  {
117  std::cerr << "Exception: " << ex.what() << std::endl;
118  return 1;
119  }
120 }
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::NodeStatusMonitor::handleNodeStatusChange
virtual void handleNodeStatusChange(const NodeStatusChangeEvent &event)
Definition: node_status_monitor.hpp:168
uavcan::ReceivedDataStructure
Definition: generic_subscriber.hpp:39
runForever
static void runForever(const uavcan_linux::NodePtr &node)
Definition: test_node.cpp:42
uavcan::NodeStatusMonitor
Definition: node_status_monitor.hpp:22
rand
int rand()
Definition: main.cpp:28
uavcan::uint16_t
std::uint16_t uint16_t
Definition: std.hpp:25
initNode
static uavcan_linux::NodePtr initNode(const std::vector< std::string > &ifaces, uavcan::NodeID nid, const std::string &name)
Definition: test_node.cpp:10
ENFORCE
#define ENFORCE(x)
Definition: platform_specific_components/linux/libuavcan/apps/debug.hpp:13
node_status_monitor.hpp
uavcan_linux.hpp
debug.hpp
uavcan::INode
Definition: abstract_node.hpp:19
int
int
Definition: libstubs.cpp:120
uavcan_linux::NodePtr
std::shared_ptr< Node > NodePtr
Definition: platform_specific_components/linux/libuavcan/include/uavcan_linux/helpers.hpp:354
uavcan::NodeStatusMonitor::NodeStatusMonitor
NodeStatusMonitor(INode &node)
Definition: node_status_monitor.hpp:184
uavcan::DurationBase< MonotonicDuration >::getInfinite
static MonotonicDuration getInfinite()
Definition: time.hpp:33
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
uavcan_linux::makeNode
static NodePtr makeNode(const std::vector< std::string > &iface_names, ClockAdjustmentMode clock_adjustment_mode=SystemClock::detectPreferredClockAdjustmentMode())
Definition: platform_specific_components/linux/libuavcan/include/uavcan_linux/helpers.hpp:363
main
int main(int argc, const char **argv)
Definition: test_node.cpp:95
uavcan::TimerEvent
Definition: timer.hpp:32


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03