void WindComputer::Select(const WindSettings &settings, const NMEAInfo &basic, DerivedInfo &calculated) { if (basic.external_wind_available && settings.use_external_wind) { // external wind available calculated.wind = basic.external_wind; calculated.wind_available = basic.external_wind_available; } else if (settings.manual_wind_available && !settings.IsAutoWindEnabled()) { // manual wind only if available and desired calculated.wind = settings.manual_wind; calculated.wind_available = settings.manual_wind_available; } else if (calculated.estimated_wind_available.Modified(settings.manual_wind_available) && settings.IsAutoWindEnabled()) { // auto wind when available and newer than manual wind calculated.wind = calculated.estimated_wind; calculated.wind_available = calculated.estimated_wind_available; } else if (settings.manual_wind_available && settings.IsAutoWindEnabled()) { // manual wind overrides auto wind if available calculated.wind = settings.manual_wind; calculated.wind_available = settings.manual_wind_available; } else // no wind available calculated.wind_available.Clear(); }
void Profile::Load(const ProfileMap &map, WindSettings &settings) { unsigned auto_wind_mode = settings.GetLegacyAutoWindMode(); if (map.Get(ProfileKeys::AutoWind, auto_wind_mode)) settings.SetLegacyAutoWindMode(auto_wind_mode); }
void WindComputer::Compute(const WindSettings &settings, const GlidePolar &glide_polar, const MoreData &basic, DerivedInfo &calculated) { if (settings.CirclingWindEnabled() && calculated.circling != last_circling) circling_wind.NewFlightMode(calculated); last_circling = calculated.circling; if (!calculated.flight.flying) return; if (settings.CirclingWindEnabled() && calculated.turn_mode == CirclingMode::CLIMB) { CirclingWind::Result result = circling_wind.NewSample(basic); if (result.IsValid()) wind_store.SlotMeasurement(basic, result.wind, result.quality); } if (settings.ZigZagWindEnabled() && basic.airspeed_available && basic.airspeed_real && basic.true_airspeed > glide_polar.GetVTakeoff()) { WindEKFGlue::Result result = wind_ekf.Update(basic, calculated); if (result.quality > 0) { Vector v_wind = Vector(result.wind); wind_store.SlotMeasurement(basic, v_wind, result.quality); } } if (settings.IsAutoWindEnabled()) wind_store.SlotAltitude(basic, calculated); }
void Profile::Load(WindSettings &settings) { unsigned auto_wind_mode = settings.GetLegacyAutoWindMode(); if (Get(szProfileAutoWind, auto_wind_mode)) settings.SetLegacyAutoWindMode(auto_wind_mode); Get(szProfileExternalWind, settings.use_external_wind); }