diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 8ca9f2507..22f605112 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -922,7 +922,7 @@ namespace BlackCore CAircraftSituation correctedSituation(situation); if (!correctedSituation.hasGroundElevation() && !correctedSituation.canLikelySkipNearGroundInterpolation()) { - const CElevationPlane ep = this->findClosestElevationWithinRange(correctedSituation, correctedSituation.getDistancePerTime(1000)); + const CElevationPlane ep = this->findClosestElevationWithinRange(correctedSituation, correctedSituation.getDistancePerTime(1000), true); correctedSituation.setGroundElevation(ep); } diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 273279a44..c97bfbda7 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -42,6 +42,14 @@ namespace BlackCore return setup; } + bool ISimulator::requestElevation(const Geo::ICoordinateGeodetic &reference) const + { + if (this->isShuttingDown()) { return false; } + if (reference.isNull()) { return false; } + Q_UNUSED(reference); + return false; + } + void ISimulator::registerHelp() { if (CSimpleCommandParser::registered("BlackCore::ISimulator")) { return; } @@ -56,11 +64,11 @@ namespace BlackCore QString ISimulator::statusToString(SimulatorStatus status) { QStringList s; - if (status.testFlag(Unspecified)) s << "Unspecified"; - if (status.testFlag(Disconnected)) s << "Disconnected"; - if (status.testFlag(Connected)) s << "Connected"; - if (status.testFlag(Simulating)) s << "Simulating"; - if (status.testFlag(Paused)) s << "Paused"; + if (status.testFlag(Unspecified)) { s << QStringLiteral("Unspecified"); } + if (status.testFlag(Disconnected)) { s << QStringLiteral("Disconnected"); } + if (status.testFlag(Connected)) { s << QStringLiteral("Connected"); } + if (status.testFlag(Simulating)) { s << QStringLiteral("Simulating"); } + if (status.testFlag(Paused)) { s << QStringLiteral("Paused"); } return s.join(", "); } diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 8b8cefd1a..7d7fbaab7 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -180,6 +180,10 @@ namespace BlackCore //! Is overall (swift) application shutting down virtual bool isShuttingDown() const = 0; + //! \copydoc BlackMisc::Simulation::ISimulationEnvironmentProvider::requestElevation + //! \remark needs to be overridden if the concrete driver supports such an option + virtual bool requestElevation(const BlackMisc::Geo::ICoordinateGeodetic &reference) const override; + //! \copydoc BlackMisc::IProvider::asQObject virtual QObject *asQObject() override { return this; } diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.cpp b/src/blackmisc/simulation/simulationenvironmentprovider.cpp index 8122988cc..093918de8 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.cpp +++ b/src/blackmisc/simulation/simulationenvironmentprovider.cpp @@ -91,14 +91,21 @@ namespace BlackMisc return delta; } - CElevationPlane ISimulationEnvironmentProvider::findClosestElevationWithinRange(const ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const + CElevationPlane ISimulationEnvironmentProvider::findClosestElevationWithinRange(const ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, bool autoRequest) const { const CCoordinateGeodetic coordinate = this->getElevationCoordinates().findClosestWithinRange(reference, minRange(range)); const bool found = !coordinate.isNull(); { QWriteLocker l{&m_lockElvCoordinates }; - if (found) { m_elvFound++; } - else { m_elvMissed++; } + if (found) + { + m_elvFound++; + } + else + { + m_elvMissed++; + if (autoRequest) { this->requestElevation(reference); } + } } return CElevationPlane(coordinate, reference); // plane with radis = distance to reference } @@ -189,10 +196,16 @@ namespace BlackMisc this->clearCGs(); } - CElevationPlane CSimulationEnvironmentAware::findClosestElevationWithinRange(const ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const + CElevationPlane CSimulationEnvironmentAware::findClosestElevationWithinRange(const ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, bool autoRequest) const { if (!this->hasProvider()) { return CElevationPlane::null(); } - return this->provider()->findClosestElevationWithinRange(reference, range); + return this->provider()->findClosestElevationWithinRange(reference, range, autoRequest); + } + + bool CSimulationEnvironmentAware::requestElevation(const ICoordinateGeodetic &reference) const + { + if (!this->hasProvider()) { return false; } + return this->provider()->requestElevation(reference); } QPair CSimulationEnvironmentAware::getElevationsFoundMissed() const diff --git a/src/blackmisc/simulation/simulationenvironmentprovider.h b/src/blackmisc/simulation/simulationenvironmentprovider.h index 42ff76328..b9c1b2164 100644 --- a/src/blackmisc/simulation/simulationenvironmentprovider.h +++ b/src/blackmisc/simulation/simulationenvironmentprovider.h @@ -38,7 +38,11 @@ namespace BlackMisc //! Find closest elevation //! \threadsafe - Geo::CElevationPlane findClosestElevationWithinRange(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const; + Geo::CElevationPlane findClosestElevationWithinRange(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, bool autoRequest = false) const; + + //! Request elevation, there is no guaranteed the requested elevation will be available in the provider + //! \threadsafe + virtual bool requestElevation(const Geo::ICoordinateGeodetic &reference) const = 0; //! Elevations found/missed statistics //! \threadsafe @@ -142,7 +146,10 @@ namespace BlackMisc void setSimulationEnvironmentProvider(ISimulationEnvironmentProvider *provider) { this->setProvider(provider); } //! \copydoc ISimulationEnvironmentProvider::findClosestElevationWithinRange - Geo::CElevationPlane findClosestElevationWithinRange(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range) const; + Geo::CElevationPlane findClosestElevationWithinRange(const Geo::ICoordinateGeodetic &reference, const PhysicalQuantities::CLength &range, bool autoRequest = false) const; + + //! \copydoc ISimulationEnvironmentProvider::findClosestElevationWithinRange + bool requestElevation(const Geo::ICoordinateGeodetic &reference) const; //! \copydoc ISimulationEnvironmentProvider::getElevationsFoundMissed QPair getElevationsFoundMissed() const; diff --git a/src/plugins/simulator/xplane/simulatorxplane.cpp b/src/plugins/simulator/xplane/simulatorxplane.cpp index 654db4cfe..cd459671f 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.cpp +++ b/src/plugins/simulator/xplane/simulatorxplane.cpp @@ -112,6 +112,12 @@ namespace BlackSimPlugin m_watcher = nullptr; } + bool CSimulatorXPlane::requestElevation(const Geo::ICoordinateGeodetic &reference) const + { + //! \todo KB 2018-04 implement a function fetching the probe value (async) and write it back to provider + return ISimulator::requestElevation(reference); + } + // convert xplane squawk mode to swift squawk mode CTransponder::TransponderMode xpdrMode(int xplaneMode, bool ident) { diff --git a/src/plugins/simulator/xplane/simulatorxplane.h b/src/plugins/simulator/xplane/simulatorxplane.h index f42e80e50..9c372b71f 100644 --- a/src/plugins/simulator/xplane/simulatorxplane.h +++ b/src/plugins/simulator/xplane/simulatorxplane.h @@ -104,6 +104,9 @@ namespace BlackSimPlugin virtual void unload() override; //! @} + //! \copydoc BlackMisc::Simulation::ISimulationEnvironmentProvider::requestElevation + virtual bool requestElevation(const BlackMisc::Geo::ICoordinateGeodetic &reference) const override; + //! Creates an appropriate dbus connection from the string describing it static QDBusConnection connectionFromString(const QString &str);