rsiot/components/cmp_esp_uart_slave/
config.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use std::time::Duration;

use esp_idf_svc::hal::{gpio::AnyIOPin, peripheral::Peripheral, uart::Uart};

use crate::message::{Message, MsgDataBound};

use crate::components_config::uart_general::*;

/// Функция преобразования входных сообщений в данные для передачи I2C
pub type TFnInput<TMsg, TBufferData> = fn(&Message<TMsg>, &mut TBufferData);

/// Функция для преобразования полученных данных I2C в исходящие сообщения
pub type TFnOutput<TMsg, TBufferData> = fn(&TBufferData) -> Vec<Message<TMsg>>;

/// Функция для работы коммуникации I2C
pub type TFnUartComm<TRequest, TResponse, TBufferData> =
    fn(TRequest, &mut TBufferData) -> anyhow::Result<TResponse>;

/// Конфигурация cmp_esp_uart_slave
pub struct Config<TMsg, TUart, TPeripheral, TBufferData>
where
    TMsg: MsgDataBound,
    TUart: Peripheral<P = TPeripheral> + 'static,
    TPeripheral: Uart,
{
    /// Адрес устройства на шине
    pub address: u8,

    /// Интерфейс uart
    ///
    /// Пример:
    ///
    /// ```rust
    /// // Лучше использовать UART1, поскольку в UART0 могут выводиться логи
    /// uart: peripherals.uart1
    /// ```
    pub uart: TUart,

    /// Пин RX
    ///
    /// Пример:
    ///
    /// ```rust
    /// pin_rx: peripherals.pins.gpio20.into(),
    /// ```
    pub pin_rx: AnyIOPin,

    /// Пин TX
    ///
    /// Пример:
    ///
    /// ```rust
    /// pin_tx: peripherals.pins.gpio21.into(),
    /// ```
    pub pin_tx: AnyIOPin,

    /// Пин RTS запроса на передачу
    pub pin_rts: AnyIOPin,

    /// Скорость сетевого обмена
    pub baudrate: Baudrate,

    /// Кол-во бит данных
    pub data_bits: DataBits,

    /// Бит четности
    pub parity: Parity,

    /// Кол-во стоповых бит
    pub stop_bits: StopBits,

    /// Структура для хранения буферных данных
    pub buffer_data_default: TBufferData,

    /// Функция преобразования входных сообщений в данные для передачи по UART
    ///
    /// ```rust
    /// fn_input: |_| None
    /// ```
    pub fn_input: TFnInput<TMsg, TBufferData>,

    /// Функция коммуникации по UART
    pub fn_uart_comm: TFnUartComm<UartRequest, UartResponse, TBufferData>,

    /// Функция для преобразования полученных данных UART в исходящие сообщения.
    ///
    /// ```rust
    /// fn_output: |_| vec![]
    /// ```
    pub fn_output: TFnOutput<TMsg, TBufferData>,

    /// Периодичность генерирования исходящих сообщений
    pub fn_output_period: Duration,
}