Skip to main content

rsiot/components/cmp_linux_spi_master/
config.rs

1use linux_embedded_hal::spidev::SpiModeFlags;
2
3use crate::{
4    components_config::{
5        master_device::DeviceTrait,
6        spi_master::{self, ConfigDeviceSpiMode},
7    },
8    message::MsgDataBound,
9};
10
11// ANCHOR: Config
12/// Конфигурация cmp_linux_spi_master
13pub struct Config<TMsg>
14where
15    TMsg: MsgDataBound,
16{
17    /// Массив настроек коммуникации с устройствами
18    ///
19    /// Порядок элементов в этом массиве должен соответствовать порядку устройств в массиве devices
20    pub devices_comm_settings: Vec<ConfigDevicesCommSettings>,
21
22    /// Драйвера устройств
23    pub devices:
24        Vec<Box<dyn DeviceTrait<TMsg, spi_master::FieldbusRequest, spi_master::FieldbusResponse>>>,
25}
26// ANCHOR: Config
27
28// ANCHOR: ConfigDevicesCommSettings
29/// Настройки коммуникации с устройствами
30pub struct ConfigDevicesCommSettings {
31    /// Конфигурация устройства Linux
32    pub linux_device: LinuxDevice,
33
34    /// Частота тактов
35    pub baudrate: u32,
36
37    /// Режим работы SPI
38    pub spi_mode: ConfigDeviceSpiMode,
39}
40// ANCHOR: ConfigDevicesCommSettings
41
42// ANCHOR: LinuxDevice
43/// Конфигурация устройства Linux
44pub enum LinuxDevice {
45    /// Только SPI
46    Spi {
47        /// Устройство SPI, например "/dev/spidev0.0"
48        dev_spi: String,
49    },
50
51    /// SPI + chip select, который управляется через GPIO
52    SpiWithCs {
53        /// Устройство SPI, например "/dev/spidev0.0"
54        dev_spi: String,
55        /// Устройство SPI, например  "/dev/gpiochip0"
56        dev_gpio: String,
57        /// Номер линии GPIO. 0 .. 31
58        gpio_line: u8,
59    },
60}
61// ANCHOR: LinuxDevice
62
63impl From<ConfigDeviceSpiMode> for SpiModeFlags {
64    fn from(value: ConfigDeviceSpiMode) -> Self {
65        match value {
66            ConfigDeviceSpiMode::Mode0 => SpiModeFlags::SPI_MODE_0,
67            ConfigDeviceSpiMode::Mode1 => SpiModeFlags::SPI_MODE_1,
68            ConfigDeviceSpiMode::Mode2 => SpiModeFlags::SPI_MODE_2,
69            ConfigDeviceSpiMode::Mode3 => SpiModeFlags::SPI_MODE_3,
70        }
71    }
72}