use crate::serial::Serial;
use core::{fmt::write, format_args};
use log::*;
use spin::Mutex;
const COM1_PORT: u16 = 0x3f8;
static LOGGER: Logger = Logger(Mutex::new(COM1_PORT));
struct Logger(Mutex<u16>);
impl log::Log for Logger {
fn enabled(&self, _m: &Metadata) -> bool {
true
}
fn log(&self, record: &Record) {
let port = self.0.lock();
let mut serial = Serial::new(*port);
let _ = write(
&mut serial,
format_args!(
"{:>8}: {} ({}, {}:{})\n",
record.level(),
record.args(),
record.target(),
record.file().unwrap_or("<unknown>"),
record.line().unwrap_or(0),
),
);
}
fn flush(&self) {}
}
fn set_logger_base(base: u16) {
let mut data = LOGGER.0.lock();
*data = base;
}
pub struct Builder {
base: u16,
filter: LevelFilter,
}
impl Builder {
pub fn new() -> Self {
Self {
base: COM1_PORT,
filter: LevelFilter::Info,
}
}
pub fn base(mut self, base: u16) -> Self {
self.base = base;
self
}
pub fn filter(mut self, filter: LevelFilter) -> Self {
self.filter = filter;
self
}
pub fn setup(self) {
Serial::new(self.base).init();
set_logger_base(self.base);
set_logger(&LOGGER).unwrap();
set_max_level(self.filter);
}
}
pub fn builder() -> Builder {
Builder::new()
}
pub fn init() {
builder().filter(LevelFilter::Info).setup();
}
pub fn init_with_filter(filter: LevelFilter) {
builder().filter(filter).setup();
}