rsiot/drivers_i2c/ds3231/
task_input.rsuse std::{sync::Arc, time::Duration};
use tokio::sync::Mutex;
use crate::{
drivers_i2c::{I2cSlaveAddress, RsiotI2cDriverBase},
executor::CmpInOut,
message::{Message, MsgDataBound, ServiceBound},
};
use super::data_models;
pub struct InputData {
pub year: u8,
pub month: u8,
pub day: u8,
pub hour: u8,
pub minute: u8,
pub second: u8,
}
pub struct TaskInput<TMsg, TService, Driver>
where
Driver: RsiotI2cDriverBase,
TMsg: MsgDataBound,
TService: ServiceBound,
{
pub address: I2cSlaveAddress,
pub driver: Arc<Mutex<Driver>>,
pub fn_input: fn(Message<TMsg>) -> Option<InputData>,
pub in_out: CmpInOut<TMsg, TService>,
}
impl<TMsg, TService, Driver> TaskInput<TMsg, TService, Driver>
where
Driver: RsiotI2cDriverBase,
TMsg: MsgDataBound,
TService: ServiceBound,
{
pub async fn spawn(mut self) -> Result<(), String> {
while let Ok(msg) = self.in_out.recv_input().await {
let input_data = (self.fn_input)(msg);
let Some(input_data) = input_data else {
continue;
};
let mut driver = self.driver.lock().await;
let request: Vec<u8> = vec![
0x00,
data_models::Second::new_from_dec(input_data.second).get_bcd(),
data_models::Minute::new_from_dec(input_data.minute).get_bcd(),
data_models::Hour::new_from_dec(input_data.hour).get_bcd(),
0x01, data_models::Day::new_from_dec(input_data.day).get_bcd(),
data_models::Month::new_from_dec(input_data.month).get_bcd(),
data_models::Year::new_from_dec(input_data.year).get_bcd(),
];
driver
.write(self.address, &request, Duration::from_secs(2))
.await
.unwrap();
}
Ok(())
}
}