From 10d43798b07ce2095fcbfb64159b0ddd4cc3fc0c Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 18 Nov 2016 21:58:22 +0100 Subject: [PATCH] refs #811, airports default implementation * if no sim data are available use reader data * merge airport data for FSX * Added "network" in .pro (needed for network classes such as readers) --- src/blackcore/simulator.h | 2 +- src/blackcore/simulatorcommon.cpp | 37 +++++++++++++++++-- src/blackcore/simulatorcommon.h | 23 ++++++++---- src/plugins/simulator/fscommon/fscommon.pro | 2 +- .../simulator/fscommon/simulatorfscommon.cpp | 27 +++++++++++--- .../simulator/fscommon/simulatorfscommon.h | 6 ++- .../fsx/simulatorfsxsimconnectproc.cpp | 11 ++++-- .../simulator/xplane/simulatorxplane.cpp | 1 + 8 files changed, 85 insertions(+), 24 deletions(-) diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index b4629d2f1..b0bea56b2 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -114,7 +114,7 @@ namespace BlackCore //! Display a text message virtual void displayTextMessage(const BlackMisc::Network::CTextMessage &message) const = 0; - //! Airports in range from simulator + //! Airports in range from simulator, or if not available from web service virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0; //! Set time synchronization between simulator and user's computer time diff --git a/src/blackcore/simulatorcommon.cpp b/src/blackcore/simulatorcommon.cpp index a5fa4e6d6..16b65eb13 100644 --- a/src/blackcore/simulatorcommon.cpp +++ b/src/blackcore/simulatorcommon.cpp @@ -28,6 +28,7 @@ #include using namespace BlackMisc; +using namespace BlackMisc::Geo; using namespace BlackMisc::Aviation; using namespace BlackMisc::Simulation; using namespace BlackMisc::PhysicalQuantities; @@ -62,8 +63,8 @@ namespace BlackCore ); // timer - this->m_oneSecondTimer.setObjectName(this->objectName().append(":m_oneSecondTimer")); connect(&m_oneSecondTimer, &QTimer::timeout, this, &CSimulatorCommon::ps_oneSecondTimer); + this->m_oneSecondTimer.setObjectName(this->objectName().append(":m_oneSecondTimer")); this->m_oneSecondTimer.start(1000); // swift data @@ -76,14 +77,14 @@ namespace BlackCore CLogMessage(this).info("Initialized simulator driver %1") << m_simulatorPluginInfo.toQString(); } + CSimulatorCommon::~CSimulatorCommon() { } + const CLogCategoryList &CSimulatorCommon::getLogCategories() { - static const CLogCategoryList cats( { CLogCategory::driver(), CLogCategory::plugin() }); + static const CLogCategoryList cats({ CLogCategory::driver(), CLogCategory::plugin() }); return cats; } - CSimulatorCommon::~CSimulatorCommon() { } - bool CSimulatorCommon::logicallyAddRemoteAircraft(const CSimulatedAircraft &remoteAircraft) { Q_ASSERT_X(remoteAircraft.hasModelString(), Q_FUNC_INFO, "Missing model string"); @@ -106,6 +107,12 @@ namespace BlackCore return false; } + int CSimulatorCommon::maxAirportsInRange() const + { + // might change in future or become a setting or such + return 20; + } + void CSimulatorCommon::blinkHighlightedAircraft() { if (m_highlightedAircraft.isEmpty() || m_highlightEndTimeMsEpoch < 1) { return; } @@ -216,6 +223,17 @@ namespace BlackCore } } + CAirportList CSimulatorCommon::getAirportsInRange() const + { + // default implementation + if (!sApp->hasWebDataServices()) { return CAirportList(); } + + const CAirportList airports = sApp->getWebDataServices()->getAirports(); + if (airports.isEmpty()) { return airports; } + const CCoordinateGeodetic ownPosition = this->getOwnAircraftPosition(); + return airports.findClosest(maxAirportsInRange(), ownPosition); + } + CAircraftModel CSimulatorCommon::reverseLookupModel(const CAircraftModel &model) { bool modified = false; @@ -373,4 +391,15 @@ namespace BlackCore m_aircraftToAddAgainWhenRemoved.clear(); } + CAirportList CSimulatorCommon::getWebServiceAirports() const + { + if (!sApp->hasWebDataServices()) { return CAirportList(); } + return sApp->getWebDataServices()->getAirports(); + } + + CAirport CSimulatorCommon::getWebServiceAirport(const CAirportIcaoCode &icao) const + { + if (!sApp->hasWebDataServices()) { return CAirport(); } + return sApp->getWebDataServices()->getAirports().findFirstByIcao(icao); + } } // namespace diff --git a/src/blackcore/simulatorcommon.h b/src/blackcore/simulatorcommon.h index 31fd58a06..5f928a208 100644 --- a/src/blackcore/simulatorcommon.h +++ b/src/blackcore/simulatorcommon.h @@ -77,6 +77,7 @@ namespace BlackCore virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override; virtual const BlackMisc::Simulation::CSimulatorPluginInfo &getSimulatorPluginInfo() const override; virtual const BlackMisc::Simulation::CSimulatorInternals &getSimulatorInternals() const override; + virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; virtual void unload() override; virtual int physicallyRemoveMultipleRemoteAircraft(const BlackMisc::Aviation::CCallsignSet &callsigns) override; //! @} @@ -100,6 +101,9 @@ namespace BlackCore virtual void ps_remoteProviderRemovedAircraft(const BlackMisc::Aviation::CCallsign &callsign); //! @} + //! All swift data read from DB + virtual void ps_allSwiftDataRead(); + protected: //! Constructor CSimulatorCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info, @@ -108,11 +112,14 @@ namespace BlackCore BlackMisc::Weather::IWeatherGridProvider *weatherGridProvider, QObject *parent); - //! \copydoc ISimulator::logicallyAddRemoteAircraft + //! \name Interface implementations + //! @{ virtual bool logicallyAddRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) override; - - //! \copydoc ISimulator::logicallyRemoveRemoteAircraft virtual bool logicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; + //! @} + + //! Max.airports in range + int maxAirportsInRange() const; //! Reset state virtual void reset(); @@ -120,6 +127,12 @@ namespace BlackCore //! Clear all aircraft related data virtual void clearAllAircraft(); + //! Airports from web services + BlackMisc::Aviation::CAirportList getWebServiceAirports() const; + + //! Airport from web services by ICAO code + BlackMisc::Aviation::CAirport getWebServiceAirport(const BlackMisc::Aviation::CAirportIcaoCode &icao) const; + //! Blink the highlighted aircraft void blinkHighlightedAircraft(); @@ -150,10 +163,6 @@ namespace BlackCore //! Lookup against DB data static BlackMisc::Simulation::CAircraftModel reverseLookupModel(const BlackMisc::Simulation::CAircraftModel &model); - private slots: - //! All swift data read from DB - void ps_allSwiftDataRead(); - private: bool m_blinkCycle = false; //!< use for highlighting qint64 m_highlightEndTimeMsEpoch = 0; //!< end highlighting diff --git a/src/plugins/simulator/fscommon/fscommon.pro b/src/plugins/simulator/fscommon/fscommon.pro index 7dd7e6858..4305e2123 100644 --- a/src/plugins/simulator/fscommon/fscommon.pro +++ b/src/plugins/simulator/fscommon/fscommon.pro @@ -1,6 +1,6 @@ load(common_pre) -QT += core dbus concurrent xml +QT += core dbus concurrent xml network TARGET = simulatorfscommon TEMPLATE = lib diff --git a/src/plugins/simulator/fscommon/simulatorfscommon.cpp b/src/plugins/simulator/fscommon/simulatorfscommon.cpp index 7caf56332..5bf9da1b0 100644 --- a/src/plugins/simulator/fscommon/simulatorfscommon.cpp +++ b/src/plugins/simulator/fscommon/simulatorfscommon.cpp @@ -8,17 +8,18 @@ */ #include "simulatorfscommon.h" +#include "blackcore/webdataservices.h" #include "blackmisc/logmessage.h" #include "blackmisc/stringutils.h" -using namespace BlackMisc::PhysicalQuantities; -using namespace BlackMisc::Simulation; -using namespace BlackMisc::Simulation::FsCommon; -using namespace BlackMisc::Aviation; -using namespace BlackMisc::Network; using namespace BlackMisc; +using namespace BlackMisc::PhysicalQuantities; +using namespace BlackMisc::Aviation; +using namespace BlackMisc::Geo; +using namespace BlackMisc::Network; using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation::FsCommon; +using namespace BlackCore; namespace BlackSimPlugin { @@ -80,7 +81,11 @@ namespace BlackSimPlugin CAirportList CSimulatorFsCommon::getAirportsInRange() const { - return m_airportsInRange; + if (!m_airportsInRangeFromSimulator.isEmpty()) + { + return m_airportsInRangeFromSimulator; + } + return CSimulatorCommon::getAirportsInRange(); } bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft) @@ -104,5 +109,15 @@ namespace BlackSimPlugin } return true; } + + void CSimulatorFsCommon::ps_allSwiftDataRead() + { + const CAirportList webServiceAirports = this->getWebServiceAirports(); + if (!webServiceAirports.isEmpty()) + { + this->m_airportsInRangeFromSimulator.updateMissingParts(webServiceAirports); + } + CSimulatorCommon::ps_allSwiftDataRead(); + } } // namespace } // namespace diff --git a/src/plugins/simulator/fscommon/simulatorfscommon.h b/src/plugins/simulator/fscommon/simulatorfscommon.h index b928913ec..4704fa9ce 100644 --- a/src/plugins/simulator/fscommon/simulatorfscommon.h +++ b/src/plugins/simulator/fscommon/simulatorfscommon.h @@ -45,6 +45,10 @@ namespace BlackSimPlugin virtual bool changeRemoteAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft) override; //! @} + protected slots: + //! \copydoc BlackCore::CSimulatorCommon::ps_allSwiftDataRead + virtual void ps_allSwiftDataRead() override; + protected: //! Constructor CSimulatorFsCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info, @@ -64,7 +68,7 @@ namespace BlackSimPlugin bool m_simPaused = false; //!< Simulator paused? bool m_simTimeSynced = false; //!< Time synchronized? BlackMisc::PhysicalQuantities::CTime m_syncTimeOffset; //!< time offset - BlackMisc::Aviation::CAirportList m_airportsInRange; //!< airports in range of own aircraft + BlackMisc::Aviation::CAirportList m_airportsInRangeFromSimulator; //!< airports in range of own aircraft // cockpit as set in SIM BlackMisc::Aviation::CComSystem m_simCom1; //!< cockpit COM1 state in simulator diff --git a/src/plugins/simulator/fsx/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsx/simulatorfsxsimconnectproc.cpp index c5e7373ca..7db35059b 100644 --- a/src/plugins/simulator/fsx/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsx/simulatorfsxsimconnectproc.cpp @@ -210,7 +210,7 @@ namespace BlackSimPlugin } case SIMCONNECT_RECV_ID_AIRPORT_LIST: { - const CLength maxDistance(200.0, CLengthUnit::NM()); + static const CLength maxDistance(200.0, CLengthUnit::NM()); const CCoordinateGeodetic posAircraft(simulatorFsx->getOwnAircraftPosition()); SIMCONNECT_RECV_AIRPORT_LIST *pAirportList = (SIMCONNECT_RECV_AIRPORT_LIST *) pData; for (unsigned i = 0; i < pAirportList->dwArraySize; ++i) @@ -224,11 +224,14 @@ namespace BlackSimPlugin CAirport airport(CAirportIcaoCode(icao), pos); const CLength d = airport.calculcateAndUpdateRelativeDistanceAndBearing(posAircraft); if (d > maxDistance) { continue; } - simulatorFsx->m_airportsInRange.replaceOrAddByIcao(airport); + airport.updateMissingParts(simulatorFsx->getWebServiceAirport(icao)); + simulatorFsx->m_airportsInRangeFromSimulator.replaceOrAddByIcao(airport); } - if (simulatorFsx->m_airportsInRange.size() > 20) + + if (simulatorFsx->m_airportsInRangeFromSimulator.size() > simulatorFsx->maxAirportsInRange()) { - simulatorFsx->m_airportsInRange.removeIfOutsideRange(posAircraft, maxDistance, true); + simulatorFsx->m_airportsInRangeFromSimulator.sortByDistanceToOwnAircraft(); + simulatorFsx->m_airportsInRangeFromSimulator.truncate(simulatorFsx->maxAirportsInRange()); } break; } diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 066c3fd05..0ddb4fd56 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -351,6 +351,7 @@ namespace BlackSimPlugin void CSimulatorXPlane::ps_setAirportsInRange(const QStringList &icaos, const QStringList &names, const BlackMisc::CSequence &lats, const BlackMisc::CSequence &lons, const BlackMisc::CSequence &alts) { + //! \todo restrict to maxAirportsInRange() m_airportsInRange.clear(); auto icaoIt = icaos.begin(); auto nameIt = names.begin();