diff --git a/src/blackcore/blackcorefreefunctions.cpp b/src/blackcore/blackcorefreefunctions.cpp index 4ed7c0969..81ce707d2 100644 --- a/src/blackcore/blackcorefreefunctions.cpp +++ b/src/blackcore/blackcorefreefunctions.cpp @@ -13,8 +13,8 @@ namespace BlackCore void registerMetadata() { // for some reasons (ask RW) these are registered twice - qRegisterMetaType(); - qRegisterMetaType("Status"); + qRegisterMetaType(); + qRegisterMetaType("Status"); qRegisterMetaType(); qRegisterMetaType("ConnectionStatus"); } diff --git a/src/blackcore/context_simulator.cpp b/src/blackcore/context_simulator.cpp index 4995258fa..6659b8ba1 100644 --- a/src/blackcore/context_simulator.cpp +++ b/src/blackcore/context_simulator.cpp @@ -23,5 +23,4 @@ namespace BlackCore return nullptr; // simulator not mandatory } } - -} +} // namespace diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 2ece6cfd9..aeba667f4 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -70,7 +70,14 @@ namespace BlackCore //! Emitted when the simulator connection changes void connectionChanged(bool connected); - //! Emitted when own aircraft model changes (TODO move to own aircraft context?) + //! Simulator started or stopped + void startedChanged(bool startedChanged); + + //! Simulator combined status + void simulatorStatusChanged(bool connected, bool running, bool paused); + + //! Emitted when own aircraft model changes + //! \todo move to own aircraft context? void ownAircraftModelChanged(BlackMisc::Network::CAircraftModel model); public slots: @@ -82,7 +89,7 @@ namespace BlackCore virtual bool isConnected() const = 0; //! Can we connect? - virtual bool canConnect() = 0; + virtual bool canConnect() const = 0; //! Connect to simulator virtual bool connectTo() = 0; @@ -93,6 +100,9 @@ namespace BlackCore //! Disconnect from simulator virtual bool disconnectFrom() = 0; + //! Returns true when simulator is running + virtual bool isRunning() const = 0; + //! Simulator info virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0; @@ -125,7 +135,7 @@ namespace BlackCore bool isSimulatorAvailable() const { return BlackMisc::CProject::isCompiledWithFlightSimulatorSupport() && !getSimulatorInfo().isUnspecified(); } //! Simulator paused? - virtual bool isSimulatorPaused() const = 0; + virtual bool isPaused() const = 0; //! Settings have been changed virtual void settingsChanged(uint type) = 0; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 0c0368634..a7f45bc2a 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -28,8 +28,7 @@ using namespace BlackSim::Settings; namespace BlackCore { - CContextSimulator::CContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextSimulator(mode, runtime), - m_simulator(nullptr), m_updateTimer(nullptr) + CContextSimulator::CContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextSimulator(mode, runtime) { m_updateTimer = new QTimer(this); findSimulatorPlugins(); @@ -63,7 +62,7 @@ namespace BlackCore return m_simulator->isConnected(); } - bool CContextSimulator::canConnect() + bool CContextSimulator::canConnect() const { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; if (!m_simulator) return false; @@ -168,11 +167,15 @@ namespace BlackCore this->unloadSimulatorPlugin(); // old plugin unloaded m_simulator = newSimulator; - connect(m_simulator, &ISimulator::statusChanged, this, &CContextSimulator::ps_onConnectionStatusChanged); + 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); + + // log connect(CLogHandler::instance(), &CLogHandler::localMessageLogged, m_simulator, &ISimulator::displayStatusMessage); connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, m_simulator, &ISimulator::displayStatusMessage); + // connect with network CAirspaceMonitor *airspace = this->getRuntime()->getCContextNetwork()->getAirspaceMonitor(); connect(airspace, &CAirspaceMonitor::addedAircraft, this, &CContextSimulator::ps_addRemoteAircraft); connect(airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextSimulator::ps_addAircraftSituation); @@ -292,18 +295,20 @@ namespace BlackCore this->m_simulator->updateOwnSimulatorCockpit(ownAircraft); } - void CContextSimulator::ps_onConnectionStatusChanged(ISimulator::Status status) + void CContextSimulator::ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status) { + bool connected; if (status == ISimulator::Connected) { + connected = true; m_updateTimer->start(100); - emit connectionChanged(true); } else { + connected = false; m_updateTimer->stop(); - emit connectionChanged(false); } + emit connectionChanged(connected); } void CContextSimulator::ps_statusMessageReceived(const CStatusMessage &statusMessage) @@ -319,7 +324,7 @@ namespace BlackCore void CContextSimulator::ps_statusMessagesReceived(const CStatusMessageList &statusMessages) { - for(const CStatusMessage &m : statusMessages) + for (const CStatusMessage &m : statusMessages) { this->ps_statusMessageReceived(m); } @@ -363,10 +368,16 @@ namespace BlackCore this->m_simulator->setTimeSynchronization(timeSync, syncOffset); } - bool CContextSimulator::isSimulatorPaused() const + bool CContextSimulator::isPaused() const { if (!this->m_simulator) return false; - return this->m_simulator->isSimPaused(); + return this->m_simulator->isPaused(); + } + + bool CContextSimulator::isRunning() const + { + if (!this->m_simulator) return false; + return this->m_simulator->isRunning(); } void CContextSimulator::findSimulatorPlugins() diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 5afc36943..e753deeed 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -48,7 +48,7 @@ namespace BlackCore virtual bool isConnected() const override; //! \copydoc IContextSimulator::canConnect - virtual bool canConnect() override; + virtual bool canConnect() const override; //! \copydoc IContextSimulator::connectTo virtual bool connectTo() override; @@ -59,6 +59,12 @@ namespace BlackCore //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFrom() override; + //! \copydoc IContextSimulator::isPaused + virtual bool isPaused() const override; + + //! \copydoc IContextSimulator::isRunning + virtual bool isRunning() const override; + //! \copydoc IContextSimulator::getSimulatorInfo() virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; @@ -89,9 +95,6 @@ namespace BlackCore //! \copydoc IContextSimulator::settingsChanged virtual void settingsChanged(uint type) override; - //! \copydoc IContextSimulator::isSimulatorPaused - virtual bool isSimulatorPaused() const override; - protected: //! \brief Constructor CContextSimulator(CRuntimeConfig::ContextMode, CRuntime *runtime); @@ -122,7 +125,7 @@ namespace BlackCore void ps_updateCockpitFromContext(const BlackMisc::Aviation::CAircraft &ownAircraft, const QString &originator); //! Handle new connection status - void ps_onConnectionStatusChanged(ISimulator::Status status); + void ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status); //! Status message received void ps_statusMessageReceived(const BlackMisc::CStatusMessage &statusMessage); @@ -139,10 +142,10 @@ namespace BlackCore BlackMisc::Network::CAircraftModel m_aircraftModel; BlackMisc::Aviation::CAircraft m_ownAircraft; - BlackCore::ISimulator *m_simulator; + BlackCore::ISimulator *m_simulator = nullptr; - QTimer *m_updateTimer; - QDir m_pluginsDir; + QTimer *m_updateTimer = nullptr; + QDir m_pluginsDir = nullptr; QSet m_simulatorFactories; QFuture m_canConnectResult; }; diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index a5a143f06..0e4c30aa4 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -25,8 +25,23 @@ namespace BlackCore this->relaySignals(serviceName, connection); } - void CContextSimulatorProxy::relaySignals(const QString &/*serviceName*/, QDBusConnection &/*connection*/) - { } + void CContextSimulatorProxy::relaySignals(const QString &serviceName, QDBusConnection &connection) + { + bool s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), + "connectionChanged", this, SIGNAL(connectionChanged(bool))); + 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))); + Q_ASSERT(s); + s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), + "ownAircraftModelChanged", this, SIGNAL(ownAircraftModelChanged(BlackMisc::Network::CAircraftModel))); + Q_ASSERT(s); + Q_UNUSED(s); + } CSimulatorInfoList CContextSimulatorProxy::getAvailableSimulatorPlugins() const { @@ -38,7 +53,7 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("isConnected")); } - bool CContextSimulatorProxy::canConnect() + bool CContextSimulatorProxy::canConnect() const { return m_dBusInterface->callDBusRet(QLatin1Literal("canConnect")); } @@ -108,9 +123,14 @@ namespace BlackCore m_dBusInterface->callDBus(QLatin1Literal("settingsChanged"), type); } - bool CContextSimulatorProxy::isSimulatorPaused() const + bool CContextSimulatorProxy::isPaused() const { - return m_dBusInterface->callDBusRet(QLatin1Literal("isSimulatorPaused")); + return m_dBusInterface->callDBusRet(QLatin1Literal("isPaused")); + } + + bool CContextSimulatorProxy::isRunning() const + { + return m_dBusInterface->callDBusRet(QLatin1Literal("isRunning")); } } // namespace BlackCore diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index d4ce7908a..da48a11cf 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -50,7 +50,7 @@ namespace BlackCore virtual bool isConnected() const override; //! \copydoc IContextSimulator::canConnect - virtual bool canConnect() override; + virtual bool canConnect() const override; //! \copydoc IContextSimulator::connectTo virtual bool connectTo() override; @@ -61,6 +61,12 @@ namespace BlackCore //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFrom() override; + //! \copydoc IContextSimulator::isRunning + virtual bool isRunning() const override; + + //! \copydoc IContextSimulator::isPaused + virtual bool isPaused() const override; + //! \copydoc IContextSimulator::getAircraftModel() virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override; @@ -91,9 +97,6 @@ namespace BlackCore //! \copydoc IContextSimulator::settingsChanged virtual void settingsChanged(uint type) override; - //! \copydoc IContextSimulator::isSimulatorPaused - virtual bool isSimulatorPaused() const override; - }; } // namespace BlackCore diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index f9c7f33c3..aedc01338 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -13,4 +13,9 @@ namespace BlackCore { ISimulator::ISimulator(QObject *parent) : QObject(parent) { } + + void ISimulator::emitSimulatorCombinedStatus() + { + emit simulatorStatusChanged(isConnected(), isRunning(), isPaused()); + } } diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index c02abc4b6..e181ab2b5 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -28,11 +28,11 @@ namespace BlackCore class ISimulator : public QObject { Q_OBJECT - Q_ENUMS(Status) + Q_ENUMS(ConnectionStatus) public: //! ISimulator connection - enum Status + enum ConnectionStatus { Disconnected, Connected, @@ -49,7 +49,17 @@ namespace BlackCore virtual bool isConnected() const = 0; //! Can we connect? - virtual bool canConnect() = 0; + //! \todo currently some code in XPlane implementation prevents to make the function const, can we fix this + virtual bool canConnect() const = 0; + + //! Is time synchronization on? + virtual bool isTimeSynchronized() const = 0; + + //! Simulator paused? + virtual bool isPaused() const = 0; + + //! Simulator running? + virtual bool isRunning() const = 0; public slots: @@ -100,27 +110,31 @@ namespace BlackCore //! \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; - //! Is time synchronization on? - virtual bool isTimeSynchronized() const = 0; - //! Time synchronization offset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const = 0; - //! Simulator paused? - virtual bool isSimPaused() const = 0; - signals: //! Emitted when the connection status has changed - void statusChanged(ISimulator::Status status); + void connectionStatusChanged(ISimulator::ConnectionStatus status); //! Emitted when own aircraft model has changed void aircraftModelChanged(BlackMisc::Network::CAircraftModel model); + //! Simulator combined status + void simulatorStatusChanged(bool connected, bool running, bool paused); + //! Simulator started void simulatorStarted(); //! Simulator stopped; void simulatorStopped(); + + + protected: + //! Emit the combined status + //! \sa simulatorStatusChanged; + void emitSimulatorCombinedStatus(); + }; //! Factory pattern class to create instances of ISimulator @@ -142,6 +156,6 @@ namespace BlackCore // TODO: Use CProject to store this string Q_DECLARE_INTERFACE(BlackCore::ISimulatorFactory, "net.vatsim.PilotClient.BlackCore.SimulatorInterface") -Q_DECLARE_METATYPE(BlackCore::ISimulator::Status) +Q_DECLARE_METATYPE(BlackCore::ISimulator::ConnectionStatus) #endif // guard diff --git a/src/blackgui/components/simulatorcomponent.cpp b/src/blackgui/components/simulatorcomponent.cpp index 920b5189f..259cf9ebe 100644 --- a/src/blackgui/components/simulatorcomponent.cpp +++ b/src/blackgui/components/simulatorcomponent.cpp @@ -59,11 +59,11 @@ namespace BlackGui { if (!this->isVisibleWidget()) return; // no updates on invisible widgets if (!this->getIContextOwnAircraft()) return; - if (!this->getIContextSimulator()->isConnected()) + if (!this->getIContextSimulator()->isRunning()) { if (this->rowCount() == 1) return; this->clear(); - this->addOrUpdateByName("info", "sim not connected", CIcons::StandardIconWarning16); + this->addOrUpdateByName("info", "sim not running", CIcons::StandardIconWarning16); return; } diff --git a/src/plugins/simulator/fs9/simulator_fs9.cpp b/src/plugins/simulator/fs9/simulator_fs9.cpp index baf3c53be..1e090b3f1 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.cpp +++ b/src/plugins/simulator/fs9/simulator_fs9.cpp @@ -97,17 +97,12 @@ namespace BlackSimPlugin // We tell the host to terminate and stop the thread afterwards QMetaObject::invokeMethod(m_fs9Host, "stopHosting"); - emit statusChanged(ISimulator::Disconnected); + emit connectionStatusChanged(ISimulator::Disconnected); m_fsuipc->disconnect(); return false; } - bool CSimulatorFs9::canConnect() - { - return true; - } - void CSimulatorFs9::addRemoteAircraft(const CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) { @@ -289,7 +284,7 @@ namespace BlackSimPlugin { m_isHosting = true; startTimer(50); - emit statusChanged(Connected); + emit connectionStatusChanged(Connected); if (m_startedLobbyConnection) { m_lobbyClient->connectFs9ToHost(m_fs9Host->getHostAddress()); @@ -304,7 +299,7 @@ namespace BlackSimPlugin connect(&m_hostThread, &QThread::finished, &m_hostThread, &QThread::deleteLater); m_hostThread.quit(); m_isHosting = false; - emit statusChanged(Disconnected); + emit connectionStatusChanged(Disconnected); break; } default: diff --git a/src/plugins/simulator/fs9/simulator_fs9.h b/src/plugins/simulator/fs9/simulator_fs9.h index 090fa71da..d00d5614f 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.h +++ b/src/plugins/simulator/fs9/simulator_fs9.h @@ -60,7 +60,17 @@ namespace BlackSimPlugin virtual bool isConnected() const override; //! \copydoc ISimulator::canConnect() - virtual bool canConnect() override; + virtual bool canConnect() const override { return true; } + + //! \copydoc ISimulator::isPaused + virtual bool isPaused() const override { return m_simPaused; } + + //! \copydoc ISimulator::isRunning + //! \todo RW fix, set better state here + virtual bool isRunning() const override { return true; } + + //! Is time synchronization on? + virtual bool isTimeSynchronized() const override { return m_syncTime; } public slots: @@ -111,15 +121,9 @@ namespace BlackSimPlugin //! \remarks not all drivers implement this, e.g. if it is an intrinsic simulator feature virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; - //! Is time synchronization on? - virtual bool isTimeSynchronized() const override { return m_syncTime; } - //! Time synchronization offset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override { return m_syncTimeOffset; } - //! Simulator paused? - virtual bool isSimPaused() const override { return m_simPaused; } - protected: //! Timer event virtual void timerEvent(QTimerEvent *event); @@ -138,6 +142,7 @@ namespace BlackSimPlugin //! Change DirectPlay host status void ps_changeHostStatus(BlackSimPlugin::Fs9::CFs9Host::HostStatus status); + //! Change client status for callsign void ps_changeClientStatus(const QString &callsign, BlackSimPlugin::Fs9::CFs9Client::ClientStatus status); private: @@ -150,11 +155,11 @@ namespace BlackSimPlugin // DirectPlay object handling CFs9Host *m_fs9Host = nullptr; QThread m_hostThread; - bool m_isHosting = false; //!< Is sim connected + bool m_isHosting = false; //!< Is sim connected bool m_startedLobbyConnection = false; - bool m_syncTime = false; //!< Time synchronized? - int m_syncDeferredCounter = 0; //!< Set when synchronized, used to wait some time - bool m_simPaused = false; //!< Simulator paused? + bool m_syncTime = false; //!< Time synchronized? + int m_syncDeferredCounter = 0; //!< Set when synchronized, used to wait some time + bool m_simPaused = false; //!< Simulator paused? QHash m_hashFs9Clients; QHash m_fs9ClientThreads; diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index 0cc0a26a3..3b7bc7f7d 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -45,9 +45,9 @@ namespace BlackSimPlugin CSimulatorFsx::CSimulatorFsx(QObject *parent) : ISimulator(parent), - m_isConnected(false), + m_simConnected(false), m_simRunning(false), - m_syncTime(false), + m_simTimeSynced(false), m_hSimConnect(nullptr), m_nextObjID(1), m_simulatorInfo(CSimulatorInfo::FSX()), @@ -67,7 +67,12 @@ namespace BlackSimPlugin bool CSimulatorFsx::isConnected() const { - return m_isConnected; + return m_simConnected; + } + + bool CSimulatorFsx::isRunning() const + { + return m_simRunning; } bool CSimulatorFsx::isFsuipcConnected() const @@ -77,11 +82,12 @@ namespace BlackSimPlugin bool CSimulatorFsx::connectTo() { - if (m_isConnected) return true; + if (m_simConnected) return true; if (FAILED(SimConnect_Open(&m_hSimConnect, BlackMisc::CProject::systemNameAndVersionChar(), nullptr, 0, 0, 0))) { - emit statusChanged(ConnectionFailed); + emit connectionStatusChanged(ConnectionFailed); + emitSimulatorCombinedStatus(); return false; } else @@ -92,9 +98,10 @@ namespace BlackSimPlugin initEvents(); initDataDefinitions(); m_simconnectTimerId = startTimer(10); - m_isConnected = true; + m_simConnected = true; - emit statusChanged(Connected); + emit connectionStatusChanged(Connected); + emitSimulatorCombinedStatus(); return true; } @@ -116,9 +123,8 @@ namespace BlackSimPlugin bool CSimulatorFsx::disconnectFrom() { - if (!m_isConnected) { return true; } + if (!m_simConnected) { return true; } - emit statusChanged(Disconnected); if (m_hSimConnect) { SimConnect_Close(m_hSimConnect); @@ -126,26 +132,34 @@ namespace BlackSimPlugin } if (m_simconnectTimerId) + { killTimer(m_simconnectTimerId); + } m_hSimConnect = nullptr; m_simconnectTimerId = -1; - m_isConnected = false; + m_simConnected = false; + emit connectionStatusChanged(Disconnected); + emitSimulatorCombinedStatus(); return true; } - bool CSimulatorFsx::canConnect() + bool CSimulatorFsx::canConnect() const { - if (m_isConnected) - return true; - - if (FAILED(SimConnect_Open(&m_hSimConnect, BlackMisc::CProject::systemNameAndVersionChar(), nullptr, 0, 0, 0))) + if (m_simConnected) { return true; } + HANDLE hSimConnect; // temporary handle + bool connect = false; + if (FAILED(SimConnect_Open(&hSimConnect, BlackMisc::CProject::systemNameAndVersionChar(), nullptr, 0, 0, 0))) { - return false; + connect = false; } - SimConnect_Close(m_hSimConnect); - return true; + else + { + connect = true; + } + SimConnect_Close(hSimConnect); + return connect; } void CSimulatorFsx::addRemoteAircraft(const CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) @@ -291,7 +305,7 @@ namespace BlackSimPlugin void CSimulatorFsx::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) { - this->m_syncTime = enable; + this->m_simTimeSynced = enable; this->m_syncTimeOffset = offset; } @@ -314,6 +328,7 @@ namespace BlackSimPlugin SIMCONNECT_DATA_REQUEST_FLAG_CHANGED); emit simulatorStarted(); + emitSimulatorCombinedStatus(); } void CSimulatorFsx::onSimStopped() @@ -321,6 +336,7 @@ namespace BlackSimPlugin if (!m_simRunning) return; m_simRunning = false; emit simulatorStopped(); + emitSimulatorCombinedStatus(); } void CSimulatorFsx::onSimFrame() @@ -414,12 +430,17 @@ namespace BlackSimPlugin initEvents(); initDataDefinitions(); m_simconnectTimerId = startTimer(50); - m_isConnected = true; + m_simConnected = true; - emit statusChanged(Connected); + emit connectionStatusChanged(Connected); + emitSimulatorCombinedStatus(); } else - emit statusChanged(ConnectionFailed); + { + m_simConnected = false; + emit connectionStatusChanged(ConnectionFailed); + emitSimulatorCombinedStatus(); + } } void CSimulatorFsx::removeRemoteAircraft(const CSimConnectObject &simObject) @@ -515,7 +536,7 @@ namespace BlackSimPlugin void CSimulatorFsx::synchronizeTime(const CTime &zuluTimeSim, const CTime &localTimeSim) { - if (!this->m_syncTime) return; + if (!this->m_simTimeSynced) return; if (!this->isConnected()) return; if (m_syncDeferredCounter > 0) { diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index a94b80a8c..23999cffd 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -92,11 +92,14 @@ namespace BlackSimPlugin //! \copydoc ISimulator::isConnected() virtual bool isConnected() const override; + //! \copydoc ISimulator::isRunning + virtual bool isRunning() const override; + //! FSUIPC connected? bool isFsuipcConnected() const; //! \copydoc ISimulator::canConnect() - virtual bool canConnect() override; + virtual bool canConnect() const override; //! SimConnect Callback static void CALLBACK SimConnectProc(SIMCONNECT_RECV *pData, DWORD cbData, void *pContext); @@ -150,13 +153,13 @@ namespace BlackSimPlugin virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; //! \copydoc ISimulator::isTimeSynchronized - virtual bool isTimeSynchronized() const override { return m_syncTime; } + virtual bool isTimeSynchronized() const override { return m_simTimeSynced; } //! \copydoc ISimulator::getTimeSynchronizationOffset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override { return m_syncTimeOffset; } //! \copydoc ISimulator::isSimPaused - virtual bool isSimPaused() const override { return m_simPaused; } + virtual bool isPaused() const override { return m_simPaused; } //! Called when sim has started void onSimRunning(); @@ -213,10 +216,10 @@ namespace BlackSimPlugin void synchronizeTime(const BlackMisc::PhysicalQuantities::CTime &zuluTimeSim, const BlackMisc::PhysicalQuantities::CTime &localTimeSim); static const int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again - bool m_isConnected = false; //!< Is simulator connected? - bool m_simRunning = false; //!< Simulator running? - bool m_simPaused = false; //!< Simulator paused? - bool m_syncTime = false; //!< Time synchronized? + bool m_simConnected = false; //!< Is simulator connected? + bool m_simRunning = false; //!< Simulator running? + bool m_simPaused = false; //!< Simulator paused? + bool m_simTimeSynced = false; //!< Time synchronized? int m_syncDeferredCounter = 0; //!< Set when synchronized, used to wait some time BlackMisc::PhysicalQuantities::CTime m_syncTimeOffset; HANDLE m_hSimConnect; //!< Handle to SimConnect object diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index bdb5618ae..305fc807d 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -71,14 +71,12 @@ namespace BlackSimPlugin return m_service && m_traffic; } - bool CSimulatorXPlane::canConnect() + bool CSimulatorXPlane::canConnect() const { if (isConnected()) { return true; } auto conn = QDBusConnection::sessionBus(); // TODO make this configurable - auto dummy = new CXBusServiceProxy(conn, this, true); - bool ok = dummy->isValid(); - delete dummy; - return ok; + CXBusServiceProxy dummy(conn, nullptr, true); + return dummy.isValid(); } bool CSimulatorXPlane::connectTo() @@ -94,7 +92,7 @@ namespace BlackSimPlugin connect(m_service, &CXBusServiceProxy::airportsInRangeUpdated, this, &CSimulatorXPlane::ps_setAirportsInRange); m_service->updateAirportsInRange(); m_watcher->setConnection(m_conn); - emit statusChanged(ISimulator::Connected); + emit connectionStatusChanged(ISimulator::Connected); return true; } else @@ -116,7 +114,7 @@ namespace BlackSimPlugin { m_traffic->cleanup(); } - emit statusChanged(ISimulator::Disconnected); + emit connectionStatusChanged(ISimulator::Disconnected); m_conn = QDBusConnection { "default" }; m_watcher->setConnection(m_conn); delete m_service; @@ -144,7 +142,7 @@ namespace BlackSimPlugin } if (m_service && m_traffic) { - emit statusChanged(ISimulator::Connected); + emit connectionStatusChanged(ISimulator::Connected); } } @@ -154,7 +152,7 @@ namespace BlackSimPlugin delete m_traffic; m_service = nullptr; m_traffic = nullptr; - emit statusChanged(ISimulator::Disconnected); + emit connectionStatusChanged(ISimulator::Disconnected); } void CSimulatorXPlane::ps_emitAircraftModelChanged(const QString &path, const QString &filename, const QString &livery, const QString &icao) diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index 0db4a8727..0bc424916 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -36,7 +36,16 @@ namespace BlackSimPlugin virtual bool isConnected() const override; //! \copydoc BlackCore::ISimulator::canConnect - virtual bool canConnect() override; + virtual bool canConnect() const override; + + //! \copydoc ISimulator::isTimeSynchronized + virtual bool isTimeSynchronized() const override { return false; } // TODO: Can we query the XP intrinisc feature? + + //! \copydoc ISimulator::isSimPaused + virtual bool isPaused() const override { return false; } + + //! \copydoc ISimulator::isRunning + virtual bool isRunning() const override { return isConnected(); } public slots: //! \copydoc BlackCore::ISimulator::connectTo @@ -86,15 +95,9 @@ namespace BlackSimPlugin //! \copydoc ISimulator::setTimeSynchronization virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; - //! \copydoc ISimulator::isTimeSynchronized - virtual bool isTimeSynchronized() const override { return false; } // TODO: Can we query the XP intrinisc feature? - //! \copydoc ISimulator::getTimeSynchronizationOffset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override { return BlackMisc::PhysicalQuantities::CTime(0, BlackMisc::PhysicalQuantities::CTimeUnit::hrmin()); } - //! \copydoc ISimulator::isSimPaused - virtual bool isSimPaused() const override { return false; } - private slots: void ps_serviceRegistered(const QString &serviceName); void ps_serviceUnregistered();