rsiot/components/cmp_raspberrypi_gpio/
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 crate::message::{Message, MsgDataBound};

/// Конфигурация компонента cmp_raspberrypi_gpio
#[derive(Clone)]
pub struct Config<TMsg>
where
    TMsg: MsgDataBound,
{
    /// Обработка входов
    ///
    /// **Примеры**
    ///
    /// ```rust
    #[doc = include_str!("./test/config_inputs.rs")]
    /// ```
    pub inputs: Vec<ConfigInput<TMsg>>,

    /// Обработка выходов
    ///
    /// **Примеры**
    ///
    /// ```rust
    #[doc = include_str!("./test/config_outputs.rs")]
    /// ```
    pub outputs: Vec<ConfigOutput<TMsg>>,
}

impl<TMsg> Default for Config<TMsg>
where
    TMsg: MsgDataBound,
{
    fn default() -> Self {
        Self {
            inputs: vec![],
            outputs: vec![],
        }
    }
}

/// Обработка одного входа
#[derive(Clone)]
pub struct ConfigInput<TMsg> {
    /// Номер пина
    pub pin_number: u8,

    /// Преобразование состояния пина в исходящее сообщение
    pub fn_output: fn(bool) -> Message<TMsg>,

    /// Режим подтяжки резисторов
    pub pull_mode: PullMode,
}

/// Режим подтяжки резисторов
#[derive(Clone)]
pub enum PullMode {
    /// Нет подтяжки
    Floating,
    /// Подтяжка к плюсу питания
    Up,
    /// Подтяжка к минусу питания
    Down,
}

/// Обработка одного выхода
#[derive(Clone)]
pub struct ConfigOutput<TMsg> {
    /// Номер пина
    pub pin_number: u8,

    /// Преобразование входящего сообщения в состояние пина
    pub fn_input: fn(Message<TMsg>) -> Option<bool>,

    /// Подается ли напряжения в отключенном состоянии или нет
    pub is_low_triggered: bool,
}