diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 5e795ec7f..659fd880f 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -65,10 +65,8 @@ namespace BlackCore virtual ~IContextSimulator() {} signals: - //! Simulator started or stopped - void startedChanged(bool startedChanged); - //! Simulator combined status + //! \sa ISimulator::SimulatorStatus void simulatorStatusChanged(int status); //! Only a limited number of aircraft displayed @@ -84,7 +82,6 @@ namespace BlackCore void ownAircraftModelChanged(BlackMisc::Simulation::CSimulatedAircraft aircraft); public slots: - //! Return list of available simulator plugins virtual BlackSim::CSimulatorPluginInfoList getAvailableSimulatorPlugins() const = 0; @@ -93,14 +90,9 @@ namespace BlackCore virtual bool isConnected() const = 0; //! Can we connect? + //! \todo Remove? virtual bool canConnect() const = 0; - //! Connect to simulator - virtual bool connectToSimulator() = 0; - - //! Connect to simulator (asynchronous version) - virtual void asyncConnectToSimulator() = 0; - //! Disconnect from simulator virtual bool disconnectFromSimulator() = 0; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 0c9dc7ed5..3e852a935 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -36,9 +36,8 @@ namespace BlackCore m_mapper(new QSignalMapper(this)) { findSimulatorPlugins(); + // Maps listener instance connect(m_mapper, static_cast(&QSignalMapper::mapped), this, &CContextSimulator::ps_simulatorStarted); - // do not load plugin here, as it depends on settings - // it has to be guaranteed the settings are alredy loaded } CContextSimulator::~CContextSimulator() @@ -111,26 +110,6 @@ namespace BlackCore return m_simulator->simulator->canConnect(); } - bool CContextSimulator::connectToSimulator() - { - if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - if (!m_simulator) - return false; - - Q_ASSERT(m_simulator->simulator); - return m_simulator->simulator->connectTo(); - } - - void CContextSimulator::asyncConnectToSimulator() - { - if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } - if (!m_simulator || m_canConnectResult.isRunning()) - return; // already checking - - Q_ASSERT(m_simulator->simulator); - m_simulator->simulator->asyncConnectTo(); - } - bool CContextSimulator::disconnectFromSimulator() { if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } @@ -210,7 +189,7 @@ namespace BlackCore return; } Q_ASSERT(m_simulator->simulator); - m_simulator->reloadInstalledModels(); + m_simulator->simulator->reloadInstalledModels(); } CAircraftIcao CContextSimulator::getIcaoForModelString(const QString &modelString) const @@ -419,10 +398,10 @@ namespace BlackCore settingsChanged(static_cast(IContextSettings::SettingsSimulator)); // try to connect - asyncConnectToSimulator(); + m_simulator->simulator->asyncConnectTo(); // info about what is going on - CLogMessage(this).info("Simulator plugin loaded: %1") << this->m_simulator->getSimulatorInfo().toQString(true); + CLogMessage(this).info("Simulator plugin loaded: %1") << this->m_simulator->info.toQString(true); return true; } @@ -567,7 +546,7 @@ namespace BlackCore m_simulator->simulator->removeRemoteAircraft(callsign); } - void CContextSimulator::ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status) + void CContextSimulator::ps_onSimulatorStatusChanged(int status) { Q_ASSERT(m_simulator); Q_ASSERT(m_simulator->simulator); diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index c8413061d..8a6aa49d2 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -56,12 +56,6 @@ namespace BlackCore //! \copydoc IContextSimulator::canConnect virtual bool canConnect() const override; - //! \copydoc IContextSimulator::connectTo - virtual bool connectToSimulator() override; - - //! \copydoc IContextSimulator::asyncConnectTo - virtual void asyncConnectToSimulator() override; - //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFromSimulator() override; diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index d5e56a78b..2118e66da 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -69,16 +69,6 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("canConnect")); } - bool CContextSimulatorProxy::connectToSimulator() - { - return m_dBusInterface->callDBusRet(QLatin1Literal("connectToSimulator")); - } - - void CContextSimulatorProxy::asyncConnectToSimulator() - { - m_dBusInterface->callDBus(QLatin1Literal("asyncConnectToSimulator")); - } - bool CContextSimulatorProxy::disconnectFromSimulator() { return m_dBusInterface->callDBusRet(QLatin1Literal("disconnectFromSimulator")); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index 9efcc5adc..47a1020a7 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -53,12 +53,6 @@ namespace BlackCore //! \copydoc IContextSimulator::canConnect virtual bool canConnect() const override; - //! \copydoc IContextSimulator::connectTo - virtual bool connectToSimulator() override; - - //! \copydoc IContextSimulator::asyncConnectTo - virtual void asyncConnectToSimulator() override; - //! \copydoc IContextSimulator::disconnectFrom virtual bool disconnectFromSimulator() override; diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index fdfbf6d7b..36c4319bc 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -259,9 +259,9 @@ namespace BlackCore VatSimType CNetworkVatlib::convertToSimType(CSimulatorPluginInfo &simInfo) { /* TODO Define recognized simulators somewhere */ - if (simInfo.simulator() == "fs9" || simInfo.simulator() == "fsx") { + if (simInfo.getSimulator() == "fs9" || simInfo.getSimulator() == "fsx") { return vatSimTypeMSCFS; - } else if (simInfo.simulator() == "xplane") { + } else if (simInfo.getSimulator() == "xplane") { return vatSimTypeXPLANE; } else { return vatSimTypeUnknown; diff --git a/src/blackgui/components/settingssimulatorcomponent.cpp b/src/blackgui/components/settingssimulatorcomponent.cpp index 4692b395f..bdc371bce 100644 --- a/src/blackgui/components/settingssimulatorcomponent.cpp +++ b/src/blackgui/components/settingssimulatorcomponent.cpp @@ -84,14 +84,18 @@ namespace BlackGui ui->cb_Plugins->setCurrentIndex(0); return; } - - const QString searchFor = plugin.name(); + for (int i = 0; i < this->ui->cb_Plugins->count(); ++i) { - const QString t = ui->cb_Plugins->itemText(i); - if (t.indexOf(searchFor, 0, Qt::CaseInsensitive) >= 0) + QVariant data = this->ui->cb_Plugins->itemData(i); + Q_ASSERT(data.canConvert()); + CSimulatorPluginInfo p = data.value(); + + if (p.getName() == plugin.getName()) { - if (i == this->ui->cb_Plugins->currentIndex()) return; + if (i == this->ui->cb_Plugins->currentIndex()) + return; + this->ui->cb_Plugins->setCurrentIndex(i); break; } diff --git a/src/blackgui/components/simulatorcomponent.cpp b/src/blackgui/components/simulatorcomponent.cpp index f269fa274..967e516f5 100644 --- a/src/blackgui/components/simulatorcomponent.cpp +++ b/src/blackgui/components/simulatorcomponent.cpp @@ -62,13 +62,22 @@ namespace BlackGui void CSimulatorComponent::update() { + Q_ASSERT(getIContextSimulator()); + if (!this->isVisibleWidget()) return; // no updates on invisible widgets if (!this->getIContextOwnAircraft()) return; - if (!this->getIContextSimulator()->isSimulating()) - { - if (this->rowCount() == 1) { return; } - this->clear(); - this->addOrUpdateByName("info", "sim not running", CIcons::StandardIconWarning16); + + if (!this->getIContextSimulator()->isConnected()) { + addOrUpdateByName("info", tr("No simulator available"), CIcons::StandardIconWarning16); + return; + } + + if (!this->getIContextSimulator()->isSimulating()) { + this->addOrUpdateByName("info", + tr("Simulator (%1) not yet running").arg( + getIContextSimulator()->getSimulatorInfo().getSimulator() + ), + CIcons::StandardIconWarning16); return; } @@ -118,6 +127,8 @@ namespace BlackGui this->m_updateTimer->startTimer(intervalMs); } else { this->stopTimer(); + clear(); + update(); } } diff --git a/src/blacksim/simulatorinfolist.cpp b/src/blacksim/simulatorinfolist.cpp index 4e88cd0ec..a7f2691b8 100644 --- a/src/blacksim/simulatorinfolist.cpp +++ b/src/blacksim/simulatorinfolist.cpp @@ -17,7 +17,7 @@ namespace BlackSim bool CSimulatorPluginInfoList::supportsSimulator(const QString &simulator) { return std::find_if(begin(), end(), [&simulator](const CSimulatorPluginInfo &info) { - return info.simulator() == simulator; + return info.getSimulator() == simulator; }) != end(); } diff --git a/src/blacksim/simulatorplugininfo.cpp b/src/blacksim/simulatorplugininfo.cpp index 2f6249b4e..f6c878fe8 100644 --- a/src/blacksim/simulatorplugininfo.cpp +++ b/src/blacksim/simulatorplugininfo.cpp @@ -15,8 +15,10 @@ using namespace BlackMisc; namespace BlackSim { - CSimulatorPluginInfo::CSimulatorPluginInfo(const QJsonObject &json) + void CSimulatorPluginInfo::convertFromJson(const QJsonObject &json) { + + if (json["IID"].toString() != QStringLiteral("org.swift.pilotclient.BlackCore.SimulatorInterface")) { return; @@ -33,17 +35,11 @@ namespace BlackSim return; } - m_name = data["name"].toString(); - m_simulator = data["simulator"].toString(); - - if (data["description"].isString()) - { - m_description = data["description"].toString(); - } + CValueObject::convertFromJson(data); m_valid = true; } - + bool CSimulatorPluginInfo::isUnspecified() const { return m_name.isEmpty(); diff --git a/src/blacksim/simulatorplugininfo.h b/src/blacksim/simulatorplugininfo.h index f470b58ce..979ce2b69 100644 --- a/src/blacksim/simulatorplugininfo.h +++ b/src/blacksim/simulatorplugininfo.h @@ -23,7 +23,7 @@ namespace BlackSim /** * The _name_ property identifies the plugin itself and must be uniqe. */ - Q_PROPERTY(QString name READ name) + Q_PROPERTY(QString getName READ getName) /** * The _simulator_ property specifies which simulator the plugin handles. @@ -31,19 +31,18 @@ namespace BlackSim * Swift enables some features for particular simulators. Currently recognized are: * fsx, fs9, xplane */ - Q_PROPERTY(QString simulator READ simulator) + Q_PROPERTY(QString getSimulator READ getSimulator) /** * The _description_ property provides a short, human-readable description of the plugin. */ - Q_PROPERTY(QString description READ description) + Q_PROPERTY(QString getDescription READ getDescription) public: //! Default constructor CSimulatorPluginInfo() = default; - - //! This constructor takes a JSON object that comes with the plugin metadata - CSimulatorPluginInfo(const QJsonObject& json); + + virtual void convertFromJson(const QJsonObject &json) override; //! Unspecified simulator bool isUnspecified() const; @@ -63,13 +62,13 @@ namespace BlackSim //! * provides plugin name; //! * specifies simulator it handles. //! Unspecified sim is considered as invalid. - inline bool isValid() const { return m_valid; } + bool isValid() const { return m_valid; } - inline bool operator==(const CSimulatorPluginInfo& other) { return name() == other.name(); } + bool operator==(const CSimulatorPluginInfo &other) { return getName() == other.getName(); } - inline const QString& name() const { return m_name; } - inline const QString& simulator() const { return m_simulator; } - inline const QString& description() const { return m_description; } + const QString &getName() const { return m_name; } + const QString &getSimulator() const { return m_simulator; } + const QString &getDescription() const { return m_description; } protected: //! \copydoc CValueObject::convertToQString @@ -86,7 +85,10 @@ namespace BlackSim } BLACK_DECLARE_TUPLE_CONVERSION(BlackSim::CSimulatorPluginInfo, ( - o.m_name, + attr(o.m_name), + attr(o.m_simulator), + attr(o.m_description), + attr(o.m_valid), attr(o.m_simsetup, flags()) )) Q_DECLARE_METATYPE(BlackSim::CSimulatorPluginInfo) diff --git a/src/plugins/simulator/fs9/simulator_fs9.cpp b/src/plugins/simulator/fs9/simulator_fs9.cpp index b5e1f611e..ecf27703c 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.cpp +++ b/src/plugins/simulator/fs9/simulator_fs9.cpp @@ -47,7 +47,7 @@ namespace BlackSimPlugin { CSimulatorFs9::CSimulatorFs9(IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, QObject *parent) : - CSimulatorFsCommon(CSimulatorPluginInfo::FS9(), ownAircraftProvider, remoteAircraftProvider, parent) + CSimulatorFsCommon(ownAircraftProvider, remoteAircraftProvider, parent) { connect(lobbyClient.data(), &CLobbyClient::disconnected, this, std::bind(&CSimulatorFs9::simulatorStatusChanged, this, 0)); connect(fs9Host.data(), &CFs9Host::customPacketReceived, this, &CSimulatorFs9::ps_processFs9Message); @@ -293,7 +293,7 @@ namespace BlackSimPlugin if (m_lobbyConnected && fs9Host->isConnected()) { - emit simulatorStarted(m_simulatorInfo); + emit simulatorStarted(); m_lobbyConnected = false; } }); @@ -339,11 +339,6 @@ namespace BlackSimPlugin return new CSimulatorFs9(ownAircraftProvider, remoteAircraftProvider, parent); } - BlackSim::CSimulatorPluginInfo CSimulatorFs9Factory::getSimulatorInfo() const - { - return CSimulatorPluginInfo::FS9(); - } - BlackCore::ISimulatorListener *CSimulatorFs9Factory::createListener(QObject *parent) { return new CSimulatorFs9Listener(parent); diff --git a/src/plugins/simulator/fs9/simulator_fs9.h b/src/plugins/simulator/fs9/simulator_fs9.h index eacad955a..74c4f13f5 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.h +++ b/src/plugins/simulator/fs9/simulator_fs9.h @@ -130,7 +130,6 @@ namespace BlackSimPlugin QTimer* m_timer = nullptr; bool m_lobbyConnected = false; - const BlackSim::CSimulatorPluginInfo m_simulatorInfo = BlackSim::CSimulatorPluginInfo::FS9(); }; @@ -152,9 +151,6 @@ namespace BlackSimPlugin BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, QObject *parent) override; - //! Simulator info - virtual BlackSim::CSimulatorPluginInfo getSimulatorInfo() const override; - //! \copydoc BlackCore::ISimulatorFactory::createListener virtual BlackCore::ISimulatorListener *createListener(QObject *parent = nullptr) override; diff --git a/src/plugins/simulator/fs9/simulator_fs9.json b/src/plugins/simulator/fs9/simulator_fs9.json index 2ca7d4a5f..7ed4306b2 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.json +++ b/src/plugins/simulator/fs9/simulator_fs9.json @@ -1,4 +1,5 @@ { - "short_name" : "FS9", - "full_name" : "Microsoft Flight Simulator 2004" + "name" : "swift_generic_fs9", + "simulator" : "fs9", + "description" : "Microsoft Flight Simulator 2004" } \ No newline at end of file diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.cpp b/src/plugins/simulator/fscommon/simulator_fscommon.cpp index 36b4d7a4d..cae7a067d 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.cpp +++ b/src/plugins/simulator/fscommon/simulator_fscommon.cpp @@ -26,8 +26,8 @@ namespace BlackSimPlugin { namespace FsCommon { - CSimulatorFsCommon::CSimulatorFsCommon(const BlackSim::CSimulatorPluginInfo &simInfo, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *renderedAircraftProvider, QObject *parent) : - CSimulatorCommon(simInfo, ownAircraftProvider, renderedAircraftProvider, parent), + CSimulatorFsCommon::CSimulatorFsCommon(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *renderedAircraftProvider, QObject *parent) : + CSimulatorCommon(ownAircraftProvider, renderedAircraftProvider, parent), m_fsuipc(new FsCommon::CFsuipc()) { // hack to init mapper diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.h b/src/plugins/simulator/fscommon/simulator_fscommon.h index f148a72cb..ce5b1ee64 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.h +++ b/src/plugins/simulator/fscommon/simulator_fscommon.h @@ -81,7 +81,6 @@ namespace BlackSimPlugin protected: //! Constructor CSimulatorFsCommon( - const BlackSim::CSimulatorPluginInfo &simInfo, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, QObject *parent = nullptr); diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index d55bd4e0b..3acbb1790 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -39,7 +39,7 @@ namespace BlackSimPlugin namespace Fsx { CSimulatorFsx::CSimulatorFsx(IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, QObject *parent) : - CSimulatorFsCommon(CSimulatorPluginInfo::FSX(), ownAircraftProvider, remoteAircraftProvider, parent) + CSimulatorFsCommon(ownAircraftProvider, remoteAircraftProvider, parent) { Q_ASSERT(ownAircraftProvider); Q_ASSERT(remoteAircraftProvider); @@ -820,7 +820,7 @@ namespace BlackSimPlugin SimConnect_Close(hSimConnect); if (result == S_OK) - emit simulatorStarted(m_simulatorInfo); + emit simulatorStarted(); }); } diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 358d39d61..9a9f57410 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -195,6 +195,7 @@ namespace BlackSimPlugin uint m_nextObjID = 1; //!< object ID TODO: also used as request id, where to we place other request ids as for facilities QHash m_simConnectObjects; QFutureWatcher m_watcherConnect; + BlackSim::CSimulatorPluginInfo m_simulatorInfo; // statistics qint64 m_statsUpdateAircraftTimeTotal = 0; @@ -218,7 +219,6 @@ namespace BlackSimPlugin private: QTimer* m_timer; - const BlackSim::CSimulatorPluginInfo m_simulatorInfo = BlackSim::CSimulatorPluginInfo::FSX(); }; } diff --git a/src/plugins/simulator/fsx/simulator_fsx.json b/src/plugins/simulator/fsx/simulator_fsx.json index 6aed5f27c..975e18123 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.json +++ b/src/plugins/simulator/fsx/simulator_fsx.json @@ -1,4 +1,5 @@ { - "short_name" : "FSX", - "full_name" : "Microsoft Flight Simulator X (2006)" + "name" : "swift_generic_fsx", + "simulator" : "fsx", + "description" : "Microsoft Flight Simulator X (2006)" } \ No newline at end of file diff --git a/src/plugins/simulator/fsx/simulator_fsxfactory.cpp b/src/plugins/simulator/fsx/simulator_fsxfactory.cpp index e4e4b898b..fde27775a 100644 --- a/src/plugins/simulator/fsx/simulator_fsxfactory.cpp +++ b/src/plugins/simulator/fsx/simulator_fsxfactory.cpp @@ -24,11 +24,6 @@ namespace BlackSimPlugin return new CSimulatorFsx(ownAircraftProvider, renderedAircraftProvider, parent); } - BlackSim::CSimulatorPluginInfo CSimulatorFsxFactory::getSimulatorInfo() const - { - return BlackSim::CSimulatorPluginInfo::FSX(); - } - BlackCore::ISimulatorListener *CSimulatorFsxFactory::createListener(QObject *parent) { return new CSimulatorFsxListener(parent); diff --git a/src/plugins/simulator/fsx/simulator_fsxfactory.h b/src/plugins/simulator/fsx/simulator_fsxfactory.h index d4ca6e84e..c2c08bcd8 100644 --- a/src/plugins/simulator/fsx/simulator_fsxfactory.h +++ b/src/plugins/simulator/fsx/simulator_fsxfactory.h @@ -38,9 +38,6 @@ namespace BlackSimPlugin BlackMisc::Simulation::IRemoteAircraftProvider *renderedAircraftProvider, QObject *parent) override; - //! \copydoc BlackCore::ISimulatorFactory::getSimulatorInfo - virtual BlackSim::CSimulatorPluginInfo getSimulatorInfo() const override; - //! \copydoc BlackCore::ISimulatorFactory::getListener virtual BlackCore::ISimulatorListener *createListener(QObject *parent = nullptr) override; }; diff --git a/src/plugins/simulator/xplane/simulator_xplane.json b/src/plugins/simulator/xplane/simulator_xplane.json index 59b93d262..d410b38f8 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.json +++ b/src/plugins/simulator/xplane/simulator_xplane.json @@ -1,5 +1,5 @@ { "name" : "swift_generic_xplane", - "simulator" : "X-Plane", + "simulator" : "xplane", "description" : "X-Plane support via the xbus plugin" } \ No newline at end of file