2022-01-25 19:40:37 -06:00
|
|
|
use core::sync::atomic::Ordering;
|
|
|
|
|
2022-03-11 13:51:47 -06:00
|
|
|
use crate::network::socket::{SimpleSock, Socket};
|
2022-03-11 15:14:35 -06:00
|
|
|
use crate::{kprint, serial_println};
|
2022-03-11 13:51:47 -06:00
|
|
|
|
2022-02-28 08:54:41 -06:00
|
|
|
use kernel::TICK;
|
2022-01-16 19:42:11 -06:00
|
|
|
use lliw::{Fg, Reset};
|
|
|
|
use log::{Level, Metadata, Record};
|
|
|
|
|
|
|
|
struct SimpleLogger;
|
2022-02-07 07:33:40 -06:00
|
|
|
// TODO: Rebuild this to take advantage of sockets
|
|
|
|
// DETAIL: Log to a socket instead of the screen
|
|
|
|
// So that we can log in the kernel and display it in userland
|
2022-01-16 19:42:11 -06:00
|
|
|
impl log::Log for SimpleLogger {
|
|
|
|
fn enabled(&self, metadata: &Metadata) -> bool {
|
|
|
|
metadata.level() <= Level::Trace
|
|
|
|
}
|
|
|
|
|
|
|
|
fn log(&self, record: &Record) {
|
|
|
|
if self.enabled(record.metadata()) {
|
2022-01-25 19:40:37 -06:00
|
|
|
let color;
|
2022-03-11 15:14:35 -06:00
|
|
|
disable();
|
2022-01-25 19:40:37 -06:00
|
|
|
let time = TICK.load(Ordering::Relaxed) as f64;
|
2022-03-11 15:14:35 -06:00
|
|
|
enable();
|
2022-02-19 07:17:44 -06:00
|
|
|
let time_float = time;
|
2022-01-16 19:42:11 -06:00
|
|
|
|
|
|
|
match record.level() {
|
|
|
|
log::Level::Error => color = (Fg::Red, "$RED$"),
|
|
|
|
log::Level::Warn => color = (Fg::LightYellow, "$LIGHTYELLOW$"),
|
|
|
|
log::Level::Info => color = (Fg::LightWhite, "$LIGHTGRAY$"),
|
|
|
|
log::Level::Debug => color = (Fg::Blue, "$BLUE$"),
|
|
|
|
log::Level::Trace => color = (Fg::Yellow, "$YELLOW$"),
|
|
|
|
}
|
2022-03-11 13:51:47 -06:00
|
|
|
let msg = format!(
|
|
|
|
"[{}{}$RESET$][$GREEN${}$RESET$]{}\n",
|
|
|
|
color.1,
|
|
|
|
record.level(),
|
|
|
|
time_float,
|
|
|
|
record.args()
|
|
|
|
);
|
2022-03-11 15:14:35 -06:00
|
|
|
// kprint!("{}", msg);
|
2022-03-11 14:18:07 -06:00
|
|
|
// NOTE: This needs to be fixed before merge
|
2022-03-11 15:14:35 -06:00
|
|
|
|
|
|
|
serial_println!(
|
2022-01-25 19:40:37 -06:00
|
|
|
"[{}{}{}][{}{}{}] {}",
|
2022-01-16 19:42:11 -06:00
|
|
|
color.0,
|
|
|
|
record.level(),
|
|
|
|
Fg::Reset,
|
|
|
|
Fg::Green,
|
2022-01-25 19:40:37 -06:00
|
|
|
time_float,
|
2022-01-16 19:42:11 -06:00
|
|
|
Reset,
|
2022-02-18 10:04:10 -06:00
|
|
|
record.args()
|
2022-01-16 19:42:11 -06:00
|
|
|
);
|
2022-03-11 13:51:47 -06:00
|
|
|
|
|
|
|
let log_socket_id = SimpleSock::grab_socket("Logger".to_string());
|
|
|
|
match log_socket_id {
|
|
|
|
Some(mut log_socket_id) => {
|
|
|
|
log_socket_id.write(msg.as_bytes().to_vec());
|
|
|
|
}
|
|
|
|
None => warn!("No socket found for Logger"),
|
|
|
|
}
|
2022-01-16 19:42:11 -06:00
|
|
|
}
|
|
|
|
}
|
2022-01-26 19:43:03 -06:00
|
|
|
/// Clear the log buffer
|
2022-01-16 19:42:11 -06:00
|
|
|
fn flush(&self) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
use log::{LevelFilter, SetLoggerError};
|
2022-03-11 15:14:35 -06:00
|
|
|
use x86_64::instructions::interrupts::{disable, enable};
|
2022-01-16 19:42:11 -06:00
|
|
|
|
|
|
|
static LOGGER: SimpleLogger = SimpleLogger;
|
|
|
|
|
|
|
|
pub fn init() -> Result<(), SetLoggerError> {
|
|
|
|
log::set_logger(&LOGGER).map(|()| log::set_max_level(LevelFilter::Trace))
|
|
|
|
}
|