mbus_core/transport/
config.rs1use core::str::FromStr;
4
5use crate::errors::MbusError;
6use heapless::String;
7
8use super::retry::{BackoffStrategy, JitterStrategy, RetryRandomFn};
9
10const MODBUS_TCP_DEFAULT_PORT: u16 = 502;
12
13#[derive(Debug, Clone, Copy, Default)]
15pub enum Parity {
16 None,
18 #[default]
20 Even,
21 Odd,
23}
24
25#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
27pub enum DataBits {
28 Five,
30 Six,
32 Seven,
34 #[default]
36 Eight,
37}
38
39#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
41pub enum SerialMode {
42 #[default]
44 Rtu,
45 Ascii,
47}
48
49#[derive(Debug, Clone, Copy, Default)]
51pub enum BaudRate {
52 Baud9600,
54 #[default]
56 Baud19200,
57 Custom(u32),
59}
60
61#[derive(Debug, Clone)]
63pub struct ModbusSerialConfig<const PORT_PATH_LEN: usize = 64> {
64 pub port_path: heapless::String<PORT_PATH_LEN>,
66 pub mode: SerialMode,
68 pub baud_rate: BaudRate,
70 pub data_bits: DataBits,
72 pub stop_bits: u8,
74 pub parity: Parity,
76 pub response_timeout_ms: u32,
78 pub retry_attempts: u8,
80 pub retry_backoff_strategy: BackoffStrategy,
82 pub retry_jitter_strategy: JitterStrategy,
84 pub retry_random_fn: Option<RetryRandomFn>,
86}
87
88impl<const PORT_PATH_LEN: usize> Default for ModbusSerialConfig<PORT_PATH_LEN> {
89 fn default() -> Self {
90 Self {
91 port_path: heapless::String::new(),
92 mode: SerialMode::Rtu,
93 baud_rate: BaudRate::Baud19200,
94 data_bits: DataBits::Eight,
95 stop_bits: 1,
96 parity: Parity::Even,
97 response_timeout_ms: 1000,
98 retry_attempts: 3,
99 retry_backoff_strategy: BackoffStrategy::Immediate,
100 retry_jitter_strategy: JitterStrategy::None,
101 retry_random_fn: None,
102 }
103 }
104}
105
106#[derive(Debug, Clone)]
108pub struct ModbusTcpConfig {
109 pub host: heapless::String<64>,
111 pub port: u16,
113 pub connection_timeout_ms: u32,
115 pub response_timeout_ms: u32,
117 pub retry_attempts: u8,
119 pub retry_backoff_strategy: BackoffStrategy,
121 pub retry_jitter_strategy: JitterStrategy,
123 pub retry_random_fn: Option<RetryRandomFn>,
125}
126
127impl ModbusTcpConfig {
128 pub fn with_default_port(host: &str) -> Result<Self, MbusError> {
130 let host_string: String<64> =
131 String::from_str(host).map_err(|_| MbusError::BufferTooSmall)?;
132 Self::new(&host_string, MODBUS_TCP_DEFAULT_PORT)
133 }
134
135 pub fn new(host: &str, port: u16) -> Result<Self, MbusError> {
137 let host_string = String::from_str(host).map_err(|_| MbusError::BufferTooSmall)?;
138 Ok(Self {
139 host: host_string,
140 port,
141 connection_timeout_ms: 5000,
142 response_timeout_ms: 5000,
143 retry_attempts: 3,
144 retry_backoff_strategy: BackoffStrategy::Immediate,
145 retry_jitter_strategy: JitterStrategy::None,
146 retry_random_fn: None,
147 })
148 }
149}
150
151#[derive(Debug, Clone)]
153pub enum ModbusConfig {
154 Tcp(ModbusTcpConfig),
156 Serial(ModbusSerialConfig),
158}
159
160impl ModbusConfig {
161 pub fn retry_attempts(&self) -> u8 {
163 match self {
164 ModbusConfig::Tcp(config) => config.retry_attempts,
165 ModbusConfig::Serial(config) => config.retry_attempts,
166 }
167 }
168
169 pub fn retry_backoff_strategy(&self) -> BackoffStrategy {
171 match self {
172 ModbusConfig::Tcp(config) => config.retry_backoff_strategy,
173 ModbusConfig::Serial(config) => config.retry_backoff_strategy,
174 }
175 }
176
177 pub fn retry_jitter_strategy(&self) -> JitterStrategy {
179 match self {
180 ModbusConfig::Tcp(config) => config.retry_jitter_strategy,
181 ModbusConfig::Serial(config) => config.retry_jitter_strategy,
182 }
183 }
184
185 pub fn retry_random_fn(&self) -> Option<RetryRandomFn> {
187 match self {
188 ModbusConfig::Tcp(config) => config.retry_random_fn,
189 ModbusConfig::Serial(config) => config.retry_random_fn,
190 }
191 }
192}