/src/panic.rs
use core::fmt::Write;
use core::panic::PanicInfo;
use crate::console::{flush, write, ConsoleError};
static mut ALREADY_PANICKING: bool = false;
fn print_panic(info: &PanicInfo) -> Result<(), ConsoleError> {
let mut format_buffer: heapless::Vec<u8, 256> = heapless::Vec::new();
write(b"PANIC!\r\n")?;
match write!(&mut format_buffer, "{}", info) {
Ok(_) => {
write(&format_buffer)?;
}
Err(_) => {
write(b"could not get payload")?;
}
}
write(b"\r\n")?;
if let Some(location) = info.location() {
write!(
&mut format_buffer,
"at {} line {}:{}",
location.file(),
location.line(),
location.column()
)
.expect("write!");
write(&format_buffer)?;
} else {
write(b"Unknown location")?;
}
write(b"\r\n")?;
Ok(())
}
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
unsafe {
if ALREADY_PANICKING {
// welp
loop {}
}
ALREADY_PANICKING = true;
}
print_panic(info).expect("rut roh");
flush();
cortex_m::interrupt::disable();
loop {}
}