use anyhow::Result;
use crossbeam::channel::{Receiver, TryRecvError, unbounded};
use lasprs::daq::{StreamDirection, StreamMgr, StreamStatus};
use lasprs::siggen::{SiggenCommand, SourceDescriptor, SweepSettings, SweepType};
use std::io;
use std::{thread, time};
fn stdin_channel_wait_for_return() -> Receiver<String> {
let (tx, rx) = unbounded();
thread::spawn(move || {
let mut buffer = String::new();
io::stdin().read_line(&mut buffer).unwrap();
let _ = tx.send(buffer);
});
rx
}
fn sleep(millis: u64) {
let duration = time::Duration::from_millis(millis);
thread::sleep(duration);
}
fn main() -> Result<()> {
let mut smgr = StreamMgr::new_with_devices();
let stdin_channel = stdin_channel_wait_for_return();
println!("Creating signal generator...");
let src = SourceDescriptor::Sweep {
settings: SweepSettings::new(10., 10000., 1., SweepType::ContinuousLog, None, None)?,
};
smgr.setSiggenSource(src)?;
smgr.siggenCommand(SiggenCommand::SetAllGains {
g: 0.1.try_into().unwrap(),
})?;
smgr.siggenCommand(SiggenCommand::SetMuteAllChannels { mute: false })?;
println!("Starting stream...");
smgr.startDefaultOutputStream()?;
println!("Press <enter> key to quit...");
'infy: loop {
match stdin_channel.try_recv() {
Ok(_key) => break 'infy,
Err(TryRecvError::Empty) => {}
Err(TryRecvError::Disconnected) => panic!("Channel disconnected"),
}
sleep(100);
match smgr.getStatus(StreamDirection::Output) {
StreamStatus::NotRunning {} => {
println!("Stream is not running?");
break 'infy;
}
StreamStatus::Running { .. } => {}
StreamStatus::Error { e } => {
println!("Stream error: {e}");
break 'infy;
}
}
}
Ok(())
}