refs #335, refs #342 improved simulator states

* new signal sending all 3 states together (connected, running, paused)
* renamed ISimulator::Status to ConnectionStatus
* consolidated some member / signal names
* for FS9/XPlane implemented stub functions
This commit is contained in:
Klaus Basan
2014-11-01 18:47:42 +01:00
committed by Roland Winklmeier
parent 326ae96def
commit a94bceddab
16 changed files with 202 additions and 112 deletions

View File

@@ -13,8 +13,8 @@ namespace BlackCore
void registerMetadata()
{
// for some reasons (ask RW) these are registered twice
qRegisterMetaType<ISimulator::Status>();
qRegisterMetaType<ISimulator::Status>("Status");
qRegisterMetaType<ISimulator::ConnectionStatus>();
qRegisterMetaType<ISimulator::ConnectionStatus>("Status");
qRegisterMetaType<IVoiceChannel::ConnectionStatus>();
qRegisterMetaType<IVoiceChannel::ConnectionStatus>("ConnectionStatus");
}

View File

@@ -23,5 +23,4 @@ namespace BlackCore
return nullptr; // simulator not mandatory
}
}
}
} // namespace

View File

@@ -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;

View File

@@ -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()

View File

@@ -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<ISimulatorFactory *> m_simulatorFactories;
QFuture<bool> m_canConnectResult;
};

View File

@@ -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<bool>(QLatin1Literal("isConnected"));
}
bool CContextSimulatorProxy::canConnect()
bool CContextSimulatorProxy::canConnect() const
{
return m_dBusInterface->callDBusRet<bool>(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<bool>(QLatin1Literal("isSimulatorPaused"));
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("isPaused"));
}
bool CContextSimulatorProxy::isRunning() const
{
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("isRunning"));
}
} // namespace BlackCore

View File

@@ -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

View File

@@ -13,4 +13,9 @@ namespace BlackCore
{
ISimulator::ISimulator(QObject *parent) : QObject(parent)
{ }
void ISimulator::emitSimulatorCombinedStatus()
{
emit simulatorStatusChanged(isConnected(), isRunning(), isPaused());
}
}

View File

@@ -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