diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 552a1ff56..f52e959d7 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -88,6 +88,10 @@ namespace BlackCore //! Aircraft model virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0; + //! Set time synchronization between simulator and user's computer time + //! \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; + //! Load specific simulator plugin virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) = 0; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 8781c8dbc..9fe54cdfb 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -105,6 +105,11 @@ namespace BlackCore return this->m_simulator->getAirportsInRange(); } + + void CContextSimulator::setTimeSynchronization(bool enable, CTime offset) + { + if (!m_simulator) return; + this->setTimeSynchronization(enable, offset); } bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo) @@ -145,6 +150,16 @@ namespace BlackCore connect(m_simulator, SIGNAL(statusChanged(ISimulator::Status)), this, SLOT(setConnectionStatus(ISimulator::Status))); connect(m_simulator, &ISimulator::aircraftModelChanged, this, &IContextSimulator::ownAircraftModelChanged); + if (this->getIContextApplication() && this->getIContextApplication()->usingLocalObjects()) + { + // relay status messages + connect(m_simulator, &ISimulator::sendStatusMessage, this->getIContextApplication(), &IContextApplication::sendStatusMessage); + connect(m_simulator, &ISimulator::sendStatusMessages, this->getIContextApplication(), &IContextApplication::sendStatusMessages); + } + else + { + qFatal("No application context ot application context not local"); + } asyncConnectTo(); // try to connect QString m = QString("Simulator plugin loaded: '%1'").arg(this->m_simulator->getSimulatorInfo().toQString(true)); diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 030641430..8bb6cd946 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -62,6 +62,9 @@ namespace BlackCore //! \copydoc IContextSimulator::getAirportsInRange() virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; + //! \copydoc IContextSimulator::setTimeSynchronization + virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; + //! \copydoc IContextSimulator::loadSimulatorPlugin() virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override; diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index c9e165be9..29b9c647b 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -73,6 +73,11 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("getSimulatorInfo")); } + void CContextSimulatorProxy::setTimeSynchronization(bool enable, CTime offset) + { + m_dBusInterface->callDBus(QLatin1Literal("setTimeSynchronization"), enable, offset); + } + bool CContextSimulatorProxy::loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) { return m_dBusInterface->callDBusRet(QLatin1Literal("loadSimulatorPlugin"), simulatorInfo); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index 85b19ee71..5cfab4137 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -63,6 +63,9 @@ namespace BlackCore //! \copydoc IContextSimulator::getSimulatorInfo virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; + //! \copydoc IContextSimulator::setTimeSynchronization + virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; + //! \copydoc IContextSimulator::loadSimulatorPlugin virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override; diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index c314863fb..32d77bbd7 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -7,7 +7,7 @@ #define BLACKCORE_SIMULATOR_H #include "blacksim/simulatorinfo.h" -#include "blackmisc/statusmessage.h" +#include "blackmisc/statusmessagelist.h" #include "blackmisc/avaircraft.h" #include "blackmisc/avairportlist.h" #include "blackmisc/nwaircraftmodel.h" @@ -88,6 +88,9 @@ namespace BlackCore //! Airports in range virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0; + //! Set time synchronization between simulator and user's computer time + //! \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; signals: //! Emitted when the connection status has changed @@ -101,6 +104,12 @@ namespace BlackCore //! Simulator stopped; void simulatorStopped(); + + //! Send a message to be displayed (from simulator to contexts) + void sendStatusMessage(const BlackMisc::CStatusMessage &message); + + //! Send messages to be displayed (from simulator to contexts) + void sendStatusMessages(const BlackMisc::CStatusMessageList &messages); }; //! Factory pattern class to create instances of ISimulator diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index d5e7cdb8f..7680ad2d9 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -286,6 +286,9 @@ namespace BlackSimPlugin void CSimulatorFsx::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) { + Q_UNUSED(enable); + Q_UNUSED(offset); + } void CSimulatorFsx::onSimRunning() { diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 347161e15..6eff270df 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -129,6 +129,8 @@ namespace BlackSimPlugin //! \copydoc ISimulator::getAirportsInRange virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; + //! \copydoc ISimulator::setTimeSynchronization + virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; //! \brief Called when sim has started void onSimRunning(); diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index 5e0934580..1c8e1415d 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -9,6 +9,8 @@ #include #include +using namespace BlackMisc; + namespace BlackSimPlugin { namespace XPlane @@ -209,6 +211,15 @@ namespace BlackSimPlugin return airports; } + void CSimulatorXPlane::setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) + { + if (enable) + { + emit this->displayStatusMessage(CStatusMessage::getWarningMessage("Use time synchronization of XP itself", CStatusMessage::TypeSimulator)); + } + Q_UNUSED(offset); + } + bool CSimulatorXPlane::updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft) { if (! isConnected()) { return false; } diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index e1ab07150..6fd9ce2fb 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -77,6 +77,9 @@ namespace BlackSimPlugin //! Airports in range virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override; + //! \copydoc ISimulator::setTimeSynchronization + virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override; + private slots: void serviceRegistered(const QString &serviceName); void serviceUnregistered();