Skip to main content

rusty_modbus_codec/request/
fifo.rs

1//! FIFO queue request: FC 18 (Read FIFO Queue).
2
3use rusty_modbus_types::{Address, FunctionCode};
4
5use crate::error::{DecodeError, EncodeError};
6use crate::request::Encode;
7
8/// FC 0x18 — Read FIFO Queue request.
9///
10/// Reads the contents of the FIFO queue at the given pointer address.
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct ReadFifoQueueRequest {
13    /// FIFO pointer address.
14    pub fifo_pointer_address: Address,
15}
16
17impl ReadFifoQueueRequest {
18    /// Decode from PDU data after the function code byte.
19    ///
20    /// # Errors
21    ///
22    /// Returns [`DecodeError::Truncated`] if `data` is shorter than 2 bytes.
23    /// Returns [`DecodeError::LengthMismatch`] if `data` has extra bytes.
24    pub fn decode(data: &[u8]) -> Result<Self, DecodeError> {
25        DecodeError::check_exact_len(data, 2)?;
26        let fifo_pointer_address = Address(u16::from_be_bytes([data[0], data[1]]));
27        Ok(Self {
28            fifo_pointer_address,
29        })
30    }
31}
32
33impl Encode for ReadFifoQueueRequest {
34    fn encode_into(&self, buf: &mut [u8]) -> Result<usize, EncodeError> {
35        let len = self.encoded_len();
36        if buf.len() < len {
37            return Err(EncodeError::BufferTooSmall {
38                required: len,
39                available: buf.len(),
40            });
41        }
42        EncodeError::check_pdu_len(len)?;
43        buf[0] = FunctionCode::ReadFifoQueue.code();
44        buf[1..3].copy_from_slice(&self.fifo_pointer_address.0.to_be_bytes());
45        Ok(len)
46    }
47
48    fn encoded_len(&self) -> usize {
49        3
50    }
51}