use crate::cortex::rtt_minimal::rtt_write_core;
use core::sync::atomic::Ordering;
use rustmeter_beacon_core::{protocol::raw_writers::event_ids, time_delta::TimeDelta};
static mut DROPPED_EVENTS_COUNTER: [u32; 2] = [0, 0];
#[unsafe(no_mangle)]
#[unsafe(link_section = ".data")]
fn write_tracing_data(data: &[u8]) {
let core_id = crate::core_id::get_current_core_id() as usize;
let idx = if core_id > 1 { 0 } else { core_id as usize };
cortex_m::interrupt::free(|_| {
let dropped_events = unsafe { DROPPED_EVENTS_COUNTER[idx] };
if dropped_events > 0 {
let mut buffer = [0u8; 12];
buffer[0] = event_ids::DATA_LOSS_EVENT << 3;
buffer[1..5].copy_from_slice(&dropped_events.to_le_bytes());
let timestamp = TimeDelta::from_now();
let pos = timestamp.write_bytes_mut(&mut buffer[5..]);
match rtt_write_core(idx, &buffer[..5 + pos]) {
Some(_) => {
unsafe {
DROPPED_EVENTS_COUNTER[idx] = 0;
}
}
None => {
unsafe {
DROPPED_EVENTS_COUNTER[idx] += 1;
}
}
}
} else {
let written = rtt_write_core(idx, data);
if written.is_none() {
unsafe {
DROPPED_EVENTS_COUNTER[idx] += 1;
}
}
}
});
}