rsiot/components/cmp_esp_i2c_slave/
config.rs

1use std::fmt::Debug;
2use std::time::Duration;
3
4use esp_idf_svc::hal::{gpio::AnyIOPin, i2c::I2c, peripheral::Peripheral};
5use serde::{de::DeserializeOwned, Serialize};
6
7use crate::message::{Message, MsgDataBound};
8
9use super::BufferData;
10
11/// Функция преобразования входных сообщений в данные для передачи I2C
12pub type FnInput<TMsg, TBufferData> = fn(&Message<TMsg>, &mut TBufferData);
13
14/// Функция для преобразования полученных данных I2C в исходящие сообщения
15pub type FnOutput<TMsg, TBufferData> = fn(&TBufferData) -> Vec<Message<TMsg>>;
16
17/// Функция для работы коммуникации I2C
18pub type FnI2cComm<TI2cRequest, TI2cResponse, TBufferData> =
19    fn(TI2cRequest, &mut TBufferData) -> anyhow::Result<TI2cResponse>;
20
21/// Конфигурация cmp_esp_i2c_slave
22pub struct Config<TMsg, TI2c, TPeripheral, TI2cRequest, TI2cResponse, TBufferData>
23where
24    TMsg: MsgDataBound,
25    TI2c: Peripheral<P = TPeripheral> + 'static,
26    TPeripheral: I2c,
27    TI2cRequest: Debug + DeserializeOwned + 'static,
28    TI2cResponse: Debug + Serialize + 'static,
29    TBufferData: BufferData,
30{
31    /// Ссылка на аппартный интерфейс I2C
32    pub i2c: TI2c,
33
34    /// Пин сигнала SDA
35    pub sda: AnyIOPin,
36
37    /// Пин сигнала SCL
38    pub scl: AnyIOPin,
39
40    /// Адрес на шине I2C
41    pub slave_address: u8,
42
43    /// Функция преобразования входных сообщений в данные для передачи I2C
44    ///
45    /// # Пример
46    ///
47    /// ```rust
48    /// fn_input: |_| None
49    /// ```
50    pub fn_input: FnInput<TMsg, TBufferData>,
51
52    /// Функция для преобразования полученных данных I2C в исходящие сообщения.
53    ///
54    /// Функция вызывается по времени, с периодом вызова `fn_output_period`
55    ///
56    /// # Пример
57    ///
58    /// ```rust
59    /// fn_output: |_| vec![]
60    /// ```
61    pub fn_output: FnOutput<TMsg, TBufferData>,
62
63    /// Период вызова `fn_output`
64    pub fn_output_period: Duration,
65
66    /// Функция для обработки коммуникации с мастером I2C
67    pub fn_i2c_comm: FnI2cComm<TI2cRequest, TI2cResponse, TBufferData>,
68
69    /// Структура для хранения буферных данных
70    pub buffer_data_default: TBufferData,
71
72    /// Задержка запуска обмена по I2C. Может потребоваться, чтобы подождать инициализации
73    /// других устройств, например по шине SPI
74    pub start_i2ccomm_delay: Duration,
75}