use std::time::Instant;
use rppal::hal::Delay;
use rppal::i2c::I2c;
use embedded_hal::blocking::delay::*;
use adafruit_nxp::*;
use datafusion_imu::{self as _, Fusion, Mode};
fn main() -> Result<(), SensorError<rppal::i2c::Error>> {
let mut delay = Delay::new();
let i2c = I2c::new().unwrap();
let mut sensor = AdafruitNXP::new(0x8700A, 0x8700B, 0x0021002C, i2c);
let ready = sensor.begin()?;
if !ready {
std::eprintln!("Sensor not detected, check your wiring!");
std::process::exit(1);
}
sensor.set_accel_range(config::AccelMagRange::Range2g)?;
sensor.set_gyro_range(config::GyroRange::Range500dps)?;
sensor.set_accelmag_output_data_rate(config::AccelMagODR::ODR200HZ)?;
sensor.set_gyro_output_data_rate(config::GyroODR::ODR200HZ)?;
sensor.read_data()?;
let acc_x = sensor.accel_sensor.get_scaled_x();
let acc_y = sensor.accel_sensor.get_scaled_y();
let acc_z = sensor.accel_sensor.get_scaled_z();
let gyro_x = sensor.gyro_sensor.get_scaled_x();
let gyro_y = sensor.gyro_sensor.get_scaled_y();
let gyro_z = sensor.gyro_sensor.get_scaled_z();
let mut fusion = Fusion::new(0.05, 20., 50);
fusion.set_mode(Mode::Dof6);
fusion.set_data_dof6(acc_x, acc_y, acc_z, gyro_x, gyro_y, gyro_z);
fusion.init();
let mut distance= 0.0;
let mut old_distance:f32;
let mut counter_reset_distance = 0;
let mut angle_z = 0.0;
let mut old_angle_z: f32;
let mut counter_reset_angle_z = 0;
let mut time = Instant::now();
loop {
let dt = time.elapsed().as_micros() as f32 / 1_000_000.;
time = Instant::now();
fusion.set_old_values(acc_x, acc_y);
sensor.read_data()?;
let acc_x = sensor.accel_sensor.get_scaled_x();
let acc_y = sensor.accel_sensor.get_scaled_y();
let acc_z = sensor.accel_sensor.get_scaled_z();
let gyro_x = sensor.gyro_sensor.get_scaled_x();
let gyro_y = sensor.gyro_sensor.get_scaled_y();
let gyro_z = sensor.gyro_sensor.get_scaled_z();
fusion.set_data_dof6(acc_x, acc_y, acc_z, gyro_x, gyro_y, gyro_z);
old_distance = distance;
old_angle_z = angle_z;
fusion.step(dt);
angle_z = fusion.get_z_angle();
distance = fusion.get_final_distance();
if (old_distance - distance).abs() == 0.0 {
if counter_reset_distance == 500 {
counter_reset_distance = 0;
fusion.reset_distance();
} else {
counter_reset_distance += 1;
}
} else {
counter_reset_distance = 0;
}
if (old_angle_z - angle_z).abs() == 0.0 {
if counter_reset_angle_z == 500 {
counter_reset_angle_z = 0;
fusion.reset_angle_z();
} else {
counter_reset_angle_z += 1;
}
} else {
counter_reset_angle_z = 0;
}
std::println!("Angle Z: {} °", angle_z);
std::println!("Total distance traveled: {} cm", distance);
delay.delay_ms(5_u8);
}
}