My solution
#![deny(unsafe_code)]
#![no_main]
#![no_std]
#[allow(unused_imports)]
use aux16::{entry, iprint, iprintln, prelude::*, I16x3, Sensitivity};
use m::Float;
#[entry]
fn main() -> ! {
const SENSITIVITY: f32 = 12. / (1 << 14) as f32;
const THRESHOLD: f32 = 0.5;
let (mut lsm303dlhc, mut delay, mono_timer, mut itm) = aux16::init();
lsm303dlhc.set_accel_sensitivity(Sensitivity::G12).unwrap();
let measurement_time = mono_timer.frequency().0; // 1 second in ticks
let mut instant = None;
let mut max_g = 0.;
loop {
let g_x = f32::from(lsm303dlhc.accel().unwrap().x).abs() * SENSITIVITY;
match instant {
None => {
// If acceleration goes above a threshold, we start measuring
if g_x > THRESHOLD {
iprintln!(&mut itm.stim[0], "START!");
max_g = g_x;
instant = Some(mono_timer.now());
}
}
// Still measuring
Some(ref instant) if instant.elapsed() < measurement_time => {
if g_x > max_g {
max_g = g_x;
}
}
_ => {
// Report max value
iprintln!(&mut itm.stim[0], "Max acceleration: {}g", max_g);
// Measurement done
instant = None;
// Reset
max_g = 0.;
}
}
delay.delay_ms(50_u8);
}
}