rsiot/drivers_i2c/ds3231/
device.rsuse std::{sync::Arc, time::Duration};
use tokio::{sync::Mutex, task::JoinSet};
use tracing::warn;
use crate::{
executor::CmpInOut,
message::{Message, MsgDataBound, ServiceBound},
};
use super::{
super::{I2cSlaveAddress, RsiotI2cDriverBase},
task_input::{InputData, TaskInput},
task_output::{OutputData, TaskOutput},
};
pub struct DS3231<TMsg, TService>
where
TMsg: MsgDataBound,
TService: ServiceBound,
{
pub address: I2cSlaveAddress,
pub fn_input: fn(Message<TMsg>) -> Option<InputData>,
pub fn_output: fn(OutputData) -> Option<Vec<Message<TMsg>>>,
pub fn_output_period: Duration,
pub in_out: CmpInOut<TMsg, TService>,
}
impl<TMsg, TService> DS3231<TMsg, TService>
where
TMsg: MsgDataBound + 'static,
TService: ServiceBound + 'static,
{
pub async fn spawn(&self, driver: Arc<Mutex<impl RsiotI2cDriverBase + 'static>>) {
loop {
let mut task_set: JoinSet<Result<(), String>> = JoinSet::new();
let task_input = TaskInput {
address: self.address,
driver: driver.clone(),
fn_input: self.fn_input,
in_out: self.in_out.clone(),
};
task_set.spawn(async move { task_input.spawn().await });
let task_output = TaskOutput {
address: self.address,
period: self.fn_output_period,
driver: driver.clone(),
fn_output: self.fn_output,
in_out: self.in_out.clone(),
};
task_set.spawn(async move { task_output.spawn().await });
while let Some(res) = task_set.join_next().await {
warn!("{res:?}");
task_set.shutdown().await;
}
}
}
}