diff --git a/platformio.ini b/platformio.ini index cb79964..f67a096 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,6 +17,7 @@ build_flags = -Iinclude/ -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue -std=gnu++17 + -DLOG_LEVEL=LOG_LEVEL_TRACE build_unflags = -std=gnu++11 # -Ilib/u8g2/csrc diff --git a/src/logger/logger.cpp b/src/logger/logger.cpp new file mode 100644 index 0000000..93a01f5 --- /dev/null +++ b/src/logger/logger.cpp @@ -0,0 +1,48 @@ +#include "logger.h" +#include "HardwareSerial.h" + +namespace Logger { + inline HardwareSerial& out() { + return Serial2; + } + + void WritePrefix(LogLevel lvl) { + switch (lvl) { + case Error: out().print(F("\r[ERR] ")); break; + case Warn: out().print(F("\r[WRN] ")); break; + case Info: out().print(F("\r[INF] ")); break; + case Debug: out().print(F("\r[DBG] ")); break; + case Trace: out().print(F("\r[TRC] ")); break; + } + } + + void VPrintf(const char* fmt, va_list args) { + char buffer[128]; + vsnprintf(buffer, sizeof(buffer), fmt, args); + out().print(buffer); + } + + void Printf(const char* fmt, ...) { + va_list args; + va_start(args, fmt); + VPrintf(fmt, args); + va_end(args); + } + + void Printf(const __FlashStringHelper* fmt, ...) { + char buffer[128]; + + va_list args; + va_start(args, fmt); + vsnprintf_P(buffer, sizeof(buffer), + reinterpret_cast(fmt), args); + va_end(args); + + out().print(buffer); + } + + void Initialize(int8_t rx, int8_t tx) { + Serial2.begin(115200, SERIAL_8N1, rx, tx); + Serial2.flush(); + } +}; diff --git a/src/logger/logger.h b/src/logger/logger.h new file mode 100644 index 0000000..0a29e99 --- /dev/null +++ b/src/logger/logger.h @@ -0,0 +1,82 @@ +#ifndef __LOGGER__ +#define __LOGGER__ + +#include +#include + +#define LOG_LEVEL_ERROR 0 +#define LOG_LEVEL_WARN 1 +#define LOG_LEVEL_INFO 2 +#define LOG_LEVEL_DEBUG 3 +#define LOG_LEVEL_TRACE 4 + +#define LOG_ENABLED(lvl) ((lvl) <= LOG_LEVEL) + +#if LOG_ENABLED(LOG_LEVEL_ERROR) + #define LOG_ERROR(fmt, ...) \ + do { \ + Logger::WritePrefix(Logger::Error); \ + Logger::Printf(fmt, ##__VA_ARGS__); \ + } while (0) +#else + #define LOG_ERROR(...) do {} while (0) +#endif + +#if LOG_ENABLED(LOG_LEVEL_WARN) + #define LOG_WARN(fmt, ...) \ + do { \ + Logger::WritePrefix(Logger::Warn); \ + Logger::Printf(fmt, ##__VA_ARGS__); \ + } while (0) +#else + #define LOG_WARN(...) do {} while (0) +#endif + +#if LOG_ENABLED(LOG_LEVEL_INFO) + #define LOG_INFO(fmt, ...) \ + do { \ + Logger::WritePrefix(Logger::Info); \ + Logger::Printf(fmt, ##__VA_ARGS__); \ + } while (0) +#else + #define LOG_INFO(...) do {} while (0) +#endif + +#if LOG_ENABLED(LOG_LEVEL_DEBUG) + #define LOG_DEBUG(fmt, ...) \ + do { \ + Logger::WritePrefix(Logger::Debug); \ + Logger::Printf(fmt, ##__VA_ARGS__); \ + } while (0) +#else + #define LOG_DEBUG(...) do {} while (0) +#endif + +#if LOG_ENABLED(LOG_LEVEL_TRACE) + #define LOG_TRACE(fmt, ...) \ + do { \ + Logger::WritePrefix(Logger::Trace); \ + Logger::Printf(fmt, ##__VA_ARGS__); \ + } while (0) +#else + #define LOG_TRACE(...) do {} while (0) +#endif + +namespace Logger { + enum LogLevel : uint8_t { + Error = LOG_LEVEL_ERROR, + Warn = LOG_LEVEL_WARN, + Info = LOG_LEVEL_INFO, + Debug = LOG_LEVEL_DEBUG, + Trace = LOG_LEVEL_TRACE + }; + + void Initialize(int8_t rx, int8_t tx); + + void WritePrefix(LogLevel lvl); + void VPrintf(const char* fmt, va_list args); + void Printf(const char* fmt, ...); + void Printf(const __FlashStringHelper* fmt, ...); +}; + +#endif