embedded-ccs811 1.0.0

Platform-agnostic Rust driver for the CCS811 ultra-low power digital gas sensor for monitoring indoor air quality.
Documentation
use embedded_ccs811::{prelude::*, Error};
use embedded_hal_mock::eh1::{
    digital::{Mock as PinMock, State as PinState, Transaction as PinTrans},
    i2c::Transaction as I2cTrans,
};
mod common;
use crate::common::{destroy, new, BitFlags as BF, Register, DEV_ADDR};

macro_rules! expect_err {
    ($name:ident, $error_id:expr, $invalid_write:expr, $invalid_read:expr, $invalid_meas:expr,
    $max_resistance:expr, $heater_fault:expr, $heater_supply:expr) => {
        #[test]
        fn $name() {
            let nwake =
                PinMock::new(&[PinTrans::set(PinState::Low), PinTrans::set(PinState::High)]);
            let transactions = [
                I2cTrans::write_read(DEV_ADDR, vec![Register::HW_ID], vec![0x81]),
                I2cTrans::write_read(DEV_ADDR, vec![Register::STATUS], vec![BF::ERROR]),
                I2cTrans::write_read(DEV_ADDR, vec![Register::ERROR_ID], vec![$error_id]),
            ];
            let mut sensor = new(&transactions, nwake);
            match sensor.hardware_id() {
                Err(Error::Device(errors)) => {
                    assert_eq!($invalid_write, errors.invalid_register_write);
                    assert_eq!($invalid_read, errors.invalid_register_read);
                    assert_eq!($invalid_meas, errors.invalid_measurement);
                    assert_eq!($max_resistance, errors.max_resistance);
                    assert_eq!($heater_fault, errors.heater_fault);
                    assert_eq!($heater_supply, errors.heater_supply);
                }
                _ => panic!("Wrong result"),
            }
            destroy(sensor);
        }
    };
}

expect_err!(
    invalid_write,
    BF::WRITE_REG_INVALID,
    true,
    false,
    false,
    false,
    false,
    false
);

expect_err!(
    invalid_read,
    BF::READ_REG_INVALID,
    false,
    true,
    false,
    false,
    false,
    false
);

expect_err!(
    invalid_measurement,
    BF::MEASMODE_INVALID,
    false,
    false,
    true,
    false,
    false,
    false
);

expect_err!(
    max_resistence,
    BF::MAX_RESISTANCE,
    false,
    false,
    false,
    true,
    false,
    false
);

expect_err!(
    heater_fault,
    BF::HEATER_FAULT,
    false,
    false,
    false,
    false,
    true,
    false
);

expect_err!(
    heater_supply,
    BF::HEATER_SUPPLY,
    false,
    false,
    false,
    false,
    false,
    true
);

expect_err!(
    heater_supply_and_heater_fault,
    BF::HEATER_SUPPLY | BF::HEATER_FAULT,
    false,
    false,
    false,
    false,
    true,
    true
);

expect_err!(
    all,
    BF::WRITE_REG_INVALID
        | BF::READ_REG_INVALID
        | BF::MEASMODE_INVALID
        | BF::MAX_RESISTANCE
        | BF::HEATER_SUPPLY
        | BF::HEATER_FAULT,
    true,
    true,
    true,
    true,
    true,
    true
);