rsiot/components/cmp_esp_uart_slave/tasks/
output.rs

1use std::time::Duration;
2
3use tokio::time::sleep;
4
5use crate::message::Message;
6
7use super::super::config::TFnOutput;
8use super::{Buffer, TaskOutput};
9
10pub struct Output<TMsg, TBufferData> {
11    pub output: TaskOutput<Message<TMsg>>,
12    pub buffer_data: Buffer<TBufferData>,
13    pub fn_output: TFnOutput<TMsg, TBufferData>,
14    pub fn_output_period: Duration,
15}
16
17impl<TMsg, TBufferData> Output<TMsg, TBufferData> {
18    pub async fn spawn(self) -> super::Result<()> {
19        loop {
20            let msgs = {
21                let buffer_data = self.buffer_data.lock().await;
22                (self.fn_output)(&buffer_data)
23            };
24            for msg in msgs {
25                self.output
26                    .send(msg)
27                    .await
28                    .map_err(|e| super::Error::TaskOutput(e.to_string()))?;
29            }
30            sleep(self.fn_output_period).await;
31        }
32    }
33}