From adeea182da647402fdc714cade0e1a9b9c53b8e2 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 27 Apr 2018 03:14:22 +0200 Subject: [PATCH] Ref T261, provider support for CG/elevation update --- src/blackcore/context/contextnetworkimpl.cpp | 9 ++- src/blackcore/context/contextnetworkimpl.h | 1 + .../simulation/remoteaircraftprovider.cpp | 63 ++++++++++++++----- .../simulation/remoteaircraftprovider.h | 17 +++-- 4 files changed, 69 insertions(+), 21 deletions(-) diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index b32ffbd9d..bcbeed103 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -711,7 +711,7 @@ namespace BlackCore bool CContextNetwork::updateFastPositionEnabled(const CCallsign &callsign, bool enableFastPositonUpdates) { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << enableFastPositonUpdates; } - bool c = m_airspace->updateFastPositionEnabled(callsign, enableFastPositonUpdates); + const bool c = m_airspace->updateFastPositionEnabled(callsign, enableFastPositonUpdates); if (c) { CSimulatedAircraft aircraft(this->getAircraftInRangeForCallsign(callsign)); @@ -721,6 +721,13 @@ namespace BlackCore return c; } + bool CContextNetwork::updateCG(const Aviation::CCallsign &callsign, const CLength &cg) + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << cg.valueRoundedWithUnit(1); } + const bool c = m_airspace->updateCG(callsign, cg); + return c; + } + void CContextNetwork::requestAtcBookingsUpdate() const { if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index 97ba53224..0dbb04f9a 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -115,6 +115,7 @@ namespace BlackCore virtual bool updateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const BlackMisc::CIdentifier &originator) override; virtual bool updateAircraftNetworkModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const BlackMisc::CIdentifier &originator) override; virtual bool updateFastPositionEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enableFastPositonUpdates) override; + virtual bool updateCG(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &cg) override; virtual BlackMisc::Simulation::CSimulatedAircraftList getAircraftInRange() const override; virtual BlackMisc::Aviation::CCallsignSet getAircraftInRangeCallsigns() const override; virtual int getAircraftInRangeCount() const override; diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index 41c14d7d4..c3d618309 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -12,16 +12,30 @@ #include "blackmisc/logmessage.h" #include "blackmisc/json.h" #include "blackmisc/verify.h" +#include "blackconfig/buildconfig.h" using namespace BlackMisc::Aviation; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Geo; using namespace BlackMisc::Json; +using namespace BlackConfig; namespace BlackMisc { namespace Simulation { + CAircraftSituationChange IRemoteAircraftProvider::remoteAircraftSituationChange(const CCallsign &callsign) const + { + const CAircraftSituationList situations(this->remoteAircraftSituations(callsign)); + if (situations.isEmpty()) { return CAircraftSituationChange::null(); } + if (CBuildConfig::isLocalDeveloperDebugBuild()) + { + Q_ASSERT_X(situations.isSortedAdjustedLatestFirstWithoutNullPositions(), Q_FUNC_INFO, "Expect latest first"); + } + const CAircraftSituationChange change = CAircraftSituationChange(situations, true, true); + return change; + } + const CLogCategoryList &CRemoteAircraftProvider::getLogCategories() { static const CLogCategoryList cats { CLogCategory::matching(), CLogCategory::network() }; @@ -182,21 +196,28 @@ namespace BlackMisc const qint64 ts = QDateTime::currentMSecsSinceEpoch(); // for testing only - CAircraftSituation situationOs(situation); - this->testAddAltitudeOffsetToSituation(situationOs); + CAircraftSituation situationOffset(situation); + this->testAddAltitudeOffsetToSituation(situationOffset); + + // verify + if (CBuildConfig::isLocalDeveloperDebugBuild()) + { + BLACK_VERIFY_X(situation.getTimeOffsetMs() > 0, Q_FUNC_INFO, "Missing offset"); + } // list from new to old QWriteLocker lock(&m_lockSituations); m_situationsAdded++; m_situationsLastModified[cs] = ts; CAircraftSituationList &situationList = m_situationsByCallsign[cs]; - if (situationList.isEmpty()) + const int situations = situationList.size(); + if (situations < 1) { - situationList.prefillLatestAdjustedFirst(situationOs, IRemoteAircraftProvider::MaxSituationsPerCallsign); + situationList.prefillLatestAdjustedFirst(situationOffset, IRemoteAircraftProvider::MaxSituationsPerCallsign); } else { - situationList.push_frontKeepLatestFirstAdjustOffset(situationOs, IRemoteAircraftProvider::MaxSituationsPerCallsign); + situationList.push_frontKeepLatestFirstAdjustOffset(situationOffset, IRemoteAircraftProvider::MaxSituationsPerCallsign); } // unify all inbound ground information @@ -206,8 +227,11 @@ namespace BlackMisc } // check sort order - Q_ASSERT_X(situationList.isSortedAdjustedLatestFirst(), Q_FUNC_INFO, "wrong sort order"); - Q_ASSERT_X(situationList.size() <= IRemoteAircraftProvider::MaxSituationsPerCallsign, Q_FUNC_INFO, "Wrong size"); + if (CBuildConfig::isLocalDeveloperDebugBuild()) + { + BLACK_VERIFY_X(situationList.isSortedAdjustedLatestFirstWithoutNullPositions(), Q_FUNC_INFO, "wrong sort order"); + BLACK_VERIFY_X(situationList.size() <= IRemoteAircraftProvider::MaxSituationsPerCallsign, Q_FUNC_INFO, "Wrong size"); + } } void CRemoteAircraftProvider::storeAircraftParts(const CCallsign &callsign, const CAircraftParts &parts, bool removeOutdated) @@ -356,23 +380,17 @@ namespace BlackMisc } int CRemoteAircraftProvider::updateAircraftGroundElevation(const CCallsign &callsign, const CElevationPlane &elevation) - { - return this->updateAircraftGroundElevationExt(callsign, elevation, false, CLength::null(), false); - } - - int CRemoteAircraftProvider::updateAircraftGroundElevationExt(const CCallsign &callsign, const CElevationPlane &elevation, bool isVtol, const CLength &cg, bool autoGuessGnd) { if (!this->isAircraftInRange(callsign)) { return 0; } // update aircraft situation const qint64 ts = QDateTime::currentMSecsSinceEpoch(); + const CAircraftModel model = this->getAircraftInRangeModelForCallsign(callsign); int updated = 0; { QWriteLocker l(&m_lockSituations); - CAircraftSituationList situations = m_situationsByCallsign[callsign]; - updated = autoGuessGnd ? - situations.setGroundElevationCheckedAndGuessGround(elevation, isVtol, cg) : - situations.setGroundElevationChecked(elevation); + CAircraftSituationList &situations = m_situationsByCallsign[callsign]; + updated = situations.setGroundElevationCheckedAndGuessGround(elevation, model); if (updated < 1) { return 0; } m_situationsLastModified[callsign] = ts; } @@ -385,6 +403,13 @@ namespace BlackMisc return updated; // updated situations } + bool CRemoteAircraftProvider::updateCG(const CCallsign &callsign, const CLength &cg) + { + QWriteLocker l(&m_lockAircraft); + const int c = m_aircraftInRange.setCG(callsign, cg); + return c > 0; + } + void CRemoteAircraftProvider::updateMarkAllAsNotRendered() { QWriteLocker l(&m_lockAircraft); @@ -628,6 +653,12 @@ namespace BlackMisc return this->provider()->remoteAircraftSituations(callsign); } + CAircraftSituationChange CRemoteAircraftAware::remoteAircraftSituationChange(const CCallsign &callsign) const + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->remoteAircraftSituationChange(callsign); + } + CAircraftPartsList CRemoteAircraftAware::remoteAircraftParts(const CCallsign &callsign, qint64 cutoffTimeBefore) const { Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); diff --git a/src/blackmisc/simulation/remoteaircraftprovider.h b/src/blackmisc/simulation/remoteaircraftprovider.h index 3ebd5ec89..161000bfd 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -18,6 +18,7 @@ #include "blackmisc/simulation/simulatedaircraftlist.h" #include "blackmisc/aviation/aircraftpartslist.h" #include "blackmisc/aviation/aircraftsituationlist.h" +#include "blackmisc/aviation/aircraftsituationchange.h" #include "blackmisc/aviation/callsignset.h" #include "blackmisc/provider.h" #include "blackmisc/blackmiscexport.h" @@ -105,6 +106,10 @@ namespace BlackMisc //! \threadsafe virtual int remoteAircraftPartsCount(const Aviation::CCallsign &callsign, qint64 cutoffTimeBefore = -1) const = 0; + //! Get the change object for callsign + //! \threadsafe + Aviation::CAircraftSituationChange remoteAircraftSituationChange(const Aviation::CCallsign &callsign) const; + //! Is remote aircraft supporting parts? //! \threadsafe virtual bool isRemoteAircraftSupportingParts(const Aviation::CCallsign &callsign) const = 0; @@ -149,6 +154,10 @@ namespace BlackMisc //! \threadsafe virtual int updateAircraftGroundElevation(const Aviation::CCallsign &callsign, const Geo::CElevationPlane &elevation) = 0; + //! Update the CG + //! \threadsafe + virtual bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg) = 0; + //! Get reverse lookup meesages //! \threadsafe virtual CStatusMessageList getReverseLookupMessages(const Aviation::CCallsign &callsign) const = 0; @@ -253,6 +262,7 @@ namespace BlackMisc virtual bool updateFastPositionEnabled(const Aviation::CCallsign &callsign, bool enableFastPositonUpdates) override; virtual bool updateAircraftRendered(const Aviation::CCallsign &callsign, bool rendered) override; virtual int updateAircraftGroundElevation(const Aviation::CCallsign &callsign, const Geo::CElevationPlane &elevation) override; + virtual bool updateCG(const Aviation::CCallsign &callsign, const PhysicalQuantities::CLength &cg) override; virtual void updateMarkAllAsNotRendered() override; virtual CStatusMessageList getAircraftPartsHistory(const Aviation::CCallsign &callsign) const override; virtual bool isAircraftPartsHistoryEnabled() const override; @@ -356,10 +366,6 @@ namespace BlackMisc //! \threadsafe void storeAircraftSituation(const Aviation::CAircraftSituation &situation); - //! An extended of IRemoteAircraftProvider::updateAircraftGroundElevation version which allows also guessing of ground - //! \sa IRemoteAircraftProvider::updateAircraftGroundElevation - int updateAircraftGroundElevationExt(const Aviation::CCallsign &callsign, const Geo::CElevationPlane &elevation, bool isVtol, const PhysicalQuantities::CLength &cg, bool autoGuessGnd); - //! Store an aircraft part //! \remark latest parts are kept first //! \threadsafe @@ -437,6 +443,9 @@ namespace BlackMisc //! \copydoc IRemoteAircraftProvider::remoteAircraftPartsCount int remoteAircraftPartsCount(const Aviation::CCallsign &callsign, qint64 cutoffTimeBefore = -1) const; + //! \copydoc IRemoteAircraftProvider::remoteAircraftSituationChange + Aviation::CAircraftSituationChange remoteAircraftSituationChange(const Aviation::CCallsign &callsign) const; + //! \copydoc IRemoteAircraftProvider::remoteAircraftSupportingParts Aviation::CCallsignSet remoteAircraftSupportingParts() const;