s7_comm/builder/
job_write_var.rs

1use crate::packet::{DataItemVal, Frame, Header, ItemRequest, Job, WriteVarJob};
2use crate::ReturnCode;
3
4#[derive(Default)]
5pub struct FrameJobWriteVarBuilder {
6    pdu_ref: u16,
7    items: Vec<(ItemRequest, DataItemVal)>,
8}
9
10impl FrameJobWriteVarBuilder {
11    pub fn pdu_ref(mut self, pdu_ref: u16) -> Self {
12        self.pdu_ref = pdu_ref;
13        self
14    }
15    pub fn add_item(mut self, item: (ItemRequest, DataItemVal)) -> Self {
16        self.items.push(item);
17        self
18    }
19
20    // todo 增加其他类型。应该也可以再抽象
21    pub fn write_db_bytes(self, db_number: u16, byte_addr: u16, data: &[u8]) -> Self {
22        let req = ItemRequest::init_db_byte(db_number, byte_addr, 0, data.len() as u16);
23        let data_val = DataItemVal::init_with_bytes(ReturnCode::Reserved, data);
24        self.add_item((req, data_val))
25    }
26
27    pub fn build(self) -> Frame {
28        let Self { pdu_ref, items } = self;
29
30        let job = items
31            .into_iter()
32            .fold(WriteVarJob::default(), |mut job, item| {
33                job.add_item(item);
34                job
35            });
36
37        let data_len = job.bytes_len_data();
38        let parameter_len = job.bytes_len_parameter();
39        let header = Header::init(pdu_ref, parameter_len, data_len);
40
41        let job = Job::WriteVar(job);
42
43        Frame::Job { header, job }
44    }
45}