void AirspaceAltitude::SetFlightLevel(const AtmosphericPressure &press) { static constexpr fixed fl_feet_to_m(30.48); if (reference == AltitudeReference::STD) altitude = press.PressureAltitudeToQNHAltitude(flight_level * fl_feet_to_m); }
static bool test_qnh_round() { AtmosphericPressure sp = AtmosphericPressure::Standard().QNHAltitudeToStaticPressure(fixed(100)); AtmosphericPressure pres = AtmosphericPressure::FindQNHFromPressure(sp, fixed(120)); fixed h0 = pres.PressureAltitudeToQNHAltitude(fixed(100)); if (verbose) { printf("%g\n",FIXED_DOUBLE(h0)); } return fabs(h0-fixed(120))<fixed(1); }
static void ComputePressure(NMEAInfo &basic, const AtmosphericPressure qnh) { const bool qnh_available = qnh.IsPlausible(); const bool static_pressure_available = basic.static_pressure_available; const bool pressure_altitude_available = basic.pressure_altitude_available; if (!static_pressure_available) { if (pressure_altitude_available) { basic.static_pressure = AtmosphericPressure::PressureAltitudeToStaticPressure(basic.pressure_altitude); basic.static_pressure_available = basic.pressure_altitude_available; } else if (basic.baro_altitude_available && qnh_available) { basic.static_pressure = qnh.QNHAltitudeToStaticPressure(basic.baro_altitude); basic.static_pressure_available = basic.baro_altitude_available; } } if (!pressure_altitude_available) { if (static_pressure_available) { basic.pressure_altitude = AtmosphericPressure::StaticPressureToPressureAltitude(basic.static_pressure); basic.pressure_altitude_available = basic.static_pressure_available; } else if (basic.baro_altitude_available && qnh_available) { basic.pressure_altitude = qnh.QNHAltitudeToPressureAltitude(basic.baro_altitude); basic.pressure_altitude_available = basic.baro_altitude_available; } } if (qnh_available) { /* if the current pressure and the QNH is known, then true baro altitude should be discarded, because the external device which provided it may have a different QNH setting */ if (static_pressure_available) { basic.baro_altitude = qnh.StaticPressureToQNHAltitude(basic.static_pressure); basic.baro_altitude_available = basic.static_pressure_available; } else if (pressure_altitude_available) { basic.baro_altitude = qnh.PressureAltitudeToQNHAltitude(basic.pressure_altitude); basic.baro_altitude_available = basic.pressure_altitude_available; } } else if (!basic.baro_altitude_available && pressure_altitude_available) /* no QNH, but let's fill in the best fallback value we can get, without setting BaroAltitudeAvailable */ basic.baro_altitude = basic.pressure_altitude; }