1use std::net::SocketAddr;
2
3use prost::Message;
4use std::net::UdpSocket;
5
6use crate::InvalidMessageError;
7use crate::ReceiveError;
8use crate::SendError;
9use crate::msg::EgmRobot;
10use crate::msg::EgmSensor;
11
12#[derive(Debug)]
13pub struct EgmPeer {
15 socket: UdpSocket,
16}
17
18impl EgmPeer {
19 pub fn new(socket: UdpSocket) -> Self {
25 Self { socket }
26 }
27
28 pub fn bind(addrs: impl std::net::ToSocketAddrs) -> std::io::Result<Self> {
33 Ok(Self::new(UdpSocket::bind(addrs)?))
34 }
35
36 pub fn socket(&self) -> &UdpSocket {
38 &self.socket
39 }
40
41 pub fn socket_mut(&mut self) -> &mut UdpSocket {
43 &mut self.socket
44 }
45
46 pub fn into_socket(self) -> UdpSocket {
48 self.socket
49 }
50
51 pub fn recv(&mut self) -> Result<EgmRobot, ReceiveError> {
56 let mut buffer = vec![0u8; 1024];
57 let bytes_received = self.socket.recv(&mut buffer)?;
58 Ok(EgmRobot::decode(&buffer[..bytes_received])?)
59 }
60
61 pub fn recv_from(&mut self) -> Result<(EgmRobot, SocketAddr), ReceiveError> {
63 let mut buffer = vec![0u8; 1024];
64 let (bytes_received, sender) = self.socket.recv_from(&mut buffer)?;
65 Ok((EgmRobot::decode(&buffer[..bytes_received])?, sender))
66 }
67
68 pub fn purge_recv_queue(&mut self) -> std::io::Result<()> {
74 self.socket.set_nonblocking(true)?;
75
76 let mut buffer = vec![0u8; 1024];
77 let read_loop_result = loop {
78 match self.socket.recv_from(&mut buffer) {
79 Err(e) => {
80 if e.kind() == std::io::ErrorKind::WouldBlock {
81 break Ok(());
82 } else {
83 break Err(e);
84 }
85 }
86 Ok(_transferred) => (),
87 }
88 };
89
90 let restore_blocking_result = self.socket.set_nonblocking(false);
93 read_loop_result?;
94 restore_blocking_result
95 }
96
97 pub fn send(&mut self, msg: &EgmSensor) -> Result<(), SendError> {
102 InvalidMessageError::check_sensor_msg(msg)?;
103 let buffer = crate::encode_to_vec(msg)?;
104 let bytes_sent = self.socket.send(&buffer)?;
105 crate::error::check_transfer(bytes_sent, buffer.len())?;
106 Ok(())
107 }
108
109 pub fn send_to(&mut self, msg: &EgmSensor, target: &SocketAddr) -> Result<(), SendError> {
111 InvalidMessageError::check_sensor_msg(msg)?;
112 let buffer = crate::encode_to_vec(msg)?;
113 let bytes_sent = self.socket.send_to(&buffer, target)?;
114 crate::error::check_transfer(bytes_sent, buffer.len())?;
115 Ok(())
116 }
117}