futuresdr 0.7.0

An Experimental Async SDR Runtime for Heterogeneous Architectures.
Documentation
use futuresdr::blocks::VectorSink;
use futuresdr::blocks::VectorSource;
use futuresdr::prelude::Flowgraph;
use futuresdr::prelude::Result;
use futuresdr::prelude::Runtime;
use futuresdr::prelude::connect;
use futuresdr::runtime::__private::KernelInterface;
use futuresdr::runtime::buffer::CpuBufferReader;
use futuresdr::runtime::buffer::CpuBufferWriter;
use futuresdr::runtime::buffer::DefaultCpuReader;
use futuresdr::runtime::buffer::DefaultCpuWriter;
use futuresdr::runtime::buffer::DefaultLocalCpuReader;
use futuresdr::runtime::buffer::DefaultLocalCpuWriter;
use futuresdr::runtime::buffer::InplaceReader;
use futuresdr::runtime::buffer::InplaceWriter;
use futuresdr::runtime::buffer::ThreadSafeConnect;
use futuresdr::runtime::buffer::circuit;
use futuresdr::runtime::dev::SendKernel;

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
enum PlainSample {
    Active,
    #[default]
    Idle,
}

fn assert_send_kernel<T: SendKernel>() {}
fn assert_send<T: Send>() {}
fn assert_thread_safe_connect<T: ThreadSafeConnect>() {}
fn assert_kernel_interface<T: KernelInterface>() {}
fn assert_local_cpu_reader<T: CpuBufferReader>() {}
fn assert_local_cpu_writer<T: CpuBufferWriter>() {}
fn assert_inplace_reader<T: InplaceReader>() {}
fn assert_inplace_writer<T: InplaceWriter>() {}

#[test]
fn normal_and_local_types_use_the_same_traits() {
    assert_send::<DefaultCpuReader<u8>>();
    assert_send::<DefaultCpuWriter<u8>>();
    assert_thread_safe_connect::<DefaultCpuWriter<u8>>();
    assert_local_cpu_reader::<DefaultCpuReader<u8>>();
    assert_local_cpu_writer::<DefaultCpuWriter<u8>>();
    assert_local_cpu_reader::<DefaultLocalCpuReader<u8>>();
    assert_local_cpu_writer::<DefaultLocalCpuWriter<u8>>();
    assert_inplace_reader::<circuit::Reader<i32>>();
    assert_inplace_writer::<circuit::Writer<i32>>();
    #[cfg(not(target_arch = "wasm32"))]
    assert_send::<circuit::Reader<i32>>();
    #[cfg(not(target_arch = "wasm32"))]
    assert_send::<circuit::Writer<i32>>();
    assert_thread_safe_connect::<circuit::Writer<i32>>();
}

#[test]
fn derived_block_interface_supports_local_buffers() {
    assert_kernel_interface::<VectorSource<u8, DefaultLocalCpuWriter<u8>>>();
    assert_send_kernel::<VectorSource<u8, DefaultCpuWriter<u8>>>();
}

#[test]
fn plain_enum_samples_use_default_cpu_buffers() -> Result<()> {
    let samples = vec![PlainSample::Active, PlainSample::Idle, PlainSample::Active];
    let mut fg = Flowgraph::new();
    let src = VectorSource::<PlainSample>::new(samples.clone());
    let snk = VectorSink::<PlainSample>::new(samples.len());

    connect!(fg, src > snk);

    let fg = Runtime::new().run(fg)?;
    assert_eq!(fg.block(&snk)?.items(), &samples);
    Ok(())
}