Ref T92, added missing ICAO query

* some formatting
* sendInitialPilotQueries no longer a slot
This commit is contained in:
Klaus Basan
2017-06-23 17:38:16 +02:00
parent 1956a27b19
commit 28a2ca6ad6
2 changed files with 27 additions and 25 deletions

View File

@@ -126,12 +126,13 @@ namespace BlackCore
CSimulatedAircraft CAirspaceMonitor::getAircraftInRangeForCallsign(const CCallsign &callsign) const CSimulatedAircraft CAirspaceMonitor::getAircraftInRangeForCallsign(const CCallsign &callsign) const
{ {
return this->getAircraftInRange().findFirstByCallsign(callsign); const CSimulatedAircraft aircraft = this->getAircraftInRange().findFirstByCallsign(callsign);
return aircraft;
} }
CAircraftModel CAirspaceMonitor::getAircraftInRangeModelForCallsign(const CCallsign &callsign) const CAircraftModel CAirspaceMonitor::getAircraftInRangeModelForCallsign(const CCallsign &callsign) const
{ {
CSimulatedAircraft aircraft(getAircraftInRangeForCallsign(callsign)); // threadsafe const CSimulatedAircraft aircraft(getAircraftInRangeForCallsign(callsign)); // threadsafe
return aircraft.getModel(); return aircraft.getModel();
} }
@@ -455,6 +456,7 @@ namespace BlackCore
// we only query ICAO if we have none yet // we only query ICAO if we have none yet
// it happens sometimes with some FSD servers (e.g our testserver) a first query is skipped // it happens sometimes with some FSD servers (e.g our testserver) a first query is skipped
// Important: this is only a workaround and must not replace a sendInitialPilotQueries
if (!aircraft.hasAircraftDesignator()) if (!aircraft.hasAircraftDesignator())
{ {
this->m_network->sendIcaoCodesQuery(cs); this->m_network->sendIcaoCodesQuery(cs);
@@ -652,7 +654,7 @@ namespace BlackCore
this->m_otherClients = clients; this->m_otherClients = clients;
} }
void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign, int trial) void CAirspaceMonitor::sendReadyForModelMatching(const CCallsign &callsign, int trial)
{ {
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "missing callsign"); Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "missing callsign");
if (!this->isConnected()) { return; } if (!this->isConnected()) { return; }
@@ -665,7 +667,7 @@ namespace BlackCore
this->addReverseLookupMessage(callsign, "Wait for further data"); this->addReverseLookupMessage(callsign, "Wait for further data");
QTimer::singleShot(1500, this, [ = ]() QTimer::singleShot(1500, this, [ = ]()
{ {
this->ps_sendReadyForModelMatching(callsign, trial + 1); this->sendReadyForModelMatching(callsign, trial + 1); // recursive
}); });
return; return;
} }
@@ -805,7 +807,7 @@ namespace BlackCore
void CAirspaceMonitor::ps_customFSInnPacketReceived(const CCallsign &callsign, const QString &airlineIcaoDesignator, const QString &aircraftIcaoDesignator, const QString &combinedAircraftType, const QString &modelString) void CAirspaceMonitor::ps_customFSInnPacketReceived(const CCallsign &callsign, const QString &airlineIcaoDesignator, const QString &aircraftIcaoDesignator, const QString &combinedAircraftType, const QString &modelString)
{ {
// it can happen this is called before any questions // it can happen this is called before any queries
// ES sends FsInn packets for callsigns such as ACCGER1, which are hard to distinguish // ES sends FsInn packets for callsigns such as ACCGER1, which are hard to distinguish
// 1) checking if they are already in the list checks again ATC position which is safe // 1) checking if they are already in the list checks again ATC position which is safe
// 2) the ATC alike callsign check is guessing // 2) the ATC alike callsign check is guessing
@@ -820,7 +822,7 @@ namespace BlackCore
if (!isAircraft && !isAtc) if (!isAircraft && !isAtc)
{ {
// we have no idea what we are dealing with, so we store it // we have no idea what we are dealing with, so we store it
FsInnPacket fsInn(aircraftIcaoDesignator, airlineIcaoDesignator, combinedAircraftType, modelString); const FsInnPacket fsInn(aircraftIcaoDesignator, airlineIcaoDesignator, combinedAircraftType, modelString);
m_tempFsInnPackets[callsign] = fsInn; m_tempFsInnPackets[callsign] = fsInn;
return; return;
} }
@@ -838,7 +840,7 @@ namespace BlackCore
this->addOrUpdateAircraftInRange(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, "", modelString, CAircraftModel::TypeFSInnData, pReverseLookupMessages); this->addOrUpdateAircraftInRange(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, "", modelString, CAircraftModel::TypeFSInnData, pReverseLookupMessages);
this->addReverseLookupMessages(callsign, reverseLookupMessages); this->addReverseLookupMessages(callsign, reverseLookupMessages);
this->ps_sendReadyForModelMatching(callsign); this->sendReadyForModelMatching(callsign); // from FSInn
} }
} }
@@ -858,7 +860,7 @@ namespace BlackCore
const CClient client = this->getOtherClientOrDefaultForCallsign(callsign); const CClient client = this->getOtherClientOrDefaultForCallsign(callsign);
this->addOrUpdateAircraftInRange(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, livery, client.getQueriedModelString(), CAircraftModel::TypeQueriedFromNetwork, pReverseLookupMessages); this->addOrUpdateAircraftInRange(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, livery, client.getQueriedModelString(), CAircraftModel::TypeQueriedFromNetwork, pReverseLookupMessages);
this->addReverseLookupMessages(callsign, reverseLookupMessages); this->addReverseLookupMessages(callsign, reverseLookupMessages);
this->ps_sendReadyForModelMatching(callsign); this->sendReadyForModelMatching(callsign); // ICAO codes received
emit this->requestedNewAircraft(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, livery); emit this->requestedNewAircraft(callsign, aircraftIcaoDesignator, airlineIcaoDesignator, livery);
} }
@@ -1036,7 +1038,7 @@ namespace BlackCore
aircraft.setSituation(situation); aircraft.setSituation(situation);
aircraft.setTransponder(transponder); aircraft.setTransponder(transponder);
this->addNewAircraftInRange(aircraft); this->addNewAircraftInRange(aircraft);
this->sendInitialPilotQueries(callsign, !hasFsInnPacket); this->sendInitialPilotQueries(callsign, true, !hasFsInnPacket);
// new client, there is a chance it has been already created by custom packet // new client, there is a chance it has been already created by custom packet
const CClient c(callsign); const CClient c(callsign);
@@ -1128,7 +1130,7 @@ namespace BlackCore
bool removedCallsign = false; bool removedCallsign = false;
{ {
QWriteLocker l(&m_lockAircraft); QWriteLocker l(&m_lockAircraft);
int c = this->m_aircraftInRange.removeByCallsign(callsign); const int c = this->m_aircraftInRange.removeByCallsign(callsign);
removedCallsign = c > 0; removedCallsign = c > 0;
} }
if (removedCallsign) { emit this->removedAircraft(callsign); } if (removedCallsign) { emit this->removedAircraft(callsign); }
@@ -1146,7 +1148,7 @@ namespace BlackCore
void CAirspaceMonitor::ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull) void CAirspaceMonitor::ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull)
{ {
Q_ASSERT(CThreadUtils::isCurrentThreadObjectThread(this)); Q_ASSERT(CThreadUtils::isCurrentThreadObjectThread(this));
CSimulatedAircraft simAircraft(getAircraftInRangeForCallsign(callsign)); const CSimulatedAircraft simAircraft(getAircraftInRangeForCallsign(callsign));
// If we are not yet synchronized, we throw away any incremental packet // If we are not yet synchronized, we throw away any incremental packet
if (!simAircraft.hasValidCallsign()) { return; } if (!simAircraft.hasValidCallsign()) { return; }
@@ -1163,7 +1165,7 @@ namespace BlackCore
{ {
// incremental update // incremental update
parts = this->remoteAircraftParts(callsign).frontOrDefault(); parts = this->remoteAircraftParts(callsign).frontOrDefault();
QJsonObject config = applyIncrementalObject(parts.toJson(), jsonObject); const QJsonObject config = applyIncrementalObject(parts.toJson(), jsonObject);
parts.convertFromJson(config); parts.convertFromJson(config);
} }
} }
@@ -1183,9 +1185,9 @@ namespace BlackCore
if (m_enableAircraftPartsHistory) if (m_enableAircraftPartsHistory)
{ {
QJsonDocument doc(jsonObject); const QJsonDocument doc(jsonObject);
QString partsAsString = doc.toJson(QJsonDocument::Compact); const QString partsAsString = doc.toJson(QJsonDocument::Compact);
CStatusMessage message(getLogCategories(), BlackMisc::CStatusMessage::SeverityInfo, callsign.isEmpty() ? callsign.toQString() + ": " + partsAsString.trimmed() : partsAsString.trimmed()); const CStatusMessage message(getLogCategories(), BlackMisc::CStatusMessage::SeverityInfo, callsign.isEmpty() ? callsign.toQString() + ": " + partsAsString.trimmed() : partsAsString.trimmed());
if (this->m_aircraftPartsHistory.contains(callsign)) if (this->m_aircraftPartsHistory.contains(callsign))
{ {
CStatusMessageList &msgs = this->m_aircraftPartsHistory[callsign]; CStatusMessageList &msgs = this->m_aircraftPartsHistory[callsign];
@@ -1264,17 +1266,17 @@ namespace BlackCore
this->m_network->sendServerQuery(callsign); this->m_network->sendServerQuery(callsign);
} }
void CAirspaceMonitor::sendInitialPilotQueries(const CCallsign &callsign, bool withFsInn) void CAirspaceMonitor::sendInitialPilotQueries(const CCallsign &callsign, bool withIcaoQuery, bool withFsInn)
{ {
if (!this->isConnected()) { return; } if (!this->isConnected()) { return; }
if (withIcaoQuery) { this->m_network->sendIcaoCodesQuery(callsign); }
if (withFsInn) { this->m_network->sendCustomFsinnQuery(callsign); }
this->m_network->sendFrequencyQuery(callsign); this->m_network->sendFrequencyQuery(callsign);
this->m_network->sendRealNameQuery(callsign); this->m_network->sendRealNameQuery(callsign);
this->m_network->sendCapabilitiesQuery(callsign); this->m_network->sendCapabilitiesQuery(callsign);
this->m_network->sendServerQuery(callsign); this->m_network->sendServerQuery(callsign);
if (withFsInn)
{
this->m_network->sendCustomFsinnQuery(callsign);
}
} }
bool CAirspaceMonitor::isConnected() const bool CAirspaceMonitor::isConnected() const

View File

@@ -280,7 +280,7 @@ namespace BlackCore
void sendInitialAtcQueries(const BlackMisc::Aviation::CCallsign &callsign); void sendInitialAtcQueries(const BlackMisc::Aviation::CCallsign &callsign);
//! Network queries for pilots //! Network queries for pilots
void sendInitialPilotQueries(const BlackMisc::Aviation::CCallsign &callsign, bool withFsInn); void sendInitialPilotQueries(const BlackMisc::Aviation::CCallsign &callsign, bool withIcaoQuery, bool withFsInn);
//! Connected with network? //! Connected with network?
bool isConnected() const; bool isConnected() const;
@@ -333,6 +333,10 @@ namespace BlackCore
//! Call ps_customFSInnPacketReceived with stored packet //! Call ps_customFSInnPacketReceived with stored packet
void recallFsInnPacket(const BlackMisc::Aviation::CCallsign &callsign); void recallFsInnPacket(const BlackMisc::Aviation::CCallsign &callsign);
//! Send the information if aircraft and(!) client are available
//! \note it can take some time to obtain all data for model matching, so function recursively calls itself if something is still missing (trial)
void sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial = 1);
//! Reverse lookup messages //! Reverse lookup messages
//! \threadsafe //! \threadsafe
void addReverseLookupMessages(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::CStatusMessageList &messages); void addReverseLookupMessages(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::CStatusMessageList &messages);
@@ -361,10 +365,6 @@ namespace BlackCore
//! Create ATC station, this is the only place where an online ATC station should be added //! Create ATC station, this is the only place where an online ATC station should be added
void ps_atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency, const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &range); void ps_atcPositionUpdate(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency, const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &range);
//! Send the information if aircraft and(!) client are available
//! \note it can take some time to obtain all data for model matching, so function recursively calls itself if something is still missing (trial)
void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial = 1);
//! Receive FSInn packet //! Receive FSInn packet
//! \remark This can happen even without a query before //! \remark This can happen even without a query before
void ps_customFSInnPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineIcaoDesignator, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &modelString); void ps_customFSInnPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineIcaoDesignator, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &modelString);