void GlideRatioComputer::Compute(const MoreData &basic, const DerivedInfo &calculated, VarioInfo &vario_info, const ComputerSettings &settings) { if (!basic.NavAltitudeAvailable()) { Reset(); vario_info.gr = INVALID_GR; vario_info.average_gr = 0; return; } if (!last_location_available) { /* need two consecutive valid locations; if the previous one wasn't valid, skip this iteration and try the next one */ Reset(); vario_info.gr = INVALID_GR; vario_info.average_gr = 0; last_location = basic.location; last_location_available = basic.location_available; last_altitude = basic.nav_altitude; return; } if (!basic.location_available.Modified(last_location_available)) return; auto DistanceFlown = basic.location.DistanceS(last_location); // Glide ratio over ground vario_info.gr = UpdateGR(vario_info.gr, DistanceFlown, last_altitude - basic.nav_altitude, 0.1); if (calculated.flight.flying && !calculated.circling) { if (!gr_calculator_initialised) { gr_calculator_initialised = true; gr_calculator.Initialize(settings); } gr_calculator.Add((int)DistanceFlown, (int)basic.nav_altitude); vario_info.average_gr = gr_calculator.Calculate(); } else gr_calculator_initialised = false; last_location = basic.location; last_location_available = basic.location_available; last_altitude = basic.nav_altitude; }
inline void GlideComputerAirData::GR(const MoreData &basic, const FlyingState &flying, VarioInfo &vario_info) { // Lift / drag instantaneous from vario, updated every reading.. if (basic.total_energy_vario_available && basic.airspeed_available && flying.flying) { vario_info.ld_vario = UpdateGR(vario_info.ld_vario, basic.indicated_airspeed, -basic.total_energy_vario, fixed(0.3)); } else { vario_info.ld_vario = INVALID_GR; } }
inline void GlideComputerAirData::CruiseGR(const MoreData &basic, DerivedInfo &calculated) { if (!calculated.circling && basic.NavAltitudeAvailable()) { if (negative(calculated.cruise_start_time)) { calculated.cruise_start_location = basic.location; calculated.cruise_start_altitude = basic.nav_altitude; calculated.cruise_start_time = basic.time; } else { fixed DistanceFlown = basic.location.Distance(calculated.cruise_start_location); calculated.cruise_gr = UpdateGR(calculated.cruise_gr, DistanceFlown, calculated.cruise_start_altitude - basic.nav_altitude, fixed(0.5)); } } }