From 66b661fe9c9d47adda4652630ff043759693d2c3 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 26 Mar 2018 20:50:05 +0200 Subject: [PATCH] Ref T259, Ref T243 added number of parts/situations and last modified timestamp * the spline interpolator might need the timestamp to create a new interpolant * number of parts/situations is for info only --- src/blackcore/context/contextnetworkimpl.cpp | 46 ++++++++++--- src/blackcore/context/contextnetworkimpl.h | 4 ++ .../simulation/remoteaircraftprovider.cpp | 67 +++++++++++++++++-- .../simulation/remoteaircraftprovider.h | 36 ++++++++++ .../simulatoremulatedmonitordialog.cpp | 6 +- 5 files changed, 140 insertions(+), 19 deletions(-) diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index 5a1ba99d7..cfb81b16e 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -545,31 +545,31 @@ namespace BlackCore CSimulatedAircraft CContextNetwork::getAircraftInRangeForCallsign(const CCallsign &callsign) const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return m_airspace->getAircraftInRangeForCallsign(callsign); } CAircraftModel CContextNetwork::getAircraftInRangeModelForCallsign(const CCallsign &callsign) const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return m_airspace->getAircraftInRangeModelForCallsign(callsign); } CStatusMessageList CContextNetwork::getReverseLookupMessages(const CCallsign &callsign) const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return m_airspace->getReverseLookupMessages(callsign); } bool CContextNetwork::isReverseLookupMessagesEnabled() const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return m_airspace->isReverseLookupMessagesEnabled(); } void CContextNetwork::enableReverseLookupMessages(bool enabled) { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << enabled; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << enabled; } if (m_airspace->isReverseLookupMessagesEnabled() == enabled) { return; } m_airspace->enableReverseLookupMessages(enabled); emit CContext::changedLogOrDebugSettings(); @@ -577,38 +577,62 @@ namespace BlackCore CStatusMessageList CContextNetwork::getAircraftPartsHistory(const CCallsign &callsign) const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return m_airspace->getAircraftPartsHistory(callsign); } CAircraftPartsList CContextNetwork::getRemoteAircraftParts(const CCallsign &callsign, qint64 cutoffTimeValuesBefore) const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return m_airspace->remoteAircraftParts(callsign, cutoffTimeValuesBefore); } int CContextNetwork::getRemoteAircraftSupportingPartsCount() const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return m_airspace->getRemoteAircraftSupportingPartsCount(); } bool CContextNetwork::isAircraftPartsHistoryEnabled() const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return m_airspace->isAircraftPartsHistoryEnabled(); } void CContextNetwork::enableAircraftPartsHistory(bool enabled) { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << enabled; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << enabled; } m_airspace->enableAircraftPartsHistory(enabled); emit CContext::changedLogOrDebugSettings(); } + int CContextNetwork::aircraftSituationsAdded() const + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + return m_airspace->aircraftSituationsAdded(); + } + + int CContextNetwork::aircraftPartsAdded() const + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + return m_airspace->aircraftPartsAdded(); + } + + qint64 CContextNetwork::situationsLastModified(const CCallsign &callsign) const + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + return m_airspace->situationsLastModified(callsign); + } + + qint64 CContextNetwork::partsLastModified(const CCallsign &callsign) const + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + return m_airspace->partsLastModified(callsign); + } + CAtcStation CContextNetwork::getOnlineStationForCallsign(const CCallsign &callsign) const { - if (this->isDebugEnabled()) { CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return m_airspace->getAtcStationsOnline().findFirstByCallsign(callsign); } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index cba26475c..4a92b0a25 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -130,6 +130,10 @@ namespace BlackCore virtual int getRemoteAircraftSupportingPartsCount() const override; virtual bool isAircraftPartsHistoryEnabled() const override; virtual void enableAircraftPartsHistory(bool enabled) override; + virtual int aircraftSituationsAdded() const override; + virtual int aircraftPartsAdded() const override; + virtual qint64 situationsLastModified(const BlackMisc::Aviation::CCallsign &callsign) const override; + virtual qint64 partsLastModified(const BlackMisc::Aviation::CCallsign &callsign) const override; //! @} //! In transition state, e.g. connecting, disconnecting. diff --git a/src/blackmisc/simulation/remoteaircraftprovider.cpp b/src/blackmisc/simulation/remoteaircraftprovider.cpp index 81e3aedb5..6ec4947be 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.cpp +++ b/src/blackmisc/simulation/remoteaircraftprovider.cpp @@ -121,8 +121,8 @@ namespace BlackMisc } // locked members - { QWriteLocker l(&m_lockParts); m_partsByCallsign.clear(); m_aircraftWithParts.clear(); } - { QWriteLocker l(&m_lockSituations); m_situationsByCallsign.clear(); } + { QWriteLocker l(&m_lockParts); m_partsByCallsign.clear(); m_aircraftWithParts.clear(); m_partsAdded = 0; m_partsLastModified.clear(); } + { QWriteLocker l(&m_lockSituations); m_situationsByCallsign.clear(); m_situationsAdded = 0; m_situationsLastModified.clear(); } { QWriteLocker l(&m_lockPartsHistory); m_aircraftPartsHistory.clear(); } { QWriteLocker l(&m_lockMessages); m_reverseLookupMessages.clear(); } { QWriteLocker l(&m_lockAircraft); m_aircraftInRange.clear(); } @@ -164,8 +164,13 @@ namespace BlackMisc void CRemoteAircraftProvider::storeAircraftSituation(const CAircraftSituation &situation) { + if (situation.getCallsign().isEmpty()) { return; } + const qint64 ts = QDateTime::currentMSecsSinceEpoch(); + // list from new to old QWriteLocker lock(&m_lockSituations); + m_situationsAdded++; + m_situationsLastModified[situation.getCallsign()] = ts; CAircraftSituationList &situationList = m_situationsByCallsign[situation.getCallsign()]; if (situationList.isEmpty()) { @@ -187,9 +192,12 @@ namespace BlackMisc if (callsign.isEmpty()) { return; } // list sorted from new to old + const qint64 ts = QDateTime::currentMSecsSinceEpoch(); CAircraftPartsList correctiveParts; { QWriteLocker lock(&m_lockParts); + m_partsAdded++; + m_partsLastModified[callsign] = ts; CAircraftPartsList &partsList = m_partsByCallsign[callsign]; partsList.push_frontKeepLatestFirstAdjustOffset(parts, IRemoteAircraftProvider::MaxPartsPerCallsign); @@ -207,7 +215,8 @@ namespace BlackMisc { QWriteLocker lock(&m_lockSituations); CAircraftSituationList &situationList = m_situationsByCallsign[callsign]; - situationList.adjustGroundFlag(parts); + const int c = situationList.adjustGroundFlag(parts); + if (c > 0) { m_situationsLastModified[callsign] = ts; } } } @@ -418,6 +427,30 @@ namespace BlackMisc m_enableAircraftPartsHistory = enabled; } + int CRemoteAircraftProvider::aircraftSituationsAdded() const + { + QReadLocker l(&m_lockSituations); + return m_situationsAdded; + } + + qint64 CRemoteAircraftProvider::situationsLastModified(const CCallsign &callsign) const + { + QReadLocker l(&m_lockSituations); + return m_situationsLastModified.value(callsign, -1); + } + + qint64 CRemoteAircraftProvider::partsLastModified(const CCallsign &callsign) const + { + QReadLocker l(&m_lockParts); + return m_partsLastModified.value(callsign, -1); + } + + int CRemoteAircraftProvider::aircraftPartsAdded() const + { + QReadLocker l(&m_lockParts); + return m_partsAdded; + } + bool CRemoteAircraftProvider::isAircraftInRange(const CCallsign &callsign) const { if (callsign.isEmpty()) { return false; } @@ -456,8 +489,8 @@ namespace BlackMisc bool CRemoteAircraftProvider::removeAircraft(const CCallsign &callsign) { - { QWriteLocker l1(&m_lockParts); m_partsByCallsign.remove(callsign); m_aircraftWithParts.remove(callsign); } - { QWriteLocker l2(&m_lockSituations); m_situationsByCallsign.remove(callsign); } + { QWriteLocker l1(&m_lockParts); m_partsByCallsign.remove(callsign); m_aircraftWithParts.remove(callsign); m_partsLastModified.remove(callsign); } + { QWriteLocker l2(&m_lockSituations); m_situationsByCallsign.remove(callsign); m_situationsLastModified.remove(callsign); } { QWriteLocker l4(&m_lockPartsHistory); m_aircraftPartsHistory.remove(callsign); } bool removedCallsign = false; { @@ -576,6 +609,30 @@ namespace BlackMisc this->provider()->updateMarkAllAsNotRendered(); } + int CRemoteAircraftAware::aircraftSituationsAdded() const + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->aircraftSituationsAdded(); + } + + int CRemoteAircraftAware::aircraftPartsAdded() const + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->aircraftPartsAdded(); + } + + qint64 CRemoteAircraftAware::situationsLastModified(const CCallsign &callsign) const + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->situationsLastModified(callsign); + } + + qint64 CRemoteAircraftAware::partsLastModified(const CCallsign &callsign) const + { + Q_ASSERT_X(this->provider(), Q_FUNC_INFO, "No object available"); + return this->provider()->partsLastModified(callsign); + } + bool CRemoteAircraftAware::isRemoteAircraftSupportingParts(const CCallsign &callsign) 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 668e00607..7bda3b5e0 100644 --- a/src/blackmisc/simulation/remoteaircraftprovider.h +++ b/src/blackmisc/simulation/remoteaircraftprovider.h @@ -171,6 +171,22 @@ namespace BlackMisc //! \threadsafe virtual void enableAircraftPartsHistory(bool enabled) = 0; + //! Number of situations added + //! \threadsafe + virtual int aircraftSituationsAdded() const = 0; + + //! Number of parts added + //! \threadsafe + virtual int aircraftPartsAdded() const = 0; + + //! When last modified + //! \threadsafe + virtual qint64 situationsLastModified(const Aviation::CCallsign &callsign) const = 0; + + //! When last modified + //! \threadsafe + virtual qint64 partsLastModified(const Aviation::CCallsign &callsign) const = 0; + //! Destructor virtual ~IRemoteAircraftProvider() {} @@ -239,6 +255,10 @@ namespace BlackMisc virtual CStatusMessageList getAircraftPartsHistory(const Aviation::CCallsign &callsign) const override; virtual bool isAircraftPartsHistoryEnabled() const override; virtual void enableAircraftPartsHistory(bool enabled) override; + virtual int aircraftSituationsAdded() const override; + virtual int aircraftPartsAdded() const override; + virtual qint64 situationsLastModified(const Aviation::CCallsign &callsign) const override; + virtual qint64 partsLastModified(const Aviation::CCallsign &callsign) const override; virtual QList connectRemoteAircraftProviderSignals( QObject *receiver, std::function addedSituationSlot, @@ -338,10 +358,14 @@ namespace BlackMisc CSituationsPerCallsign m_situationsByCallsign; //!< situations, for performance reasons per callsign, thread safe access required CPartsPerCallsign m_partsByCallsign; //!< parts, for performance reasons per callsign, thread safe access required Aviation::CCallsignSet m_aircraftWithParts; //!< aircraft supporting parts, thread safe access required + int m_situationsAdded = 0; //!< total number of situations added + int m_partsAdded = 0; //!< total number of parts added CSimulatedAircraftList m_aircraftInRange; //!< aircraft, thread safe access required QMap m_reverseLookupMessages; QMap m_aircraftPartsHistory; + QMap m_situationsLastModified; + QMap m_partsLastModified; bool m_enableReverseLookupMsgs = false; //!< shall we log. information about the matching process bool m_enableAircraftPartsHistory = true; //!< shall we keep a history of aircraft parts @@ -421,6 +445,18 @@ namespace BlackMisc //! \copydoc IRemoteAircraftProvider::updateMarkAllAsNotRendered void updateMarkAllAsNotRendered(); + //! \copydoc IRemoteAircraftProvider::aircraftSituationsAdded + int aircraftSituationsAdded() const; + + //! \copydoc IRemoteAircraftProvider::aircraftPartsAdded + int aircraftPartsAdded() const; + + //! \copydoc IRemoteAircraftProvider::situationsLastModified + qint64 situationsLastModified(const Aviation::CCallsign &callsign) const; + + //! \copydoc IRemoteAircraftProvider::partsLastModified + qint64 partsLastModified(const Aviation::CCallsign &callsign) const; + //! Set remote aircraft provider void setRemoteAircraftProvider(IRemoteAircraftProvider *remoteAircraftProvider) { this->setProvider(remoteAircraftProvider); } diff --git a/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp b/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp index c3ceda257..b249d024b 100644 --- a/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp +++ b/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp @@ -204,9 +204,9 @@ namespace BlackSimPlugin { if (!m_simulator) { return; } ui->le_PhysicallyAddedAircraft->setText(QString::number(m_simulator->getStatisticsPhysicallyAddedAircraft())); - ui->le_PhysicallyRemovedAircraft->setText(QString::number(m_simulator->getStatisticsPhysicallyRemovedAircraft())); - // ui->le_SituationAdded->setText(QString::number(m_simulator->getStatisticsSituationAdded())); - // ui->le_PartsAdded->setText(QString::number(m_simulator->getStatisticsPartsAdded())); + ui->le_PhysicallyRemovedAircraft->setText(QString::number(m_simulator->aircraftSituationsAdded())); + ui->le_SituationAdded->setText(QString::number(m_simulator->aircraftSituationsAdded())); + ui->le_PartsAdded->setText(QString::number(m_simulator->aircraftPartsAdded())); ui->le_AircraftRendered->setText(QString::number(m_simulator->m_renderedAircraft.size())); ui->le_PartsEnabledAircraft->setText(QString::number(m_simulator->getRemoteAircraftSupportingPartsCount())); }