pub mod backend;
pub mod dac;
pub mod protocol;
pub use self::protocol::{
DacBroadcast, DacPoint, DacResponse, DacStatus, ReadBytes, SizeBytes, WriteBytes,
};
pub use backend::EtherDreamBackend;
use crate::types::{DacCapabilities, OutputModel};
use std::{io, net};
pub fn default_capabilities() -> DacCapabilities {
DacCapabilities {
pps_min: 1,
pps_max: 100_000,
max_points_per_chunk: 1799,
output_model: OutputModel::NetworkFifo,
}
}
pub struct RecvDacBroadcasts {
udp_socket: net::UdpSocket,
buffer: [u8; RecvDacBroadcasts::BUFFER_LEN],
}
impl RecvDacBroadcasts {
pub const BUFFER_LEN: usize = protocol::DacBroadcast::SIZE_BYTES;
}
pub fn recv_dac_broadcasts() -> io::Result<RecvDacBroadcasts> {
let broadcast_addr = net::SocketAddrV4::new([0, 0, 0, 0].into(), protocol::BROADCAST_PORT);
let udp_socket = net::UdpSocket::bind(broadcast_addr)?;
Ok(RecvDacBroadcasts {
udp_socket,
buffer: [0; RecvDacBroadcasts::BUFFER_LEN],
})
}
impl RecvDacBroadcasts {
pub fn next_broadcast(&mut self) -> io::Result<(protocol::DacBroadcast, net::SocketAddr)> {
let (len, src_addr) = self.udp_socket.recv_from(&mut self.buffer)?;
if len < protocol::DacBroadcast::SIZE_BYTES {
return Err(io::Error::new(
io::ErrorKind::UnexpectedEof,
format!(
"received {} bytes, expected at least {}",
len,
protocol::DacBroadcast::SIZE_BYTES
),
));
}
let mut bytes = &self.buffer[..len];
let dac_broadcast = bytes.read_bytes::<protocol::DacBroadcast>()?;
Ok((dac_broadcast, src_addr))
}
pub fn set_timeout(&self, duration: Option<std::time::Duration>) -> io::Result<()> {
self.udp_socket.set_read_timeout(duration)
}
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
self.udp_socket.set_nonblocking(nonblocking)
}
}
impl Iterator for RecvDacBroadcasts {
type Item = io::Result<(protocol::DacBroadcast, net::SocketAddr)>;
fn next(&mut self) -> Option<Self::Item> {
Some(self.next_broadcast())
}
}