busmust_sys/
can_message_builder.rs

1use std::convert::TryFrom;
2use ::{BMCanMessage, BMMessageId};
3use ::{BMMessageCtrl, BMTxMessageCtrl};
4
5impl BMCanMessage {
6    pub fn builder() -> BMCanMessageBuilder {
7        BMCanMessageBuilder::default()
8    }
9}
10
11/// Builder for [BMCanMessage] structure.
12#[derive(Default)]
13pub struct BMCanMessageBuilder {
14    sid: Option<u16>,
15    eid: Option<u32>,
16    dlc: Option<u8>,
17    ide: Option<bool>,
18    rtr: Option<bool>,
19    brs: Option<bool>,
20    fdf: Option<bool>,
21    payload: Vec<u8>
22}
23
24impl BMCanMessageBuilder {
25    pub fn new(payload: Vec<u8>) -> BMCanMessageBuilder {
26        let mut vec = Vec::from(payload);
27        vec.resize(64, 0);
28
29        BMCanMessageBuilder {
30            sid: None,
31            eid: None,
32            dlc: None,
33            ide: None,
34            rtr: None,
35            brs: None,
36            fdf: None,
37            payload: vec
38        }
39    }
40
41    pub fn sid(mut self, value: u16) -> BMCanMessageBuilder {
42        self.sid = Some(value);
43        self
44    }
45
46    pub fn eid(mut self, value: u32) -> BMCanMessageBuilder {
47        self.eid = Some(value);
48        self
49    }
50
51    pub fn dlc(mut self, value: u8) -> BMCanMessageBuilder {
52        self.dlc = Some(value);
53        self
54    }
55
56    pub fn ide(mut self, value: bool) -> BMCanMessageBuilder {
57        self.ide = Some(value);
58        self
59    }
60
61    pub fn rtr(mut self, value: bool) -> BMCanMessageBuilder {
62        self.rtr = Some(value);
63        self
64    }
65
66    pub fn brs(mut self, value: bool) -> BMCanMessageBuilder {
67        self.brs = Some(value);
68        self
69    }
70
71    pub fn fdf(mut self, value: bool) -> BMCanMessageBuilder {
72        self.fdf = Some(value);
73        self
74    }
75
76    pub fn payload(mut self, value: Vec<u8>) -> BMCanMessageBuilder {
77        self.dlc = Some(value.len() as u8);
78
79        let mut vec = Vec::from(value);
80        vec.resize(64, 0);
81
82        self.payload = vec;
83        self
84    }
85
86    pub fn build(self) -> BMCanMessage {
87        BMCanMessage {
88            mid: BMMessageId::new()
89                .with_sid(self.sid.unwrap_or_default())
90                .with_eid(self.eid.unwrap_or_default()),
91            ctrl: BMMessageCtrl {
92                tx: BMTxMessageCtrl::new()
93                    .with_dlc(self.dlc.unwrap_or_default())
94                    .with_ide(self.ide.unwrap_or_default())
95                    .with_rtr(self.rtr.unwrap_or_default())
96                    .with_brs(self.brs.unwrap_or_default())
97                    .with_fdf(self.fdf.unwrap_or_default()),
98            },
99            payload: <[u8; 64]>::try_from(self.payload).unwrap()
100        }
101    }
102}