socketcan_alt/frame/
data.rs1use 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 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;