Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UAVCAN UAVCAN_Subscriber
libuavcan/include/uavcan/node/node.hpp@0:dfe6edabb8ec, 2018-04-14 (annotated)
- Committer:
- RuslanUrya
- Date:
- Sat Apr 14 10:25:32 2018 +0000
- Revision:
- 0:dfe6edabb8ec
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |