linux-gpib-rs 0.2.6

Low-level wrapper for Linux GPIB
Documentation
use linux_gpib_rs::error::GpibError;
use linux_gpib_rs::instrument::{Board, Parameters};
use linux_gpib_rs::lowlevel::traditional::{ibdev, ibrd, ibwrt};
use linux_gpib_rs::types::IbSendEOI;
use linux_gpib_rs::types::{IbEosMode, IbTimeout, PrimaryAddress, SecondaryAddress};
#[cfg(feature = "async-tokio")]
use tokio::task::JoinSet;

fn lowlevel_query() -> Result<(), GpibError> {
    let ud = ibdev(
        0,
        PrimaryAddress::new(1)?,
        SecondaryAddress::new(0)?,
        IbTimeout::T1s,
        IbSendEOI::default(),
        IbEosMode::default(),
    )?;
    ibwrt(ud, b"*IDN?\n")?;
    let mut buffer: [u8; 256] = [0; 256];
    ibrd(ud, &mut buffer)?;
    let iden = String::from_utf8(buffer.to_vec())?;
    println!("{iden}");
    Ok(())
}

fn multidevice_query() -> Result<(), GpibError> {
    let board = Board::with_board_number(0);
    let instruments = board.find_listeners()?;
    board.send_list(&instruments, b"*IDN?\n", IbSendEOI::default())?;
    for instr in instruments {
        let iden = instr.receive()?;
        println!("{:>20} {}", instr.visa_string(), iden.trim());
    }
    Ok(())
}

#[cfg(feature = "async-tokio")]
async fn asynchronous_simple() -> Result<(), GpibError> {
    let board = Board::with_board_number(0);
    let instruments = board.find_listeners()?;
    for instr in instruments {
        let handle = instr.open(Parameters::default())?;
        let visa_string = instr.visa_string();
        let iden = handle.query("*IDN?\n").await?;
        println!("{:>20} {}", visa_string, iden.trim());
    }
    Ok(())
}

#[cfg(feature = "async-tokio")]
async fn asynchronous_bis() -> Result<(), GpibError> {
    let board = Board::with_board_number(0);
    let instruments = board.find_listeners()?;
    let mut set = JoinSet::<Result<(String, String), GpibError>>::new();
    for instr in instruments {
        let handle = instr.open(Parameters::default())?;
        let visa_string = instr.visa_string();
        set.spawn(async move {
            let iden = handle.query("*IDN?\n").await?;
            Ok((visa_string, iden))
        });
    }
    while let Some(Ok(val)) = set.join_next().await {
        if let Ok((visa_string, iden)) = val {
            println!("{:>20} {}", visa_string, iden.trim());
        }
    }
    Ok(())
}

#[cfg(feature = "async-tokio")]
#[tokio::main]
async fn main() {
    env_logger::init();

    println!("*** lowlevel_query ***");
    lowlevel_query().unwrap();

    println!("*** Multidevice query ***");
    multidevice_query().unwrap();

    println!("*** Asynchronous simple ***");
    asynchronous_simple().await.unwrap();

    println!("**** Asynchronous bis ***");
    asynchronous_bis().await.unwrap();
}

#[cfg(not(feature = "async-tokio"))]
fn main() {
    env_logger::init();

    println!("*** lowlevel_query ***");
    lowlevel_query().unwrap();

    println!("*** Multidevice query ***");
    multidevice_query().unwrap();
}