modbus_rtu/common/
request_form.rs

1use super::BypassRequest;
2
3
4/// Modbus RTU request packet format
5#[derive(Debug, Clone)]
6pub enum RequestForm<'a> {
7    /// Request format for reading multiple Holding Registers
8    /// 
9    /// - `start_register`: The starting register address
10    /// - `registers_count`: The number of registers to read
11    /// 
12    ReadHoldingRegisters { start_register: u16, registers_count: u16 },
13
14    /// Request format for reading multiple Input Registers
15    /// 
16    /// - `start_register`: The starting register address
17    /// - `registers_count`: The number of registers to read
18    /// 
19    ReadInputRegisters { start_register: u16, registers_count: u16 },
20
21    /// Request format for writing a single Holding Register
22    /// 
23    /// - `register_address`: The register address to write to
24    /// - `data_to_write`: The data value to write
25    /// 
26    WriteSingleRegister { register_address: u16, data_to_write: u16 },
27
28    /// Request format for writing multiple Holding Registers
29    /// 
30    /// - `start_register`: The starting register address
31    /// - `datas_to_wirte`: Slice of data values to write to consecutive registers
32    /// 
33    WriteMultipleRegisters { start_register: u16, datas_to_write: &'a [u16] },
34
35    /// Request format for bypassing a packet to a downstream device
36    #[cfg(feature="bypass")]
37    BypassRequest(&'a BypassRequest<'a>),
38}
39
40
41impl<'a> RequestForm<'a> {
42    /// Retrieves the Modbus function code corresponding to the request form variant.
43    ///
44    /// ---
45    /// # Returns
46    /// A `u8` representing the Modbus function code of the request.
47    ///
48    /// ---
49    /// # Examples
50    /// ```
51    /// use modbus_rtu::common::RequestForm;
52    ///
53    /// let form = RequestForm::ReadHoldingRegisters {
54    ///     start_register: 0x0000,
55    ///     registers_count: 2,
56    /// };
57    ///
58    /// assert_eq!(form.get_function_code(), 0x03);
59    /// ```
60    /// 
61    pub fn get_function_code(&self) -> u8 {
62        match self {
63            RequestForm::ReadHoldingRegisters { .. } => 0x03,
64            RequestForm::ReadInputRegisters { .. } => 0x04,
65            RequestForm::WriteSingleRegister { .. } => 0x06,
66            RequestForm::WriteMultipleRegisters { .. } => 0x10,
67            #[cfg(feature="bypass")]
68            RequestForm::BypassRequest(_) => 0x45,
69        }
70    }
71}
72
73
74/// Modbus RTU bypass request packet format
75#[cfg(feature="bypass")]
76#[derive(Debug, Clone)]
77pub enum BypassRequestForm<'a> {
78    /// Request format for reading multiple Holding Registers
79    /// 
80    /// - `start_register`: The starting register address
81    /// - `registers_count`: The number of registers to read
82    /// 
83    ReadHoldingRegisters { start_register: u16, registers_count: u16 },
84
85    /// Request format for reading multiple Input Registers
86    /// 
87    /// - `start_register`: The starting register address
88    /// - `registers_count`: The number of registers to read
89    /// 
90    ReadInputRegisters { start_register: u16, registers_count: u16 },
91
92    /// Request format for writing a single Holding Register
93    /// 
94    /// - `register_address`: The register address to write to
95    /// - `data_to_write`: The data value to write
96    /// 
97    WriteSingleRegister { register_address: u16, data_to_write: u16 },
98
99    /// Request format for writing multiple Holding Registers
100    /// 
101    /// - `start_register`: The starting register address
102    /// - `datas_to_wirte`: Slice of data values to write to consecutive registers
103    /// 
104    WriteMultipleRegisters { start_register: u16, datas_to_write: &'a [u16] },
105}
106
107
108#[cfg(feature="bypass")]
109impl<'a> BypassRequestForm<'a> {
110    /// Retrieves the Modbus function code corresponding to the request form variant.
111    ///
112    /// ---
113    /// # Returns
114    /// A `u8` representing the Modbus function code of the request.
115    ///
116    /// ---
117    /// # Examples
118    /// ```
119    /// use modbus_rtu::common::BypassRequestForm;
120    ///
121    /// let form = BypassRequestForm::ReadHoldingRegisters {
122    ///     start_register: 0x0000,
123    ///     registers_count: 2,
124    /// };
125    ///
126    /// assert_eq!(form.get_function_code(), 0x03);
127    /// ```
128    /// 
129    pub fn get_function_code(&self) -> u8 {
130        match self {
131            BypassRequestForm::ReadHoldingRegisters { .. } => 0x03,
132            BypassRequestForm::ReadInputRegisters { .. } => 0x04,
133            BypassRequestForm::WriteSingleRegister { .. } => 0x06,
134            BypassRequestForm::WriteMultipleRegisters { .. } => 0x10,
135        }
136    }
137}