use mbus_core::transport::ModbusConfig;
#[cfg(feature = "network-tcp")]
use mbus_core::transport::ModbusTcpConfig;
#[cfg(any(feature = "serial-rtu", feature = "serial-ascii"))]
use mbus_core::transport::{
BackoffStrategy, BaudRate, DataBits, JitterStrategy, ModbusSerialConfig, Parity, SerialMode,
};
use mbus_core::{errors::MbusError, transport::UnitIdOrSlaveAddr};
use mbus_server::ResilienceConfig;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct MbusServerConfig {
pub slave_address: u8,
pub response_timeout_ms: u32,
}
impl MbusServerConfig {
pub(super) fn unit_id_or_slave_addr(&self) -> Result<UnitIdOrSlaveAddr, MbusError> {
UnitIdOrSlaveAddr::new(self.slave_address)
}
pub(super) fn resilience(&self) -> ResilienceConfig {
ResilienceConfig::default()
}
#[cfg(feature = "network-tcp")]
pub(super) fn tcp_modbus_config(&self) -> Result<ModbusConfig, MbusError> {
let inner = ModbusTcpConfig::new("", 502).map_err(|_| MbusError::InvalidConfiguration)?;
Ok(ModbusConfig::Tcp(inner))
}
#[cfg(feature = "serial-rtu")]
pub(super) fn rtu_modbus_config(&self) -> Result<ModbusConfig, MbusError> {
let inner = ModbusSerialConfig {
port_path: heapless::String::new(),
mode: SerialMode::Rtu,
baud_rate: BaudRate::default(),
data_bits: DataBits::default(),
stop_bits: 1,
parity: Parity::default(),
response_timeout_ms: self.response_timeout_ms,
retry_attempts: 0,
retry_backoff_strategy: BackoffStrategy::Immediate,
retry_jitter_strategy: JitterStrategy::None,
retry_random_fn: None,
};
Ok(ModbusConfig::Serial(inner))
}
#[cfg(feature = "serial-ascii")]
pub(super) fn ascii_modbus_config(&self) -> Result<ModbusConfig, MbusError> {
let inner = ModbusSerialConfig {
port_path: heapless::String::new(),
mode: SerialMode::Ascii,
baud_rate: BaudRate::default(),
data_bits: DataBits::default(),
stop_bits: 1,
parity: Parity::default(),
response_timeout_ms: self.response_timeout_ms,
retry_attempts: 0,
retry_backoff_strategy: BackoffStrategy::Immediate,
retry_jitter_strategy: JitterStrategy::None,
retry_random_fn: None,
};
Ok(ModbusConfig::Serial(inner))
}
}
impl Default for MbusServerConfig {
fn default() -> Self {
Self {
slave_address: 1,
response_timeout_ms: 5_000,
}
}
}