Files
PentaTrack/logging.hpp

125 lines
2.4 KiB
C++

#pragma once
#include <string_view>
#include "uart_handler.hpp"
enum class LogLevel {
ERROR = 0,
INFO,
DEBUG,
TRACE,
};
inline constexpr std::string_view get_loglevel_string(LogLevel level) {
switch (level) {
case (LogLevel::ERROR): {
return "[Error]";
}
case (LogLevel::INFO): {
return "[Info] ";
}
case (LogLevel::DEBUG): {
return "[Debug]";
}
case (LogLevel::TRACE): {
return "[Trace]";
}
}
return "[Unknown]";
}
class logging_adapter {
public:
virtual bool init() { return true; }
virtual void log(std::string_view message) const = 0;
};
class uart_logger : public logging_adapter {
public:
bool init() { return uart_interface::init(); }
virtual void log(std::string_view message) const override {
uart_interface::write(message, 2048);
}
};
class log {
public:
template <typename LoggerType>
static bool init() {
if (logger) {
return true;
}
static LoggerType logger_impl;
logger = &logger_impl;
return logger_impl.init();
}
static void linebreak() {
const auto val = std::string_view{"\r\n"};
return logger->log(val);
}
template <typename... Args>
static void error(Args&&... args) {
if (!log_impl_begin(LogLevel::ERROR)) {
return;
}
log_impl(std::forward<Args&&>(args)...);
}
template <typename... Args>
static void debug(Args&&... args) {
if (!log_impl_begin(LogLevel::DEBUG)) {
return;
}
log_impl(std::forward<Args&&>(args)...);
}
template <typename... Args>
static void info(Args&&... args) {
if (!log_impl_begin(LogLevel::INFO)) {
return;
}
log_impl(std::forward<Args&&>(args)...);
}
static void set_loglevel(LogLevel level) {
info("New LogLevel: ", get_loglevel_string(level));
log_level = level;
}
private:
static bool log_impl_begin(LogLevel level) {
if (log_level < level) {
return false;
}
logger->log(get_loglevel_string(level));
logger->log(": ");
return true;
}
template <typename... Args>
static void log_impl(std::string_view message, Args&&... args) {
logger->log(message);
log_impl(std::forward<Args&&>(args)...);
}
static void log_impl(std::string_view message) {
logger->log(message);
constexpr std::string_view carriage_return{"\r\n"};
logger->log(carriage_return);
}
static logging_adapter* logger;
static LogLevel log_level;
};