rsiot/drivers_i2c/pm_rq8/tasks/
input_periodic.rs1use std::{sync::Arc, time::Duration};
2
3use tokio::{sync::Mutex, time::sleep};
4
5use super::{
6 super::config::Buffer,
7 {I2cRequest, TaskOutput},
8};
9
10pub struct InputPeriodic {
11 pub output: TaskOutput<I2cRequest>,
12 pub buffer: Arc<Mutex<Buffer>>,
13 pub period: Duration,
14}
15
16impl InputPeriodic {
17 pub async fn spawn(self) -> super::Result<()> {
18 loop {
19 let buffer = { self.buffer.lock().await.clone() };
20 let request = I2cRequest::SetOutputs(buffer.into());
21 self.output
22 .send(request)
23 .await
24 .map_err(|_| super::Error::TokioTaskSend)?;
25 sleep(self.period).await;
26 }
27 }
28}