pub extern crate ether_dream;
pub mod lerp;
pub mod point;
pub mod stream;
pub mod util;
pub use lerp::Lerp;
pub use point::{Point, RawPoint};
pub use stream::raw::Buffer;
pub use stream::raw::Stream as RawStream;
pub use stream::frame::Frame;
pub use stream::frame::Stream as FrameStream;
use std::io;
use std::sync::Arc;
pub struct Lasy {
inner: Arc<Inner>,
}
pub(crate) struct Inner;
pub struct DetectDacs {
dac_broadcasts: ether_dream::RecvDacBroadcasts,
}
#[derive(Clone, Debug)]
pub enum DetectedDac {
EtherDream {
broadcast: ether_dream::protocol::DacBroadcast,
source_addr: std::net::SocketAddr,
},
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum DacId {
EtherDream {
mac_address: [u8; 6],
}
}
impl Lasy {
pub fn new() -> Self {
Lasy { inner: Arc::new(Inner) }
}
pub fn detect_dacs(&self) -> io::Result<DetectDacs> {
self.inner.detect_dacs()
}
pub fn detect_dac(&self, id: DacId) -> io::Result<DetectedDac> {
self.inner.detect_dac(id)
}
pub fn new_frame_stream<M, F>(&self, model: M, render: F) -> stream::frame::Builder<M, F>
where
F: stream::frame::RenderFn<M>,
{
let api_inner = self.inner.clone();
let builder = Default::default();
let frame_hz = None;
let interpolation_conf = Default::default();
let process_raw = stream::frame::default_process_raw_fn;
stream::frame::Builder {
api_inner,
builder,
model,
render,
process_raw,
frame_hz,
interpolation_conf,
}
}
pub fn new_raw_stream<M, F>(&self, model: M, render: F) -> stream::raw::Builder<M, F>
where
F: stream::raw::RenderFn<M>,
{
let api_inner = self.inner.clone();
let builder = Default::default();
stream::raw::Builder { api_inner, builder, model, render }
}
}
impl Inner {
pub(crate) fn detect_dacs(&self) -> io::Result<DetectDacs> {
let dac_broadcasts = ether_dream::recv_dac_broadcasts()?;
Ok(DetectDacs { dac_broadcasts })
}
pub(crate) fn detect_dac(&self, id: DacId) -> io::Result<DetectedDac> {
for res in self.detect_dacs()? {
let dac = res?;
if dac.id() == id {
return Ok(dac);
}
}
unreachable!("DAC detection iterator should never return `None`")
}
}
impl DetectedDac {
pub fn max_point_hz(&self) -> u32 {
match self {
DetectedDac::EtherDream { ref broadcast, .. } => broadcast.max_point_rate as _,
}
}
pub fn buffer_capacity(&self) -> u32 {
match self {
DetectedDac::EtherDream { ref broadcast, .. } => broadcast.buffer_capacity as _,
}
}
pub fn id(&self) -> DacId {
match self {
DetectedDac::EtherDream { ref broadcast, .. } => {
DacId::EtherDream {
mac_address: broadcast.mac_address,
}
}
}
}
}
impl AsRef<Point> for Point {
fn as_ref(&self) -> &Point {
self
}
}
impl Iterator for DetectDacs {
type Item = io::Result<DetectedDac>;
fn next(&mut self) -> Option<Self::Item> {
let res = self.dac_broadcasts.next()?;
match res {
Err(err) => Some(Err(err)),
Ok((broadcast, source_addr)) => {
Some(Ok(DetectedDac::EtherDream { broadcast, source_addr }))
}
}
}
}