diff --git a/src/communication/ethernet.rs b/src/communication/ethernet.rs index 17ace523c07cc74229863771105149d1ea960e72..2506fa956300839834ec0eb68dd0743e24e61942 100644 --- a/src/communication/ethernet.rs +++ b/src/communication/ethernet.rs @@ -22,8 +22,7 @@ use super::{ /// Configuration for an Ethernet connection. #[derive(Debug, Clone)] pub struct EthernetConfiguration { - pub recv_port: u16, - pub send_port: u16, + pub port: u16, } impl Connectable for EthernetConfiguration { @@ -32,20 +31,26 @@ impl Connectable for EthernetConfiguration { /// Binds to the specified UDP port to create a network connection. #[profiling::function] fn connect(&self) -> Result<Self::Connected, ConnectionError> { - let recv_addr = format!("0.0.0.0:{}", self.recv_port); - let send_addr = format!("255.255.255.255:{}", self.send_port); - let socket = UdpSocket::bind(recv_addr)?; - debug!("Bound to Ethernet port on port {}", self.recv_port); - socket.set_broadcast(true)?; - socket.connect(send_addr)?; - debug!("Connected to Ethernet port on port {}", self.send_port); - Ok(EthernetTransceiver { socket }) + let recv_addr = format!("0.0.0.0:{}", self.port); + let server_socket = UdpSocket::bind(recv_addr)?; + debug!("Bound to Ethernet port on port {}", self.port); + let send_addr = "0.0.0.0:0"; + let cast_addr = format!("255.255.255.255:{}", self.port); + let client_socket = UdpSocket::bind(send_addr)?; + client_socket.set_broadcast(true)?; + client_socket.connect(&cast_addr)?; + debug!("Created Ethernet connection to {}", cast_addr); + Ok(EthernetTransceiver { + server_socket, + client_socket, + }) } } /// Manages a connection over Ethernet. pub struct EthernetTransceiver { - socket: UdpSocket, + server_socket: UdpSocket, + client_socket: UdpSocket, } impl MessageTransceiver for EthernetTransceiver { @@ -53,7 +58,7 @@ impl MessageTransceiver for EthernetTransceiver { #[profiling::function] fn wait_for_message(&self) -> Result<TimedMessage, MessageReadError> { let mut buf = [0; MAX_MSG_SIZE]; - let read = self.socket.recv(&mut buf)?; + let read = self.server_socket.recv(&mut buf)?; trace!("Received {} bytes", read); let mut reader = PeekReader::new(&buf[..read]); let (_, res) = read_v1_msg(&mut reader)?; @@ -67,7 +72,7 @@ impl MessageTransceiver for EthernetTransceiver { let MavFrame { header, msg, .. } = msg; let mut write_buf = Vec::new(); write_v1_msg(&mut write_buf, header, &msg)?; - let written = self.socket.send(&write_buf)?; + let written = self.client_socket.send(&write_buf)?; debug!("Sent message: {:?}", msg); trace!("Sent {} bytes via Ethernet", written); Ok(written) diff --git a/src/ui/windows/connections.rs b/src/ui/windows/connections.rs index e818ddb38ea8b6dbbb8b4d76730ec148b7b268a9..ebc34c32fcfd24d57cba0a17ff7f126d79b48e0b 100644 --- a/src/ui/windows/connections.rs +++ b/src/ui/windows/connections.rs @@ -70,20 +70,14 @@ impl ConnectionsWindow { } match connection_config { - ConnectionConfig::Ethernet(EthernetConfiguration { - recv_port, - send_port, - }) => { + ConnectionConfig::Ethernet(EthernetConfiguration { port: recv_port }) => { egui::Grid::new("grid") .num_columns(2) .spacing([10.0, 5.0]) .show(ui, |ui| { - ui.label("Ethernet Receiving Port:"); + ui.label("Ethernet Port:"); ui.add(egui::DragValue::new(recv_port).range(0..=65535).speed(10)); ui.end_row(); - ui.label("Ethernet Sending Port:"); - ui.add(egui::DragValue::new(send_port).range(0..=65535).speed(10)); - ui.end_row(); }); } ConnectionConfig::Serial(opt) => { @@ -183,8 +177,7 @@ pub enum ConnectionConfig { fn default_ethernet() -> EthernetConfiguration { EthernetConfiguration { - recv_port: DEFAULT_ETHERNET_PORT, - send_port: DEFAULT_ETHERNET_PORT, + port: DEFAULT_ETHERNET_PORT, } }