Solution 2

#![deny(unsafe_code)] #![no_main] #![no_std] // You'll find this useful ;-) use core::f32::consts::PI; #[allow(unused_imports)] use aux15::{entry, iprint, iprintln, prelude::*, switch_hal::OutputSwitch, Direction, I16x3}; use m::Float; #[entry] fn main() -> ! { let (leds, mut lsm303dlhc, mut delay, _itm) = aux15::init(); let mut leds = leds.into_array(); loop { let I16x3 { x, y, .. } = lsm303dlhc.mag().unwrap(); let theta = (y as f32).atan2(x as f32); // in radians let dir = if theta < -7. * PI / 8. { Direction::North } else if theta < -5. * PI / 8. { Direction::Northwest } else if theta < -3. * PI / 8. { Direction::West } else if theta < -PI / 8. { Direction::Southwest } else if theta < PI / 8. { Direction::South } else if theta < 3. * PI / 8. { Direction::Southeast } else if theta < 5. * PI / 8. { Direction::East } else if theta < 7. * PI / 8. { Direction::Northeast } else { Direction::North }; leds.iter_mut().for_each(|led| led.off().unwrap()); leds[dir as usize].on().unwrap(); delay.delay_ms(100_u8); } }