rsiot/components/cmp_linux_uart_master/
config.rs

1use std::time::Duration;
2
3use linux_embedded_hal::serialport;
4
5use crate::components_config::master_device::DeviceTrait;
6use crate::components_config::uart_general::{
7    Baudrate, DataBits, FieldbusRequest, FieldbusResponse, Parity, StopBits,
8};
9use crate::message::MsgDataBound;
10
11/// Конфигурация cmp_linux_uart_master
12#[derive(Debug)]
13pub struct Config<TMsg>
14where
15    TMsg: MsgDataBound,
16{
17    /// Название порта
18    ///
19    /// Примеры:
20    ///
21    /// ```
22    /// port: "/dev/ttyUSB0"
23    /// port: "/dev/ttyAMA0"
24    /// ```
25    pub port: &'static str,
26
27    /// Скорость сетевого обмена
28    pub baudrate: Baudrate,
29
30    /// Кол-во бит данных
31    pub data_bits: DataBits,
32
33    /// Бит четности
34    pub parity: Parity,
35
36    /// Кол-во стоповых бит
37    pub stop_bits: StopBits,
38
39    /// Время ожидания ответа
40    pub timeout: Duration,
41
42    /// Название чипа gpio в системе.
43    ///
44    /// Примеры:
45    ///
46    /// ```rust
47    /// gpio_chip: "/dev/gpiochip0"
48    /// ```
49    pub gpio_chip: &'static str,
50
51    /// Номер пина для сигнала RTS (ready to send).
52    ///
53    /// Примеры:
54    ///
55    /// ```rust
56    /// // На raspberry pi 17 пин - 11 физ. вывод на гребенке
57    /// pin_rts: Some(17),
58    ///
59    /// // Если пин RTS не нужен
60    /// pin_rts: None
61    /// ```
62    pub pin_rts: Option<u32>,
63
64    /// Массив устройств
65    pub devices: Vec<Box<dyn DeviceTrait<TMsg, FieldbusRequest, FieldbusResponse>>>,
66}
67
68impl<TMsg> Default for Config<TMsg>
69where
70    TMsg: MsgDataBound,
71{
72    fn default() -> Self {
73        Self {
74            port: "/dev/ttyAMA0",
75            baudrate: Baudrate::default(),
76            data_bits: DataBits::default(),
77            parity: Parity::default(),
78            stop_bits: StopBits::default(),
79            timeout: Duration::from_millis(100),
80            gpio_chip: "/dev/gpiochip0",
81            pin_rts: Some(17),
82            devices: vec![],
83        }
84    }
85}
86
87impl From<DataBits> for serialport::DataBits {
88    fn from(value: DataBits) -> Self {
89        match value {
90            DataBits::_5 => serialport::DataBits::Five,
91            DataBits::_6 => serialport::DataBits::Six,
92            DataBits::_7 => serialport::DataBits::Seven,
93            DataBits::_8 => serialport::DataBits::Eight,
94        }
95    }
96}
97
98impl From<Parity> for serialport::Parity {
99    fn from(value: Parity) -> Self {
100        match value {
101            Parity::None => serialport::Parity::None,
102            Parity::Even => serialport::Parity::Even,
103            Parity::Odd => serialport::Parity::Odd,
104        }
105    }
106}
107
108impl From<StopBits> for serialport::StopBits {
109    fn from(value: StopBits) -> Self {
110        match value {
111            StopBits::_1 => serialport::StopBits::One,
112            StopBits::_1p5 => unimplemented!("Stop bit 1.5 not implemented"),
113            StopBits::_2 => serialport::StopBits::Two,
114        }
115    }
116}