From 8f746d59b945cf08b595ba074aa7b620b1936737 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 15 Dec 2014 17:25:49 +0100 Subject: [PATCH] refs #358, adjusted simulator context and airspace monitor for model matching --- src/blackcore/airspace_monitor.cpp | 41 +++++++++++++++---- src/blackcore/airspace_monitor.h | 7 +++- src/blackcore/context_simulator.h | 14 ++++++- src/blackcore/context_simulator_impl.cpp | 48 +++++++++++++++++++---- src/blackcore/context_simulator_impl.h | 9 ++++- src/blackcore/context_simulator_proxy.cpp | 18 ++++++++- src/blackcore/context_simulator_proxy.h | 6 +++ 7 files changed, 122 insertions(+), 21 deletions(-) diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index 487d11fbd..0c33d9ed0 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -11,18 +11,20 @@ #include "blackcore/blackcorefreefunctions.h" #include "blackmisc/project.h" #include "blackmisc/testing.h" +#include "blackmisc/logmessage.h" +#include "blackmisc/blackmiscfreefunctions.h" #include "blackmisc/propertyindexallclasses.h" +using namespace BlackMisc; +using namespace BlackMisc::Aviation; +using namespace BlackMisc::Audio; +using namespace BlackMisc::Network; +using namespace BlackMisc::Geo; +using namespace BlackMisc::PhysicalQuantities; + namespace BlackCore { - using namespace BlackMisc; - using namespace BlackMisc::Aviation; - using namespace BlackMisc::Audio; - using namespace BlackMisc::Network; - using namespace BlackMisc::Geo; - using namespace BlackMisc::PhysicalQuantities; - CAirspaceMonitor::CAirspaceMonitor(QObject *parent, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile) : QObject(parent), m_network(network), m_vatsimBookingReader(bookings), m_vatsimDataFileReader(dataFile), m_atcWatchdog(this), m_aircraftWatchdog(this) @@ -270,7 +272,7 @@ namespace BlackCore // Request of other client, I can get the other's model from that CPropertyIndexVariantMap vm({ CClient::IndexModel, CAircraftModel::IndexModelString }, model); - vm.addValue({ CClient::IndexModel, CAircraftModel::IndexIsQueriedModelString }, true); + vm.addValue({ CClient::IndexModel, CAircraftModel::IndexModelType }, static_cast(CAircraftModel::TypeQueriedFromNetwork)); if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { // with custom packets it can happen, @@ -392,6 +394,13 @@ namespace BlackCore } } + void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign) + { + CAircraft remoteAircraft = this->m_aircraftInRange.findFirstByCallsign(callsign); + CClient remoteClient = this->m_otherClients.findFirstByCallsign(callsign); + emit readyForModelMatching(remoteAircraft, remoteClient); + } + void CAirspaceMonitor::ps_atcPositionUpdate(const CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency, const CCoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &range) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); @@ -529,6 +538,22 @@ namespace BlackCore } int changed = this->m_aircraftInRange.applyIf(&CAircraft::getCallsign, callsign, vm, true); if (changed > 0) { emit this->changedAircraftInRange(); } + + // we have most important data for model matching + // but do we already have the client + if (this->m_otherClients.contains(&CClient::getCallsign, callsign)) + { + // yes, client with possible model string is there + ps_sendReadyForModelMatching(callsign); + } + else + { + // allow another period for the client data to arrive, otherwise go ahead + BlackMisc::singleShot(5000, QThread::currentThread(), [ = ]() + { + ps_sendReadyForModelMatching(callsign); + }); + } } void CAirspaceMonitor::ps_aircraftUpdateReceived(const CCallsign &callsign, const CAircraftSituation &situation, const CTransponder &transponder) diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index b8615342a..a6ae3e075 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -98,6 +98,8 @@ namespace BlackCore //! An aircraft disappeared void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign); + //! Read for model matching + void readyForModelMatching(const BlackMisc::Aviation::CAircraft &remoteAircraft, const BlackMisc::Network::CClient &remoteClient); public slots: //! Own aircraft updated @@ -128,7 +130,7 @@ namespace BlackCore BlackMisc::Aviation::CAircraft m_ownAircraft; BlackMisc::Network::CAircraftModel m_ownAircraftModel; - INetwork *m_network; + INetwork *m_network = nullptr; CVatsimBookingReader *m_vatsimBookingReader; CVatsimDataFileReader *m_vatsimDataFileReader; CAirspaceWatchdog m_atcWatchdog; @@ -162,10 +164,11 @@ namespace BlackCore void ps_aircraftUpdateReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder); void ps_pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign); void ps_frequencyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency); - void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations); void ps_receivedDataFile(); + // non network related slots + void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign); }; } // namespace diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index aeba667f4..8a6973987 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -28,7 +28,7 @@ #include "blackcore/context_runtime.h" #include "blacksim/simulatorinfo.h" #include "blacksim/simulatorinfolist.h" -#include "blackmisc/nwaircraftmodel.h" +#include "blackmisc/nwaircraftmodellist.h" #include "blackmisc/avaircraft.h" #include "blackmisc/avairportlist.h" #include "blackmisc/project.h" @@ -76,6 +76,12 @@ namespace BlackCore //! Simulator combined status void simulatorStatusChanged(bool connected, bool running, bool paused); + //! Installed aircraft models ready or changed + void installedAircraftModelsChanged(); + + //! A single model has been matched + void modelMatchingCompleted(BlackMisc::Network::CAircraftModel model); + //! Emitted when own aircraft model changes //! \todo move to own aircraft context? void ownAircraftModelChanged(BlackMisc::Network::CAircraftModel model); @@ -112,6 +118,12 @@ namespace BlackCore //! Aircraft model virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0; + //! Installed models in simulator eco system + virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const = 0; + + //! Remote aircraft in range having a valid model matching (which should be all aircraft in range) + virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const = 0; + //! Set time synchronization between simulator and user's computer time //! \remarks not all drivers implement this, e.g. if it is an intrinsic simulator feature virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) = 0; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 3eb08a1f4..c369cdc03 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -99,34 +99,57 @@ namespace BlackCore Network::CAircraftModel CContextSimulator::getOwnAircraftModel() const { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; // If no ISimulator object is available, return a dummy. if (!m_simulator) { return Network::CAircraftModel(); } - return this->m_simulator->getAircraftModel(); + return this->m_simulator->getOwnAircraftModel(); } CAirportList CContextSimulator::getAirportsInRange() const { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; // If no ISimulator object is available, return a dummy. if (!m_simulator) { return CAirportList(); } return this->m_simulator->getAirportsInRange(); } + CAircraftModelList CContextSimulator::getInstalledModels() const + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + // If no ISimulator object is available, return a dummy. + if (!m_simulator) { return CAircraftModelList(); } + + return this->m_simulator->getInstalledModels(); + } + + CAircraftModelList CContextSimulator::getCurrentlyMatchedModels() const + { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + // If no ISimulator object is available, return a dummy. + if (!m_simulator) { return CAircraftModelList(); } + + return this->m_simulator->getCurrentlyMatchedModels(); + } + void CContextSimulator::setTimeSynchronization(bool enable, CTime offset) { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; if (!m_simulator) return; this->m_simulator->setTimeSynchronization(enable, offset); } bool CContextSimulator::isTimeSynchronized() const { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; if (!m_simulator) return false; return this->m_simulator->isTimeSynchronized(); } CTime CContextSimulator::getTimeSynchronizationOffset() const { + CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; if (!m_simulator) return CTime(0, CTimeUnit::hrmin()); return this->m_simulator->getTimeSynchronizationOffset(); } @@ -169,7 +192,8 @@ namespace BlackCore connect(m_simulator, &ISimulator::connectionStatusChanged, this, &CContextSimulator::ps_onConnectionStatusChanged); connect(m_simulator, &ISimulator::simulatorStatusChanged, this, &CContextSimulator::simulatorStatusChanged); - connect(m_simulator, &ISimulator::aircraftModelChanged, this, &IContextSimulator::ownAircraftModelChanged); + connect(m_simulator, &ISimulator::ownAircraftModelChanged, this, &IContextSimulator::ownAircraftModelChanged); + connect(m_simulator, &ISimulator::modelMatchingCompleted, this, &IContextSimulator::modelMatchingCompleted); // log connect(CLogHandler::instance(), &CLogHandler::localMessageLogged, m_simulator, &ISimulator::displayStatusMessage); @@ -177,12 +201,15 @@ namespace BlackCore // connect with network CAirspaceMonitor *airspace = this->getRuntime()->getCContextNetwork()->getAirspaceMonitor(); - connect(airspace, &CAirspaceMonitor::addedAircraft, this, &CContextSimulator::ps_addRemoteAircraft); + // connect(airspace, &CAirspaceMonitor::addedAircraft, this, &CContextSimulator::ps_addRemoteAircraft); + connect(airspace, &CAirspaceMonitor::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft); connect(airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextSimulator::ps_addAircraftSituation); connect(airspace, &CAirspaceMonitor::removedAircraft, this, &CContextSimulator::ps_removeRemoteAircraft); for (const auto &aircraft : airspace->getAircraftInRange()) { - m_simulator->addRemoteAircraft(aircraft.getCallsign(), aircraft.getSituation()); + // m_simulator->addRemoteAircraft(aircraft.getCallsign(), aircraft.getSituation()); + CClient client = airspace->getOtherClients().findFirstByCallsign(aircraft.getCallsign()); + m_simulator->addRemoteAircraft(aircraft, client); } // apply latest settings @@ -265,13 +292,20 @@ namespace BlackCore } } - void CContextSimulator::ps_addRemoteAircraft(const CCallsign &callsign, const CAircraftSituation &initialSituation) + void CContextSimulator::ps_addRemoteAircraft(const CAircraft &remoteAircraft, const CClient &remoteClient) { Q_ASSERT(this->m_simulator); if (!this->m_simulator) return; - this->m_simulator->addRemoteAircraft(callsign, initialSituation); + this->m_simulator->addRemoteAircraft(remoteAircraft, remoteClient); } +// void CContextSimulator::ps_addRemoteAircraft(const CCallsign &callsign, const CAircraftSituation &initialSituation) +// { +// Q_ASSERT(this->m_simulator); +// if (!this->m_simulator) return; +// this->m_simulator->addRemoteAircraft(callsign, initialSituation); +// } + void CContextSimulator::ps_addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation) { Q_ASSERT(this->m_simulator); @@ -361,7 +395,7 @@ namespace BlackCore bool CContextSimulator::isRunning() const { if (!this->m_simulator) return false; - return this->m_simulator->isRunning(); + return this->m_simulator->isSimulating(); } void CContextSimulator::findSimulatorPlugins() diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 661f8fcfa..3bcd266a4 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -74,6 +74,12 @@ namespace BlackCore //! \copydoc IContextSimulator::getAirportsInRange() virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; + //! \copydoc IContextSimulator::getInstalledModels() + virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const override; + + //! \copydoc IContextSimulator::getCurrentlyMatchedModels() + virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const override; + //! \copydoc IContextSimulator::setTimeSynchronization virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; @@ -112,7 +118,8 @@ namespace BlackCore void ps_updateOwnAircraftContext(); //! \copydoc ISimulator::addRemoteAircraft - void ps_addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation); + // void ps_addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation); + void ps_addRemoteAircraft(const BlackMisc::Aviation::CAircraft &remoteAircraft, const BlackMisc::Network::CClient &remoteClient); //! \copydoc ISimulator::addAircraftSituation void ps_addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation); diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index 0e4c30aa4..b95210b81 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -11,6 +11,7 @@ using namespace BlackMisc; using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::Aviation; +using namespace BlackMisc::Network; using namespace BlackMisc::Geo; using namespace BlackSim; @@ -32,14 +33,17 @@ namespace BlackCore Q_ASSERT(s); s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), "startedChanged", this, SIGNAL(startedChanged(bool))); - Q_ASSERT(s); s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), - "simulatorStatusChanged", this, SIGNAL(simulatorStatusChanged(bool,bool,bool))); + "simulatorStatusChanged", this, SIGNAL(simulatorStatusChanged(bool, bool, bool))); Q_ASSERT(s); s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), "ownAircraftModelChanged", this, SIGNAL(ownAircraftModelChanged(BlackMisc::Network::CAircraftModel))); Q_ASSERT(s); + + s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), + "modelMatchingCompleted", this, SIGNAL(modelMatchingCompleted(BlackMisc::Network::CAircraftModel))); + Q_ASSERT(s); Q_UNUSED(s); } @@ -83,6 +87,16 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("getAirportsInRange")); } + CAircraftModelList CContextSimulatorProxy::getInstalledModels() const + { + return m_dBusInterface->callDBusRet(QLatin1Literal("getInstalledModels")); + } + + CAircraftModelList CContextSimulatorProxy::getCurrentlyMatchedModels() const + { + return m_dBusInterface->callDBusRet(QLatin1Literal("getCurrentlyMatchedModels")); + } + BlackSim::CSimulatorInfo CContextSimulatorProxy::getSimulatorInfo() const { return m_dBusInterface->callDBusRet(QLatin1Literal("getSimulatorInfo")); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index da48a11cf..4fa6540f5 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -73,6 +73,12 @@ namespace BlackCore //! \copydoc IContextSimulator::getAirportsInRange() virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; + //! \copydoc IContextSimulator::getInstalledModels() + virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const override; + + //! \copydoc IContextSimulator::getCurrentlyMatchedModels() + virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const override; + //! \copydoc IContextSimulator::getSimulatorInfo virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;