1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
extern crate alloc; use cortex_m::iprint; use stm32f1xx_hal_bxcan::pac::ITM; #[macro_export] macro_rules! log_debug { ($logger:expr, $fmt:expr) => { unsafe { (&mut *$logger.get()).log_debug($fmt); } }; ($logger:expr, $fmt:expr, $($arg:tt)*) => { unsafe { (&mut *$logger.get()).log_debug(&format!($fmt, $($arg)*)); } }; } #[macro_export] macro_rules! log_warning { ($logger:expr, $fmt:expr) => { unsafe { (&mut *$logger.get()).log_warning($fmt); } }; ($logger:expr, $fmt:expr, $($arg:tt)*) => { unsafe { (&mut *$logger.get()).log_warning(&format!($fmt, $($arg)*)); } }; } #[macro_export] macro_rules! log_error { ($logger:expr, $fmt:expr) => { unsafe { (&mut *$logger.get()).log_error($fmt); } }; ($logger:expr, $fmt:expr, $($arg:tt)*) => { unsafe { (&mut *$logger.get()).log_error(&format!($fmt, $($arg)*)); } }; } pub enum RossLogLevel { Debug, Warning, Error, } pub struct RossLogger { log_level: RossLogLevel, itm: ITM, } impl RossLogger { pub fn new(log_level: RossLogLevel, itm: ITM) -> Self { RossLogger { log_level, itm } } pub fn change_log_level(&mut self, log_level: RossLogLevel) { self.log_level = log_level; } pub fn log_debug(&mut self, message: &str) { if matches!(self.log_level, RossLogLevel::Debug) { self.log("[DEBUG] "); self.log(message); self.log("\r\n"); } } pub fn log_warning(&mut self, message: &str) { if matches!(self.log_level, RossLogLevel::Debug) || matches!(self.log_level, RossLogLevel::Warning) { self.log("[DEBUG] "); self.log(message); self.log("\r\n"); } } pub fn log_error(&mut self, message: &str) { self.log("[ERROR] "); self.log(message); self.log("\r\n"); } fn log(&mut self, message: &str) { iprint!(&mut self.itm.stim[0], message); } }