sgp30 1.1.0

Platform agnostic Rust driver for the Sensirion SGP30 gas sensor.
use embedded_hal::delay::DelayNs;
use linux_embedded_hal::{Delay, I2cdev};
use sgp30::Sgp30;

fn measure_loop(sgp: &mut Sgp30<I2cdev, Delay>) -> ! {
    let mut i = 0;
    loop {
        if i != 0 {
            Delay.delay_ms(1000u32 - 12 - 25);
        }
        if i % 10 == 0 {
            let baseline = sgp.get_baseline().unwrap();
            println!("Baseline: {} / {}", baseline.co2eq, baseline.tvoc);
        }
        let measurements = sgp.measure().unwrap();
        let signals = sgp.measure_raw_signals().unwrap();
        println!(
            "{}: CO₂eq = {} ppm, TVOC = {} ppb, H2 sig = {}, Ethanol sig = {}",
            i + 1,
            measurements.co2eq_ppm,
            measurements.tvoc_ppb,
            signals.h2,
            signals.ethanol
        );
        i += 1;
    }
}

fn main() {
    let dev = I2cdev::new("/dev/i2c-1").unwrap();
    let address = 0x58;
    let mut sgp = Sgp30::new(dev, address, Delay);

    println!("Starting SGP30 tests.");
    println!();
    println!("Serial: {:?}", sgp.serial().unwrap());
    println!("Feature set: {:?}", sgp.get_feature_set().unwrap());
    println!(
        "Self-Test: {}",
        if sgp.selftest().unwrap() {
            "Pass"
        } else {
            "Fail"
        }
    );
    println!();
    println!("Initializing...");
    sgp.init().unwrap();
    println!("Starting measurement loop, press Ctrl+C to abort...\n");
    measure_loop(&mut sgp);
}