socketcan_alt/frame/
data.rs

1use super::Id;
2use crate::sys;
3use std::fmt;
4use std::mem::MaybeUninit;
5
6#[derive(Clone, Copy)]
7pub struct DataFrame(pub(super) sys::can_frame);
8
9impl DataFrame {
10    /// # Panics
11    ///
12    /// Panics if `id` exceeds its limit or `data` is longer than 8 bytes.
13    pub fn new(id: Id, data: &[u8]) -> Self {
14        assert!(data.len() <= sys::CAN_MAX_DLEN as _);
15        let mut inner = MaybeUninit::<sys::can_frame>::zeroed();
16        unsafe {
17            (*inner.as_mut_ptr()).can_id = id.into_can_id();
18            (&mut *inner.as_mut_ptr()).set_len(data.len() as _);
19            (*inner.as_mut_ptr()).data[..data.len()].copy_from_slice(data);
20            Self(inner.assume_init())
21        }
22    }
23
24    pub fn id(&self) -> Id {
25        Id::from_can_id(self.0.can_id)
26    }
27
28    pub fn data(&self) -> &[u8] {
29        &self.0.data[..self.0.len() as _]
30    }
31}
32
33impl fmt::Debug for DataFrame {
34    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
35        fmt.debug_struct("DataFrame")
36            .field("id", &self.id())
37            .field("data", &self.data())
38            .finish()
39    }
40}
41
42#[cfg(test)]
43mod tests;