refs #840, update (ground) elevation via remote aircraft provider

This commit is contained in:
Klaus Basan
2016-12-21 22:34:21 +01:00
committed by Mathew Sutcliffe
parent 667009c85e
commit be297d8ccf
9 changed files with 110 additions and 128 deletions

View File

@@ -52,6 +52,8 @@ namespace BlackCore
const CAircraftModelList modelSet(this->m_modelSet); // Models for this matching
const MatchingMode mode = this->m_matchingMode;
static const QString format("hh:mm:ss.zzz");
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("--- Matching: %1 ---").arg(QDateTime::currentDateTimeUtc().toString(format)));
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Matching uses model set of %1 models").arg(modelSet.size()), getLogCategories());
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Input model: '%1' '%2'").arg(remoteAircraft.getCallsignAsString(), remoteAircraft.getModel().toQString()), getLogCategories());
@@ -108,6 +110,7 @@ namespace BlackCore
Q_ASSERT_X(matchedModel.hasModelString(), Q_FUNC_INFO, "Missing model string");
Q_ASSERT_X(matchedModel.getModelType() != CAircraftModel::TypeUnknown, Q_FUNC_INFO, "Missing model type");
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("--- Matching end: %1 ---").arg(QDateTime::currentDateTimeUtc().toString(format)));
return matchedModel;
}
@@ -482,34 +485,46 @@ namespace BlackCore
return matchedModel;
}
CAircraftModel CAircraftMatcher::getClosestMatchScoreImplementation(MatchingMode mode, const BlackMisc::Simulation::CAircraftModelList &modelSet, const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const
CAircraftModel CAircraftMatcher::getClosestMatchScoreImplementation(MatchingMode mode, const CAircraftModelList &modelSet, const CSimulatedAircraft &remoteAircraft, CStatusMessageList *log) const
{
Q_UNUSED(mode);
CAircraftModelList usedModelSet;
// VTOL
ScoredModels map;
if (remoteAircraft.isVtol() && modelSet.contains(&CAircraftModel::isVtol, true))
{
usedModelSet = modelSet.findBy(&CAircraftModel::isVtol, true);
}
else
{
usedModelSet = modelSet;
}
// first decide what set to use for scoring, it should not be too large
ScoredModels map;
if (remoteAircraft.hasAircraftAndAirlineDesignator() && modelSet.containsModelsWithAircraftAndAirlineDesignator(remoteAircraft.getAircraftIcaoCodeDesignator(), remoteAircraft.getAirlineIcaoCodeDesignator()))
if (remoteAircraft.hasAircraftAndAirlineDesignator() && usedModelSet.containsModelsWithAircraftAndAirlineDesignator(remoteAircraft.getAircraftIcaoCodeDesignator(), remoteAircraft.getAirlineIcaoCodeDesignator()))
{
const CAircraftModelList byAircraftAndAirline(modelSet.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), remoteAircraft.getAirlineIcaoCode()));
const CAircraftModelList byAircraftAndAirline(usedModelSet.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), remoteAircraft.getAirlineIcaoCode()));
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Using reduced set of %1 models by aircraft/airline ICAOs '%2'/'%3' for scoring").arg(byAircraftAndAirline.size()).arg(remoteAircraft.getAircraftIcaoCode().getDesignatorDbKey(), remoteAircraft.getAirlineIcaoCode().getVDesignatorDbKey()), getLogCategories());
map = byAircraftAndAirline.scoreFull(remoteAircraft.getModel());
}
else if (remoteAircraft.hasAircraftDesignator() && modelSet.contains(&CAircraftModel::getAircraftIcaoCodeDesignator, remoteAircraft.getAircraftIcaoCodeDesignator()))
else if (remoteAircraft.hasAircraftDesignator() && usedModelSet.contains(&CAircraftModel::getAircraftIcaoCodeDesignator, remoteAircraft.getAircraftIcaoCodeDesignator()))
{
const CAircraftModelList byAircraft(modelSet.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), CAirlineIcaoCode()));
const CAircraftModelList byAircraft(usedModelSet.findByIcaoDesignators(remoteAircraft.getAircraftIcaoCode(), CAirlineIcaoCode()));
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Using reduced set of %1 models by aircraft ICAO '%2' for scoring").arg(byAircraft.size()).arg(remoteAircraft.getAircraftIcaoCode().getDesignatorDbKey()), getLogCategories());
map = byAircraft.scoreFull(remoteAircraft.getModel());
}
else if (remoteAircraft.getAircraftIcaoCode().hasValidCombinedType() && modelSet.containsCombinedType(remoteAircraft.getAircraftIcaoCode().getCombinedType()))
else if (remoteAircraft.getAircraftIcaoCode().hasValidCombinedType() && usedModelSet.containsCombinedType(remoteAircraft.getAircraftIcaoCode().getCombinedType()))
{
const CAircraftModelList byAircraft(modelSet.findByCombinedType(remoteAircraft.getAircraftIcaoCode().getCombinedType()));
const CAircraftModelList byAircraft(usedModelSet.findByCombinedType(remoteAircraft.getAircraftIcaoCode().getCombinedType()));
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Using reduced set of %1 models by combined type '%2' for scoring").arg(byAircraft.size()).arg(remoteAircraft.getAircraftIcaoCode().getCombinedType()), getLogCategories());
map = byAircraft.scoreFull(remoteAircraft.getModel());
}
else
{
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Using full set with %1 models").arg(modelSet.size()), getLogCategories());
map = modelSet.scoreFull(remoteAircraft.getModel());
CMatchingUtils::addLogDetailsToList(log, remoteAircraft, QString("Using set with %1 models").arg(usedModelSet.size()), getLogCategories());
map = usedModelSet.scoreFull(remoteAircraft.getModel());
}
CAircraftModel matchedModel;

