test_time_sync.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <iostream>
6 #include <cassert>
10 #include "debug.hpp"
11 
12 
13 static uavcan_linux::NodePtr initNode(const std::vector<std::string>& ifaces, uavcan::NodeID nid,
14  const std::string& name)
15 {
16  auto node = uavcan_linux::makeNode(ifaces);
17  node->setNodeID(nid);
18  node->setName(name.c_str());
19 
20  ENFORCE(0 == node->start());
21 
22  node->setModeOperational();
23  return node;
24 }
25 
27 {
29  ENFORCE(0 == tsmaster.init());
30 
32  ENFORCE(0 == tsslave.start());
33 
34  auto publish_sync_if_master = [&](const uavcan::TimerEvent&)
35  {
36  bool i_am_master = false;
37  if (tsslave.isActive())
38  {
39  const uavcan::NodeID master_node = tsslave.getMasterNodeID();
40  assert(master_node.isValid());
41  if (node->getNodeID() < master_node)
42  {
43  std::cout << "Overriding the lower priority master " << int(master_node.get()) << std::endl;
44  i_am_master = true;
45  }
46  else
47  {
48  std::cout << "There is other master of higher priority " << int(master_node.get()) << std::endl;
49  }
50  }
51  else
52  {
53  std::cout << "No other masters present" << std::endl;
54  i_am_master = true;
55  }
56 
57  // Don't forget to disable slave adjustments if we're master
58  tsslave.suppress(i_am_master);
59 
60  if (i_am_master)
61  {
62  ENFORCE(0 <= tsmaster.publish());
63  }
64  };
65 
66  auto sync_publish_timer = node->makeTimer(uavcan::MonotonicDuration::fromMSec(1000), publish_sync_if_master);
67 
68  while (true)
69  {
70  const int res = node->spin(uavcan::MonotonicDuration::getInfinite());
71  if (res < 0)
72  {
73  node->logError("spin", "Error %*", res);
74  }
75  }
76 }
77 
78 int main(int argc, const char** argv)
79 {
80  try
81  {
82  if (argc < 3)
83  {
84  std::cerr << "Usage:\n\t" << argv[0] << " <node-id> <can-iface-name-1> [can-iface-name-N...]" << std::endl;
85  return 1;
86  }
87  const int self_node_id = std::stoi(argv[1]);
88  std::vector<std::string> iface_names;
89  for (int i = 2; i < argc; i++)
90  {
91  iface_names.emplace_back(argv[i]);
92  }
93  uavcan_linux::NodePtr node = initNode(iface_names, self_node_id, "org.uavcan.linux_test_node_status_monitor");
95  return 0;
96  }
97  catch (const std::exception& ex)
98  {
99  std::cerr << "Exception: " << ex.what() << std::endl;
100  return 1;
101  }
102 }
uavcan::NodeID::isValid
bool isValid() const
Definition: transfer.hpp:134
uavcan::GlobalTimeSyncSlave::isActive
bool isActive() const
Definition: global_time_sync_slave.hpp:177
uavcan::NodeID::get
uint8_t get() const
Definition: transfer.hpp:132
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::GlobalTimeSyncSlave::suppress
void suppress(bool suppressed)
Definition: global_time_sync_slave.hpp:168
uavcan::GlobalTimeSyncSlave::getMasterNodeID
NodeID getMasterNodeID() const
Definition: global_time_sync_slave.hpp:188
uavcan::GlobalTimeSyncSlave::start
int start()
Definition: global_time_sync_slave.hpp:149
ENFORCE
#define ENFORCE(x)
Definition: platform_specific_components/linux/libuavcan/apps/debug.hpp:13
uavcan_linux.hpp
uavcan::GlobalTimeSyncMaster::init
int init(const TransferPriority priority=TransferPriority::OneLowerThanHighest)
Definition: global_time_sync_master.hpp:154
debug.hpp
global_time_sync_slave.hpp
runForever
static void runForever(const uavcan_linux::NodePtr &node)
Definition: test_time_sync.cpp:26
uavcan::GlobalTimeSyncMaster
Definition: global_time_sync_master.hpp:32
int
int
Definition: libstubs.cpp:120
main
int main(int argc, const char **argv)
Definition: test_time_sync.cpp:78
initNode
static uavcan_linux::NodePtr initNode(const std::vector< std::string > &ifaces, uavcan::NodeID nid, const std::string &name)
Definition: test_time_sync.cpp:13
uavcan_linux::NodePtr
std::shared_ptr< Node > NodePtr
Definition: platform_specific_components/linux/libuavcan/include/uavcan_linux/helpers.hpp:354
global_time_sync_master.hpp
uavcan::DurationBase< MonotonicDuration >::getInfinite
static MonotonicDuration getInfinite()
Definition: time.hpp:33
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
uavcan::GlobalTimeSyncSlave
Definition: global_time_sync_slave.hpp:28
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
uavcan::GlobalTimeSyncMaster::publish
int publish()
Definition: global_time_sync_master.hpp:210
uavcan::TimerEvent
Definition: timer.hpp:32


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