use std::error::Error;
pub mod adxl345_accelerometer;
pub mod mpl115a2_barometer;
pub mod nunchuck;
#[derive(Debug)]
pub struct AccelerometerSample {
pub x: f32,
pub y: f32,
pub z: f32,
}
pub trait Accelerometer {
type Error: Error;
fn accelerometer_sample(&mut self) -> Result<AccelerometerSample, Self::Error>;
}
pub trait Thermometer {
type Error: Error;
fn temperature_celsius(&mut self) -> Result<f32, Self::Error>;
}
pub trait Barometer {
type Error: Error;
fn pressure_kpa(&mut self) -> Result<f32, Self::Error>;
}
pub trait Altimeter {
type Error: Error;
fn altitude_meters(&mut self, sea_level_kpa: f32) -> Result<f32, Self::Error>;
}
impl<T> Altimeter for T
where T: Barometer
{
type Error = <Self as Barometer>::Error;
fn altitude_meters(&mut self, sea_level_kpa: f32) -> Result<f32, Self::Error> {
let pressure = try!(self.pressure_kpa()) * 1000.;
let sea_level_pa = sea_level_kpa * 1000.;
let altitude = 44330. * (1. - (pressure / sea_level_pa).powf(0.1903));
Ok(altitude)
}
}