use rusty_modbus_types::{Address, FunctionCode};
use crate::error::{DecodeError, EncodeError};
use crate::request::Encode;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ReadFifoQueueRequest {
pub fifo_pointer_address: Address,
}
impl ReadFifoQueueRequest {
pub fn decode(data: &[u8]) -> Result<Self, DecodeError> {
DecodeError::check_exact_len(data, 2)?;
let fifo_pointer_address = Address(u16::from_be_bytes([data[0], data[1]]));
Ok(Self {
fifo_pointer_address,
})
}
}
impl Encode for ReadFifoQueueRequest {
fn encode_into(&self, buf: &mut [u8]) -> Result<usize, EncodeError> {
let len = self.encoded_len();
if buf.len() < len {
return Err(EncodeError::BufferTooSmall {
required: len,
available: buf.len(),
});
}
EncodeError::check_pdu_len(len)?;
buf[0] = FunctionCode::ReadFifoQueue.code();
buf[1..3].copy_from_slice(&self.fifo_pointer_address.0.to_be_bytes());
Ok(len)
}
fn encoded_len(&self) -> usize {
3
}
}