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)
This commit is contained in:
Klaus Basan
2016-11-18 21:58:22 +01:00
parent b6a59decc7
commit 10d43798b0
8 changed files with 85 additions and 24 deletions

View File

@@ -114,7 +114,7 @@ namespace BlackCore
//! Display a text message //! Display a text message
virtual void displayTextMessage(const BlackMisc::Network::CTextMessage &message) const = 0; 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; virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0;
//! Set time synchronization between simulator and user's computer time //! Set time synchronization between simulator and user's computer time

View File

@@ -28,6 +28,7 @@
#include <functional> #include <functional>
using namespace BlackMisc; using namespace BlackMisc;
using namespace BlackMisc::Geo;
using namespace BlackMisc::Aviation; using namespace BlackMisc::Aviation;
using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation;
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
@@ -62,8 +63,8 @@ namespace BlackCore
); );
// timer // timer
this->m_oneSecondTimer.setObjectName(this->objectName().append(":m_oneSecondTimer"));
connect(&m_oneSecondTimer, &QTimer::timeout, this, &CSimulatorCommon::ps_oneSecondTimer); connect(&m_oneSecondTimer, &QTimer::timeout, this, &CSimulatorCommon::ps_oneSecondTimer);
this->m_oneSecondTimer.setObjectName(this->objectName().append(":m_oneSecondTimer"));
this->m_oneSecondTimer.start(1000); this->m_oneSecondTimer.start(1000);
// swift data // swift data
@@ -76,14 +77,14 @@ namespace BlackCore
CLogMessage(this).info("Initialized simulator driver %1") << m_simulatorPluginInfo.toQString(); CLogMessage(this).info("Initialized simulator driver %1") << m_simulatorPluginInfo.toQString();
} }
CSimulatorCommon::~CSimulatorCommon() { }
const CLogCategoryList &CSimulatorCommon::getLogCategories() const CLogCategoryList &CSimulatorCommon::getLogCategories()
{ {
static const CLogCategoryList cats( { CLogCategory::driver(), CLogCategory::plugin() }); static const CLogCategoryList cats({ CLogCategory::driver(), CLogCategory::plugin() });
return cats; return cats;
} }
CSimulatorCommon::~CSimulatorCommon() { }
bool CSimulatorCommon::logicallyAddRemoteAircraft(const CSimulatedAircraft &remoteAircraft) bool CSimulatorCommon::logicallyAddRemoteAircraft(const CSimulatedAircraft &remoteAircraft)
{ {
Q_ASSERT_X(remoteAircraft.hasModelString(), Q_FUNC_INFO, "Missing model string"); Q_ASSERT_X(remoteAircraft.hasModelString(), Q_FUNC_INFO, "Missing model string");
@@ -106,6 +107,12 @@ namespace BlackCore
return false; return false;
} }
int CSimulatorCommon::maxAirportsInRange() const
{
// might change in future or become a setting or such
return 20;
}
void CSimulatorCommon::blinkHighlightedAircraft() void CSimulatorCommon::blinkHighlightedAircraft()
{ {
if (m_highlightedAircraft.isEmpty() || m_highlightEndTimeMsEpoch < 1) { return; } 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) CAircraftModel CSimulatorCommon::reverseLookupModel(const CAircraftModel &model)
{ {
bool modified = false; bool modified = false;
@@ -373,4 +391,15 @@ namespace BlackCore
m_aircraftToAddAgainWhenRemoved.clear(); 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 } // namespace

View File

@@ -77,6 +77,7 @@ namespace BlackCore
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override; 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::CSimulatorPluginInfo &getSimulatorPluginInfo() const override;
virtual const BlackMisc::Simulation::CSimulatorInternals &getSimulatorInternals() const override; virtual const BlackMisc::Simulation::CSimulatorInternals &getSimulatorInternals() const override;
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
virtual void unload() override; virtual void unload() override;
virtual int physicallyRemoveMultipleRemoteAircraft(const BlackMisc::Aviation::CCallsignSet &callsigns) 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); virtual void ps_remoteProviderRemovedAircraft(const BlackMisc::Aviation::CCallsign &callsign);
//! @} //! @}
//! All swift data read from DB
virtual void ps_allSwiftDataRead();
protected: protected:
//! Constructor //! Constructor
CSimulatorCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info, CSimulatorCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info,
@@ -108,11 +112,14 @@ namespace BlackCore
BlackMisc::Weather::IWeatherGridProvider *weatherGridProvider, BlackMisc::Weather::IWeatherGridProvider *weatherGridProvider,
QObject *parent); QObject *parent);
//! \copydoc ISimulator::logicallyAddRemoteAircraft //! \name Interface implementations
//! @{
virtual bool logicallyAddRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) override; virtual bool logicallyAddRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) override;
//! \copydoc ISimulator::logicallyRemoveRemoteAircraft
virtual bool logicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; virtual bool logicallyRemoveRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override;
//! @}
//! Max.airports in range
int maxAirportsInRange() const;
//! Reset state //! Reset state
virtual void reset(); virtual void reset();
@@ -120,6 +127,12 @@ namespace BlackCore
//! Clear all aircraft related data //! Clear all aircraft related data
virtual void clearAllAircraft(); 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 //! Blink the highlighted aircraft
void blinkHighlightedAircraft(); void blinkHighlightedAircraft();
@@ -150,10 +163,6 @@ namespace BlackCore
//! Lookup against DB data //! Lookup against DB data
static BlackMisc::Simulation::CAircraftModel reverseLookupModel(const BlackMisc::Simulation::CAircraftModel &model); static BlackMisc::Simulation::CAircraftModel reverseLookupModel(const BlackMisc::Simulation::CAircraftModel &model);
private slots:
//! All swift data read from DB
void ps_allSwiftDataRead();
private: private:
bool m_blinkCycle = false; //!< use for highlighting bool m_blinkCycle = false; //!< use for highlighting
qint64 m_highlightEndTimeMsEpoch = 0; //!< end highlighting qint64 m_highlightEndTimeMsEpoch = 0; //!< end highlighting

