node.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_NODE_NODE_HPP_INCLUDED
6 #define UAVCAN_NODE_NODE_HPP_INCLUDED
7 
8 #include <cassert>
9 #include <uavcan/error.hpp>
10 #include <uavcan/build_config.hpp>
12 
13 // High-level functionality available by default
15 
16 #if !UAVCAN_TINY
21 #endif
22 
23 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
24 # error UAVCAN_CPP_VERSION
25 #endif
26 
27 namespace uavcan
28 {
37 template <std::size_t MemPoolSize = 0>
38 class UAVCAN_EXPORT Node : public INode
39 {
40  typedef typename
41  Select<(MemPoolSize > 0),
42  PoolAllocator<MemPoolSize, MemPoolBlockSize>, // If pool size is specified, use default allocator
43  IPoolAllocator& // Otherwise use reference to user-provided allocator
44  >::Result Allocator;
45 
48 
50 #if !UAVCAN_TINY
55 #endif
56 
58  bool started_;
59 
60  void commonInit()
61  {
62  internal_failure_cnt_ = 0;
63  started_ = false;
64  }
65 
66 protected:
67  virtual void registerInternalFailure(const char* msg)
68  {
69  internal_failure_cnt_++;
70  UAVCAN_TRACE("Node", "Internal failure: %s", msg);
71 #if UAVCAN_TINY
72  (void)msg;
73 #else
74  (void)getLogger().log(protocol::debug::LogLevel::ERROR, "UAVCAN", msg);
75 #endif
76  }
77 
78 public:
82  Node(ICanDriver& can_driver,
83  ISystemClock& system_clock) :
84  scheduler_(can_driver, pool_allocator_, system_clock),
85  proto_nsp_(*this)
86 #if !UAVCAN_TINY
87  , proto_dtp_(*this)
88  , proto_logger_(*this)
89  , proto_rrs_(*this)
90  , proto_tsp_(*this)
91 #endif
92  {
93  commonInit();
94  }
95 
99  Node(ICanDriver& can_driver,
100  ISystemClock& system_clock,
101  IPoolAllocator& allocator) :
102  pool_allocator_(allocator),
103  scheduler_(can_driver, pool_allocator_, system_clock),
104  proto_nsp_(*this)
105 #if !UAVCAN_TINY
106  , proto_dtp_(*this)
107  , proto_logger_(*this)
108  , proto_rrs_(*this)
109  , proto_tsp_(*this)
110 #endif
111  {
112  commonInit();
113  }
114 
115  virtual typename RemoveReference<Allocator>::Type& getAllocator() { return pool_allocator_; }
116 
117  virtual Scheduler& getScheduler() { return scheduler_; }
118  virtual const Scheduler& getScheduler() const { return scheduler_; }
119 
120  int spin(MonotonicTime deadline)
121  {
122  if (started_)
123  {
124  return INode::spin(deadline);
125  }
126  return -ErrNotInited;
127  }
128 
129  int spin(MonotonicDuration duration)
130  {
131  if (started_)
132  {
133  return INode::spin(duration);
134  }
135  return -ErrNotInited;
136  }
137 
138  int spinOnce()
139  {
140  if (started_)
141  {
142  return INode::spinOnce();
143  }
144  return -ErrNotInited;
145  }
146 
147  bool isStarted() const { return started_; }
148 
149  uint64_t getInternalFailureCount() const { return internal_failure_cnt_; }
150 
160  int start(const TransferPriority node_status_transfer_priority = TransferPriority::Default);
161 
166  const NodeStatusProvider::NodeName& getName() const { return proto_nsp_.getName(); }
167  void setName(const NodeStatusProvider::NodeName& name) { proto_nsp_.setName(name); }
168 
172  void setHealthOk() { proto_nsp_.setHealthOk(); }
173  void setHealthWarning() { proto_nsp_.setHealthWarning(); }
174  void setHealthError() { proto_nsp_.setHealthError(); }
175  void setHealthCritical() { proto_nsp_.setHealthCritical(); }
176 
181  void setModeOperational() { proto_nsp_.setModeOperational(); }
183  void setModeMaintenance() { proto_nsp_.setModeMaintenance(); }
185 
187  {
188  proto_nsp_.setModeOffline();
189  (void)proto_nsp_.forcePublish();
190  }
191 
196  {
197  proto_nsp_.setVendorSpecificStatusCode(code);
198  }
199 
203  void setSoftwareVersion(const protocol::SoftwareVersion& version) { proto_nsp_.setSoftwareVersion(version); }
204  void setHardwareVersion(const protocol::HardwareVersion& version) { proto_nsp_.setHardwareVersion(version); }
205 
206  const protocol::SoftwareVersion& getSoftwareVersion() const { return proto_nsp_.getSoftwareVersion(); }
207  const protocol::HardwareVersion& getHardwareVersion() const { return proto_nsp_.getHardwareVersion(); }
208 
209  NodeStatusProvider& getNodeStatusProvider() { return proto_nsp_; }
210 
211 #if !UAVCAN_TINY
212 
215  void setRestartRequestHandler(IRestartRequestHandler* handler) { proto_rrs_.setHandler(handler); }
216 
218 
225 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
226 
227  template <typename... Args>
228  inline void logDebug(const char* source, const char* format, Args... args)
229  {
230  (void)proto_logger_.logDebug(source, format, args...);
231  }
232 
233  template <typename... Args>
234  inline void logInfo(const char* source, const char* format, Args... args)
235  {
236  (void)proto_logger_.logInfo(source, format, args...);
237  }
238 
239  template <typename... Args>
240  inline void logWarning(const char* source, const char* format, Args... args)
241  {
242  (void)proto_logger_.logWarning(source, format, args...);
243  }
244 
245  template <typename... Args>
246  inline void logError(const char* source, const char* format, Args... args)
247  {
248  (void)proto_logger_.logError(source, format, args...);
249  }
250 
251 #else
252 
253  void logDebug(const char* source, const char* text) { (void)proto_logger_.logDebug(source, text); }
254  void logInfo(const char* source, const char* text) { (void)proto_logger_.logInfo(source, text); }
255  void logWarning(const char* source, const char* text) { (void)proto_logger_.logWarning(source, text); }
256  void logError(const char* source, const char* text) { (void)proto_logger_.logError(source, text); }
257 
258 #endif
259 
266  Logger& getLogger() { return proto_logger_; }
267 
268 #endif // UAVCAN_TINY
269 };
270 
271 // ----------------------------------------------------------------------------
272 
273 template <std::size_t MemPoolSize_>
275 {
276  if (started_)
277  {
278  return 0;
279  }
281 
282  int res = 0;
283  res = proto_nsp_.startAndPublish(priority);
284  if (res < 0)
285  {
286  goto fail;
287  }
288 #if !UAVCAN_TINY
289  res = proto_dtp_.start();
290  if (res < 0)
291  {
292  goto fail;
293  }
294  res = proto_logger_.init();
295  if (res < 0)
296  {
297  goto fail;
298  }
299  res = proto_rrs_.start();
300  if (res < 0)
301  {
302  goto fail;
303  }
304  res = proto_tsp_.start();
305  if (res < 0)
306  {
307  goto fail;
308  }
309 #endif
310  started_ = res >= 0;
311  return res;
312 fail:
313  UAVCAN_ASSERT(res < 0);
314  return res;
315 }
316 
317 }
318 
319 #endif // UAVCAN_NODE_NODE_HPP_INCLUDED
uavcan::INode::spinOnce
int spinOnce()
Definition: abstract_node.hpp:86
uavcan::Node::proto_dtp_
DataTypeInfoProvider proto_dtp_
Definition: node.hpp:51
uavcan::NodeStatusProvider::setHealthWarning
void setHealthWarning()
Definition: node_status_provider.hpp:130
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::Node::getInternalFailureCount
uint64_t getInternalFailureCount() const
Definition: node.hpp:149
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
uavcan::Node::commonInit
void commonInit()
Definition: node.hpp:60
uavcan::Node::setSoftwareVersion
void setSoftwareVersion(const protocol::SoftwareVersion &version)
Definition: node.hpp:203
uavcan::Node::setModeOfflineAndPublish
void setModeOfflineAndPublish()
Definition: node.hpp:186
transport_stats_provider.hpp
uavcan::NodeStatusProvider::setModeOffline
void setModeOffline()
Definition: node_status_provider.hpp:143
uavcan::Node< NodeMemPoolSize >::Allocator
Select<(MemPoolSize > 0), PoolAllocator< MemPoolSize, MemPoolBlockSize >, IPoolAllocator & >::Result Allocator
Definition: node.hpp:44
uavcan::Node::internal_failure_cnt_
uint64_t internal_failure_cnt_
Definition: node.hpp:57
uavcan::Logger::logInfo
int logInfo(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:186
uavcan::NodeStatusProvider::setModeInitialization
void setModeInitialization()
Definition: node_status_provider.hpp:140
uavcan::Node::getAllocator
virtual RemoveReference< Allocator >::Type & getAllocator()
Definition: node.hpp:115
uavcan::NodeStatusProvider::setModeOperational
void setModeOperational()
Definition: node_status_provider.hpp:139
uavcan::Node::scheduler_
Scheduler scheduler_
Definition: node.hpp:47
uavcan::RestartRequestServer
Definition: restart_request_server.hpp:38
uavcan::Node::logWarning
void logWarning(const char *source, const char *format, Args... args)
Definition: node.hpp:240
uavcan::NodeStatusProvider
Definition: node_status_provider.hpp:51
uavcan::Node::getScheduler
virtual Scheduler & getScheduler()
Definition: node.hpp:117
uavcan::ICanDriver
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:207
uavcan::NodeStatusProvider::setHealthError
void setHealthError()
Definition: node_status_provider.hpp:131
uavcan::Node::proto_nsp_
NodeStatusProvider proto_nsp_
Definition: node.hpp:49
uavcan::Node::spin
int spin(MonotonicTime deadline)
Definition: node.hpp:120
uavcan::Node::getSoftwareVersion
const protocol::SoftwareVersion & getSoftwareVersion() const
Definition: node.hpp:206
uavcan::DataTypeInfoProvider
Definition: data_type_info_provider.hpp:21
uavcan::Node::setHealthWarning
void setHealthWarning()
Definition: node.hpp:173
uavcan::RestartRequestServer::setHandler
void setHandler(IRestartRequestHandler *handler)
Definition: restart_request_server.hpp:78
UAVCAN_TRACE
#define UAVCAN_TRACE(...)
Definition: libuavcan/libuavcan/include/uavcan/debug.hpp:31
uavcan::MonotonicDuration
Definition: time.hpp:182
uavcan::Node::setModeMaintenance
void setModeMaintenance()
Definition: node.hpp:183
uavcan::INode::spin
int spin(MonotonicTime deadline)
Definition: abstract_node.hpp:63
uavcan::Node::proto_tsp_
TransportStatsProvider proto_tsp_
Definition: node.hpp:54
uavcan::Node::getRestartRequestServer
RestartRequestServer & getRestartRequestServer()
Definition: node.hpp:217
uavcan::PoolAllocator< MemPoolSize, MemPoolBlockSize >
uavcan::NodeStatusProvider::setModeSoftwareUpdate
void setModeSoftwareUpdate()
Definition: node_status_provider.hpp:142
uavcan::Node::getHardwareVersion
const protocol::HardwareVersion & getHardwareVersion() const
Definition: node.hpp:207
uavcan::Node::setRestartRequestHandler
void setRestartRequestHandler(IRestartRequestHandler *handler)
Definition: node.hpp:215
uavcan::Logger::logDebug
int logDebug(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:180
A
Definition: comparison.cpp:95
uavcan::Node::setHealthError
void setHealthError()
Definition: node.hpp:174
uavcan::Node::setName
void setName(const NodeStatusProvider::NodeName &name)
Definition: node.hpp:167
uavcan::NodeStatusProvider::setName
void setName(const NodeName &name)
Definition: uc_node_status_provider.cpp:137
uavcan::Node::spin
int spin(MonotonicDuration duration)
Definition: node.hpp:129
uavcan::Node::logError
void logError(const char *source, const char *format, Args... args)
Definition: node.hpp:246
uavcan::Node::started_
bool started_
Definition: node.hpp:58
uavcan::NodeStatusProvider::setHealthCritical
void setHealthCritical()
Definition: node_status_provider.hpp:132
setup.args
args
Definition: pyuavcan/setup.py:22
uavcan_lpc11c24::clock::fail
static void fail()
Definition: clock.cpp:38
uavcan::Node::getNodeStatusProvider
NodeStatusProvider & getNodeStatusProvider()
Definition: node.hpp:209
uavcan::NodeStatusProvider::forcePublish
int forcePublish()
Definition: node_status_provider.hpp:105
data_type_info_provider.hpp
uavcan::IPoolAllocator
Definition: dynamic_memory.hpp:21
abstract_node.hpp
uavcan::Node::pool_allocator_
Allocator pool_allocator_
Definition: node.hpp:46
uavcan::Select
struct UAVCAN_EXPORT Select
Definition: templates.hpp:80
uavcan::Logger::logWarning
int logWarning(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:192
uavcan::Scheduler
Definition: scheduler.hpp:63
uavcan::Node::proto_rrs_
RestartRequestServer proto_rrs_
Definition: node.hpp:53
uavcan::TransportStatsProvider
Definition: transport_stats_provider.hpp:19
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::NodeStatusProvider::getHardwareVersion
const protocol::HardwareVersion & getHardwareVersion() const
Definition: node_status_provider.hpp:167
ERROR
@ ERROR
Definition: lpc_types.h:74
uavcan::INode
Definition: abstract_node.hpp:19
uavcan::TransferPriority
Definition: transfer.hpp:28
uavcan::IRestartRequestHandler
Definition: restart_request_server.hpp:18
uavcan::Node::start
int start(const TransferPriority node_status_transfer_priority=TransferPriority::Default)
Definition: node.hpp:274
uavcan::NodeStatusProvider::getName
const NodeName & getName() const
Definition: node_status_provider.hpp:159
uavcan::RemoveReference::Type
T Type
Definition: templates.hpp:112
build_config.hpp
uavcan::Node::spinOnce
int spinOnce()
Definition: node.hpp:138
uavcan::Node::getName
const NodeStatusProvider::NodeName & getName() const
Definition: node.hpp:166
start
ROSCPP_DECL void start()
uavcan::Node::setModeInitialization
void setModeInitialization()
Definition: node.hpp:182
uavcan::Node::setModeOperational
void setModeOperational()
Definition: node.hpp:181
uavcan::Node::setVendorSpecificStatusCode
void setVendorSpecificStatusCode(NodeStatusProvider::VendorSpecificStatusCode code)
Definition: node.hpp:195
uavcan::Node::isStarted
bool isStarted() const
Definition: node.hpp:147
uavcan::Node::setModeSoftwareUpdate
void setModeSoftwareUpdate()
Definition: node.hpp:184
uavcan::Logger
Definition: logger.hpp:58
uavcan::Node::Node
Node(ICanDriver &can_driver, ISystemClock &system_clock)
Definition: node.hpp:82
logger.hpp
uavcan::NodeStatusProvider::setSoftwareVersion
void setSoftwareVersion(const protocol::SoftwareVersion &version)
Definition: uc_node_status_provider.cpp:145
uavcan::Node::getLogger
Logger & getLogger()
Definition: node.hpp:266
uavcan::Node::logInfo
void logInfo(const char *source, const char *format, Args... args)
Definition: node.hpp:234
uavcan::NodeStatusProvider::setHealthOk
void setHealthOk()
Definition: node_status_provider.hpp:129
uavcan::Node::setHealthCritical
void setHealthCritical()
Definition: node.hpp:175
uavcan::Node::Node
Node(ICanDriver &can_driver, ISystemClock &system_clock, IPoolAllocator &allocator)
Definition: node.hpp:99
uavcan::MonotonicTime
Definition: time.hpp:184
uavcan::GlobalDataTypeRegistry::instance
static GlobalDataTypeRegistry & instance()
Definition: uc_global_data_type_registry.cpp:128
uavcan::NodeStatusProvider::getSoftwareVersion
const protocol::SoftwareVersion & getSoftwareVersion() const
Definition: node_status_provider.hpp:166
uavcan::Node::proto_logger_
Logger proto_logger_
Definition: node.hpp:52
restart_request_server.hpp
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::ISystemClock
Definition: system_clock.hpp:19
uavcan::GlobalDataTypeRegistry::freeze
void freeze()
Definition: uc_global_data_type_registry.cpp:134
UAVCAN_TINY
#define UAVCAN_TINY
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:118
uavcan::Node::getScheduler
virtual const Scheduler & getScheduler() const
Definition: node.hpp:118
node_status_provider.hpp
test.format
format
Definition: dsdl/test.py:6
uavcan::Node::setHardwareVersion
void setHardwareVersion(const protocol::HardwareVersion &version)
Definition: node.hpp:204
uavcan::Node
Definition: node.hpp:38
uavcan::NodeStatusProvider::setModeMaintenance
void setModeMaintenance()
Definition: node_status_provider.hpp:141
uavcan::Node::setHealthOk
void setHealthOk()
Definition: node.hpp:172
uavcan::TransferPriority::Default
static const TransferPriority Default
This priority is used by default.
Definition: transfer.hpp:38
uavcan::Node::logDebug
void logDebug(const char *source, const char *format, Args... args)
Definition: node.hpp:228
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
error.hpp
uavcan::Logger::logError
int logError(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:198
uavcan::Node::registerInternalFailure
virtual void registerInternalFailure(const char *msg)
Definition: node.hpp:67


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