use gmt_dos_clients_transceiver::{Monitor, On, Transceiver, Transmitter, TransmitterBuilder};
use interface::{Data, Read, UniqueIdentifier};
use crate::{
payload::{Payload, ScopeData},
GmtScope, ImageScope, ImageScopeKind,
};
use super::XScope;
pub type Shot<FU> = XScope<FU, ImageScope>;
pub type GmtShot<FU> = XScope<FU, GmtScope>;
impl<'a, FU, K> super::Builder<'a, FU, K>
where
FU: UniqueIdentifier + 'static,
K: ImageScopeKind,
{
pub fn build(self) -> Result<XScope<FU, K>, super::ServerError> {
Ok(XScope {
tx: if self.frame_by_frame {
TransmitterBuilder::new(self.address).capacity(0).build()?
} else {
Transceiver::transmitter(self.address)?
}
.run(self.monitor.unwrap()),
size: self.size.unwrap(),
minmax: self.minmax,
scale: self.scale,
tau: self.tau.unwrap_or(1f64),
idx: 0,
kind: std::marker::PhantomData,
})
}
pub fn frame_by_frame(mut self) -> Self {
self.frame_by_frame = true;
self
}
pub fn minmax(mut self, minmax: (f64, f64)) -> Self {
self.minmax = Some(minmax);
self
}
}
impl<FU, K> XScope<FU, K>
where
FU: UniqueIdentifier + 'static,
<FU as UniqueIdentifier>::DataType: Send + Sync + serde::Serialize,
K: ImageScopeKind,
{
pub fn builder(
address: impl Into<String>,
monitor: &mut Monitor,
size: [usize; 2],
) -> super::Builder<FU, K> {
super::Builder {
address: address.into(),
monitor: Some(monitor),
size: Some(size),
..Default::default()
}
}
}
impl<T, FU> Read<FU> for Shot<FU>
where
FU: UniqueIdentifier<DataType = Vec<T>>,
T: Copy,
f64: From<T>,
{
fn read(&mut self, data: Data<FU>) {
let payload = Payload::image(data, self.tau, self.size, self.minmax, self.scale)
.expect("failed to create payload from data");
<Transceiver<ScopeData<FU>, Transmitter, On> as Read<ScopeData<FU>>>::read(
&mut self.tx,
Data::new(payload),
);
}
}
impl<T, FU> Read<FU> for GmtShot<FU>
where
FU: UniqueIdentifier<DataType = (Vec<T>, Vec<bool>)>,
T: Copy,
f64: From<T>,
{
fn read(&mut self, data: Data<FU>) {
let payload = Payload::gmt(data, self.tau, self.size, self.minmax, self.scale)
.expect("failed to create payload from data");
<Transceiver<ScopeData<FU>, Transmitter, On> as Read<ScopeData<FU>>>::read(
&mut self.tx,
Data::new(payload),
);
}
}