/** * Check whether this intersection should be added to, or updated in, the warning manager * * @param airspace Airspace corresponding to current intersection */ void Intersection(const AbstractAirspace& airspace) { if (!airspace.IsActive()) return; // ignore inactive airspaces completely if (!warning_manager.GetConfig().IsClassEnabled(airspace.GetType()) || ExcludeAltitude(airspace)) return; AirspaceWarning *warning = warning_manager.GetWarningPtr(airspace); if (warning == NULL || warning->IsStateAccepted(warning_state)) { AirspaceInterceptSolution solution; if (mode_inside) { airspace.Intercept(state, perf, solution, state.location, state.location); } else { solution = Intercept(airspace, state, perf); } if (!solution.IsValid()) return; if (solution.elapsed_time > max_time) return; if (warning == NULL) warning = warning_manager.GetNewWarningPtr(airspace); warning->UpdateSolution(warning_state, solution); found = true; } }
bool AirspaceWarningManager::UpdateInside(const AircraftState& state, const GlidePolar &glide_polar) { if (!glide_polar.IsValid()) return false; bool found = false; AirspacePredicateAircraftInside condition(state); Airspaces::AirspaceVector results = airspaces.FindInside(state, condition); for (const auto &i : results) { const AbstractAirspace &airspace = i.GetAirspace(); if (!airspace.IsActive()) continue; // ignore inactive airspaces if (!config.IsClassEnabled(airspace.GetType())) continue; AirspaceWarning *warning = GetWarningPtr(airspace); if (warning == nullptr || warning->IsStateAccepted(AirspaceWarning::WARNING_INSIDE)) { GeoPoint c = airspace.ClosestPoint(state.location, GetProjection()); const AirspaceAircraftPerformance perf_glide(glide_polar); AirspaceInterceptSolution solution; airspace.Intercept(state, c, GetProjection(), perf_glide, solution); if (warning == nullptr) warning = GetNewWarningPtr(airspace); warning->UpdateSolution(AirspaceWarning::WARNING_INSIDE, solution); found = true; } } return found; }