View File

@@ -1,6 +1,6 @@
load(common_pre) load(common_pre)
QT += core dbus concurrent xml QT += core dbus concurrent xml network
TARGET = simulatorfscommon TARGET = simulatorfscommon
TEMPLATE = lib TEMPLATE = lib

View File

@@ -8,17 +8,18 @@
*/ */
#include "simulatorfscommon.h" #include "simulatorfscommon.h"
#include "blackcore/webdataservices.h"
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
#include "blackmisc/stringutils.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;
using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Geo;
using namespace BlackMisc::Network;
using namespace BlackMisc::Simulation; using namespace BlackMisc::Simulation;
using namespace BlackMisc::Simulation::FsCommon; using namespace BlackMisc::Simulation::FsCommon;
using namespace BlackCore;
namespace BlackSimPlugin namespace BlackSimPlugin
{ {
@@ -80,7 +81,11 @@ namespace BlackSimPlugin
CAirportList CSimulatorFsCommon::getAirportsInRange() const CAirportList CSimulatorFsCommon::getAirportsInRange() const
{ {
return m_airportsInRange; if (!m_airportsInRangeFromSimulator.isEmpty())
{
return m_airportsInRangeFromSimulator;
}
return CSimulatorCommon::getAirportsInRange();
} }
bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft) bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft)
@@ -104,5 +109,15 @@ namespace BlackSimPlugin
} }
return true; return true;
} }
void CSimulatorFsCommon::ps_allSwiftDataRead()
{
const CAirportList webServiceAirports = this->getWebServiceAirports();
if (!webServiceAirports.isEmpty())
{
this->m_airportsInRangeFromSimulator.updateMissingParts(webServiceAirports);
}
CSimulatorCommon::ps_allSwiftDataRead();
}
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -45,6 +45,10 @@ namespace BlackSimPlugin
virtual bool changeRemoteAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft) override; virtual bool changeRemoteAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft) override;
//! @} //! @}
protected slots:
//! \copydoc BlackCore::CSimulatorCommon::ps_allSwiftDataRead
virtual void ps_allSwiftDataRead() override;
protected: protected:
//! Constructor //! Constructor
CSimulatorFsCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info, CSimulatorFsCommon(const BlackMisc::Simulation::CSimulatorPluginInfo &info,
@@ -64,7 +68,7 @@ namespace BlackSimPlugin
bool m_simPaused = false; //!< Simulator paused? bool m_simPaused = false; //!< Simulator paused?
bool m_simTimeSynced = false; //!< Time synchronized? bool m_simTimeSynced = false; //!< Time synchronized?
BlackMisc::PhysicalQuantities::CTime m_syncTimeOffset; //!< time offset 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 // cockpit as set in SIM
BlackMisc::Aviation::CComSystem m_simCom1; //!< cockpit COM1 state in simulator BlackMisc::Aviation::CComSystem m_simCom1; //!< cockpit COM1 state in simulator

View File

@@ -210,7 +210,7 @@ namespace BlackSimPlugin
} }
case SIMCONNECT_RECV_ID_AIRPORT_LIST: 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()); const CCoordinateGeodetic posAircraft(simulatorFsx->getOwnAircraftPosition());
SIMCONNECT_RECV_AIRPORT_LIST *pAirportList = (SIMCONNECT_RECV_AIRPORT_LIST *) pData; SIMCONNECT_RECV_AIRPORT_LIST *pAirportList = (SIMCONNECT_RECV_AIRPORT_LIST *) pData;
for (unsigned i = 0; i < pAirportList->dwArraySize; ++i) for (unsigned i = 0; i < pAirportList->dwArraySize; ++i)
@@ -224,11 +224,14 @@ namespace BlackSimPlugin
CAirport airport(CAirportIcaoCode(icao), pos); CAirport airport(CAirportIcaoCode(icao), pos);
const CLength d = airport.calculcateAndUpdateRelativeDistanceAndBearing(posAircraft); const CLength d = airport.calculcateAndUpdateRelativeDistanceAndBearing(posAircraft);
if (d > maxDistance) { continue; } 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; break;
} }

View File

@@ -351,6 +351,7 @@ namespace BlackSimPlugin
void CSimulatorXPlane::ps_setAirportsInRange(const QStringList &icaos, const QStringList &names, const BlackMisc::CSequence<double> &lats, const BlackMisc::CSequence<double> &lons, const BlackMisc::CSequence<double> &alts) void CSimulatorXPlane::ps_setAirportsInRange(const QStringList &icaos, const QStringList &names, const BlackMisc::CSequence<double> &lats, const BlackMisc::CSequence<double> &lons, const BlackMisc::CSequence<double> &alts)
{ {
//! \todo restrict to maxAirportsInRange()
m_airportsInRange.clear(); m_airportsInRange.clear();
auto icaoIt = icaos.begin(); auto icaoIt = icaos.begin();
auto nameIt = names.begin(); auto nameIt = names.begin();