From d3bdad9ef6e2a3019ce903b35ea39c93fe04bcae Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Sun, 8 Feb 2015 12:42:05 +0100 Subject: [PATCH] refs #321 Handle received aircraft parts in airspace monitor --- src/blackcore/airspace_monitor.cpp | 33 ++++++++++++++++++++++++++++++ src/blackcore/airspace_monitor.h | 1 + 2 files changed, 34 insertions(+) diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index ce5e6e38f..d5875d291 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -325,6 +325,8 @@ namespace BlackCore // apply same to client in aircraft vm.prependIndex(static_cast(CSimulatedAircraft::IndexClient)); this->m_aircraftInRange.applyIf(&CSimulatedAircraft::getCallsign, callsign, vm); + + if (flags & INetwork::SupportsAircraftConfigs) m_network->sendAircraftConfigQuery(callsign); } void CAirspaceMonitor::ps_fsipirCustomPacketReceived(const CCallsign &callsign, const QString &airlineIcao, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &model) @@ -766,4 +768,35 @@ namespace BlackCore if (changed > 0) { emit this->changedAircraftInRange(); } } + void CAirspaceMonitor::ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &incremental, bool isFull) + { + Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + + CSimulatedAircraftList list = this->m_aircraftInRange.findByCallsign(callsign); + // Skip unknown callsigns + if (list.isEmpty()) return; + + CSimulatedAircraft simAircraft = list.front(); + // If we are not yet synchronized, we throw away any incremental packet + if (!simAircraft.isPartsSynchronized() && !isFull) return; + + CAircraftParts parts = m_aircraftParts.findBackByCallsign(callsign); + parts.setCurrentUtcTime(); + parts.setCallsign(callsign); + // update + QJsonObject config = applyIncrementalObject(parts.toJson(), incremental); + parts.convertFromJson(config); + + // store part history + this->m_aircraftParts.insert(parts); + + CPropertyIndexVariantMap vm; + vm.addValue(CAircraft::IndexParts, parts); + vm.addValue(CSimulatedAircraft::IndexPartsSynchronized, true); + + // here I expect always a changed value + this->m_aircraftInRange.applyIfCallsign(callsign, vm); + this->m_aircraftWatchdog.resetCallsign(callsign); + } + } // namespace diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index ae24a9c83..2a9512cd4 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -188,6 +188,7 @@ namespace BlackCore void ps_frequencyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency); void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations); void ps_receivedDataFile(); + void ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &incremental, bool isFull); //! Send the information if aircraft and(!) client are vailable void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial);