ublox_sockets/
tcp_listener.rs

1use embedded_nal::SocketAddr;
2use heapless::{spsc::Queue, FnvIndexMap};
3
4use crate::SocketHandle;
5
6pub struct TcpListener<const N: usize, const L: usize> {
7    handles: FnvIndexMap<SocketHandle, u16, N>,
8    connections: FnvIndexMap<u16, Queue<(SocketHandle, SocketAddr), L>, N>,
9}
10
11impl<const N: usize, const L: usize> TcpListener<N, L> {
12    pub fn new() -> Self {
13        Self {
14            handles: FnvIndexMap::new(),
15            connections: FnvIndexMap::new(),
16        }
17    }
18
19    pub fn bind(&mut self, handle: SocketHandle, port: u16) -> Result<(), ()> {
20        if self.handles.contains_key(&handle) {
21            return Err(());
22        }
23
24        self.handles.insert(handle, port).map_err(drop)?;
25        self.connections.insert(port, Queue::new()).map_err(drop)?;
26
27        Ok(())
28    }
29
30    pub fn incoming(&mut self, port: u16) -> Option<&mut Queue<(SocketHandle, SocketAddr), L>> {
31        self.connections.get_mut(&port)
32    }
33
34    pub fn available(&mut self, handle: SocketHandle) -> Result<bool, ()> {
35        let port = self.handles.get(&handle).ok_or(())?;
36        Ok(!self.connections.get_mut(port).ok_or(())?.is_empty())
37    }
38
39    pub fn accept(&mut self, handle: SocketHandle) -> Result<(SocketHandle, SocketAddr), ()> {
40        let port = self.handles.get(&handle).ok_or(())?;
41        self.connections
42            .get_mut(port)
43            .ok_or(())?
44            .dequeue()
45            .ok_or(())
46    }
47}