Skip to content

Commit bc12c4e

Browse files
authored
Merge pull request #30 from natemara/master
Add Altimeter trait and default implementaiton
2 parents 4037bfe + f1d83ff commit bc12c4e

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

src/sensors/mod.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ pub trait Thermometer {
3737

3838
/// Get a temperature from the sensor in degrees celsius
3939
///
40-
/// Returns Some(temperature) if available, otherwise returns
41-
/// None
40+
/// Returns `Ok(temperature)` if available, otherwise returns `Err(Self::Error)`
4241
fn temperature_celsius(&mut self) -> Result<f32, Self::Error>;
4342
}
4443

@@ -48,7 +47,31 @@ pub trait Barometer {
4847

4948
/// Get a pressure reading from the sensor in kPa
5049
///
51-
/// Returns Some(temperature) if avialable, otherwise returns
52-
/// None
50+
/// Returns `Ok(temperature)` if avialable, otherwise returns `Err(Self::Error)`
5351
fn pressure_kpa(&mut self) -> Result<f32, Self::Error>;
5452
}
53+
54+
/// Trait for sensors that provide access to altitude readings
55+
pub trait Altimeter {
56+
type Error: Error;
57+
58+
/// Get an altitude reading from the sensor in meters, relative to the pressure in kPa at
59+
/// sea level
60+
///
61+
/// Returns `Ok(altitude)` if available, otherwise returns `Err(Self::Error)`
62+
fn altitude_meters(&mut self, sea_level_kpa: f32) -> Result<f32, Self::Error>;
63+
}
64+
65+
impl<T> Altimeter for T
66+
where T: Barometer
67+
{
68+
type Error = <Self as Barometer>::Error;
69+
70+
fn altitude_meters(&mut self, sea_level_kpa: f32) -> Result<f32, Self::Error> {
71+
let pressure = try!(self.pressure_kpa()) * 1000.;
72+
let sea_level_pa = sea_level_kpa * 1000.;
73+
74+
let altitude = 44330. * (1. - (pressure / sea_level_pa).powf(0.1903));
75+
Ok(altitude)
76+
}
77+
}

0 commit comments

Comments
 (0)