use smoltcp::{
phy::{
RxToken,
TxToken,
},
time::Instant,
};
use crate::DynPhy;
mod private {
pub trait Sealed {}
}
impl<T> private::Sealed for T where T: DynPhy {}
pub trait DynPhyExt: DynPhy + private::Sealed {
#[inline]
fn send(&mut self, timestamp: Instant, data: &[u8]) -> bool {
let Some(tx) = self.dyn_transmit(timestamp) else {
return false;
};
tx.send(data);
true
}
#[cfg(feature = "std")]
#[inline]
fn send_now(&mut self, data: &[u8]) -> bool {
self.send(Instant::now(), data)
}
#[inline]
fn receive(
&mut self,
timestamp: Instant,
f: impl FnOnce(&mut [u8], &mut dyn FnMut(&[u8])),
) -> bool {
let Some((rx, tx)) = self.dyn_receive(timestamp) else {
return false;
};
let mut tx = Some(tx);
let tx = &mut tx;
rx.consume(move |b| {
f(b, &mut |data| {
if let Some(tx) = tx.take() {
tx.consume(data.len(), move |dat| {
dat.copy_from_slice(data);
});
}
});
});
true
}
#[cfg(feature = "std")]
#[inline]
fn receive_now(&mut self, f: impl FnOnce(&mut [u8], &mut dyn FnMut(&[u8]))) -> bool {
self.receive(Instant::now(), f)
}
}
impl<T> DynPhyExt for T where T: DynPhy {}