1use core::fmt::{Display, Formatter};
9
10use irox_units::units::length::Length;
11
12#[derive(Debug, Copy, Clone, Default, Eq, PartialEq)]
14pub enum AltitudeReferenceFrame {
15 #[default]
17 Unspecified,
18
19 Ellipsoid,
21
22 Geoid,
24
25 Terrain,
27
28 Geocentric,
30
31 SurfaceFeatures,
36
37 PressureAltitude,
39
40 IndicatedAltitude,
42
43 DensityAltitude,
45}
46
47impl AltitudeReferenceFrame {
48 pub fn short_name(&self) -> &'static str {
49 match self {
50 AltitudeReferenceFrame::Unspecified => "UNK",
51 AltitudeReferenceFrame::Ellipsoid => "ELL",
52 AltitudeReferenceFrame::Geoid => "MSL",
53 AltitudeReferenceFrame::Terrain => "AGL",
54 AltitudeReferenceFrame::Geocentric => "GEO",
55 AltitudeReferenceFrame::SurfaceFeatures => "MSA",
56 AltitudeReferenceFrame::PressureAltitude => "PA",
57 AltitudeReferenceFrame::IndicatedAltitude => "IA",
58 AltitudeReferenceFrame::DensityAltitude => "DA",
59 }
60 }
61}
62
63#[derive(Debug, Default, Copy, Clone, PartialEq)]
65pub struct Altitude {
66 value: Length,
67 reference_frame: AltitudeReferenceFrame,
68}
69
70impl Altitude {
71 #[must_use]
72 pub const fn new(value: Length, reference_frame: AltitudeReferenceFrame) -> Altitude {
73 Altitude {
74 value,
75 reference_frame,
76 }
77 }
78
79 #[must_use]
80 pub const fn new_unknown(value: Length) -> Altitude {
81 Altitude::new(value, AltitudeReferenceFrame::Unspecified)
82 }
83
84 #[must_use]
85 pub fn value(&self) -> Length {
86 self.value
87 }
88
89 #[must_use]
90 pub fn reference_frame(&self) -> AltitudeReferenceFrame {
91 self.reference_frame
92 }
93}
94
95impl Display for Altitude {
96 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
97 f.write_fmt(format_args!(
98 "{} {}",
99 self.value,
100 self.reference_frame.short_name()
101 ))
102 }
103}