use heapless::Vec;
use mbus_core::{
data_unit::common::{MAX_PDU_DATA_LEN, Pdu},
errors::MbusError,
function_codes::public::FunctionCode,
};
pub(super) struct ReqPduCompiler {}
impl ReqPduCompiler {
pub(super) fn read_discrete_inputs_request(
address: u16,
quantity: u16,
) -> Result<Pdu, MbusError> {
if !(1..=2000).contains(&quantity) {
return Err(MbusError::InvalidPduLength);
}
let mut data_vec: Vec<u8, MAX_PDU_DATA_LEN> = Vec::new();
data_vec
.extend_from_slice(&address.to_be_bytes())
.map_err(|_| MbusError::BufferLenMissmatch)?;
data_vec
.extend_from_slice(&quantity.to_be_bytes())
.map_err(|_| MbusError::BufferLenMissmatch)?;
Ok(Pdu::new(FunctionCode::ReadDiscreteInputs, data_vec, 4))
}
}