use anyhow::Result;
use float_cmp::assert_approx_eq;
use futuresdr::async_io::block_on;
use futuresdr::blocks::Head;
use futuresdr::blocks::NullSink;
use futuresdr::blocks::NullSource;
use futuresdr::blocks::seify::*;
use futuresdr::prelude::*;
use futuresdr::seify::Direction::*;
use std::collections::HashMap;
#[test]
fn builder_compat() -> Result<()> {
futuresdr::runtime::init();
let mut fg = Flowgraph::new();
let src = Builder::new("driver=dummy")?
.frequency(100e6)
.sample_rate(3.2e6)
.gain(34.0)
.build_source()?;
let head = Head::<Complex<f32>>::new(1024);
let snk = NullSink::<Complex<f32>>::new();
connect!(fg, src.outputs[0] > head > snk);
Runtime::new().run(fg)?;
Ok(())
}
#[test]
fn builder_compat_filter() -> Result<()> {
let mut fg = Flowgraph::new();
let src = Builder::new("driver=dummy")?
.frequency(100e6)
.sample_rate(3.2e6)
.gain(34.0)
.build_source()?;
let head = Head::<Complex<f32>>::new(1024);
let snk = NullSink::<Complex<f32>>::new();
connect!(fg, src.outputs[0] > head > snk);
Runtime::new().run(fg)?;
Ok(())
}
#[test]
fn builder_config() -> Result<()> {
let mut fg = Flowgraph::new();
let dev = seify::Device::from_args("driver=dummy")?;
let src = Builder::from_device(dev.clone())
.channels(vec![0]) .sample_rate(1e6)
.frequency(100e6)
.build_source()?;
let snk = NullSink::<Complex<f32>>::new();
connect!(fg, src.outputs[0] > snk);
let rt = Runtime::new();
rt.start_sync(fg)?;
assert_approx_eq!(f64, dev.sample_rate(Rx, 0)?, 1e6);
assert_approx_eq!(f64, dev.frequency(Rx, 0)?, 100e6);
Ok(())
}
#[test]
fn config_freq_gain_ports() -> Result<()> {
futuresdr::runtime::init();
let mut fg = Flowgraph::new();
let dev = seify::Device::from_args("driver=dummy")?;
let src = Builder::from_device(dev.clone())
.sample_rate(1e6)
.frequency(100e6)
.gain(1.0)
.build_source()?;
let snk = NullSink::<Complex<f32>>::new();
connect!(fg, src.outputs[0] > snk);
let rt = Runtime::new();
let (_task, mut fg_handle) = rt.start_sync(fg)?;
block_on(async {
let src = src.clone();
fg_handle
.callback(src, "freq", Pmt::F64(102e6))
.await
.unwrap();
});
assert_approx_eq!(f64, dev.frequency(Rx, 0)?, 102e6, epsilon = 0.1);
block_on(async {
fg_handle.callback(src, "gain", Pmt::U32(2)).await.unwrap();
});
assert_approx_eq!(f64, dev.gain(Rx, 0)?.unwrap(), 2.0);
Ok(())
}
#[test]
fn src_config_cmd_map() -> Result<()> {
let mut fg = Flowgraph::new();
let dev = seify::Device::from_args("driver=dummy")?;
let src = Builder::from_device(dev.clone())
.sample_rate(1e6)
.frequency(100e6)
.gain(1.0)
.build_source()?;
let snk = NullSink::<Complex<f32>>::new();
connect!(fg, src.outputs[0] > snk);
let rt = Runtime::new();
let (_, mut fg_handle) = rt.start_sync(fg)?;
block_on(async {
let src = src.clone();
let pmt = Pmt::MapStrPmt(HashMap::from([
("chan".to_owned(), Pmt::U32(0)),
("freq".to_owned(), Pmt::F64(102e6)),
("sample_rate".to_owned(), Pmt::F32(1e6)),
]));
fg_handle.callback(src, "cmd", pmt).await.unwrap();
});
assert_approx_eq!(f64, dev.frequency(Rx, 0)?, 102e6, epsilon = 0.1);
assert_approx_eq!(f64, dev.sample_rate(Rx, 0)?, 1e6);
let conf = block_on(fg_handle.callback(src, "config", Pmt::Ok))?;
match conf {
Pmt::MapStrPmt(m) => {
assert_eq!(m.get("freq").unwrap(), &Pmt::F64(102e6));
assert_eq!(m.get("sample_rate").unwrap(), &Pmt::F64(1e6));
}
o => panic!("unexpected pmt type {o:?}"),
}
Ok(())
}
#[test]
fn sink_config_cmd_map() -> Result<()> {
let mut fg = Flowgraph::new();
let dev = seify::Device::from_args("driver=dummy")?;
let snk = Builder::from_device(dev.clone())
.sample_rate(1e6)
.frequency(100e6)
.gain(1.0)
.build_sink()?;
let src = NullSource::<Complex<f32>>::new();
connect!(fg, src > inputs[0].snk);
let rt = Runtime::new();
let (_, mut fg_handle) = rt.start_sync(fg)?;
block_on(async {
let snk = snk.clone();
let pmt = Pmt::MapStrPmt(HashMap::from([
("freq".to_owned(), Pmt::F64(102e6)),
("sample_rate".to_owned(), Pmt::F32(1e6)),
]));
fg_handle.callback(snk, "cmd", pmt).await.unwrap();
});
assert_approx_eq!(f64, dev.frequency(Tx, 0)?, 102e6, epsilon = 0.1);
assert_approx_eq!(f64, dev.sample_rate(Tx, 0)?, 1e6);
let conf = block_on(fg_handle.callback(snk, "config", Pmt::Ok))?;
match conf {
Pmt::MapStrPmt(m) => {
assert_eq!(m.get("freq").unwrap(), &Pmt::F64(102e6));
assert_eq!(m.get("sample_rate").unwrap(), &Pmt::F64(1e6));
}
o => panic!("unexpected pmt type {o:?}"),
}
Ok(())
}