rsiot/drivers_i2c/pm_rq8/tasks/
input_periodic.rs

1use 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}