uc_node_status_provider.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
6 #include <uavcan/debug.hpp>
7 #include <cassert>
8 
9 namespace uavcan
10 {
11 
13 {
14  // Hardware/Software versions are not required
15  return !node_info_.name.empty();
16 }
17 
19 {
21  UAVCAN_ASSERT(uptime.isPositive());
22  node_info_.status.uptime_sec = uint32_t(uptime.toMSec() / 1000);
23 
25 
26  return node_status_pub_.broadcast(node_info_.status);
27 }
28 
30 {
31  if (getNode().isPassiveMode())
32  {
33  UAVCAN_TRACE("NodeStatusProvider", "NodeStatus pub skipped - passive mode");
34  }
35  else
36  {
38  {
40  }
41 
42  const int res = publish();
43  if (res < 0)
44  {
45  getNode().registerInternalFailure("NodeStatus pub failed");
46  }
47  }
48 }
49 
50 void NodeStatusProvider::handleGetNodeInfoRequest(const protocol::GetNodeInfo::Request&,
51  protocol::GetNodeInfo::Response& rsp)
52 {
53  UAVCAN_TRACE("NodeStatusProvider", "Got GetNodeInfo request");
55  rsp = node_info_;
56 }
57 
59 {
60  if (!isNodeInfoInitialized())
61  {
62  UAVCAN_TRACE("NodeStatusProvider", "Node info was not initialized");
63  return -ErrNotInited;
64  }
65 
66  int res = -1;
67 
68  node_status_pub_.setPriority(priority);
69 
70  if (!getNode().isPassiveMode())
71  {
72  res = publish();
73  if (res < 0) // Initial broadcast
74  {
75  goto fail;
76  }
77  }
78 
80  if (res < 0)
81  {
82  goto fail;
83  }
84 
85  setStatusPublicationPeriod(MonotonicDuration::fromMSec(protocol::NodeStatus::MAX_BROADCASTING_PERIOD_MS));
86 
87  return res;
88 
89 fail:
90  UAVCAN_ASSERT(res < 0);
91  gni_srv_.stop();
93  return res;
94 }
95 
97 {
98  const MonotonicDuration maximum = MonotonicDuration::fromMSec(protocol::NodeStatus::MAX_BROADCASTING_PERIOD_MS);
99  const MonotonicDuration minimum = MonotonicDuration::fromMSec(protocol::NodeStatus::MIN_BROADCASTING_PERIOD_MS);
100 
101  period = min(period, maximum);
102  period = max(period, minimum);
103  TimerBase::startPeriodic(period);
104 
105  const MonotonicDuration tx_timeout = period - MonotonicDuration::fromUSec(period.toUSec() / 20);
106  node_status_pub_.setTxTimeout(tx_timeout);
107 
108  UAVCAN_TRACE("NodeStatusProvider", "Status pub period: %s, TX timeout: %s",
109  period.toString().c_str(), node_status_pub_.getTxTimeout().toString().c_str());
110 }
111 
113 {
114  return TimerBase::getPeriod();
115 }
116 
118 {
119  ad_hoc_status_updater_ = updater; // Can be nullptr, that's okay
120 }
121 
123 {
124  node_info_.status.health = code;
125 }
126 
128 {
129  node_info_.status.mode = code;
130 }
131 
133 {
134  node_info_.status.vendor_specific_status_code = code;
135 }
136 
138 {
139  if (node_info_.name.empty())
140  {
141  node_info_.name = name;
142  }
143 }
144 
145 void NodeStatusProvider::setSoftwareVersion(const protocol::SoftwareVersion& version)
146 {
147  if (node_info_.software_version == protocol::SoftwareVersion())
148  {
149  node_info_.software_version = version;
150  }
151 }
152 
153 void NodeStatusProvider::setHardwareVersion(const protocol::HardwareVersion& version)
154 {
155  if (node_info_.hardware_version == protocol::HardwareVersion())
156  {
157  node_info_.hardware_version = version;
158  }
159 }
160 
161 }
std::uint8_t uint8_t
Definition: std.hpp:24
StorageType< typename protocol::GetNodeInfo::Response::FieldTypes::name >::Type NodeName
MonotonicDuration getTxTimeout() const
bool isPositive() const
Definition: time.hpp:48
void setStatusPublicationPeriod(uavcan::MonotonicDuration period)
void setPriority(const TransferPriority prio)
void setSoftwareVersion(const protocol::SoftwareVersion &version)
void startPeriodic(MonotonicDuration period)
Definition: uc_timer.cpp:42
int startAndPublish(const TransferPriority priority=TransferPriority::Default)
void handleGetNodeInfoRequest(const protocol::GetNodeInfo::Request &, protocol::GetNodeInfo::Response &rsp)
const MonotonicTime creation_timestamp_
uavcan::MonotonicDuration getStatusPublicationPeriod() const
void setTxTimeout(MonotonicDuration tx_timeout)
protocol::GetNodeInfo::Response node_info_
int64_t toUSec() const
Definition: time.hpp:43
static void fail()
Definition: clock.cpp:38
void toString(char buf[StringBufSize]) const
Prints time in seconds with microsecond resolution.
Definition: time.hpp:224
Publisher< protocol::NodeStatus > node_status_pub_
UAVCAN_EXPORT const T & max(const T &a, const T &b)
Definition: templates.hpp:291
int64_t toMSec() const
Definition: time.hpp:44
virtual void registerInternalFailure(const char *msg)=0
void setVendorSpecificStatusCode(VendorSpecificStatusCode code)
MethodBinder< NodeStatusProvider *, void(NodeStatusProvider::*)(const protocol::GetNodeInfo::Request &, protocol::GetNodeInfo::Response &)> GetNodeInfoCallback
std::uint32_t uint32_t
Definition: std.hpp:26
virtual void updateNodeStatus()=0
void setHardwareVersion(const protocol::HardwareVersion &version)
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35
StorageType< typename protocol::NodeStatus::FieldTypes::vendor_specific_status_code >::Type VendorSpecificStatusCode
UAVCAN_EXPORT const T & min(const T &a, const T &b)
Definition: templates.hpp:281
virtual void handleTimerEvent(const TimerEvent &)
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
ServiceServer< protocol::GetNodeInfo, GetNodeInfoCallback > gni_srv_
IAdHocNodeStatusUpdater * ad_hoc_status_updater_
void setAdHocNodeStatusUpdater(IAdHocNodeStatusUpdater *updater)
MonotonicTime getMonotonicTime() const
void setName(const NodeName &name)
MonotonicDuration getPeriod() const
Definition: timer.hpp:77
int broadcast(const DataType &message)
Definition: publisher.hpp:52


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:40