diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index a45709f3d..d8ad7c4df 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -97,6 +97,12 @@ namespace BlackCore return this; } + void CContextNetwork::setSimulationEnvironmentProvider(ISimulationEnvironmentProvider *provider) + { + if (m_airspace) { m_airspace->setSimulationEnvironmentProvider(provider); } + if (m_network) { m_network->setSimulationEnvironmentProvider(provider); } + } + CContextNetwork::~CContextNetwork() { this->gracefulShutdown(); @@ -438,17 +444,14 @@ namespace BlackCore void CContextNetwork::xCtxSimulatorStatusChanged(int status) { const ISimulator::SimulatorStatus simStatus = static_cast(status); - if (m_network) + if (ISimulator::isAnyConnectedStatus(simStatus)) { - if (simStatus.testFlag(ISimulator::Connected)) - { - const CContextSimulator *sim = this->getRuntime()->getCContextSimulator(); - m_network->setSimulationEnvironmentProvider(sim ? sim->simulator() : nullptr); - } - else - { - m_network->setSimulationEnvironmentProvider(nullptr); - } + const CContextSimulator *sim = this->getRuntime()->getCContextSimulator(); + this->setSimulationEnvironmentProvider(sim ? sim->simulator() : nullptr); + } + else + { + this->setSimulationEnvironmentProvider(nullptr); } } diff --git a/src/blackcore/context/contextnetworkimpl.h b/src/blackcore/context/contextnetworkimpl.h index 4a92b0a25..0532127c7 100644 --- a/src/blackcore/context/contextnetworkimpl.h +++ b/src/blackcore/context/contextnetworkimpl.h @@ -217,6 +217,9 @@ namespace BlackCore //! \remarks normally only for core facade internal usage CAirspaceMonitor *airspace() const { return m_airspace; } + //! Set the provider + void setSimulationEnvironmentProvider(BlackMisc::Simulation::ISimulationEnvironmentProvider *provider); + private: CAirspaceMonitor *m_airspace = nullptr; INetwork *m_network = nullptr; diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index c97bfbda7..7ac982756 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -72,6 +72,11 @@ namespace BlackCore return s.join(", "); } + bool ISimulator::isAnyConnectedStatus(SimulatorStatus status) + { + return (status.testFlag(Connected) || status.testFlag(Simulating) || status.testFlag(Paused)); + } + ISimulator::ISimulator( const CSimulatorPluginInfo &pluginInfo, IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, IWeatherGridProvider *weatherGridProvider, QObject *parent) : diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 7d7fbaab7..47bfa9911 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -207,6 +207,9 @@ namespace BlackCore //! Status to string static QString statusToString(SimulatorStatus status); + //! Any connected status? + static bool isAnyConnectedStatus(SimulatorStatus status); + signals: //! Simulator combined status void simulatorStatusChanged(SimulatorStatus status); diff --git a/src/blackmisc/geo/elevationplane.cpp b/src/blackmisc/geo/elevationplane.cpp index 4cfdbceaa..e667adf18 100644 --- a/src/blackmisc/geo/elevationplane.cpp +++ b/src/blackmisc/geo/elevationplane.cpp @@ -34,6 +34,10 @@ namespace BlackMisc m_radius = this->calculateGreatCircleDistance(rangeCoordinate); } + CElevationPlane::CElevationPlane(const ICoordinateGeodetic &coordinate, const CLength &radius) : + CCoordinateGeodetic(coordinate), m_radius(radius) + { } + const CAltitude &CElevationPlane::getAltitudeIfWithinRadius(const ICoordinateGeodetic &coordinate) const { return (isWithinRange(coordinate)) ? geodeticHeight() : CAltitude::null(); diff --git a/src/blackmisc/geo/elevationplane.h b/src/blackmisc/geo/elevationplane.h index cbbecc71e..f5ac9d1ba 100644 --- a/src/blackmisc/geo/elevationplane.h +++ b/src/blackmisc/geo/elevationplane.h @@ -36,6 +36,9 @@ namespace BlackMisc //! Plane at given coordinates with range to 2nd coordinate CElevationPlane(const ICoordinateGeodetic &coordinate, const ICoordinateGeodetic &rangeCoordinate); + //! Plane at given coordinates with radius + CElevationPlane(const ICoordinateGeodetic &coordinate, const PhysicalQuantities::CLength &radius); + //! Constructors from CCoordinateGeodetic using CCoordinateGeodetic::CCoordinateGeodetic; diff --git a/src/blackmisc/provider.h b/src/blackmisc/provider.h index ee54c5b0c..9b97be78b 100644 --- a/src/blackmisc/provider.h +++ b/src/blackmisc/provider.h @@ -44,6 +44,7 @@ namespace BlackMisc //! \remark use individual names to disambiguate void setProvider(PROVIDER *provider) { + if (m_provider == provider) { return; } if (m_provider) { m_lastProviderConnections.disconnectAll(); } m_provider = provider; // new provider IProvider *iProvider = dynamic_cast(provider);