bmi323-driver 0.1.0

Generic no_std driver for the Bosch BMI323 IMU
Documentation
use crate::registers::{INT_MAP1, INT_MAP2, interrupt_map_location};
use crate::*;

#[test]
fn accel_config_matches_datasheet_example() {
    let config = AccelConfig {
        mode: AccelMode::LowPower,
        average: AverageSamples::Avg2,
        bandwidth: Bandwidth::OdrOver2,
        range: AccelRange::G8,
        odr: OutputDataRate::Hz50,
    };
    assert_eq!(config.to_word(), 0x3127);
}

#[test]
fn gyro_config_matches_datasheet_example() {
    let config = GyroConfig {
        mode: GyroMode::Normal,
        average: AverageSamples::Avg1,
        bandwidth: Bandwidth::OdrOver2,
        range: GyroRange::Dps2000,
        odr: OutputDataRate::Hz800,
    };
    assert_eq!(config.to_word(), 0x404B);
}

#[test]
fn interrupt_map_location_is_stable() {
    assert_eq!(
        interrupt_map_location(InterruptSource::AnyMotion),
        (INT_MAP1, 2)
    );
    assert_eq!(
        interrupt_map_location(InterruptSource::AccelDataReady),
        (INT_MAP2, 10)
    );
}

#[test]
fn step_counter_config_encodes_watermark_and_reset() {
    let config = StepCounterConfig {
        watermark_level: 37,
        reset_counter: true,
    };
    assert_eq!(config.to_word(), 37 | (1 << 10));
}

#[test]
fn step_counter_config_with_watermark_saturates() {
    assert_eq!(
        StepCounterConfig::with_watermark(2048).watermark_level,
        1023
    );
}

#[test]
fn tap_duration_helpers_match_datasheet_scaling() {
    assert_eq!(TapConfig::max_gesture_duration_from_seconds(0.64), 16);
    assert!((TapConfig::short_duration_to_seconds(6) - 0.03).abs() < 0.001);
}

#[test]
fn significant_motion_helpers_match_datasheet_scaling() {
    assert_eq!(SignificantMotionConfig::block_size_from_seconds(5.0), 250);
    assert!(
        (SignificantMotionConfig::peak_to_peak_to_g(SignificantMotionConfig::peak_to_peak_from_g(
            0.5
        )) - 0.5)
            .abs()
            < 0.01
    );
}

#[test]
fn tilt_segment_size_helper_matches_datasheet_scaling() {
    assert_eq!(TiltConfig::segment_size_from_seconds(2.0), 100);
    assert!((TiltConfig::segment_size_to_seconds(100) - 2.0).abs() < 0.001);
}

#[test]
fn alt_accel_config_encodes_expected_fields() {
    let config = AltAccelConfig {
        mode: AccelMode::HighPerformance,
        average: AverageSamples::Avg4,
        odr: OutputDataRate::Hz100,
    };
    assert_eq!(config.to_word(), 0x7208);
}

#[test]
fn alt_status_decodes_active_flags() {
    let status = AltStatus(0x0011);
    assert!(status.accel_uses_alternate());
    assert!(status.gyro_uses_alternate());
}

#[test]
fn alt_accel_switch_profile_builds_expected_defaults() {
    let profile = AltAccelSwitchProfile::low_power_to_high_performance(
        OutputDataRate::Hz25,
        OutputDataRate::Hz200,
        AltConfigSwitchSource::AnyMotion,
        AltConfigSwitchSource::NoMotion,
    );
    assert_eq!(profile.user_accel.mode, AccelMode::LowPower);
    assert_eq!(profile.user_accel.average, AverageSamples::Avg2);
    assert_eq!(profile.alternate_accel.mode, AccelMode::HighPerformance);
    assert!(profile.control.accel_enabled);
    assert!(!profile.control.gyro_enabled);
}

#[test]
fn self_test_selection_encodes_expected_bits() {
    assert_eq!(SelfTestSelection::Accelerometer.to_word(), 0x0001);
    assert_eq!(SelfTestSelection::Gyroscope.to_word(), 0x0002);
    assert_eq!(SelfTestSelection::Both.to_word(), 0x0003);
}

#[test]
fn self_test_detail_decodes_expected_checks() {
    let detail = SelfTestDetail(0x007F);
    assert!(detail.accelerometer_ok());
    assert!(detail.gyroscope_ok());
}