示例#1
0
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();
}
示例#2
0
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);
}
示例#3
0
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);
}
示例#4
0
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);
}