logger.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_PROTOCOL_LOGGER_HPP_INCLUDED
6 #define UAVCAN_PROTOCOL_LOGGER_HPP_INCLUDED
7 
8 #include <uavcan/time.hpp>
10 #include <uavcan/protocol/debug/LogMessage.hpp>
13 #include <cstdlib>
14 
15 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
16 # error UAVCAN_CPP_VERSION
17 #endif
18 
19 namespace uavcan
20 {
28 {
29 public:
31 
32  virtual ~ILogSink() { }
33 
38  virtual LogLevel getLogLevel() const { return protocol::debug::LogLevel::DEBUG; }
39 
44  virtual void log(const protocol::debug::LogMessage& message) = 0;
45 };
46 
59 {
60 public:
62 
67  static LogLevel getLogLevelAboveAll() { return (1U << protocol::debug::LogLevel::FieldTypes::value::BitLen) - 1U; }
68 
69 private:
70  enum { DefaultTxTimeoutMs = 2000 };
71 
73  protocol::debug::LogMessage msg_buf_;
76 
78  {
79  return (external_sink_ == UAVCAN_NULLPTR) ? getLogLevelAboveAll() : external_sink_->getLogLevel();
80  }
81 
82 public:
83  explicit Logger(INode& node)
84  : logmsg_pub_(node)
85  , external_sink_(UAVCAN_NULLPTR)
86  {
88  setTxTimeout(MonotonicDuration::fromMSec(DefaultTxTimeoutMs));
89  UAVCAN_ASSERT(getTxTimeout() == MonotonicDuration::fromMSec(DefaultTxTimeoutMs));
90  }
91 
98  {
99  const int res = logmsg_pub_.init(priority);
100  if (res < 0)
101  {
102  return res;
103  }
104  return 0;
105  }
106 
118  int log(const protocol::debug::LogMessage& message)
119  {
120  int retval = 0;
121  if (message.level.value >= getExternalSinkLevel())
122  {
123  external_sink_->log(message);
124  }
125  if (message.level.value >= level_)
126  {
127  retval = logmsg_pub_.broadcast(message);
128  }
129  return retval;
130  }
131 
138  LogLevel getLevel() const { return level_; }
139  void setLevel(LogLevel level) { level_ = level; }
140 
147  ILogSink* getExternalSink() const { return external_sink_; }
148  void setExternalSink(ILogSink* sink) { external_sink_ = sink; }
149 
154  MonotonicDuration getTxTimeout() const { return logmsg_pub_.getTxTimeout(); }
155  void setTxTimeout(MonotonicDuration val) { logmsg_pub_.setTxTimeout(val); }
156 
174 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
175 
176  template <typename... Args>
177  int log(LogLevel level, const char* source, const char* format, Args... args) UAVCAN_NOEXCEPT;
178 
179  template <typename... Args>
180  inline int logDebug(const char* source, const char* format, Args... args) UAVCAN_NOEXCEPT
181  {
182  return log(protocol::debug::LogLevel::DEBUG, source, format, args...);
183  }
184 
185  template <typename... Args>
186  inline int logInfo(const char* source, const char* format, Args... args) UAVCAN_NOEXCEPT
187  {
188  return log(protocol::debug::LogLevel::INFO, source, format, args...);
189  }
190 
191  template <typename... Args>
192  inline int logWarning(const char* source, const char* format, Args... args) UAVCAN_NOEXCEPT
193  {
194  return log(protocol::debug::LogLevel::WARNING, source, format, args...);
195  }
196 
197  template <typename... Args>
198  inline int logError(const char* source, const char* format, Args... args) UAVCAN_NOEXCEPT
199  {
200  return log(protocol::debug::LogLevel::ERROR, source, format, args...);
201  }
202 
203 #else
204 
205  int log(LogLevel level, const char* source, const char* text) UAVCAN_NOEXCEPT
206  {
207  #if UAVCAN_EXCEPTIONS
208  try
209  #endif
210  {
211  if (level >= level_ || level >= getExternalSinkLevel())
212  {
213  msg_buf_.level.value = level;
214  msg_buf_.source = source;
215  msg_buf_.text = text;
216  return log(msg_buf_);
217  }
218  return 0;
219  }
220  #if UAVCAN_EXCEPTIONS
221  catch (...)
222  {
223  return -ErrFailure;
224  }
225  #endif
226  }
227 
228  int logDebug(const char* source, const char* text) UAVCAN_NOEXCEPT
229  {
230  return log(protocol::debug::LogLevel::DEBUG, source, text);
231  }
232 
233  int logInfo(const char* source, const char* text) UAVCAN_NOEXCEPT
234  {
235  return log(protocol::debug::LogLevel::INFO, source, text);
236  }
237 
238  int logWarning(const char* source, const char* text) UAVCAN_NOEXCEPT
239  {
240  return log(protocol::debug::LogLevel::WARNING, source, text);
241  }
242 
243  int logError(const char* source, const char* text) UAVCAN_NOEXCEPT
244  {
245  return log(protocol::debug::LogLevel::ERROR, source, text);
246  }
247 
248 #endif
249 
252 };
253 
254 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
255 
256 template <typename... Args>
257 int Logger::log(LogLevel level, const char* source, const char* format, Args... args) UAVCAN_NOEXCEPT
258 {
259 #if UAVCAN_EXCEPTIONS
260  try
261 #endif
262  {
263  if (level >= level_ || level >= getExternalSinkLevel())
264  {
265  msg_buf_.level.value = level;
266  msg_buf_.source = source;
267  msg_buf_.text.clear();
269  formatter.write(format, args...);
270  return log(msg_buf_);
271  }
272  return 0;
273  }
274 #if UAVCAN_EXCEPTIONS
275  catch (...)
276  {
277  return -ErrFailure;
278  }
279 #endif
280 }
281 
282 #endif
283 
284 }
285 
286 #endif // UAVCAN_PROTOCOL_LOGGER_HPP_INCLUDED
UAVCAN_NULLPTR
#define UAVCAN_NULLPTR
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:51
uavcan::ILogSink
Definition: logger.hpp:27
uavcan::GenericPublisherBase::setTxTimeout
void setTxTimeout(MonotonicDuration tx_timeout)
Definition: uc_generic_publisher.cpp:56
uavcan::Publisher< protocol::debug::LogMessage >
uavcan::Logger::logInfo
int logInfo(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:186
uavcan::Logger::init
int init(const TransferPriority priority=TransferPriority::Lowest)
Definition: logger.hpp:97
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::Logger::setTxTimeout
void setTxTimeout(MonotonicDuration val)
Definition: logger.hpp:155
uavcan::Logger::level_
LogLevel level_
Definition: logger.hpp:74
uavcan::ILogSink::~ILogSink
virtual ~ILogSink()
Definition: logger.hpp:32
uavcan::MonotonicDuration
Definition: time.hpp:182
uavcan::Logger::msg_buf_
protocol::debug::LogMessage msg_buf_
Definition: logger.hpp:73
publisher.hpp
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::CharArrayFormatter
Definition: char_array_formatter.hpp:25
uavcan::Logger::Logger
Logger(INode &node)
Definition: logger.hpp:83
uavcan::TransferPriority::Lowest
static const TransferPriority Lowest
Definition: transfer.hpp:42
setup.args
args
Definition: pyuavcan/setup.py:22
uavcan::Logger::getLevel
LogLevel getLevel() const
Definition: logger.hpp:138
uavcan::Logger::logWarning
int logWarning(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:192
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
ERROR
@ ERROR
Definition: lpc_types.h:74
uavcan::Logger::setExternalSink
void setExternalSink(ILogSink *sink)
Definition: logger.hpp:148
uavcan::INode
Definition: abstract_node.hpp:19
uavcan::TransferPriority
Definition: transfer.hpp:28
test.level
level
Definition: dsdl/test.py:6
uavcan::Logger::LogLevel
ILogSink::LogLevel LogLevel
Definition: logger.hpp:61
build_config.hpp
uavcan::GenericPublisher::init
int init()
Definition: generic_publisher.hpp:118
uavcan::ILogSink::LogLevel
StorageType< typename protocol::debug::LogLevel::FieldTypes::value >::Type LogLevel
Definition: logger.hpp:30
uavcan::ILogSink::log
virtual void log(const protocol::debug::LogMessage &message)=0
uavcan::ILogSink::getLogLevel
virtual LogLevel getLogLevel() const
Definition: logger.hpp:38
uavcan::Logger
Definition: logger.hpp:58
uavcan::Logger::getExternalSink
ILogSink * getExternalSink() const
Definition: logger.hpp:147
uavcan::Logger::getTxTimeout
MonotonicDuration getTxTimeout() const
Definition: logger.hpp:154
uavcan::Logger::logmsg_pub_
Publisher< protocol::debug::LogMessage > logmsg_pub_
Definition: logger.hpp:72
uavcan::Logger::getLogLevelAboveAll
static LogLevel getLogLevelAboveAll()
Definition: logger.hpp:67
uavcan::GenericPublisherBase::getTxTimeout
MonotonicDuration getTxTimeout() const
Definition: generic_publisher.hpp:58
uavcan::Publisher::broadcast
int broadcast(const DataType &message)
Definition: publisher.hpp:52
pyuavcan_v0.introspect.node
node
Definition: introspect.py:398
uavcan::Logger::external_sink_
ILogSink * external_sink_
Definition: logger.hpp:75
time.hpp
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::Logger::log
int log(const protocol::debug::LogMessage &message)
Definition: logger.hpp:118
char_array_formatter.hpp
UAVCAN_NOEXCEPT
#define UAVCAN_NOEXCEPT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:99
uavcan::Logger::getExternalSinkLevel
LogLevel getExternalSinkLevel() const
Definition: logger.hpp:77
test.format
format
Definition: dsdl/test.py:6
uavcan::Logger::setLevel
void setLevel(LogLevel level)
Definition: logger.hpp:139
UAVCAN_ASSERT
#define UAVCAN_ASSERT(x)
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:184
uavcan::StorageType::Type
T Type
Definition: type_util.hpp:53
uavcan::Logger::logError
int logError(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:198
uavcan::CharArrayFormatter::write
void write(const char *text)
Definition: char_array_formatter.hpp:79


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