#[allow(unused_imports)]
use super::*;
use crate::bus_logging::timestamp_to_seconds;
use crate::can::fd::{FdFlags, MAX_FD_DATA_LEN};
use alloc::vec::Vec;
#[derive(Clone)]
pub(crate) struct RawFrame {
pub(crate) timestamp_s: f64,
pub(crate) can_id: u32,
pub(crate) dlc: u8,
pub(crate) data: [u8; MAX_FD_DATA_LEN],
pub(crate) data_len: usize,
pub(crate) fd_flags: FdFlags,
pub(crate) is_extended: bool,
pub(crate) is_fd: bool,
}
impl RawFrame {
pub(crate) fn new_classic(
timestamp_us: u64,
can_id: u32,
dlc: u8,
data: &[u8],
is_extended: bool,
) -> Self {
let mut frame_data = [0u8; MAX_FD_DATA_LEN];
let len = data.len().min(8);
frame_data[..len].copy_from_slice(&data[..len]);
Self {
timestamp_s: timestamp_to_seconds(timestamp_us),
can_id,
dlc,
data: frame_data,
data_len: len,
fd_flags: FdFlags::default(),
is_extended,
is_fd: false,
}
}
pub(crate) fn new_fd(
timestamp_us: u64,
can_id: u32,
dlc: u8,
data: &[u8],
flags: FdFlags,
is_extended: bool,
) -> Self {
let mut frame_data = [0u8; MAX_FD_DATA_LEN];
let len = data.len().min(MAX_FD_DATA_LEN);
frame_data[..len].copy_from_slice(&data[..len]);
Self {
timestamp_s: timestamp_to_seconds(timestamp_us),
can_id,
dlc,
data: frame_data,
data_len: len,
fd_flags: flags,
is_extended,
is_fd: true,
}
}
pub(crate) fn frame_type(&self) -> FrameType {
FrameType::from_frame(self.is_extended, self.is_fd, self.data_len)
}
pub(crate) fn to_dataframe_bytes(&self) -> Vec<u8> {
let max_data = self.frame_type().max_data_len();
let has_fd_flags = self.is_fd && self.data_len > 8;
let total_size = if has_fd_flags {
4 + 1 + 1 + max_data
} else {
4 + 1 + max_data
};
let mut bytes = Vec::with_capacity(total_size);
let id_with_flags = if self.is_extended {
self.can_id | 0x8000_0000
} else {
self.can_id
};
bytes.extend_from_slice(&id_with_flags.to_le_bytes());
bytes.push(self.dlc);
if has_fd_flags {
bytes.push(self.fd_flags.to_byte());
}
bytes.extend_from_slice(&self.data[..self.data_len.min(max_data)]);
bytes.resize(total_size, 0);
bytes
}
}