rsiot/drivers_i2c/ds3231/
task_input.rs1use 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
13pub struct InputData {
15 pub year: u8,
17 pub month: u8,
19 pub day: u8,
21 pub hour: u8,
23 pub minute: u8,
25 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, 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}