kxcj9 0.2.0

Platform-agnostic Rust driver for the KXCJ9 ultra-low-power tri-axis accelerometer.
Documentation
extern crate embedded_hal_mock as hal;
extern crate kxcj9;
use hal::i2c::Transaction as I2cTrans;
use kxcj9::{GScale16, Resolution};

mod common;
use common::{destroy, new_1018, BitFlags, Register, DEV_ADDR};

#[test]
fn can_read_unscaled_8bit() {
    let transactions = [I2cTrans::write_read(
        DEV_ADDR,
        vec![Register::XOUT_L],
        vec![0, 0xAB, 127, 0xCD, 128, 0xEF],
    )];
    let mut sensor = new_1018(&transactions);
    let measurement = sensor.read_unscaled().unwrap();
    assert_eq!(0, measurement.x);
    assert_eq!(127, measurement.y);
    assert_eq!(-128, measurement.z);
    destroy(sensor);
}

#[test]
fn can_read_unscaled_12bit() {
    let transactions = [
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, 0]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BitFlags::RES]),
        I2cTrans::write_read(DEV_ADDR, vec![Register::XOUT_L], vec![1, 0, 255, 3, 255, 7]),
    ];
    let mut sensor = new_1018(&transactions);
    sensor.set_resolution(Resolution::High).unwrap();
    let measurement = sensor.read_unscaled().unwrap();
    assert_eq!(1, measurement.x);
    assert_eq!(1023, measurement.y);
    assert_eq!(2047, measurement.z);
    destroy(sensor);
}

#[test]
fn can_read_unscaled_14bit() {
    use BitFlags as BF;
    let transactions = [
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, 0]),
        I2cTrans::write(
            DEV_ADDR,
            vec![Register::CTRL1, BF::RES | BF::GSEL0 | BF::GSEL1],
        ),
        I2cTrans::write_read(
            DEV_ADDR,
            vec![Register::XOUT_L],
            vec![1, 0, 255, 15, 255, 31],
        ),
    ];
    let mut sensor = new_1018(&transactions);
    sensor.set_scale(GScale16::G16FP).unwrap();
    let measurement = sensor.read_unscaled().unwrap();
    assert_eq!(1, measurement.x);
    assert_eq!(4095, measurement.y);
    assert_eq!(8191, measurement.z);
    destroy(sensor);
}

fn assert_near_positive(a: f32, b: f32) {
    if (a - b).abs() > 0.1 {
        panic!(format!("{} vs {}", a, b));
    }
}

#[test]
#[should_panic]
fn assert_near_can_fail() {
    assert_near_positive(1.0, 2.0)
}

#[test]
fn can_read_8bit_4g_1018() {
    let transactions = [I2cTrans::write_read(
        DEV_ADDR,
        vec![Register::XOUT_L],
        vec![0, 0xAB, 64, 0xCD, 127, 0xEF],
    )];
    let mut sensor = new_1018(&transactions);
    let measurement = sensor.read().unwrap();
    assert_near_positive(0.0, measurement.x);
    assert_near_positive(2.0, measurement.y);
    assert_near_positive(4.0, measurement.z);
    destroy(sensor);
}

#[test]
fn can_read_12bit_8g_1018() {
    use BitFlags as BF;
    let transactions = [
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, 0]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BF::RES]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BF::RES]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BF::RES | BF::GSEL0]),
        I2cTrans::write_read(DEV_ADDR, vec![Register::XOUT_L], vec![1, 0, 255, 3, 255, 7]),
    ];
    let mut sensor = new_1018(&transactions);
    sensor.set_resolution(Resolution::High).unwrap();
    sensor.set_scale(GScale16::G8).unwrap();
    let measurement = sensor.read().unwrap();
    assert_near_positive(0.0, measurement.x);
    assert_near_positive(4.0, measurement.y);
    assert_near_positive(8.0, measurement.z);
    destroy(sensor);
}

#[test]
fn can_read_12bit_16g_1018() {
    use BitFlags as BF;
    let transactions = [
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, 0]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BF::RES]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BF::RES]),
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, BF::RES | BF::GSEL1]),
        I2cTrans::write_read(DEV_ADDR, vec![Register::XOUT_L], vec![1, 0, 255, 3, 255, 7]),
    ];
    let mut sensor = new_1018(&transactions);
    sensor.set_resolution(Resolution::High).unwrap();
    sensor.set_scale(GScale16::G16).unwrap();
    let measurement = sensor.read().unwrap();
    assert_near_positive(0.0, measurement.x);
    assert_near_positive(8.0, measurement.y);
    assert_near_positive(16.0, measurement.z);
    destroy(sensor);
}

#[test]
fn can_read_14bit_16g_1018() {
    use BitFlags as BF;
    let transactions = [
        I2cTrans::write(DEV_ADDR, vec![Register::CTRL1, 0]),
        I2cTrans::write(
            DEV_ADDR,
            vec![Register::CTRL1, BF::RES | BF::GSEL0 | BF::GSEL1],
        ),
        I2cTrans::write_read(
            DEV_ADDR,
            vec![Register::XOUT_L],
            vec![1, 0, 255, 15, 255, 31],
        ),
    ];
    let mut sensor = new_1018(&transactions);
    sensor.set_scale(GScale16::G16FP).unwrap();
    let measurement = sensor.read().unwrap();
    assert_near_positive(0.0, measurement.x);
    assert_near_positive(8.0, measurement.y);
    assert_near_positive(16.0, measurement.z);
    destroy(sensor);
}