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::{mode, Ccs811, SlaveAddr};
use embedded_hal_mock::eh1::{
    delay::NoopDelay as NoDelay,
    digital::Mock as PinMock,
    i2c::{Mock as I2cMock, Transaction as I2cTrans},
};

pub const DEV_ADDR: u8 = 0x5A;
pub struct Register {}
#[allow(unused)]
impl Register {
    pub const STATUS: u8 = 0x00;
    pub const MEAS_MODE: u8 = 0x01;
    pub const ALG_RESULT_DATA: u8 = 0x02;
    pub const RAW_DATA: u8 = 0x03;
    pub const ENV_DATA: u8 = 0x05;
    pub const THRESHOLDS: u8 = 0x10;
    pub const BASELINE: u8 = 0x11;
    pub const HW_ID: u8 = 0x20;
    pub const HW_VERSION: u8 = 0x21;
    pub const FW_BOOT_VERSION: u8 = 0x23;
    pub const FW_APP_VERSION: u8 = 0x24;
    pub const ERROR_ID: u8 = 0xE0;
    pub const APP_ERASE: u8 = 0xF1;
    pub const REG_BOOT_APP: u8 = 0xF2;
    pub const APP_VERIFY: u8 = 0xF3;
    pub const APP_START: u8 = 0xF4;
    pub const SW_RESET: u8 = 0xFF;
}

pub struct BitFlags {}
#[allow(unused)]
impl BitFlags {
    pub const DATA_READY: u8 = 1 << 3;
    pub const APP_VALID: u8 = 1 << 4;
    pub const APP_VERIFY: u8 = 1 << 5;
    pub const APP_ERASE: u8 = 1 << 6;
    pub const FW_MODE: u8 = 1 << 7;
    pub const ERROR: u8 = 1;
    pub const WRITE_REG_INVALID: u8 = 1;
    pub const READ_REG_INVALID: u8 = 1 << 1;
    pub const MEASMODE_INVALID: u8 = 1 << 2;
    pub const MAX_RESISTANCE: u8 = 1 << 3;
    pub const HEATER_FAULT: u8 = 1 << 4;
    pub const HEATER_SUPPLY: u8 = 1 << 5;
    pub const INTERRUPT: u8 = 1 << 3;
    pub const THRESH: u8 = 1 << 2;
}

pub fn new(
    transactions: &[I2cTrans],
    pin: PinMock,
) -> Ccs811<I2cMock, PinMock, NoDelay, mode::Boot> {
    Ccs811::new(
        I2cMock::new(transactions),
        SlaveAddr::default(),
        pin,
        NoDelay::new(),
    )
}

pub fn destroy<MODE>(sensor: Ccs811<I2cMock, PinMock, NoDelay, MODE>) {
    let (mut i2c, mut pin, _delay) = sensor.destroy();
    i2c.done();
    pin.done();
}

#[macro_export]
macro_rules! read_status_test {
    ($name:ident, $method:ident, $expected:expr, $value: 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::STATUS],
                vec![$value],
            )];
            let mut sensor = new(&transactions, nwake);
            assert_eq!($expected, sensor.$method().unwrap());
            destroy(sensor);
        }
    };
}

#[macro_export]
macro_rules! assert_error {
    ($result:expr, $error:ident::$variant:ident) => {
        match $result {
            Err($error::$variant) => (),
            _ => panic!("Error not returned."),
        }
    };
}