Skip to main content

mbus_client/services/fifo_queue/
request.rs

1//! Modbus FIFO Queue Service Module
2//!
3//! This module provides the necessary structures and logic to handle Modbus operations
4//! related to FIFO Queues (Function Code 0x18).
5//!
6//! It includes functionality for:
7//! - Reading the contents of a remote FIFO queue of registers.
8//! - Parsing response PDUs containing the FIFO count and register values.
9//! - Validating data integrity (byte counts vs register counts).
10//!
11//! This module is designed for `no_std` environments using `heapless` collections.
12//! The maximum number of registers in a single FIFO response is limited to 31 by the protocol.
13
14use heapless::Vec;
15
16use mbus_core::{
17    data_unit::common::{MAX_PDU_DATA_LEN, Pdu},
18    errors::MbusError,
19    function_codes::public::FunctionCode,
20};
21
22/// Provides operations for creating and parsing Modbus FIFO Queue request/response PDUs.
23pub(super) struct ReqPduCompiler {}
24
25impl ReqPduCompiler {
26    /// Creates a Modbus Read FIFO Queue request PDU.
27    pub(super) fn read_fifo_queue_request(address: u16) -> Result<Pdu, MbusError> {
28        let mut data_vec: Vec<u8, MAX_PDU_DATA_LEN> = Vec::new();
29        data_vec
30            .extend_from_slice(&address.to_be_bytes())
31            .map_err(|_| MbusError::BufferLenMissmatch)?;
32
33        Ok(Pdu::new(FunctionCode::ReadFifoQueue, data_vec, 2)) // Corrected: 2 addr
34    }
35}