rsiot/components/cmp_esp_spi_master/
config.rs

1use esp_idf_svc::hal::gpio::AnyIOPin;
2use esp_idf_svc::hal::spi::config::{MODE_0, MODE_1, MODE_2, MODE_3};
3use esp_idf_svc::hal::{peripheral::Peripheral, spi::Spi};
4
5use crate::components_config::master_device::DeviceTrait;
6use crate::components_config::spi_master::{self, ConfigDeviceSpiMode};
7use crate::message::MsgDataBound;
8
9/// Конфигурация компонента cmp_esp_spi_master
10pub struct Config<TMsg, TSpi, TPeripheral>
11where
12    TMsg: MsgDataBound,
13    TSpi: Peripheral<P = TPeripheral> + 'static,
14    TPeripheral: Spi,
15{
16    /// Ссылка на аппартный интерфейс SPI
17    pub spi: TSpi,
18
19    /// Пин MISO
20    pub pin_miso: AnyIOPin,
21
22    /// Пин MOSI
23    pub pin_mosi: AnyIOPin,
24
25    /// Пин SCK
26    pub pin_sck: AnyIOPin,
27
28    /// Массив настроек коммуникации с устройствами
29    ///
30    /// Порядок элементов в этом массиве должен соответствовать порядку устройств в массиве devices
31    pub devices_comm_settings: Vec<ConfigDevicesCommSettings>,
32
33    /// Драйвера устройств
34    pub devices:
35        Vec<Box<dyn DeviceTrait<TMsg, spi_master::FieldbusRequest, spi_master::FieldbusResponse>>>,
36}
37
38/// Настройки коммуникации с устройствами
39pub struct ConfigDevicesCommSettings {
40    /// Пин Chip Select
41    pub pin_cs: AnyIOPin,
42
43    /// Частота тактов
44    pub baudrate: u32,
45
46    /// Режим работы SPI
47    pub spi_mode: ConfigDeviceSpiMode,
48}
49
50impl From<ConfigDeviceSpiMode> for esp_idf_svc::hal::spi::config::Mode {
51    fn from(value: ConfigDeviceSpiMode) -> Self {
52        match value {
53            ConfigDeviceSpiMode::Mode0 => MODE_0,
54            ConfigDeviceSpiMode::Mode1 => MODE_1,
55            ConfigDeviceSpiMode::Mode2 => MODE_2,
56            ConfigDeviceSpiMode::Mode3 => MODE_3,
57        }
58    }
59}