uhd 0.4.0

Bindings to the UHD (USRP Hardware Driver) library, which provides support for Ettus Research / National Instruments Universal Software Radio Peripheral devices
use std::env::set_var;

use anyhow::{Context, Result};
use num_complex::Complex;
use tap::Pipe;
use uhd::{self, StreamCommand, StreamCommandType, StreamTime, TuneRequest, Usrp};

const CHANNEL: usize = 0;
const NUM_SAMPLES: usize = 1000;

pub fn main() -> Result<()> {
    set_var("RUST_LOG", "DEBUG");
    env_logger::init();

    log::info!("Starting receive test");

    let mut usrp = Usrp::find("")
        .context("Failed to open device list")?
        .drain(..)
        .next()
        .context("Failed to find a valid USRP to attach to")?
        .pipe(|addr| Usrp::open(&addr))
        .context("Failed to find properly open the USRP")?;

    let _ = usrp.set_clock_source("external", 0);
    let clock_source = usrp.get_clock_source(0).unwrap();
    println!("Clock source: {:?}", clock_source);
    assert_eq!(clock_source, "external");
    let _ = usrp.set_clock_source("internal", 0);
    let clock_source = usrp.get_clock_source(0).unwrap();
    println!("Clock source: {:?}", clock_source);
    assert_eq!(clock_source, "internal");
        
    usrp.set_rx_sample_rate(1e6, CHANNEL)?;
    usrp.set_rx_antenna("TX/RX", CHANNEL)?;
    usrp.set_rx_frequency(&TuneRequest::with_frequency(2.4e9), CHANNEL)?;

    let mut receiver = usrp
        .get_rx_stream(&uhd::StreamArgs::<Complex<i16>>::new("sc16"))
        .unwrap();

    let mut buffer = uhd::alloc_boxed_slice::<Complex<i16>, NUM_SAMPLES>();

    receiver.send_command(&StreamCommand {
        command_type: StreamCommandType::CountAndDone(buffer.len() as u64),
        time: StreamTime::Now,
    })?;
    let status = receiver.receive_simple(buffer.as_mut())?;

    log::info!("{:?}", status);
    log::info!("{:?}", &buffer[..16]);

    Ok(())
}