diff --git a/src/blackmisc/aviation/aircraftsituation.cpp b/src/blackmisc/aviation/aircraftsituation.cpp index 760ebfff1..47cb59eb8 100644 --- a/src/blackmisc/aviation/aircraftsituation.cpp +++ b/src/blackmisc/aviation/aircraftsituation.cpp @@ -310,6 +310,17 @@ namespace BlackMisc return CAircraftSituation::onGroundDetailsToString(this->getOnGroundDetails()); } + bool CAircraftSituation::setOnGroundDetails(CAircraftSituation::OnGroundDetails details) + { + if (details != OnGroundByGuessing) + { + m_onGroundGuessingDetails.clear(); + } + if (this->getOnGroundDetails() == details) { return false; } + m_onGroundDetails = static_cast(details); + return true; + } + bool CAircraftSituation::setOnGroundFromGroundFactorFromInterpolation(double threshold) { this->setOnGroundDetails(OnGroundByInterpolation); @@ -512,12 +523,14 @@ namespace BlackMisc m_correspondingCallsign.setTypeHint(CCallsign::Aircraft); } - bool CAircraftSituation::adjustGroundFlag(const CAircraftParts &parts, double timeDeviationFactor, qint64 *differenceMs) + bool CAircraftSituation::adjustGroundFlag(const CAircraftParts &parts, bool alwaysSetDetails, double timeDeviationFactor, qint64 *differenceMs) { Q_ASSERT_X(timeDeviationFactor >= 0 && timeDeviationFactor <= 1.0, Q_FUNC_INFO, "Expect 0..1"); static const qint64 Max = std::numeric_limits::max(); if (differenceMs) { *differenceMs = Max; } + if (this->getOnGroundDetails() == CAircraftSituation::InFromNetwork) { return false; } + if (alwaysSetDetails) { this->setOnGroundDetails(InFromParts); } const qint64 d = this->getAdjustedTimeDifferenceMs(parts.getAdjustedMSecsSinceEpoch()); const bool adjust = (d >= 0) || qAbs(d) < (timeDeviationFactor * parts.getTimeOffsetMs()); // future or past within deviation range if (!adjust) { return false; } @@ -527,14 +540,16 @@ namespace BlackMisc return true; } - bool CAircraftSituation::adjustGroundFlag(const CAircraftPartsList &partsList, double timeDeviationFactor, qint64 *differenceMs) + bool CAircraftSituation::adjustGroundFlag(const CAircraftPartsList &partsList, bool alwaysSetDetails, double timeDeviationFactor, qint64 *differenceMs) { Q_ASSERT_X(timeDeviationFactor >= 0 && timeDeviationFactor <= 1.0, Q_FUNC_INFO, "Expect 0..1"); - if (this->getOnGroundDetails() == CAircraftSituation::InFromNetwork) { return false; } - if (partsList.isEmpty()) { return false; } - static const qint64 Max = std::numeric_limits::max(); if (differenceMs) { *differenceMs = Max; } + + if (this->getOnGroundDetails() == CAircraftSituation::InFromNetwork) { return false; } + if (alwaysSetDetails) { this->setOnGroundDetails(InFromParts); } + if (partsList.isEmpty()) { return false; } + CAircraftParts bestParts; bool adjust = false; qint64 bestDistance = Max; diff --git a/src/blackmisc/aviation/aircraftsituation.h b/src/blackmisc/aviation/aircraftsituation.h index f2f501a06..9e1717119 100644 --- a/src/blackmisc/aviation/aircraftsituation.h +++ b/src/blackmisc/aviation/aircraftsituation.h @@ -197,7 +197,7 @@ namespace BlackMisc const QString &getOnDetailsAsString() const; //! On ground details - void setOnGroundDetails(CAircraftSituation::OnGroundDetails details) { m_onGroundDetails = static_cast(details); } + bool setOnGroundDetails(CAircraftSituation::OnGroundDetails details); //! Set on ground as interpolated from ground fatcor bool setOnGroundFromGroundFactorFromInterpolation(double threshold = 0.5); @@ -320,14 +320,14 @@ namespace BlackMisc //! \param alwaysSetDetails mark as CAircraftSituation::InFromParts regardless of parts //! \param timeDeviationFactor 0..1 (of offset time) small deviations from time are accepted //! \param differenceMs returns time difference - bool adjustGroundFlag(const CAircraftParts &parts, double timeDeviationFactor = 0.1, qint64 *differenceMs = nullptr); + bool adjustGroundFlag(const CAircraftParts &parts, bool alwaysSetDetails, double timeDeviationFactor = 0.1, qint64 *differenceMs = nullptr); //! Transfer ground flag from parts list //! \param partsList containing the gnd flag //! \param alwaysSetDetails mark as CAircraftSituation::InFromParts regardless of parts //! \param timeDeviationFactor 0..1 (of offset time) small deviations from time are accepted //! \param differenceMs returns time difference - bool adjustGroundFlag(const CAircraftPartsList &partsList, double timeDeviationFactor = 0.1, qint64 *differenceMs = nullptr); + bool adjustGroundFlag(const CAircraftPartsList &partsList, bool alwaysSetDetails, double timeDeviationFactor = 0.1, qint64 *differenceMs = nullptr); //! Get flag indicating this is an interim position update bool isInterim() const { return m_isInterim; } diff --git a/src/blackmisc/aviation/aircraftsituationlist.cpp b/src/blackmisc/aviation/aircraftsituationlist.cpp index 22242fd99..2714f93ff 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.cpp +++ b/src/blackmisc/aviation/aircraftsituationlist.cpp @@ -48,6 +48,7 @@ namespace BlackMisc int c = 0; for (CAircraftSituation &situation : *this) { + situation.setOnGroundDetails(CAircraftSituation::InFromParts); if (situation.adjustGroundFlag(parts, timeDeviationFactor)) { c++; }; } return c; @@ -92,5 +93,29 @@ namespace BlackMisc } return false; } + + bool CAircraftSituationList::containsOnGroundDetails(CAircraftSituation::OnGroundDetails details) const + { + return this->contains(&CAircraftSituation::getOnGroundDetails, details); + } + + bool CAircraftSituationList::areAllOnGroundDetailsSame(CAircraftSituation::OnGroundDetails details) const + { + for (const CAircraftSituation &situation : *this) + { + if (situation.getOnGroundDetails() != details) { return false; } + } + return true; + } + + int CAircraftSituationList::setOnGroundDetails(CAircraftSituation::OnGroundDetails details) + { + int c = 0; + for (CAircraftSituation &situation : *this) + { + if (situation.setOnGroundDetails(details)) { c++; } + } + return c; + } } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircraftsituationlist.h b/src/blackmisc/aviation/aircraftsituationlist.h index b77fbe18b..2b38c7786 100644 --- a/src/blackmisc/aviation/aircraftsituationlist.h +++ b/src/blackmisc/aviation/aircraftsituationlist.h @@ -68,6 +68,15 @@ namespace BlackMisc //! Any situation outside range bool hasGroundElevationOutsideRange(const PhysicalQuantities::CLength &range) const; + + //! Contains on ground details + bool containsOnGroundDetails(CAircraftSituation::OnGroundDetails details) const; + + //! Are all on ground details the same + bool areAllOnGroundDetailsSame(CAircraftSituation::OnGroundDetails details) const; + + //! Set on ground details for all situations + int setOnGroundDetails(CAircraftSituation::OnGroundDetails details); }; } // namespace } // namespace