Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Committer:
RuslanUrya
Date:
Sat Apr 14 10:25:32 2018 +0000
Revision:
0:dfe6edabb8ec
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RuslanUrya 0:dfe6edabb8ec 1 /*
RuslanUrya 0:dfe6edabb8ec 2 * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
RuslanUrya 0:dfe6edabb8ec 3 */
RuslanUrya 0:dfe6edabb8ec 4
RuslanUrya 0:dfe6edabb8ec 5 #ifndef UAVCAN_NODE_NODE_HPP_INCLUDED
RuslanUrya 0:dfe6edabb8ec 6 #define UAVCAN_NODE_NODE_HPP_INCLUDED
RuslanUrya 0:dfe6edabb8ec 7
RuslanUrya 0:dfe6edabb8ec 8 #include <cassert>
RuslanUrya 0:dfe6edabb8ec 9 #include <uavcan/error.hpp>
RuslanUrya 0:dfe6edabb8ec 10 #include <uavcan/build_config.hpp>
RuslanUrya 0:dfe6edabb8ec 11 #include <uavcan/node/abstract_node.hpp>
RuslanUrya 0:dfe6edabb8ec 12
RuslanUrya 0:dfe6edabb8ec 13 // High-level functionality available by default
RuslanUrya 0:dfe6edabb8ec 14 #include <uavcan/protocol/node_status_provider.hpp>
RuslanUrya 0:dfe6edabb8ec 15
RuslanUrya 0:dfe6edabb8ec 16 #if !UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 17 # include <uavcan/protocol/data_type_info_provider.hpp>
RuslanUrya 0:dfe6edabb8ec 18 # include <uavcan/protocol/logger.hpp>
RuslanUrya 0:dfe6edabb8ec 19 # include <uavcan/protocol/restart_request_server.hpp>
RuslanUrya 0:dfe6edabb8ec 20 # include <uavcan/protocol/transport_stats_provider.hpp>
RuslanUrya 0:dfe6edabb8ec 21 #endif
RuslanUrya 0:dfe6edabb8ec 22
RuslanUrya 0:dfe6edabb8ec 23 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
RuslanUrya 0:dfe6edabb8ec 24 # error UAVCAN_CPP_VERSION
RuslanUrya 0:dfe6edabb8ec 25 #endif
RuslanUrya 0:dfe6edabb8ec 26
RuslanUrya 0:dfe6edabb8ec 27 namespace uavcan
RuslanUrya 0:dfe6edabb8ec 28 {
RuslanUrya 0:dfe6edabb8ec 29 /**
RuslanUrya 0:dfe6edabb8ec 30 * This is the top-level node API.
RuslanUrya 0:dfe6edabb8ec 31 * A custom node class can be implemented if needed, in which case it shall inherit INode.
RuslanUrya 0:dfe6edabb8ec 32 *
RuslanUrya 0:dfe6edabb8ec 33 * @tparam MemPoolSize Size of memory pool for this node, in bytes.
RuslanUrya 0:dfe6edabb8ec 34 * Please refer to the documentation for details.
RuslanUrya 0:dfe6edabb8ec 35 * If this value is zero, the constructor will accept a reference to user-provided allocator.
RuslanUrya 0:dfe6edabb8ec 36 */
RuslanUrya 0:dfe6edabb8ec 37 template <std::size_t MemPoolSize = 0>
RuslanUrya 0:dfe6edabb8ec 38 class UAVCAN_EXPORT Node : public INode
RuslanUrya 0:dfe6edabb8ec 39 {
RuslanUrya 0:dfe6edabb8ec 40 typedef typename
RuslanUrya 0:dfe6edabb8ec 41 Select<(MemPoolSize > 0),
RuslanUrya 0:dfe6edabb8ec 42 PoolAllocator<MemPoolSize, MemPoolBlockSize>, // If pool size is specified, use default allocator
RuslanUrya 0:dfe6edabb8ec 43 IPoolAllocator& // Otherwise use reference to user-provided allocator
RuslanUrya 0:dfe6edabb8ec 44 >::Result Allocator;
RuslanUrya 0:dfe6edabb8ec 45
RuslanUrya 0:dfe6edabb8ec 46 Allocator pool_allocator_;
RuslanUrya 0:dfe6edabb8ec 47 Scheduler scheduler_;
RuslanUrya 0:dfe6edabb8ec 48
RuslanUrya 0:dfe6edabb8ec 49 NodeStatusProvider proto_nsp_;
RuslanUrya 0:dfe6edabb8ec 50 #if !UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 51 DataTypeInfoProvider proto_dtp_;
RuslanUrya 0:dfe6edabb8ec 52 Logger proto_logger_;
RuslanUrya 0:dfe6edabb8ec 53 RestartRequestServer proto_rrs_;
RuslanUrya 0:dfe6edabb8ec 54 TransportStatsProvider proto_tsp_;
RuslanUrya 0:dfe6edabb8ec 55 #endif
RuslanUrya 0:dfe6edabb8ec 56
RuslanUrya 0:dfe6edabb8ec 57 uint64_t internal_failure_cnt_;
RuslanUrya 0:dfe6edabb8ec 58 bool started_;
RuslanUrya 0:dfe6edabb8ec 59
RuslanUrya 0:dfe6edabb8ec 60 void commonInit()
RuslanUrya 0:dfe6edabb8ec 61 {
RuslanUrya 0:dfe6edabb8ec 62 internal_failure_cnt_ = 0;
RuslanUrya 0:dfe6edabb8ec 63 started_ = false;
RuslanUrya 0:dfe6edabb8ec 64 }
RuslanUrya 0:dfe6edabb8ec 65
RuslanUrya 0:dfe6edabb8ec 66 protected:
RuslanUrya 0:dfe6edabb8ec 67 virtual void registerInternalFailure(const char* msg)
RuslanUrya 0:dfe6edabb8ec 68 {
RuslanUrya 0:dfe6edabb8ec 69 internal_failure_cnt_++;
RuslanUrya 0:dfe6edabb8ec 70 UAVCAN_TRACE("Node", "Internal failure: %s", msg);
RuslanUrya 0:dfe6edabb8ec 71 #if UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 72 (void)msg;
RuslanUrya 0:dfe6edabb8ec 73 #else
RuslanUrya 0:dfe6edabb8ec 74 (void)getLogger().log(protocol::debug::LogLevel::ERROR, "UAVCAN", msg);
RuslanUrya 0:dfe6edabb8ec 75 #endif
RuslanUrya 0:dfe6edabb8ec 76 }
RuslanUrya 0:dfe6edabb8ec 77
RuslanUrya 0:dfe6edabb8ec 78 public:
RuslanUrya 0:dfe6edabb8ec 79 /**
RuslanUrya 0:dfe6edabb8ec 80 * This overload is only valid if MemPoolSize > 0.
RuslanUrya 0:dfe6edabb8ec 81 */
RuslanUrya 0:dfe6edabb8ec 82 Node(ICanDriver& can_driver,
RuslanUrya 0:dfe6edabb8ec 83 ISystemClock& system_clock) :
RuslanUrya 0:dfe6edabb8ec 84 scheduler_(can_driver, pool_allocator_, system_clock),
RuslanUrya 0:dfe6edabb8ec 85 proto_nsp_(*this)
RuslanUrya 0:dfe6edabb8ec 86 #if !UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 87 , proto_dtp_(*this)
RuslanUrya 0:dfe6edabb8ec 88 , proto_logger_(*this)
RuslanUrya 0:dfe6edabb8ec 89 , proto_rrs_(*this)
RuslanUrya 0:dfe6edabb8ec 90 , proto_tsp_(*this)
RuslanUrya 0:dfe6edabb8ec 91 #endif
RuslanUrya 0:dfe6edabb8ec 92 {
RuslanUrya 0:dfe6edabb8ec 93 commonInit();
RuslanUrya 0:dfe6edabb8ec 94 }
RuslanUrya 0:dfe6edabb8ec 95
RuslanUrya 0:dfe6edabb8ec 96 /**
RuslanUrya 0:dfe6edabb8ec 97 * This overload is only valid if MemPoolSize == 0.
RuslanUrya 0:dfe6edabb8ec 98 */
RuslanUrya 0:dfe6edabb8ec 99 Node(ICanDriver& can_driver,
RuslanUrya 0:dfe6edabb8ec 100 ISystemClock& system_clock,
RuslanUrya 0:dfe6edabb8ec 101 IPoolAllocator& allocator) :
RuslanUrya 0:dfe6edabb8ec 102 pool_allocator_(allocator),
RuslanUrya 0:dfe6edabb8ec 103 scheduler_(can_driver, pool_allocator_, system_clock),
RuslanUrya 0:dfe6edabb8ec 104 proto_nsp_(*this)
RuslanUrya 0:dfe6edabb8ec 105 #if !UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 106 , proto_dtp_(*this)
RuslanUrya 0:dfe6edabb8ec 107 , proto_logger_(*this)
RuslanUrya 0:dfe6edabb8ec 108 , proto_rrs_(*this)
RuslanUrya 0:dfe6edabb8ec 109 , proto_tsp_(*this)
RuslanUrya 0:dfe6edabb8ec 110 #endif
RuslanUrya 0:dfe6edabb8ec 111 {
RuslanUrya 0:dfe6edabb8ec 112 commonInit();
RuslanUrya 0:dfe6edabb8ec 113 }
RuslanUrya 0:dfe6edabb8ec 114
RuslanUrya 0:dfe6edabb8ec 115 virtual typename RemoveReference<Allocator>::Type& getAllocator() { return pool_allocator_; }
RuslanUrya 0:dfe6edabb8ec 116
RuslanUrya 0:dfe6edabb8ec 117 virtual Scheduler& getScheduler() { return scheduler_; }
RuslanUrya 0:dfe6edabb8ec 118 virtual const Scheduler& getScheduler() const { return scheduler_; }
RuslanUrya 0:dfe6edabb8ec 119
RuslanUrya 0:dfe6edabb8ec 120 int spin(MonotonicTime deadline)
RuslanUrya 0:dfe6edabb8ec 121 {
RuslanUrya 0:dfe6edabb8ec 122 if (started_)
RuslanUrya 0:dfe6edabb8ec 123 {
RuslanUrya 0:dfe6edabb8ec 124 return INode::spin(deadline);
RuslanUrya 0:dfe6edabb8ec 125 }
RuslanUrya 0:dfe6edabb8ec 126 return -ErrNotInited;
RuslanUrya 0:dfe6edabb8ec 127 }
RuslanUrya 0:dfe6edabb8ec 128
RuslanUrya 0:dfe6edabb8ec 129 int spin(MonotonicDuration duration)
RuslanUrya 0:dfe6edabb8ec 130 {
RuslanUrya 0:dfe6edabb8ec 131 if (started_)
RuslanUrya 0:dfe6edabb8ec 132 {
RuslanUrya 0:dfe6edabb8ec 133 return INode::spin(duration);
RuslanUrya 0:dfe6edabb8ec 134 }
RuslanUrya 0:dfe6edabb8ec 135 return -ErrNotInited;
RuslanUrya 0:dfe6edabb8ec 136 }
RuslanUrya 0:dfe6edabb8ec 137
RuslanUrya 0:dfe6edabb8ec 138 int spinOnce()
RuslanUrya 0:dfe6edabb8ec 139 {
RuslanUrya 0:dfe6edabb8ec 140 if (started_)
RuslanUrya 0:dfe6edabb8ec 141 {
RuslanUrya 0:dfe6edabb8ec 142 return INode::spinOnce();
RuslanUrya 0:dfe6edabb8ec 143 }
RuslanUrya 0:dfe6edabb8ec 144 return -ErrNotInited;
RuslanUrya 0:dfe6edabb8ec 145 }
RuslanUrya 0:dfe6edabb8ec 146
RuslanUrya 0:dfe6edabb8ec 147 bool isStarted() const { return started_; }
RuslanUrya 0:dfe6edabb8ec 148
RuslanUrya 0:dfe6edabb8ec 149 uint64_t getInternalFailureCount() const { return internal_failure_cnt_; }
RuslanUrya 0:dfe6edabb8ec 150
RuslanUrya 0:dfe6edabb8ec 151 /**
RuslanUrya 0:dfe6edabb8ec 152 * Starts the node and publishes uavcan.protocol.NodeStatus immediately.
RuslanUrya 0:dfe6edabb8ec 153 * Does not so anything if the node is already started.
RuslanUrya 0:dfe6edabb8ec 154 * Once started, the node can't stop.
RuslanUrya 0:dfe6edabb8ec 155 * If the node failed to start up, it's recommended to destroy the current node instance and start over.
RuslanUrya 0:dfe6edabb8ec 156 * Returns negative error code.
RuslanUrya 0:dfe6edabb8ec 157 * @param node_status_transfer_priority Transfer priority that will be used for outgoing NodeStatus messages.
RuslanUrya 0:dfe6edabb8ec 158 * Normal priority is used by default.
RuslanUrya 0:dfe6edabb8ec 159 */
RuslanUrya 0:dfe6edabb8ec 160 int start(const TransferPriority node_status_transfer_priority = TransferPriority::Default);
RuslanUrya 0:dfe6edabb8ec 161
RuslanUrya 0:dfe6edabb8ec 162 /**
RuslanUrya 0:dfe6edabb8ec 163 * Gets/sets the node name, e.g. "com.example.product_name". The node name can be set only once.
RuslanUrya 0:dfe6edabb8ec 164 * The name must be set before the node is started, otherwise the node will refuse to start up.
RuslanUrya 0:dfe6edabb8ec 165 */
RuslanUrya 0:dfe6edabb8ec 166 const NodeStatusProvider::NodeName& getName() const { return proto_nsp_.getName(); }
RuslanUrya 0:dfe6edabb8ec 167 void setName(const NodeStatusProvider::NodeName& name) { proto_nsp_.setName(name); }
RuslanUrya 0:dfe6edabb8ec 168
RuslanUrya 0:dfe6edabb8ec 169 /**
RuslanUrya 0:dfe6edabb8ec 170 * Node health code helpers.
RuslanUrya 0:dfe6edabb8ec 171 */
RuslanUrya 0:dfe6edabb8ec 172 void setHealthOk() { proto_nsp_.setHealthOk(); }
RuslanUrya 0:dfe6edabb8ec 173 void setHealthWarning() { proto_nsp_.setHealthWarning(); }
RuslanUrya 0:dfe6edabb8ec 174 void setHealthError() { proto_nsp_.setHealthError(); }
RuslanUrya 0:dfe6edabb8ec 175 void setHealthCritical() { proto_nsp_.setHealthCritical(); }
RuslanUrya 0:dfe6edabb8ec 176
RuslanUrya 0:dfe6edabb8ec 177 /**
RuslanUrya 0:dfe6edabb8ec 178 * Node mode code helpers.
RuslanUrya 0:dfe6edabb8ec 179 * Note that INITIALIZATION is the default mode; the application has to manually set it to OPERATIONAL.
RuslanUrya 0:dfe6edabb8ec 180 */
RuslanUrya 0:dfe6edabb8ec 181 void setModeOperational() { proto_nsp_.setModeOperational(); }
RuslanUrya 0:dfe6edabb8ec 182 void setModeInitialization() { proto_nsp_.setModeInitialization(); }
RuslanUrya 0:dfe6edabb8ec 183 void setModeMaintenance() { proto_nsp_.setModeMaintenance(); }
RuslanUrya 0:dfe6edabb8ec 184 void setModeSoftwareUpdate() { proto_nsp_.setModeSoftwareUpdate(); }
RuslanUrya 0:dfe6edabb8ec 185
RuslanUrya 0:dfe6edabb8ec 186 void setModeOfflineAndPublish()
RuslanUrya 0:dfe6edabb8ec 187 {
RuslanUrya 0:dfe6edabb8ec 188 proto_nsp_.setModeOffline();
RuslanUrya 0:dfe6edabb8ec 189 (void)proto_nsp_.forcePublish();
RuslanUrya 0:dfe6edabb8ec 190 }
RuslanUrya 0:dfe6edabb8ec 191
RuslanUrya 0:dfe6edabb8ec 192 /**
RuslanUrya 0:dfe6edabb8ec 193 * Updates the vendor-specific status code.
RuslanUrya 0:dfe6edabb8ec 194 */
RuslanUrya 0:dfe6edabb8ec 195 void setVendorSpecificStatusCode(NodeStatusProvider::VendorSpecificStatusCode code)
RuslanUrya 0:dfe6edabb8ec 196 {
RuslanUrya 0:dfe6edabb8ec 197 proto_nsp_.setVendorSpecificStatusCode(code);
RuslanUrya 0:dfe6edabb8ec 198 }
RuslanUrya 0:dfe6edabb8ec 199
RuslanUrya 0:dfe6edabb8ec 200 /**
RuslanUrya 0:dfe6edabb8ec 201 * Gets/sets the node version information.
RuslanUrya 0:dfe6edabb8ec 202 */
RuslanUrya 0:dfe6edabb8ec 203 void setSoftwareVersion(const protocol::SoftwareVersion& version) { proto_nsp_.setSoftwareVersion(version); }
RuslanUrya 0:dfe6edabb8ec 204 void setHardwareVersion(const protocol::HardwareVersion& version) { proto_nsp_.setHardwareVersion(version); }
RuslanUrya 0:dfe6edabb8ec 205
RuslanUrya 0:dfe6edabb8ec 206 const protocol::SoftwareVersion& getSoftwareVersion() const { return proto_nsp_.getSoftwareVersion(); }
RuslanUrya 0:dfe6edabb8ec 207 const protocol::HardwareVersion& getHardwareVersion() const { return proto_nsp_.getHardwareVersion(); }
RuslanUrya 0:dfe6edabb8ec 208
RuslanUrya 0:dfe6edabb8ec 209 NodeStatusProvider& getNodeStatusProvider() { return proto_nsp_; }
RuslanUrya 0:dfe6edabb8ec 210
RuslanUrya 0:dfe6edabb8ec 211 #if !UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 212 /**
RuslanUrya 0:dfe6edabb8ec 213 * Restart handler can be installed to handle external node restart requests (highly recommended).
RuslanUrya 0:dfe6edabb8ec 214 */
RuslanUrya 0:dfe6edabb8ec 215 void setRestartRequestHandler(IRestartRequestHandler* handler) { proto_rrs_.setHandler(handler); }
RuslanUrya 0:dfe6edabb8ec 216
RuslanUrya 0:dfe6edabb8ec 217 RestartRequestServer& getRestartRequestServer() { return proto_rrs_; }
RuslanUrya 0:dfe6edabb8ec 218
RuslanUrya 0:dfe6edabb8ec 219 /**
RuslanUrya 0:dfe6edabb8ec 220 * Node logging.
RuslanUrya 0:dfe6edabb8ec 221 * Logging calls are passed directly into the @ref Logger instance.
RuslanUrya 0:dfe6edabb8ec 222 * Type safe log formatting is supported only in C++11 mode.
RuslanUrya 0:dfe6edabb8ec 223 * @{
RuslanUrya 0:dfe6edabb8ec 224 */
RuslanUrya 0:dfe6edabb8ec 225 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
RuslanUrya 0:dfe6edabb8ec 226
RuslanUrya 0:dfe6edabb8ec 227 template <typename... Args>
RuslanUrya 0:dfe6edabb8ec 228 inline void logDebug(const char* source, const char* format, Args... args)
RuslanUrya 0:dfe6edabb8ec 229 {
RuslanUrya 0:dfe6edabb8ec 230 (void)proto_logger_.logDebug(source, format, args...);
RuslanUrya 0:dfe6edabb8ec 231 }
RuslanUrya 0:dfe6edabb8ec 232
RuslanUrya 0:dfe6edabb8ec 233 template <typename... Args>
RuslanUrya 0:dfe6edabb8ec 234 inline void logInfo(const char* source, const char* format, Args... args)
RuslanUrya 0:dfe6edabb8ec 235 {
RuslanUrya 0:dfe6edabb8ec 236 (void)proto_logger_.logInfo(source, format, args...);
RuslanUrya 0:dfe6edabb8ec 237 }
RuslanUrya 0:dfe6edabb8ec 238
RuslanUrya 0:dfe6edabb8ec 239 template <typename... Args>
RuslanUrya 0:dfe6edabb8ec 240 inline void logWarning(const char* source, const char* format, Args... args)
RuslanUrya 0:dfe6edabb8ec 241 {
RuslanUrya 0:dfe6edabb8ec 242 (void)proto_logger_.logWarning(source, format, args...);
RuslanUrya 0:dfe6edabb8ec 243 }
RuslanUrya 0:dfe6edabb8ec 244
RuslanUrya 0:dfe6edabb8ec 245 template <typename... Args>
RuslanUrya 0:dfe6edabb8ec 246 inline void logError(const char* source, const char* format, Args... args)
RuslanUrya 0:dfe6edabb8ec 247 {
RuslanUrya 0:dfe6edabb8ec 248 (void)proto_logger_.logError(source, format, args...);
RuslanUrya 0:dfe6edabb8ec 249 }
RuslanUrya 0:dfe6edabb8ec 250
RuslanUrya 0:dfe6edabb8ec 251 #else
RuslanUrya 0:dfe6edabb8ec 252
RuslanUrya 0:dfe6edabb8ec 253 void logDebug(const char* source, const char* text) { (void)proto_logger_.logDebug(source, text); }
RuslanUrya 0:dfe6edabb8ec 254 void logInfo(const char* source, const char* text) { (void)proto_logger_.logInfo(source, text); }
RuslanUrya 0:dfe6edabb8ec 255 void logWarning(const char* source, const char* text) { (void)proto_logger_.logWarning(source, text); }
RuslanUrya 0:dfe6edabb8ec 256 void logError(const char* source, const char* text) { (void)proto_logger_.logError(source, text); }
RuslanUrya 0:dfe6edabb8ec 257
RuslanUrya 0:dfe6edabb8ec 258 #endif
RuslanUrya 0:dfe6edabb8ec 259 /**
RuslanUrya 0:dfe6edabb8ec 260 * @}
RuslanUrya 0:dfe6edabb8ec 261 */
RuslanUrya 0:dfe6edabb8ec 262
RuslanUrya 0:dfe6edabb8ec 263 /**
RuslanUrya 0:dfe6edabb8ec 264 * Use this method to configure logging.
RuslanUrya 0:dfe6edabb8ec 265 */
RuslanUrya 0:dfe6edabb8ec 266 Logger& getLogger() { return proto_logger_; }
RuslanUrya 0:dfe6edabb8ec 267
RuslanUrya 0:dfe6edabb8ec 268 #endif // UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 269 };
RuslanUrya 0:dfe6edabb8ec 270
RuslanUrya 0:dfe6edabb8ec 271 // ----------------------------------------------------------------------------
RuslanUrya 0:dfe6edabb8ec 272
RuslanUrya 0:dfe6edabb8ec 273 template <std::size_t MemPoolSize_>
RuslanUrya 0:dfe6edabb8ec 274 int Node<MemPoolSize_>::start(const TransferPriority priority)
RuslanUrya 0:dfe6edabb8ec 275 {
RuslanUrya 0:dfe6edabb8ec 276 if (started_)
RuslanUrya 0:dfe6edabb8ec 277 {
RuslanUrya 0:dfe6edabb8ec 278 return 0;
RuslanUrya 0:dfe6edabb8ec 279 }
RuslanUrya 0:dfe6edabb8ec 280 GlobalDataTypeRegistry::instance().freeze();
RuslanUrya 0:dfe6edabb8ec 281
RuslanUrya 0:dfe6edabb8ec 282 int res = 0;
RuslanUrya 0:dfe6edabb8ec 283 res = proto_nsp_.startAndPublish(priority);
RuslanUrya 0:dfe6edabb8ec 284 if (res < 0)
RuslanUrya 0:dfe6edabb8ec 285 {
RuslanUrya 0:dfe6edabb8ec 286 goto fail;
RuslanUrya 0:dfe6edabb8ec 287 }
RuslanUrya 0:dfe6edabb8ec 288 #if !UAVCAN_TINY
RuslanUrya 0:dfe6edabb8ec 289 res = proto_dtp_.start();
RuslanUrya 0:dfe6edabb8ec 290 if (res < 0)
RuslanUrya 0:dfe6edabb8ec 291 {
RuslanUrya 0:dfe6edabb8ec 292 goto fail;
RuslanUrya 0:dfe6edabb8ec 293 }
RuslanUrya 0:dfe6edabb8ec 294 res = proto_logger_.init();
RuslanUrya 0:dfe6edabb8ec 295 if (res < 0)
RuslanUrya 0:dfe6edabb8ec 296 {
RuslanUrya 0:dfe6edabb8ec 297 goto fail;
RuslanUrya 0:dfe6edabb8ec 298 }
RuslanUrya 0:dfe6edabb8ec 299 res = proto_rrs_.start();
RuslanUrya 0:dfe6edabb8ec 300 if (res < 0)
RuslanUrya 0:dfe6edabb8ec 301 {
RuslanUrya 0:dfe6edabb8ec 302 goto fail;
RuslanUrya 0:dfe6edabb8ec 303 }
RuslanUrya 0:dfe6edabb8ec 304 res = proto_tsp_.start();
RuslanUrya 0:dfe6edabb8ec 305 if (res < 0)
RuslanUrya 0:dfe6edabb8ec 306 {
RuslanUrya 0:dfe6edabb8ec 307 goto fail;
RuslanUrya 0:dfe6edabb8ec 308 }
RuslanUrya 0:dfe6edabb8ec 309 #endif
RuslanUrya 0:dfe6edabb8ec 310 started_ = res >= 0;
RuslanUrya 0:dfe6edabb8ec 311 return res;
RuslanUrya 0:dfe6edabb8ec 312 fail:
RuslanUrya 0:dfe6edabb8ec 313 UAVCAN_ASSERT(res < 0);
RuslanUrya 0:dfe6edabb8ec 314 return res;
RuslanUrya 0:dfe6edabb8ec 315 }
RuslanUrya 0:dfe6edabb8ec 316
RuslanUrya 0:dfe6edabb8ec 317 }
RuslanUrya 0:dfe6edabb8ec 318
RuslanUrya 0:dfe6edabb8ec 319 #endif // UAVCAN_NODE_NODE_HPP_INCLUDED