rart_rs/futures/
channel.rs

1use heapless::Deque;
2use crate::common::arc::Arc;
3use crate::common::ArcMutex;
4use crate::common::blocking_mutex::BlockingMutex;
5use crate::common::result::RARTError;
6use crate::futures::semaphore::Semaphore;
7
8pub struct Channel<T: Sized, const N: usize, const TN: usize> {
9    queue: ArcMutex<Deque<T, N>>,
10    sem: Semaphore<N, TN>,
11}
12
13impl<T: Sized, const N: usize, const TN: usize> Channel<T, N, TN> {
14    pub fn new() -> Self {
15        let deq = Deque::new();
16        Self {
17            queue: Arc::new(BlockingMutex::new(deq)),
18            sem: Semaphore::new(0),
19        }
20    }
21
22    pub async fn send(&'static self, data: T) -> Result<(), RARTError> {
23        self.sem.wait_give().await;
24        let mut queue = self.queue.lock()?;
25        if let Err(_) = queue.push_back(data) {
26            Err(RARTError::SendError)
27        } else {
28            Ok(())
29        }
30    }
31
32    pub async fn recv(&'static self) -> Result<T, RARTError> {
33        self.sem.take().await;
34        let mut queue = self.queue.lock()?;
35        queue.pop_front().ok_or(RARTError::RecvError)
36    }
37}