logging: implement a way to set the logging levels at runtime

This commit is contained in:
2026-02-28 16:43:25 +01:00
parent 08a3c65346
commit 95ebc7820a

View File

@@ -1,11 +1,13 @@
#![allow(static_mut_refs)]
use embassy_sync::blocking_mutex::{raw::CriticalSectionRawMutex, Mutex}; use embassy_sync::blocking_mutex::{raw::CriticalSectionRawMutex, Mutex};
use esp_println::println; use esp_println::println;
use log::{LevelFilter, Metadata, Record}; use log::{LevelFilter, Metadata, Record};
use static_cell::StaticCell;
// Provides a threadsafe serial logger // Provides a threadsafe serial logger
pub struct RenderbugLogger { pub struct RenderbugLogger {
lock: Mutex<CriticalSectionRawMutex, ()>, lock: Mutex<CriticalSectionRawMutex, ()>,
current_level: LevelFilter,
default_level: LevelFilter default_level: LevelFilter
} }
@@ -13,12 +15,14 @@ impl Default for RenderbugLogger {
fn default() -> Self { fn default() -> Self {
Self { Self {
lock: Mutex::new(()), lock: Mutex::new(()),
current_level: LevelFilter::Info,
default_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 { impl RenderbugLogger {
pub fn init_logger() { pub fn init_logger() {
@@ -33,7 +37,8 @@ impl RenderbugLogger {
_ => LevelFilter::Info _ => 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 { unsafe {
critical_section::with(|_| { critical_section::with(|_| {
log::set_logger_racy(logger).ok(); 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 { impl log::Log for RenderbugLogger {