use crate::base::*;
use crate::utils::*;
use core::cell::OnceCell;
type Callback = fn();
pub struct FreeRtosHooks {
on_assert: OnceCell<Callback>,
}
impl FreeRtosHooks {
pub fn set_on_assert(&self, c: Callback) -> Result<(), Callback> {
self.on_assert.set(c)
}
fn do_on_assert(&self) {
if let Some(cb) = self.on_assert.get() {
cb()
}
}
}
unsafe impl Sync for FreeRtosHooks {}
pub static FREERTOS_HOOKS: FreeRtosHooks = FreeRtosHooks {
on_assert: OnceCell::new(),
};
#[allow(unused_doc_comments)]
#[no_mangle]
pub extern "C" fn vAssertCalled(file_name_ptr: FreeRtosCharPtr, line: FreeRtosUBaseType) {
let file_name = unsafe { str_from_c_string(file_name_ptr).unwrap() };
FREERTOS_HOOKS.do_on_assert();
panic!("FreeRTOS ASSERT: {}:{}", file_name, line);
}