10#ifndef M5_UTILITY_LOG_LIBRARY_LOG_HPP
11#define M5_UTILITY_LOG_LIBRARY_LOG_HPP
21#if M5UTILITY_HAS_USABLE_CHRONO
27#if defined(__has_include)
28#if __has_include(<sdkconfig.h>)
49using log_level_t = LogLevel;
52constexpr log_level_t logOutputLevel = log_level_t::None;
53#elif defined(M5_LOG_LEVEL)
54constexpr log_level_t logOutputLevel =
static_cast<log_level_t
>(M5_LOG_LEVEL);
55#elif defined(CORE_DEBUG_LEVEL)
56constexpr log_level_t logOutputLevel =
static_cast<log_level_t
>(CORE_DEBUG_LEVEL);
71constexpr bool contains_slash(
const char* s)
73 return *s ? (*s ==
'/' ? true : contains_slash(s + 1)) :
false;
76constexpr const char* after_right_slash(
const char* s)
78 return (*s ==
'/') ? (s + 1) : after_right_slash(s - 1);
81constexpr const char* tail(
const char* s)
83 return *s ? tail(s + 1) : s;
94 return (path && path[0]) ? (contains_slash(path) ? after_right_slash(tail(path)) : path) :
"";
98void logPrintf(
const char* format, ...);
100void dump(
const void* addr,
const size_t len,
const bool align =
true);
102#if !M5UTILITY_HAS_USABLE_CHRONO
123 constexpr uint32_t count()
const
144#if defined(CONFIG_NEWLIB_NANO_FORMAT) || !M5UTILITY_HAS_USABLE_CHRONO
145#define M5_UTILITY_LOG_TS_FMT "%6" PRIu32
146#define M5_UTILITY_LOG_TS_VAL (uint32_t) m5::utility::log::elapsedTime().count()
148#define M5_UTILITY_LOG_TS_FMT "%6" PRId64
149#define M5_UTILITY_LOG_TS_VAL (int64_t) m5::utility::log::elapsedTime().count()
152#ifndef M5_UTILITY_LOG_FORMAT
153#define M5_UTILITY_LOG_FORMAT(letter, format) \
154 "[" M5_UTILITY_LOG_TS_FMT "][" #letter "][%s:%u] %s(): " format "\n", M5_UTILITY_LOG_TS_VAL, \
155 m5::utility::log::pathToFilename(__FILE__), __LINE__, __func__
163#define M5_LIB_LOGE(format, ...) \
165 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Error) { \
166 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(E, format), ##__VA_ARGS__); \
173#define M5_LIB_LOGW(format, ...) \
175 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Warn) { \
176 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(W, format), ##__VA_ARGS__); \
183#define M5_LIB_LOGI(format, ...) \
185 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Info) { \
186 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(I, format), ##__VA_ARGS__); \
193#define M5_LIB_LOGD(format, ...) \
195 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Debug) { \
196 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(D, format), ##__VA_ARGS__); \
203#define M5_LIB_LOGV(format, ...) \
205 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Verbose) { \
206 m5::utility::log::logPrintf(M5_UTILITY_LOG_FORMAT(V, format), ##__VA_ARGS__); \
214#define M5_DUMPE(addr, len) \
216 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Error) { \
217 m5::utility::log::dump((addr), (len)); \
224#define M5_DUMPW(addr, len) \
226 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Warn) { \
227 m5::utility::log::dump((addr), (len)); \
234#define M5_DUMPI(addr, len) \
236 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Info) { \
237 m5::utility::log::dump((addr), (len)); \
244#define M5_DUMPD(addr, len) \
246 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Debug) { \
247 m5::utility::log::dump((addr), (len)); \
254#define M5_DUMPV(addr, len) \
256 if (m5::utility::log::logOutputLevel >= m5::utility::log::log_level_t::Verbose) { \
257 m5::utility::log::dump((addr), (len)); \
elapsed_time_t elapsedTime()
Gets the elapsed time for log.
Definition library_log.cpp:123
LogLevel
Log output control level.
Definition library_log.hpp:41
constexpr log_level_t logOutputLevel
Base value of log level to be output.
Definition library_log.hpp:66
constexpr const char * pathToFilename(const char *path)
Gets the filename from full pathname.
Definition library_log.hpp:92
Top level namespace of M5.
Definition base64.cpp:39
Millisecond duration count; only .count() is provided, unlike the std::chrono::milliseconds used ever...
Definition library_log.hpp:114