From 60d746af115de1d4710a60fb9a18cb6775634dcb Mon Sep 17 00:00:00 2001 From: ChUrl Date: Sat, 16 Jul 2022 01:48:09 +0200 Subject: [PATCH] implement logger --- c_os/user/lib/Logger.cc | 45 +++++++++++++++++++++++++++++++++ c_os/user/lib/Logger.h | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 c_os/user/lib/Logger.cc create mode 100644 c_os/user/lib/Logger.h diff --git a/c_os/user/lib/Logger.cc b/c_os/user/lib/Logger.cc new file mode 100644 index 0000000..77c6e02 --- /dev/null +++ b/c_os/user/lib/Logger.cc @@ -0,0 +1,45 @@ +#include "user/lib/Logger.h" +#include "kernel/Globals.h" + +bool Logger::kout_enabled = true; +bool Logger::serial_enabled = true; +const Semaphore Logger::sem = Semaphore(1); + +Logger::LogLevel Logger::level = Logger::TRACE; + +void Logger::log(char* message, CGA::color col) { + if (Logger::kout_enabled) { + CGA::color old_col = kout.color_fg; + kout << fgc(col) << this->name << " :: " << message << fgc(old_col) << endl; + } + if (Logger::serial_enabled) { + serial.write(this->name); + serial.write(" :: "); + serial.write(message); + serial.write("\r\n"); + } +} + +void Logger::trace(char* message) { + if (Logger::level <= Logger::TRACE) { + this->log(message, CGA::GREEN); + } +} + +void Logger::debug(char* message) { + if (Logger::level <= Logger::DEBUG) { + this->log(message, CGA::CYAN); + } +} + +void Logger::error(char* message) { + if (Logger::level <= Logger::ERROR) { + this->log(message, CGA::RED); + } +} + +void Logger::info(char* message) { + if (Logger::level <= Logger::TRACE) { + this->log(message, CGA::LIGHT_GREY); + } +} diff --git a/c_os/user/lib/Logger.h b/c_os/user/lib/Logger.h new file mode 100644 index 0000000..018ff33 --- /dev/null +++ b/c_os/user/lib/Logger.h @@ -0,0 +1,55 @@ +#ifndef __Logger_Include_H_ +#define __Logger_Include_H_ + +#include "devices/CGA.h" +#include "lib/Semaphore.h" + +class Logger { +private: + Logger(const Logger& copy) = delete; + + char* name; + static bool kout_enabled; + static bool serial_enabled; + + // TODO: Don't mix logs + static const Semaphore sem; + + void log(char* message, CGA::color col); + +public: + Logger(char* name) : name(name) {} + + enum LogLevel { + TRACE = 0, + DEBUG = 1, + ERROR = 2, + INFO = 3 + }; + static LogLevel level; + + void trace(char* message); + void debug(char* message); + void error(char* message); + void info(char* message); + + // TODO: Make level change accessible over menu + static void set_level(LogLevel level) { + Logger::level = level; + } + + static void enable_kout() { + Logger::kout_enabled = true; + } + static void disable_kout() { + Logger::kout_enabled = false; + } + static void enable_serial() { + Logger::serial_enabled = true; + } + static void disable_serial() { + Logger::serial_enabled = false; + } +}; + +#endif