Skip to content

Commit 62a5ff9

Browse files
author
Nate Mara
committed
Add Altimeter trait and default implementaiton
This creates a trait for Altimeter sensors, providing altitude readings in meters. There is also a default implementation specified for any type that implements Barometer.
1 parent 4037bfe commit 62a5ff9

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/sensors/mod.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,28 @@ pub trait Barometer {
5252
/// None
5353
fn pressure_kpa(&mut self) -> Result<f32, Self::Error>;
5454
}
55+
56+
/// Trait for sensors that provide access to altitude readings
57+
pub trait Altimeter {
58+
type Error: Error;
59+
60+
/// Get an altitude reading from the sensor in meters, relative to the pressure in kPa at
61+
/// sea level
62+
///
63+
/// Returns `Ok(altitude)` if available, otherwise returns `Err(Self::Error)`
64+
fn altitude_meters(&mut self, sea_level_kpa: f32) -> Result<f32, Self::Error>;
65+
}
66+
67+
impl<T> Altimeter for T
68+
where T: Barometer
69+
{
70+
type Error = <Self as Barometer>::Error;
71+
72+
fn altitude_meters(&mut self, sea_level_kpa: f32) -> Result<f32, Self::Error> {
73+
let pressure = try!(self.pressure_kpa()) * 1000.;
74+
let sea_level_pa = sea_level_kpa * 1000.;
75+
76+
let altitude = 44330. * (1. - (pressure / sea_level_pa).powf(0.1903));
77+
Ok(altitude)
78+
}
79+
}

0 commit comments

Comments
 (0)