s7_comm/builder/
job_write_var.rs1use 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 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}