modbus_rtu/
function_kind.rs

1/// ## FunctionKind
2///
3/// `FunctionKind` represents the function codes defined by the Modbus RTU standard protocol.
4/// Functions not listed here are not supported.
5///
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[repr(u8)]
8pub enum FunctionKind {
9    /// Read Coils `(0x01)`
10    ReadCoils = 0x01,
11
12    /// Read Discrete Inputs `(0x02)`
13    ReadDiscreteInputs = 0x02,
14
15    /// Read Holding Registers `(0x03)`
16    ReadHoldingRegisters = 0x03,
17
18    /// Read Input Registers `(0x04)`
19    ReadInputRegisters = 0x04,
20
21    /// Write Single Coil `(0x05)`
22    WriteSingleCoil = 0x05,
23
24    /// Write Single Register `(0x06)`
25    WriteSingleRegister = 0x06,
26
27    /// Write Multiple Coils `(0x0F)`
28    WriteMultipleCoils = 0x0F,
29
30    /// Write Multiple Registers `(0x10)`
31    WriteMultipleRegisters = 0x10,
32}
33
34impl FunctionKind {
35    /// Returns the Modbus RTU function code represented by this [`FunctionKind`].
36    ///
37    /// ---
38    /// # Examples
39    /// ```rust
40    /// use modbus_rtu::FunctionKind;
41    ///
42    /// let code = FunctionKind::ReadHoldingRegisters.as_code();
43    /// assert_eq!(code, 0x03);
44    /// ```
45    ///
46    pub const fn as_code(&self) -> u8 {
47        *self as u8
48    }
49
50    /// Converts a Modbus RTU function code into its [`FunctionKind`] counterpart.
51    ///
52    /// Returns [`Some`] when the code is supported by this crate; otherwise
53    /// returns [`None`].
54    ///
55    /// ---
56    /// # Examples
57    /// ```rust
58    /// use modbus_rtu::FunctionKind;
59    ///
60    /// let kind = FunctionKind::from_code(0x04);
61    /// assert_eq!(kind, Some(FunctionKind::ReadInputRegisters));
62    ///
63    /// let unsupported = FunctionKind::from_code(0x7F);
64    /// assert_eq!(unsupported, None);
65    /// ```
66    ///
67    pub fn from_code(code: u8) -> Option<Self> {
68        match code {
69            0x01 => Some(Self::ReadCoils),
70            0x02 => Some(Self::ReadDiscreteInputs),
71            0x03 => Some(Self::ReadHoldingRegisters),
72            0x04 => Some(Self::ReadInputRegisters),
73            0x05 => Some(Self::WriteSingleCoil),
74            0x06 => Some(Self::WriteSingleRegister),
75            0x0F => Some(Self::WriteMultipleCoils),
76            0x10 => Some(Self::WriteMultipleRegisters),
77            _ => None,
78        }
79    }
80}
81
82impl std::fmt::Display for FunctionKind {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        write!(
85            f,
86            "{}",
87            match self {
88                Self::ReadCoils => "Read Coils",
89                Self::ReadDiscreteInputs => "Read Discrete Inputs",
90                Self::ReadHoldingRegisters => "Read Holding Registers",
91                Self::ReadInputRegisters => "Read Input Registers",
92                Self::WriteSingleCoil => "Write Single Coil",
93                Self::WriteSingleRegister => "Write Single Register",
94                Self::WriteMultipleCoils => "Write Multiple Coils",
95                Self::WriteMultipleRegisters => "Write Multiple Registers",
96            }
97        )
98    }
99}