use mbus_core::data_unit::common::Pdu;
use mbus_core::errors::MbusError;
use mbus_core::function_codes::public::FunctionCode;
use mbus_core::models::coil::Coils;
pub(super) struct ReqPduCompiler {}
impl ReqPduCompiler {
pub(super) fn read_coils_request(address: u16, quantity: u16) -> Result<Pdu, MbusError> {
if !(1..=2000).contains(&quantity) {
return Err(MbusError::InvalidQuantity); }
Pdu::build_read_window(FunctionCode::ReadCoils, address, quantity)
}
pub(super) fn write_single_coil_request(address: u16, value: bool) -> Result<Pdu, MbusError> {
let coil_value: u16 = if value { 0xFF00 } else { 0x0000 };
Pdu::build_write_single_u16(FunctionCode::WriteSingleCoil, address, coil_value)
}
pub(super) fn write_multiple_coils_request(
address: u16,
quantity: u16,
values: &Coils,
) -> Result<Pdu, MbusError> {
if !(1..=1968).contains(&quantity) {
return Err(MbusError::InvalidPduLength);
}
let byte_count = quantity.div_ceil(8) as usize;
Pdu::build_write_multiple(
FunctionCode::WriteMultipleCoils,
address,
quantity,
&values.values()[..byte_count],
)
}
}