std::string MotionPlannerInterface::Plan(MilestonePath& path,const HaltingCondition& cond) { path.edges.clear(); bool foundPath = false; Real lastCheckTime = 0, lastCheckValue = 0; Timer timer; for(int iters=0;iters<cond.maxIters;iters++) { Real t=timer.ElapsedTime(); if(t > cond.timeLimit) { if(foundPath) { //get the final path GetSolution(path); } return "timeLimit"; } //check for cost improvements if(foundPath && t > lastCheckTime + cond.costImprovementPeriod) { GetSolution(path); Real len = path.Length(); if(len < cond.costThreshold) return "costThreshold"; if(lastCheckValue - len < cond.costImprovementThreshold) return "costImprovementThreshold"; lastCheckTime = t; lastCheckValue = len; } //do planning, check if a path is found PlanMore(); if(!foundPath) { if(IsSolved()) { foundPath = true; GetSolution(path); if(cond.foundSolution) { return "foundSolution"; } lastCheckTime = t; lastCheckValue = path.Length(); } } } if(foundPath) { //get the final path GetSolution(path); } return "maxIters"; }
bool AirspaceWarning::operator<(const AirspaceWarning &other) const { // compare bother.ack if (IsAckExpired() != other.IsAckExpired()) // least expired top return IsAckExpired() > other.IsAckExpired(); // compare bother.state if (GetWarningState() != other.GetWarningState()) // most severe top return GetWarningState() > other.GetWarningState(); // state and ack equal, compare bother.time to intersect return GetSolution().elapsed_time < other.GetSolution().elapsed_time; }
void AirspaceWarningMonitor::Check() { const auto &calculated = CommonInterface::Calculated(); if (widget == nullptr && calculated.airspace_warnings.latest == last) return; /* there's a new airspace warning */ last = calculated.airspace_warnings.latest; auto *airspace_warnings = GetAirspaceWarnings(); if (airspace_warnings == nullptr) { HideWidget(); return; } if (!HasPointer()) { /* "classic" list-only view for devices without touch screen */ if (dlgAirspaceWarningVisible()) /* already visible */ return; // un-blank the display, play a sound ResetUserIdle(); PlayResource(_T("IDR_WAV_BEEPBWEEP")); // show airspace warnings dialog if (CommonInterface::GetUISettings().enable_airspace_warning_dialog) dlgAirspaceWarningsShowModal(*airspace_warnings, true); return; } const AbstractAirspace *airspace = nullptr; AirspaceWarning::State state; AirspaceInterceptSolution solution; { const ProtectedAirspaceWarningManager::Lease lease(*airspace_warnings); auto w = lease->begin(); if (w != lease->end() && w->IsAckExpired()) { airspace = &w->GetAirspace(); state = w->GetWarningState(); solution = w->GetSolution(); } } if (airspace == nullptr) { HideWidget(); return; } if (CommonInterface::GetUISettings().enable_airspace_warning_dialog) { /* show airspace warning */ if (widget != nullptr) { if (widget->Update(*airspace, state, solution)) return; HideWidget(); } widget = new AirspaceWarningWidget(*this, *airspace_warnings, *airspace, state, solution); PageActions::SetCustomBottom(widget); } // un-blank the display, play a sound ResetUserIdle(); PlayResource(_T("IDR_WAV_BEEPBWEEP")); }