rsiot/components/cmp_esp_uart_slave/tasks/
output.rs1use 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}