24 enum LogLevel { Debug, Info, Warning, Error };
28 this->log_print_ptr = &out;
29 this->log_level = level;
33 void setLogLevel(LogLevel level) { this->log_level = level; }
36 bool isLogging(LogLevel level = Info) {
37 return log_print_ptr !=
nullptr && level >= log_level;
40 AudioLogger& prefix(
const char* file,
int line, LogLevel current_level) {
41 printPrefix(file, line, current_level);
46#if defined(IS_DESKTOP) || defined(IS_DESKTOP_WITH_TIME_ONLY)
47 fprintf(stderr,
"%s\n", print_buffer);
49#elif defined(IS_ZEPHYR)
50 if (log_print_ptr !=
nullptr) {
51 log_print_ptr->println(print_buffer);
52 log_print_ptr->flush();
58 log_print_ptr->println(print_buffer);
59 log_print_ptr->flush();
64 char* str() {
return print_buffer; }
67 static AudioLogger& instance() {
68 static AudioLogger* ptr;
70 ptr =
new AudioLogger;
75 LogLevel level() {
return log_level; }
77 void print(
const char* c) { log_print_ptr->print(c); }
79 void printChar(
char c) { log_print_ptr->print(c); }
81 void printCharHex(
char c) {
83 unsigned char val = c;
84 snprintf(tmp, 5,
"%02X ", val);
85 log_print_ptr->print(tmp);
95 const char* levelName(LogLevel level)
const {
109 int printPrefix(
const char* file,
int line, LogLevel current_level)
const {
110 const char* file_name = strrchr(file,
'/') ? strrchr(file,
'/') + 1 : file;
111 const char* level_code = levelName(current_level);
112 int len = log_print_ptr->print(
"[");
113 len += log_print_ptr->print(level_code);
114 len += log_print_ptr->print(
"] ");
115 len += log_print_ptr->print(file_name);
116 len += log_print_ptr->print(
" : ");
117 len += log_print_ptr->print(line);
118 len += log_print_ptr->print(
" - ");
124static AudioLogger& AudioToolsLogger = AudioLogger::instance();
127using AudioToolsLogLevel = AudioLogger::LogLevel;
130class CustomLogLevel {
132 AudioLogger::LogLevel getActual() {
return actual; }
135 void set(AudioLogger::LogLevel level) {
137 original = AudioLogger::instance().level();
144 AudioLogger::instance().begin(
Serial, actual);
150 AudioLogger::instance().begin(
Serial, original);
156 AudioLogger::LogLevel original;
157 AudioLogger::LogLevel actual;
162#define LOG_OUT_PGMEM(level, fmt, ...) \
164 ::audio_tools::AudioToolsLogger.prefix(__FILE__, __LINE__, level); \
165 snprintf(::audio_tools::AudioToolsLogger.str(), LOG_PRINTF_BUFFER_SIZE, PSTR(fmt), \
167 ::audio_tools::AudioToolsLogger.println(); \
170#define LOG_OUT(level, fmt, ...) \
172 ::audio_tools::AudioToolsLogger.prefix(__FILE__, __LINE__, level); \
173 snprintf(::audio_tools::AudioToolsLogger.str(), LOG_PRINTF_BUFFER_SIZE, fmt, \
175 ::audio_tools::AudioToolsLogger.println(); \
177#define LOG_MIN(level) \
179 ::audio_tools::AudioToolsLogger.prefix(__FILE__, __LINE__, level); \
180 ::audio_tools::AudioToolsLogger.println(); \
184#define LOGD(fmt, ...) \
185 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Debug) { \
186 LOG_MIN(AudioLogger::Debug); \
188#define LOGI(fmt, ...) \
189 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Info) { \
190 LOG_MIN(AudioLogger::Info); \
192#define LOGW(fmt, ...) \
193 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Warning) { \
194 LOG_MIN(AudioLogger::Warning); \
196#define LOGE(fmt, ...) \
197 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Error) { \
198 LOG_MIN(AudioLogger::Error); \
202#define LOGD(fmt, ...) \
203 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Debug) { \
204 LOG_OUT_PGMEM(AudioLogger::Debug, fmt, ##__VA_ARGS__); \
206#define LOGI(fmt, ...) \
207 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Info) { \
208 LOG_OUT_PGMEM(AudioLogger::Info, fmt, ##__VA_ARGS__); \
210#define LOGW(fmt, ...) \
211 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Warning) { \
212 LOG_OUT_PGMEM(AudioLogger::Warning, fmt, ##__VA_ARGS__); \
214#define LOGE(fmt, ...) \
215 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Error) { \
216 LOG_OUT_PGMEM(AudioLogger::Error, fmt, ##__VA_ARGS__); \
221#if defined(NO_TRACED) || defined(NO_TRACE)
225 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Debug) { \
226 LOG_OUT(AudioLogger::Debug, LOG_METHOD); \
230#if defined(NO_TRACEI) || defined(NO_TRACE)
234 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Info) { \
235 LOG_OUT(AudioLogger::Info, LOG_METHOD); \
239#if defined(NO_TRACEW) || defined(NO_TRACE)
243 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Warning) { \
244 LOG_OUT(AudioLogger::Warning, LOG_METHOD); \
248#if defined(NO_TRACEE) || defined(NO_TRACE)
252 if (::audio_tools::AudioToolsLogger.level() <= AudioLogger::Error) { \
253 LOG_OUT(AudioLogger::Error, LOG_METHOD); \
static HardwareSerial Serial
Definition Arduino.h:179
#define LOG_PRINTF_BUFFER_SIZE
Definition avr.h:25
constexpr const _Ep * begin(initializer_list< _Ep > __il) noexcept
Definition InitializerList.h:55