bool AirspaceWarning::ChangedState() const { if (expired > expired_last) return true; if ((state_last == WARNING_CLEAR) && (state > WARNING_CLEAR)) return IsAckExpired(); if ((state_last < WARNING_INSIDE) && (state == WARNING_INSIDE)) return IsAckExpired(); return false; }
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; }
static bool HasWarning() { ProtectedAirspaceWarningManager::Lease lease(*airspace_warnings); for (auto i = lease->begin(), end = lease->end(); i != end; ++i) if (i->IsAckExpired()) return true; return false; }
bool AirspaceWarning::WarningLive(const unsigned ack_time, const unsigned dt) { // propagate settings from manager if (acktime_warning == null_acktime) acktime_warning = ack_time; if (acktime_inside == null_acktime) acktime_inside = ack_time; if ((state != WARNING_CLEAR) && (state < state_last) && (state_last == WARNING_INSIDE)) // if inside was acknowledged, consider warning to be acknowledged acktime_warning = std::max(acktime_warning, acktime_inside); if (acktime_warning > dt) acktime_warning-= dt; else acktime_warning = 0; if (acktime_inside > dt) acktime_inside-= dt; else acktime_inside = 0; if (debounce_time > dt) debounce_time-= dt; else debounce_time = 0; expired = IsAckExpired(); if (state == WARNING_CLEAR) return !expired; return true; }
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")); }