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 core::fmt::Display for FunctionKind {
83 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::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}