#![deny(unsafe_code)]
#![no_std]
pub mod measurements;
pub mod nmea;
pub mod quantity;
pub use measurements::Measurements;
use quantity::{Angle, Distance, Pressure, Temperature};
const SEA_LVL_PRESSURE: Pressure = Pressure::from_pascals(101300.25);
const GRAVITATIONAL_CONST: f32 = 0.0065;
pub fn calculate_altitude(pressure: Pressure) -> Distance {
let base = pressure / SEA_LVL_PRESSURE;
let exponent = 1.0 / 5.255;
Distance::from_meters(44330.0 * (1.0 - (libm::powf(base, exponent))))
}
pub fn calculate_altitude_with_temperature(
temperature: Temperature,
pressure: Pressure,
) -> Distance {
let base = SEA_LVL_PRESSURE / pressure;
let exponent = 1.0 / 5.257;
Distance::from_meters(
((libm::powf(base, exponent) - 1.0) * temperature.as_kelvins()) / GRAVITATIONAL_CONST,
)
}
pub fn roll(y: f32, z: f32) -> Angle {
Angle::from_radians(libm::atan2f(y, z))
}
pub fn pitch(x: f32, y: f32, z: f32) -> Angle {
Angle::from_radians(libm::atan2f(-x, libm::sqrtf(y * y + z * z)))
}