rsiot/drivers_i2c/ds3231/
task_input.rs

1use std::{sync::Arc, time::Duration};
2
3use tokio::sync::Mutex;
4
5use crate::{
6    drivers_i2c::{I2cSlaveAddress, RsiotI2cDriverBase},
7    executor::CmpInOut,
8    message::{Message, MsgDataBound},
9};
10
11use super::data_models;
12
13/// Структура входных данных для задания времени
14pub struct InputData {
15    /// Год
16    pub year: u8,
17    /// Месяц
18    pub month: u8,
19    /// День
20    pub day: u8,
21    /// Час
22    pub hour: u8,
23    /// Минуты
24    pub minute: u8,
25    /// Секунды
26    pub second: u8,
27}
28
29pub struct TaskInput<TMsg, Driver>
30where
31    Driver: RsiotI2cDriverBase,
32    TMsg: MsgDataBound,
33{
34    pub address: I2cSlaveAddress,
35    pub driver: Arc<Mutex<Driver>>,
36    pub fn_input: fn(Message<TMsg>) -> Option<InputData>,
37    pub in_out: CmpInOut<TMsg>,
38}
39
40impl<TMsg, Driver> TaskInput<TMsg, Driver>
41where
42    Driver: RsiotI2cDriverBase,
43    TMsg: MsgDataBound,
44{
45    pub async fn spawn(mut self) -> Result<(), String> {
46        while let Ok(msg) = self.in_out.recv_input().await {
47            let input_data = (self.fn_input)(msg);
48            let Some(input_data) = input_data else {
49                continue;
50            };
51
52            let mut driver = self.driver.lock().await;
53
54            let request: Vec<u8> = vec![
55                0x00,
56                data_models::Second::new_from_dec(input_data.second).get_bcd(),
57                data_models::Minute::new_from_dec(input_data.minute).get_bcd(),
58                data_models::Hour::new_from_dec(input_data.hour).get_bcd(),
59                0x01, // день ненели
60                data_models::Day::new_from_dec(input_data.day).get_bcd(),
61                data_models::Month::new_from_dec(input_data.month).get_bcd(),
62                data_models::Year::new_from_dec(input_data.year).get_bcd(),
63            ];
64            driver
65                .write(self.address, &request, Duration::from_secs(2))
66                .await
67                .unwrap();
68        }
69        Ok(())
70    }
71}