Skip to main content

rsiot/components/cmp_esp_spi_master/
config.rs

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