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
This commit is contained in:
Klaus Basan
2018-03-26 20:50:05 +02:00
parent 21644c9f24
commit 66b661fe9c
5 changed files with 140 additions and 19 deletions

View File

@@ -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");

View File

@@ -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<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
QObject *receiver,
std::function<void(const Aviation::CAircraftSituation &)> 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<Aviation::CCallsign, CStatusMessageList> m_reverseLookupMessages;
QMap<Aviation::CCallsign, CStatusMessageList> m_aircraftPartsHistory;
QMap<Aviation::CCallsign, qint64> m_situationsLastModified;
QMap<Aviation::CCallsign, qint64> 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); }