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 }
uavcan::NodeStatusProvider::setHealth
void setHealth(uint8_t code)
Definition: uc_node_status_provider.cpp:122
uavcan::NodeStatusProvider::setHardwareVersion
void setHardwareVersion(const protocol::HardwareVersion &version)
Definition: uc_node_status_provider.cpp:153
uavcan::NodeStatusProvider::setVendorSpecificStatusCode
void setVendorSpecificStatusCode(VendorSpecificStatusCode code)
Definition: uc_node_status_provider.cpp:132
uavcan::TimerBase::getPeriod
MonotonicDuration getPeriod() const
Definition: timer.hpp:77
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::INode::getMonotonicTime
MonotonicTime getMonotonicTime() const
Definition: abstract_node.hpp:32
uavcan::DurationBase::toMSec
int64_t toMSec() const
Definition: time.hpp:44
uavcan::NodeStatusProvider::VendorSpecificStatusCode
StorageType< typename protocol::NodeStatus::FieldTypes::vendor_specific_status_code >::Type VendorSpecificStatusCode
Definition: node_status_provider.hpp:77
debug.hpp
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan::GenericPublisherBase::setTxTimeout
void setTxTimeout(MonotonicDuration tx_timeout)
Definition: uc_generic_publisher.cpp:56
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::NodeStatusProvider::GetNodeInfoCallback
MethodBinder< NodeStatusProvider *, void(NodeStatusProvider::*)(const protocol::GetNodeInfo::Request &, protocol::GetNodeInfo::Response &)> GetNodeInfoCallback
Definition: node_status_provider.hpp:55
UAVCAN_TRACE
#define UAVCAN_TRACE(...)
Definition: libuavcan/libuavcan/include/uavcan/debug.hpp:31
uavcan::MonotonicDuration
Definition: time.hpp:182
uavcan::NodeStatusProvider::getNode
INode & getNode()
Definition: node_status_provider.hpp:66
uavcan::TimerBase::startPeriodic
void startPeriodic(MonotonicDuration period)
Definition: uc_timer.cpp:42
uavcan::NodeStatusProvider::setAdHocNodeStatusUpdater
void setAdHocNodeStatusUpdater(IAdHocNodeStatusUpdater *updater)
Definition: uc_node_status_provider.cpp:117
uavcan::NodeStatusProvider::ad_hoc_status_updater_
IAdHocNodeStatusUpdater * ad_hoc_status_updater_
Definition: node_status_provider.hpp:64
uavcan::NodeStatusProvider::handleTimerEvent
virtual void handleTimerEvent(const TimerEvent &)
Definition: uc_node_status_provider.cpp:29
uavcan::INode::registerInternalFailure
virtual void registerInternalFailure(const char *msg)=0
uavcan::NodeStatusProvider::setName
void setName(const NodeName &name)
Definition: uc_node_status_provider.cpp:137
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::max
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Definition: templates.hpp:291
uavcan::NodeStatusProvider::gni_srv_
ServiceServer< protocol::GetNodeInfo, GetNodeInfoCallback > gni_srv_
Definition: node_status_provider.hpp:60
uavcan_lpc11c24::clock::fail
static void fail()
Definition: clock.cpp:38
uavcan::DurationBase::isPositive
bool isPositive() const
Definition: time.hpp:48
uavcan::NodeStatusProvider::setStatusPublicationPeriod
void setStatusPublicationPeriod(uavcan::MonotonicDuration period)
Definition: uc_node_status_provider.cpp:96
uavcan::IAdHocNodeStatusUpdater::updateNodeStatus
virtual void updateNodeStatus()=0
uavcan::min
const UAVCAN_EXPORT T & min(const T &a, const T &b)
Definition: templates.hpp:281
uavcan::NodeStatusProvider::NodeName
StorageType< typename protocol::GetNodeInfo::Response::FieldTypes::name >::Type NodeName
Definition: node_status_provider.hpp:79
uavcan::NodeStatusProvider::setMode
void setMode(uint8_t code)
Definition: uc_node_status_provider.cpp:127
uavcan::TransferPriority
Definition: transfer.hpp:28
uavcan::NodeStatusProvider::handleGetNodeInfoRequest
void handleGetNodeInfoRequest(const protocol::GetNodeInfo::Request &, protocol::GetNodeInfo::Response &rsp)
Definition: uc_node_status_provider.cpp:50
uavcan::DeadlineHandler::stop
void stop()
Definition: uc_scheduler.cpp:27
uavcan::DurationBase::toString
void toString(char buf[StringBufSize]) const
Prints time in seconds with microsecond resolution.
Definition: time.hpp:224
uavcan::IAdHocNodeStatusUpdater
Definition: node_status_provider.hpp:23
uavcan::NodeStatusProvider::publish
int publish()
Definition: uc_node_status_provider.cpp:18
uavcan::NodeStatusProvider::startAndPublish
int startAndPublish(const TransferPriority priority=TransferPriority::Default)
Definition: uc_node_status_provider.cpp:58
uavcan::NodeStatusProvider::node_info_
protocol::GetNodeInfo::Response node_info_
Definition: node_status_provider.hpp:62
uavcan::NodeStatusProvider::isNodeInfoInitialized
bool isNodeInfoInitialized() const
Definition: uc_node_status_provider.cpp:12
uavcan::NodeStatusProvider::setSoftwareVersion
void setSoftwareVersion(const protocol::SoftwareVersion &version)
Definition: uc_node_status_provider.cpp:145
uavcan::NodeStatusProvider::getStatusPublicationPeriod
uavcan::MonotonicDuration getStatusPublicationPeriod() const
Definition: uc_node_status_provider.cpp:112
uavcan::GenericPublisherBase::getTxTimeout
MonotonicDuration getTxTimeout() const
Definition: generic_publisher.hpp:58
uavcan::Publisher::broadcast
int broadcast(const DataType &message)
Definition: publisher.hpp:52
uavcan::NodeStatusProvider::creation_timestamp_
const MonotonicTime creation_timestamp_
Definition: node_status_provider.hpp:57
uavcan::GenericPublisherBase::setPriority
void setPriority(const TransferPriority prio)
Definition: generic_publisher.hpp:74
uavcan::NodeStatusProvider::node_status_pub_
Publisher< protocol::NodeStatus > node_status_pub_
Definition: node_status_provider.hpp:59
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
node_status_provider.hpp
uavcan::DurationBase::toUSec
int64_t toUSec() const
Definition: time.hpp:43
uavcan::DurationBase< MonotonicDuration >::fromUSec
static MonotonicDuration fromUSec(int64_t us)
Definition: time.hpp:35
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
uavcan::TimerEvent
Definition: timer.hpp:32


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