Skip to main content

rusty_modbus_codec/
pdu.rs

1//! Core PDU types: `PduRef`, `RequestPdu`, `ResponsePdu`.
2
3use crate::request::{
4    DiagnosticsRequest, EncapsulatedInterfaceRequest, MaskWriteRegisterRequest, ReadCoilsRequest,
5    ReadDiscreteInputsRequest, ReadFifoQueueRequest, ReadFileRecordRequest,
6    ReadHoldingRegistersRequest, ReadInputRegistersRequest, ReadWriteMultipleRegistersRequest,
7    WriteFileRecordRequest, WriteMultipleCoilsRequest, WriteMultipleRegistersRequest,
8    WriteSingleCoilRequest, WriteSingleRegisterRequest,
9};
10use crate::response::{
11    DiagnosticsResponse, EncapsulatedInterfaceResponse, ExceptionResponse,
12    GetCommEventCounterResponse, GetCommEventLogResponse, MaskWriteRegisterResponse,
13    ReadCoilsResponse, ReadDiscreteInputsResponse, ReadExceptionStatusResponse,
14    ReadFifoQueueResponse, ReadFileRecordResponse, ReadHoldingRegistersResponse,
15    ReadInputRegistersResponse, ReadWriteMultipleRegistersResponse, ReportServerIdResponse,
16    WriteFileRecordResponse, WriteMultipleCoilsResponse, WriteMultipleRegistersResponse,
17    WriteSingleCoilResponse, WriteSingleRegisterResponse,
18};
19
20/// Raw decoded PDU — function code + borrowed data slice.
21///
22/// This is the first thing produced by the decoder before dispatching
23/// to typed request/response structs.
24#[derive(Debug, Clone, Copy)]
25pub struct PduRef<'buf> {
26    /// Raw function code byte (may include 0x80 exception flag).
27    pub function_code: u8,
28    /// Remaining PDU bytes after the function code.
29    pub data: &'buf [u8],
30}
31
32/// Fully dispatched request PDU. Each variant borrows from the source buffer.
33#[derive(Debug)]
34pub enum RequestPdu<'buf> {
35    /// FC 0x01 — Read Coils.
36    ReadCoils(ReadCoilsRequest),
37    /// FC 0x02 — Read Discrete Inputs.
38    ReadDiscreteInputs(ReadDiscreteInputsRequest),
39    /// FC 0x03 — Read Holding Registers.
40    ReadHoldingRegisters(ReadHoldingRegistersRequest),
41    /// FC 0x04 — Read Input Registers.
42    ReadInputRegisters(ReadInputRegistersRequest),
43    /// FC 0x05 — Write Single Coil.
44    WriteSingleCoil(WriteSingleCoilRequest),
45    /// FC 0x06 — Write Single Register.
46    WriteSingleRegister(WriteSingleRegisterRequest),
47    /// FC 0x07 — Read Exception Status.
48    ReadExceptionStatus,
49    /// FC 0x08 — Diagnostics.
50    Diagnostics(DiagnosticsRequest<'buf>),
51    /// FC 0x0B — Get Comm Event Counter.
52    GetCommEventCounter,
53    /// FC 0x0C — Get Comm Event Log.
54    GetCommEventLog,
55    /// FC 0x0F — Write Multiple Coils.
56    WriteMultipleCoils(WriteMultipleCoilsRequest<'buf>),
57    /// FC 0x10 — Write Multiple Registers.
58    WriteMultipleRegisters(WriteMultipleRegistersRequest<'buf>),
59    /// FC 0x11 — Report Server ID.
60    ReportServerId,
61    /// FC 0x14 — Read File Record.
62    ReadFileRecord(ReadFileRecordRequest<'buf>),
63    /// FC 0x15 — Write File Record.
64    WriteFileRecord(WriteFileRecordRequest<'buf>),
65    /// FC 0x16 — Mask Write Register.
66    MaskWriteRegister(MaskWriteRegisterRequest),
67    /// FC 0x17 — Read/Write Multiple Registers.
68    ReadWriteMultipleRegisters(ReadWriteMultipleRegistersRequest<'buf>),
69    /// FC 0x18 — Read FIFO Queue.
70    ReadFifoQueue(ReadFifoQueueRequest),
71    /// FC 0x2B — Encapsulated Interface Transport.
72    EncapsulatedInterface(EncapsulatedInterfaceRequest<'buf>),
73    /// Non-standard / vendor-specific request.
74    Custom(u8, &'buf [u8]),
75}
76
77/// Fully dispatched response PDU. Each variant borrows from the source buffer.
78#[derive(Debug)]
79pub enum ResponsePdu<'buf> {
80    /// FC 0x01 — Read Coils.
81    ReadCoils(ReadCoilsResponse<'buf>),
82    /// FC 0x02 — Read Discrete Inputs.
83    ReadDiscreteInputs(ReadDiscreteInputsResponse<'buf>),
84    /// FC 0x03 — Read Holding Registers.
85    ReadHoldingRegisters(ReadHoldingRegistersResponse<'buf>),
86    /// FC 0x04 — Read Input Registers.
87    ReadInputRegisters(ReadInputRegistersResponse<'buf>),
88    /// FC 0x05 — Write Single Coil.
89    WriteSingleCoil(WriteSingleCoilResponse),
90    /// FC 0x06 — Write Single Register.
91    WriteSingleRegister(WriteSingleRegisterResponse),
92    /// FC 0x07 — Read Exception Status.
93    ReadExceptionStatus(ReadExceptionStatusResponse),
94    /// FC 0x08 — Diagnostics.
95    Diagnostics(DiagnosticsResponse<'buf>),
96    /// FC 0x0B — Get Comm Event Counter.
97    GetCommEventCounter(GetCommEventCounterResponse),
98    /// FC 0x0C — Get Comm Event Log.
99    GetCommEventLog(GetCommEventLogResponse<'buf>),
100    /// FC 0x0F — Write Multiple Coils.
101    WriteMultipleCoils(WriteMultipleCoilsResponse),
102    /// FC 0x10 — Write Multiple Registers.
103    WriteMultipleRegisters(WriteMultipleRegistersResponse),
104    /// FC 0x11 — Report Server ID.
105    ReportServerId(ReportServerIdResponse<'buf>),
106    /// FC 0x14 — Read File Record.
107    ReadFileRecord(ReadFileRecordResponse<'buf>),
108    /// FC 0x15 — Write File Record.
109    WriteFileRecord(WriteFileRecordResponse<'buf>),
110    /// FC 0x16 — Mask Write Register.
111    MaskWriteRegister(MaskWriteRegisterResponse),
112    /// FC 0x17 — Read/Write Multiple Registers.
113    ReadWriteMultipleRegisters(ReadWriteMultipleRegistersResponse<'buf>),
114    /// FC 0x18 — Read FIFO Queue.
115    ReadFifoQueue(ReadFifoQueueResponse<'buf>),
116    /// FC 0x2B — Encapsulated Interface Transport.
117    EncapsulatedInterface(EncapsulatedInterfaceResponse<'buf>),
118    /// Non-standard / vendor-specific response.
119    Custom(u8, &'buf [u8]),
120    /// Exception response.
121    Exception(ExceptionResponse),
122}