Skip to content

Instantly share code, notes, and snippets.

@TotalKrill
Created July 31, 2019 16:00
Show Gist options
  • Save TotalKrill/6672a3db83d93979cebb8f4afd41b7b5 to your computer and use it in GitHub Desktop.
Save TotalKrill/6672a3db83d93979cebb8f4afd41b7b5 to your computer and use it in GitHub Desktop.
use core::cell::RefCell;
use core::fmt::Write;
use cortex_m::interrupt::Mutex;
use heapless::{consts::U1024, spsc::Queue};
use log::{Metadata, Record};
pub static LOGBUF: Mutex<RefCell<Buffer>> = Mutex::new(RefCell::new(Buffer::new()));
pub struct Buffer(pub Queue<u8, U1024>);
impl Buffer {
const fn new() -> Self {
Buffer(Queue::new())
}
}
impl core::fmt::Write for Buffer {
fn write_str(&mut self, s: &str) -> Result<(), core::fmt::Error> {
for u8char in s.bytes() {
let _e = self.0.enqueue(u8char);
}
Ok(())
}
}
pub struct BufferLogger;
impl log::Log for BufferLogger {
fn enabled(&self, _metadata: &Metadata) -> bool {
true
}
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
cortex_m::interrupt::free(|cs| {
// make sure you are alone on the buffer
let mut tx = LOGBUF.borrow(cs).borrow_mut();
writeln!(
tx,
"{} {}: {}",
record.level(),
record.target(),
record.args()
)
.unwrap();
});
}
}
fn flush(&self) {}
}
@TotalKrill
Copy link
Author

TotalKrill commented Jul 31, 2019

Example of how to write it out over uart, this can be done whenever you want it.

        cortex_m::interrupt::free(|cs| {
            // Obtain mutex protected write part of serial port
            while let Some(b) = logger::LOGBUF
                .borrow(cs)
                .borrow_mut()
                .deref_mut()
                .0
                .dequeue()
            {
                let _e = write!(uart, "{}", b as char);
            }
        });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment