busmust_sys/
data_builder.rs

1use std::convert::TryFrom;
2use ::{BMData, BMDataHeader};
3use ::{BM_DATA_PAYLOAD_MAX_SIZE, BMDataType};
4use BMCanMessage;
5
6impl BMData {
7    pub fn builder() -> BMDataBuilder {
8        BMDataBuilder::default()
9    }
10}
11
12/// Builder for [BMData] structure.
13#[derive(Default)]
14pub struct BMDataBuilder {
15    header: BMDataHeader,
16    payload: Vec<u8>,
17}
18
19impl BMDataBuilder {
20    pub fn new(payload: Vec<u8>) -> BMDataBuilder {
21        let mut vec = Vec::from(payload);
22        vec.resize(BM_DATA_PAYLOAD_MAX_SIZE, 0);
23
24        BMDataBuilder {
25            header: BMDataHeader::new().with_kind(BMDataType::Can as u8),
26            payload: vec
27        }
28    }
29
30    pub fn kind(mut self, kind: BMDataType) {
31        self.header = BMDataHeader::new()
32            .with_kind(kind as u8)
33            .with_flags(self.header.flags())
34            .with_dchn(self.header.dchn())
35            .with_schn(self.header.schn())
36    }
37
38    pub fn dst_chn(mut self, dst_chn: u8) {
39        self.header = BMDataHeader::new()
40            .with_kind(self.header.kind())
41            .with_flags(self.header.flags())
42            .with_dchn(dst_chn)
43            .with_schn(self.header.schn())
44    }
45
46    pub fn src_chn(mut self, src_chn: u8) {
47        self.header = BMDataHeader::new()
48            .with_kind(self.header.kind())
49            .with_flags(self.header.flags())
50            .with_dchn(self.header.dchn())
51            .with_schn(src_chn)
52    }
53
54    pub fn payload(mut self, value: Vec<u8>) -> BMDataBuilder {
55        let mut vec = Vec::from(value);
56        vec.resize(BM_DATA_PAYLOAD_MAX_SIZE, 0);
57
58        self.payload = vec;
59        self
60    }
61
62    pub fn can_message(mut self, value: BMCanMessage) -> BMDataBuilder {
63        self.payload = value.to_bytes();
64        self.header = BMDataHeader::new().with_kind(BMDataType::Can as u8);
65        self
66    }
67
68    pub fn build(self) -> BMData {
69        BMData {
70            header: self.header,
71            length: self.payload.len() as u16,
72            timestamp: 0,
73            payload: <[u8; BM_DATA_PAYLOAD_MAX_SIZE]>::try_from(self.payload).unwrap(),
74        }
75    }
76}