fleascope-rs 0.2.0

Library to interact with a Fleascope
Documentation
use fleascope_rs::{FleaScope, ProbeType, Waveform};
use std::time::Duration;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Initialize logging
    env_logger::init();

    println!("FleaScope CLI Reader");
    println!("===================");

    // Connect to the device
    println!("Connecting to FleaScope...");
    let mut fleascope = FleaScope::connect(None, None, true)?;

    println!("Connected to: {}", fleascope.get_hostname());

    // Set up a test waveform (optional)
    println!("Setting up sine wave at 1000 Hz...");
    fleascope.set_waveform(Waveform::Sine, 1000)?;

    // Read data from the scope
    println!("Reading data...");
    let start_time = std::time::Instant::now();

    let lazy_frame = fleascope.read(
        ProbeType::X1,
        Duration::from_millis(100), // 100ms time frame
        None,                       // Auto trigger
        None,                       // No delay
    )?;

    let read_duration = start_time.elapsed();

    // Collect and analyze the data
    let dataframe = lazy_frame.collect()?;

    println!(
        "Read {} data points in {:?}",
        dataframe.height(),
        read_duration
    );

    // Display some statistics
    if let (Ok(time_col), Ok(voltage_col)) = (dataframe.column("time"), dataframe.column("bnc")) {
        if let (Ok(time_series), Ok(voltage_series)) = (time_col.f64(), voltage_col.f64()) {
            let time_values: Vec<f64> = time_series.into_no_null_iter().collect();
            let voltage_values: Vec<f64> = voltage_series.into_no_null_iter().collect();

            if !voltage_values.is_empty() {
                let min_voltage = voltage_values.iter().fold(f64::INFINITY, |a, &b| a.min(b));
                let max_voltage = voltage_values
                    .iter()
                    .fold(f64::NEG_INFINITY, |a, &b| a.max(b));
                let avg_voltage = voltage_values.iter().sum::<f64>() / voltage_values.len() as f64;

                let time_span =
                    time_values.last().unwrap_or(&0.0) - time_values.first().unwrap_or(&0.0);

                println!("\nData Analysis:");
                println!("Time span: {:.6} seconds", time_span);
                println!("Voltage range: {:.3}V to {:.3}V", min_voltage, max_voltage);
                println!("Average voltage: {:.3}V", avg_voltage);
                println!(
                    "Sample rate: {:.1} Hz",
                    voltage_values.len() as f64 / time_span
                );
            }
        }
    }

    // Show first few data points
    println!("\nFirst 10 data points:");
    println!("{}", dataframe.head(Some(10)));

    Ok(())
}