rsiot/components/cmp_esp_i2c_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
use std::fmt::Debug;
use std::time::Duration;
use esp_idf_svc::hal::{gpio::AnyIOPin, i2c::I2c, peripheral::Peripheral};
use serde::{de::DeserializeOwned, Serialize};
use crate::message::{Message, MsgDataBound};
use super::BufferData;
/// Функция преобразования входных сообщений в данные для передачи I2C
pub type FnInput<TMsg, TBufferData> = fn(&Message<TMsg>, &mut TBufferData);
/// Функция для преобразования полученных данных I2C в исходящие сообщения
pub type FnOutput<TMsg, TBufferData> = fn(&TBufferData) -> Vec<Message<TMsg>>;
/// Функция для работы коммуникации I2C
pub type FnI2cComm<TI2cRequest, TI2cResponse, TBufferData> =
fn(TI2cRequest, &mut TBufferData) -> anyhow::Result<TI2cResponse>;
/// Конфигурация cmp_esp_i2c_slave
pub struct Config<TMsg, TI2c, TPeripheral, TI2cRequest, TI2cResponse, TBufferData>
where
TMsg: MsgDataBound,
TI2c: Peripheral<P = TPeripheral> + 'static,
TPeripheral: I2c,
TI2cRequest: Debug + DeserializeOwned + 'static,
TI2cResponse: Debug + Serialize + 'static,
TBufferData: BufferData,
{
/// Ссылка на аппартный интерфейс I2C
pub i2c: TI2c,
/// Пин сигнала SDA
pub sda: AnyIOPin,
/// Пин сигнала SCL
pub scl: AnyIOPin,
/// Адрес на шине I2C
pub slave_address: u8,
/// Функция преобразования входных сообщений в данные для передачи I2C
///
/// # Пример
///
/// ```rust
/// fn_input: |_| None
/// ```
pub fn_input: FnInput<TMsg, TBufferData>,
/// Функция для преобразования полученных данных I2C в исходящие сообщения.
///
/// Функция вызывается по времени, с периодом вызова `fn_output_period`
///
/// # Пример
///
/// ```rust
/// fn_output: |_| vec![]
/// ```
pub fn_output: FnOutput<TMsg, TBufferData>,
/// Период вызова `fn_output`
pub fn_output_period: Duration,
/// Функция для обработки коммуникации с мастером I2C
pub fn_i2c_comm: FnI2cComm<TI2cRequest, TI2cResponse, TBufferData>,
/// Структура для хранения буферных данных
pub buffer_data_default: TBufferData,
/// Задержка запуска обмена по I2C. Может потребоваться, чтобы подождать инициализации
/// других устройств, например по шине SPI
pub start_i2ccomm_delay: Duration,
}