logging: implement a way to set the logging levels at runtime
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
#![allow(static_mut_refs)]
|
||||
|
||||
use embassy_sync::blocking_mutex::{raw::CriticalSectionRawMutex, Mutex};
|
||||
use esp_println::println;
|
||||
use log::{LevelFilter, Metadata, Record};
|
||||
use static_cell::StaticCell;
|
||||
|
||||
// Provides a threadsafe serial logger
|
||||
pub struct RenderbugLogger {
|
||||
lock: Mutex<CriticalSectionRawMutex, ()>,
|
||||
current_level: LevelFilter,
|
||||
default_level: LevelFilter
|
||||
}
|
||||
|
||||
@@ -13,12 +15,14 @@ impl Default for RenderbugLogger {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
lock: Mutex::new(()),
|
||||
current_level: LevelFilter::Info,
|
||||
default_level: LevelFilter::Info
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static LOGGER: StaticCell<RenderbugLogger> = StaticCell::new();
|
||||
//static LOGGER: StaticCell<RenderbugLogger> = StaticCell::new();
|
||||
static mut LOGGER: Option<RenderbugLogger> = None;
|
||||
|
||||
impl RenderbugLogger {
|
||||
pub fn init_logger() {
|
||||
@@ -33,7 +37,8 @@ impl RenderbugLogger {
|
||||
_ => LevelFilter::Info
|
||||
};
|
||||
|
||||
let logger = LOGGER.init(RenderbugLogger { default_level, ..Default::default() });
|
||||
unsafe { LOGGER.replace(RenderbugLogger { default_level, current_level: default_level, ..Default::default() }) };
|
||||
let logger = unsafe { LOGGER.as_mut().unwrap() };
|
||||
unsafe {
|
||||
critical_section::with(|_| {
|
||||
log::set_logger_racy(logger).ok();
|
||||
@@ -41,6 +46,25 @@ impl RenderbugLogger {
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
pub fn set_level(level: LevelFilter) {
|
||||
unsafe {
|
||||
critical_section::with(|_| {
|
||||
log::set_max_level_racy(level);
|
||||
LOGGER.as_mut().unwrap().current_level = level;
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub fn reset_level() {
|
||||
unsafe {
|
||||
critical_section::with(|_| {
|
||||
let logger = LOGGER.as_mut().unwrap();
|
||||
log::set_max_level_racy(logger.default_level);
|
||||
logger.current_level = logger.default_level;
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl log::Log for RenderbugLogger {
|
||||
|
||||
Reference in New Issue
Block a user