bmi160 1.1.0

Platform-agnostic Rust driver for the BMI160 inertial measurement unit (IMU).
Documentation
use bmi160::{Data, MagnetometerData, Sensor3DData, Sensor3DDataScaled, SensorSelector};
mod common;
use crate::common::{destroy_i2c, destroy_spi, new_i2c, new_spi, Register, DEV_ADDR};
use embedded_hal_mock::eh1::i2c::Transaction as I2cTrans;

#[test]
fn can_create_and_destroy_i2c() {
    let imu = new_i2c(&[]);
    destroy_i2c(imu);
}

#[test]
fn can_create_and_destroy_spi() {
    let imu = new_spi(&[]);
    destroy_spi(imu);
}

#[test]
fn can_get_chip_id() {
    let chip_id = 0b11010001;
    let mut imu = new_i2c(&[I2cTrans::write_read(
        DEV_ADDR,
        vec![Register::CHIPID],
        vec![chip_id],
    )]);
    let id = imu.chip_id().unwrap();
    assert_eq!(chip_id, id);
    destroy_i2c(imu);
}

mod get_sensor_data {
    use bmi160::DataScaled;

    use super::*;

    const EMPTY: Data = Data {
        accel: None,
        gyro: None,
        magnet: None,
        time: None,
    };

    const BUFFER: [u8; 23] = [
        0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
    ];

    #[test]
    fn empty() {
        let mut imu = new_i2c(&[]);
        let result = imu.data(SensorSelector::new()).unwrap();
        assert_eq!(result, EMPTY);
        destroy_i2c(imu);
    }

    #[test]
    fn all() {
        let mut imu = new_i2c(&[I2cTrans::write_read(
            DEV_ADDR,
            vec![Register::MAG],
            BUFFER.to_vec(),
        )]);
        let result = imu.data(SensorSelector::all()).unwrap();
        let expected = Data {
            magnet: Some(MagnetometerData {
                axes: Sensor3DData {
                    x: 0x0201,
                    y: 0x0403,
                    z: 0x0605,
                },
                hall_resistence: 0x0807,
            }),
            gyro: Some(Sensor3DData {
                x: 0x0A09,
                y: 0x0C0B,
                z: 0x0E0D,
            }),
            accel: Some(Sensor3DData {
                x: 0x100F,
                y: 0x1211,
                z: 0x1413,
            }),
            time: Some(0x171615),
        };
        assert_eq!(result, expected);
        destroy_i2c(imu);
    }

    #[test]
    fn accel_and_time() {
        let mut imu = new_i2c(&[I2cTrans::write_read(
            DEV_ADDR,
            vec![Register::ACC],
            BUFFER[14..].to_vec(),
        )]);
        let result = imu.data(SensorSelector::new().accel().time()).unwrap();
        let expected = Data {
            magnet: None,
            gyro: None,
            accel: Some(Sensor3DData {
                x: 0x100F,
                y: 0x1211,
                z: 0x1413,
            }),
            time: Some(0x171615),
        };
        assert_eq!(result, expected);
        destroy_i2c(imu);
    }

    #[test]
    fn only_gyro() {
        let mut imu = new_i2c(&[I2cTrans::write_read(
            DEV_ADDR,
            vec![Register::GYR],
            BUFFER[8..14].to_vec(),
        )]);
        let result = imu.data(SensorSelector::new().gyro()).unwrap();
        let expected = Data {
            magnet: None,
            gyro: Some(Sensor3DData {
                x: 0x0A09,
                y: 0x0C0B,
                z: 0x0E0D,
            }),
            accel: None,
            time: None,
        };
        assert_eq!(result, expected);
        destroy_i2c(imu);
    }

    #[test]
    fn all_scaled() {
        let mut imu = new_i2c(&[I2cTrans::write_read(
            DEV_ADDR,
            vec![Register::MAG],
            BUFFER.to_vec(),
        )]);
        let result = imu.data_scaled(SensorSelector::all()).unwrap();
        let expected = DataScaled {
            magnet: Some(MagnetometerData {
                axes: Sensor3DData {
                    x: 0x0201,
                    y: 0x0403,
                    z: 0x0605,
                },
                hall_resistence: 0x0807,
            }),
            gyro: Some(Sensor3DDataScaled {
                x: 0x0A09 as f32 * (1. / 16.4),
                y: 0x0C0B as f32 * (1. / 16.4),
                z: 0x0E0D as f32 * (1. / 16.4),
            }),
            accel: Some(Sensor3DDataScaled {
                x: 0x100F as f32 * (1. / 16384.),
                y: 0x1211 as f32 * (1. / 16384.),
                z: 0x1413 as f32 * (1. / 16384.),
            }),
            time: Some(0x171615),
        };
        assert_eq!(result, expected);
        destroy_i2c(imu);
    }
}