rart_rs/futures/
channel.rs1use 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}