rsiot/drivers_i2c/pm_rq8/
config.rs

1use std::sync::Arc;
2
3use tokio::sync::Mutex;
4
5use crate::{
6    drivers_i2c::I2cSlaveAddress,
7    message::{Message, MsgDataBound},
8};
9
10pub type FnInput<TMsg> = fn(&Message<TMsg>, &mut Buffer) -> ();
11
12/// Настройка модулуля коммуникации с модулем PM-RQ8
13#[derive(Clone)]
14pub struct Config<TMsg>
15where
16    TMsg: MsgDataBound,
17{
18    /// Адрес модуля
19    pub address: I2cSlaveAddress,
20    /// Функция преобразования входящих сообщений в команды для модуля
21    pub fn_input: FnInput<TMsg>,
22}
23
24/// Буфер данных коммуникации с модулем PM-RQ8
25#[derive(Clone, Debug, Default, PartialEq)]
26pub struct Buffer {
27    /// Состояние выхода 0
28    pub output_0: bool,
29    /// Состояние выхода 1
30    pub output_1: bool,
31    /// Состояние выхода 2
32    pub output_2: bool,
33    /// Состояние выхода 3
34    pub output_3: bool,
35    /// Состояние выхода 4
36    pub output_4: bool,
37    /// Состояние выхода 5
38    pub output_5: bool,
39    /// Состояние выхода 6
40    pub output_6: bool,
41    /// Состояние выхода 7
42    pub output_7: bool,
43}
44
45impl From<Buffer> for u8 {
46    fn from(value: Buffer) -> Self {
47        let mut sum = 0;
48        if value.output_0 {
49            sum += 2_u8.pow(0);
50        }
51        if value.output_1 {
52            sum += 2_u8.pow(1);
53        }
54        if value.output_2 {
55            sum += 2_u8.pow(2);
56        }
57        if value.output_3 {
58            sum += 2_u8.pow(3);
59        }
60        if value.output_4 {
61            sum += 2_u8.pow(4);
62        }
63        if value.output_5 {
64            sum += 2_u8.pow(5);
65        }
66        if value.output_6 {
67            sum += 2_u8.pow(6);
68        }
69        if value.output_7 {
70            sum += 2_u8.pow(7);
71        }
72        sum
73    }
74}
75
76impl From<Buffer> for Arc<Mutex<Buffer>> {
77    fn from(value: Buffer) -> Self {
78        Arc::new(Mutex::new(value))
79    }
80}