bmi160 1.1.0

Platform-agnostic Rust driver for the BMI160 inertial measurement unit (IMU).
Documentation
use bmi160::{AccelerometerPowerMode, GyroscopePowerMode, MagnetometerPowerMode, SensorPowerMode};
mod common;
use crate::common::{destroy_i2c, new_i2c, Register, DEV_ADDR};
use embedded_hal_mock::eh1::i2c::Transaction as I2cTrans;

macro_rules! get_pm_test {
    ($name:ident, $pmu:expr, $accel:ident, $gyro:ident, $magnet:ident) => {
        #[test]
        fn $name() {
            let mut imu = new_i2c(&[I2cTrans::write_read(
                DEV_ADDR,
                vec![Register::PMU_STATUS],
                vec![$pmu],
            )]);
            let pm = imu.power_mode().unwrap();
            assert_eq!(
                SensorPowerMode {
                    accel: AccelerometerPowerMode::$accel,
                    gyro: GyroscopePowerMode::$gyro,
                    magnet: MagnetometerPowerMode::$magnet,
                },
                pm
            );
            destroy_i2c(imu);
        }
    };
}

mod get_pm {
    use super::*;
    get_pm_test!(pm_all_normal, 0b0001_0101, Normal, Normal, Normal);
    get_pm_test!(pm_all_suspend, 0, Suspend, Suspend, Suspend);
    get_pm_test!(accel_lp, 0b0010_0101, LowPower, Normal, Normal);
    get_pm_test!(gyro_fast_start, 0b0001_1101, Normal, FastStartUp, Normal);
    get_pm_test!(magnet_lp, 0b0001_0110, Normal, Normal, LowPower);
}

macro_rules! set_pm_test {
    ($name:ident, $method:ident, $st:ident::$variant:ident, $cmd:expr) => {
        #[test]
        fn $name() {
            let mut imu = new_i2c(&[I2cTrans::write(DEV_ADDR, vec![Register::CMD, $cmd])]);
            imu.$method($st::$variant).unwrap();
            destroy_i2c(imu);
        }
    };
}

macro_rules! set_accel_pm_test {
    ($name:ident, $variant:ident, $cmd:expr) => {
        set_pm_test!(
            $name,
            set_accel_power_mode,
            AccelerometerPowerMode::$variant,
            $cmd
        );
    };
}
set_accel_pm_test!(set_accel_pm_susp, Suspend, 0b0001_0000);
set_accel_pm_test!(set_accel_pm_norm, Normal, 0b0001_0001);
set_accel_pm_test!(set_accel_pm_lowp, LowPower, 0b0001_0010);

macro_rules! set_gyro_pm_test {
    ($name:ident, $variant:ident, $cmd:expr) => {
        set_pm_test!(
            $name,
            set_gyro_power_mode,
            GyroscopePowerMode::$variant,
            $cmd
        );
    };
}
set_gyro_pm_test!(set_gyro_pm_susp, Suspend, 0b0001_0100);
set_gyro_pm_test!(set_gyro_pm_norm, Normal, 0b0001_0101);
set_gyro_pm_test!(set_gyro_pm_lowp, FastStartUp, 0b0001_0111);

macro_rules! set_magnet_pm_test {
    ($name:ident, $variant:ident, $cmd:expr) => {
        set_pm_test!(
            $name,
            set_magnet_power_mode,
            MagnetometerPowerMode::$variant,
            $cmd
        );
    };
}
set_magnet_pm_test!(set_magnet_pm_susp, Suspend, 0b0001_1000);
set_magnet_pm_test!(set_magnet_pm_norm, Normal, 0b0001_1001);
set_magnet_pm_test!(set_magnet_pm_lowp, LowPower, 0b0001_1010);