View File

@@ -21,13 +21,14 @@
#include "blackmisc/aviation/comsystem.h"
#include "blackmisc/aviation/modulator.h"
#include "blackmisc/aviation/transponder.h"
#include "blackmisc/geo/elevationplane.h"
#include "blackmisc/network/user.h"
#include "blackmisc/network/voicecapabilities.h"
#include "blackmisc/pq/units.h"
#include "blackmisc/compare.h"
#include "blackmisc/iterator.h"
#include "blackmisc/json.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/network/user.h"
#include "blackmisc/network/voicecapabilities.h"
#include "blackmisc/pq/units.h"
#include "blackmisc/propertyindexvariantmap.h"
#include "blackmisc/range.h"
#include "blackmisc/sequence.h"
@@ -195,15 +196,15 @@ namespace BlackCore
Q_ASSERT_X(receiver, Q_FUNC_INFO, "Missing receiver");
// bind does not allow to define connection type, so we use receiver as workaround
QMetaObject::Connection c1 = connect(this, &CAirspaceMonitor::addedAircraftSituation, receiver, situationSlot);
const QMetaObject::Connection c1 = connect(this, &CAirspaceMonitor::addedAircraftSituation, receiver, situationSlot);
Q_ASSERT_X(c1, Q_FUNC_INFO, "connect failed");
QMetaObject::Connection c2 = connect(this, &CAirspaceMonitor::addedAircraftParts, receiver, partsSlot);
const QMetaObject::Connection c2 = connect(this, &CAirspaceMonitor::addedAircraftParts, receiver, partsSlot);
Q_ASSERT_X(c2, Q_FUNC_INFO, "connect failed");
QMetaObject::Connection c3 = connect(this, &CAirspaceMonitor::removedAircraft, receiver, removedAircraftSlot);
const QMetaObject::Connection c3 = connect(this, &CAirspaceMonitor::removedAircraft, receiver, removedAircraftSlot);
Q_ASSERT_X(c3, Q_FUNC_INFO, "connect failed");
// trick is to use the Queued signal here
// analyzer (own thread) -> airspaceAircraftSnapshot -> AirspaceMonitor -> airspaceAircraftSnapshot queued in main thread
QMetaObject::Connection c4 = this->connect(this->m_analyzer, &CAirspaceAnalyzer::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot, Qt::QueuedConnection);
const QMetaObject::Connection c4 = this->connect(this->m_analyzer, &CAirspaceAnalyzer::airspaceAircraftSnapshot, receiver, aircraftSnapshotSlot, Qt::QueuedConnection);
Q_ASSERT_X(c4, Q_FUNC_INFO, "connect failed");
return QList<QMetaObject::Connection>({ c1, c2, c3, c4});
}
@@ -250,6 +251,13 @@ namespace BlackCore
return c > 0;
}
bool CAirspaceMonitor::updateAircraftGroundElevation(const CCallsign &callsign, const CElevationPlane &elevation)
{
QWriteLocker l(&m_lockAircraft);
const int c = m_aircraftInRange.setGroundElevation(callsign, elevation.geodeticHeight());
return c > 0;
}
void CAirspaceMonitor::updateMarkAllAsNotRendered()
{
QWriteLocker l(&m_lockAircraft);
@@ -307,7 +315,7 @@ namespace BlackCore
CCallsignSet searchList(callsigns);
// myself, which is not in the lists below
CSimulatedAircraft myAircraft(getOwnAircraft());
const CSimulatedAircraft myAircraft(getOwnAircraft());
if (!myAircraft.getCallsign().isEmpty() && searchList.contains(myAircraft.getCallsign()))
{
searchList.remove(myAircraft.getCallsign());
@@ -343,7 +351,7 @@ namespace BlackCore
// those are the ones not in range
for (const CCallsign &callsign : searchList)
{
CUserList usersByCallsign = sApp->getWebDataServices()->getUsersForCallsign(callsign);
const CUserList usersByCallsign = sApp->getWebDataServices()->getUsersForCallsign(callsign);
if (usersByCallsign.isEmpty())
{
CUser user;
@@ -663,7 +671,7 @@ namespace BlackCore
{
Q_ASSERT(CThreadUtils::isCurrentThreadObjectThread(this));
if (!this->isConnected()) { return; }
CAtcStationList stationsWithCallsign = this->m_atcStationsOnline.findByCallsign(callsign);
const CAtcStationList stationsWithCallsign = this->m_atcStationsOnline.findByCallsign(callsign);
if (stationsWithCallsign.isEmpty())
{
// new station, init with data from data file
@@ -699,7 +707,7 @@ namespace BlackCore
vm.addValue(CAtcStation::IndexFrequency, frequency);
vm.addValue(CAtcStation::IndexPosition, position);
vm.addValue(CAtcStation::IndexRange, range);
int changed = this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm, true);
const int changed = this->m_atcStationsOnline.applyIfCallsign(callsign, vm, true);
if (changed > 0) { emit this->changedAtcStationsOnline(); }
}
@@ -713,7 +721,7 @@ namespace BlackCore
this->m_otherClients.removeByCallsign(callsign);
if (this->m_atcStationsOnline.containsCallsign(callsign))
{
CAtcStation removedStation = this->m_atcStationsOnline.findFirstByCallsign(callsign);
const CAtcStation removedStation = this->m_atcStationsOnline.findFirstByCallsign(callsign);
this->m_atcStationsOnline.removeByCallsign(callsign);
emit this->changedAtcStationsOnline();
emit this->changedAtcStationOnlineConnectionStatus(removedStation, false);
@@ -933,7 +941,7 @@ namespace BlackCore
int CAirspaceMonitor::updateOnlineStations(const CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues, bool sendSignal)
{
const int c = this->m_atcStationsOnline.applyIf(&CAtcStation::getCallsign, callsign, vm, skipEqualValues);
const int c = this->m_atcStationsOnline.applyIfCallsign(callsign, vm, skipEqualValues);
if (c > 0 && sendSignal)
{
emit this->changedAtcStationsOnline();
@@ -943,7 +951,8 @@ namespace BlackCore
int CAirspaceMonitor::updateBookedStations(const CCallsign &callsign, const CPropertyIndexVariantMap &vm, bool skipEqualValues, bool sendSignal)
{
const int c = this->m_atcStationsBooked.applyIf(&CAtcStation::getCallsign, callsign, vm, skipEqualValues);
// do not used applyFirst here, more stations wit callsign at a time
const int c = this->m_atcStationsBooked.applyIfCallsign(callsign, vm, skipEqualValues);
if (c > 0 && sendSignal)
{
emit this->changedAtcStationsBooked();

View File

@@ -100,6 +100,7 @@ namespace BlackCore
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 updateAircraftRendered(const BlackMisc::Aviation::CCallsign &callsign, bool rendered) override;
virtual bool updateAircraftGroundElevation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Geo::CElevationPlane &elevation) override;
virtual void updateMarkAllAsNotRendered() override;
virtual void enableReverseLookupMessages(bool enabled) override;
virtual bool isReverseLookupMessagesEnabled() const override;

View File

@@ -637,14 +637,17 @@ namespace BlackCore
bool CContextNetwork::updateAircraftRendered(const CCallsign &callsign, bool rendered)
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << rendered; }
bool c = this->m_airspace->updateAircraftRendered(callsign, rendered);
return c;
}
bool CContextNetwork::updateAircraftGroundElevation(const CCallsign &callsign, const CElevationPlane &elevation)
{
return this->m_airspace->updateAircraftGroundElevation(callsign, elevation);
}
void CContextNetwork::updateMarkAllAsNotRendered()
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
this->m_airspace->updateMarkAllAsNotRendered();
}

View File

@@ -84,28 +84,13 @@ namespace BlackCore
//! Destructor
virtual ~CContextNetwork();
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::remoteAircraftSituations
//! \ingroup remoteaircraftprovider
//! @{
virtual BlackMisc::Aviation::CAircraftSituationList remoteAircraftSituations(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::remoteAircraftSituationsCount
//! \ingroup remoteaircraftprovider
virtual int remoteAircraftSituationsCount(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::remoteAircraftParts
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Aviation::CAircraftPartsList remoteAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTimeBefore = -1) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::isRemoteAircraftSupportingParts
//! \ingroup remoteaircraftprovider
virtual bool isRemoteAircraftSupportingParts(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::remoteAircraftSupportingParts
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Aviation::CCallsignSet remoteAircraftSupportingParts() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::connectRemoteAircraftProviderSignals
//! \ingroup remoteaircraftprovider
virtual QList<QMetaObject::Connection> connectRemoteAircraftProviderSignals(
QObject *receiver,
std::function<void(const BlackMisc::Aviation::CAircraftSituation &)> addedSituationSlot,
@@ -113,89 +98,36 @@ namespace BlackCore
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot,
std::function<void(const BlackMisc::Simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
) override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::updateAircraftRendered
//! \ingroup remoteaircraftprovider
virtual bool updateAircraftRendered(const BlackMisc::Aviation::CCallsign &callsign, bool rendered) override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::updateMarkAllAsNotRendered
//! \ingroup remoteaircraftprovider
virtual bool updateAircraftGroundElevation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Geo::CElevationPlane &elevation) override;
virtual void updateMarkAllAsNotRendered() override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getLatestAirspaceAircraftSnapshot
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Simulation::CAirspaceAircraftSnapshot getLatestAirspaceAircraftSnapshot() const override;
//! @}
//! Network library
INetwork *network() const { return m_network; }
public slots:
//! \copydoc IContextNetwork::updateAircraftEnabled
// from context and provider interface
//! \ingroup remoteaircraftprovider
//! @{
virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRendering) override;
//! \copydoc IContextNetwork::updateAircraftModel
//! \ingroup remoteaircraftprovider
virtual bool updateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const BlackMisc::CIdentifier &originator) override;
//! \copydoc IContextNetwork::updateAircraftNetworkModel
//! \ingroup remoteaircraftprovider
virtual bool updateAircraftNetworkModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const BlackMisc::CIdentifier &originator) override;
//! \copydoc IContextNetwork::updateFastPositionEnabled
//! \ingroup remoteaircraftprovider
virtual bool updateFastPositionEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enableFastPositonUpdates) override;
//! \copydoc IContextNetwork::getAtcStationsBooked()
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsBooked() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getAircraftInRange
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Simulation::CSimulatedAircraftList getAircraftInRange() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getAircraftInRangeCallsigns
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Aviation::CCallsignSet getAircraftInRangeCallsigns() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getAircraftInRangeCount
//! \ingroup remoteaircraftprovider
virtual int getAircraftInRangeCount() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getAircraftInRangeForCallsign
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Simulation::CSimulatedAircraft getAircraftInRangeForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getAircraftInRangeModelForCallsign
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Simulation::CAircraftModel getAircraftInRangeModelForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getReverseLookupMessages
//! \ingroup remoteaircraftprovider
virtual BlackMisc::CStatusMessageList getReverseLookupMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::isReverseLookupMessagesEnabled
//! \ingroup remoteaircraftprovider
virtual bool isReverseLookupMessagesEnabled() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::enableReverseLookupMessages
//! \ingroup remoteaircraftprovider
virtual void enableReverseLookupMessages(bool enabled) override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::getAircraftPartsHistory
//! \ingroup remoteaircraftprovider
virtual BlackMisc::CStatusMessageList getAircraftPartsHistory(const BlackMisc::Aviation::CCallsign &callsign) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::remoteAircraftParts
//! \ingroup remoteaircraftprovider
virtual BlackMisc::Aviation::CAircraftPartsList getRemoteAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, qint64 cutoffTimeValuesBefore) const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::isAircraftPartsHistoryEnabled
//! \ingroup remoteaircraftprovider
virtual bool isAircraftPartsHistoryEnabled() const override;
//! \copydoc BlackMisc::Simulation::IRemoteAircraftProvider::enableAircraftPartsHistory
//! \ingroup remoteaircraftprovider
virtual void enableAircraftPartsHistory(bool enabled) override;
//! @}
//! In transition state, e.g. connecting, disconnecting.
//! \details In such a state it is advisable to wait until an end state (connected/disconnected) is reached
@@ -211,6 +143,9 @@ namespace BlackCore
//! \copydoc IContextNetwork::parseCommandLine
virtual bool parseCommandLine(const QString &commandLine, const BlackMisc::CIdentifier &originator) override;
//! \copydoc IContextNetwork::getAtcStationsBooked()
virtual BlackMisc::Aviation::CAtcStationList getAtcStationsBooked() const override;
//! \copydoc IContextNetwork::readAtcBookingsFromSource()
virtual void readAtcBookingsFromSource() const override;