ublox_sockets/
tcp_listener.rs1use 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}