refs #808, set internals object for FSX

This commit is contained in:
Klaus Basan
2016-11-17 04:42:58 +01:00
parent c4dd888fa7
commit 53d430575c
4 changed files with 45 additions and 30 deletions

View File

@@ -13,7 +13,6 @@
#include "blackmisc/network/textmessage.h" #include "blackmisc/network/textmessage.h"
#include "blackmisc/simulation/fscommon/bcdconversions.h" #include "blackmisc/simulation/fscommon/bcdconversions.h"
#include "blackmisc/simulation/fsx/simconnectutilities.h" #include "blackmisc/simulation/fsx/simconnectutilities.h"
#include "blackmisc/simulation/fsx/fsxsimulatorinternals.h"
#include "blackmisc/simulation/simulatorplugininfo.h" #include "blackmisc/simulation/simulatorplugininfo.h"
#include "blackmisc/simulation/aircraftmodel.h" #include "blackmisc/simulation/aircraftmodel.h"
#include "blackmisc/aviation/airportlist.h" #include "blackmisc/aviation/airportlist.h"
@@ -50,7 +49,6 @@ namespace BlackSimPlugin
Q_ASSERT_X(ownAircraftProvider, Q_FUNC_INFO, "Missing provider"); Q_ASSERT_X(ownAircraftProvider, Q_FUNC_INFO, "Missing provider");
Q_ASSERT_X(remoteAircraftProvider, Q_FUNC_INFO, "Missing provider"); Q_ASSERT_X(remoteAircraftProvider, Q_FUNC_INFO, "Missing provider");
Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing global object"); Q_ASSERT_X(sApp, Q_FUNC_INFO, "Missing global object");
this->m_simulatorSetup = CFsxSimulatorInternals::getInitializedInternals();
this->m_realityBubbleTimer.setInterval(20 * 1000); this->m_realityBubbleTimer.setInterval(20 * 1000);
connect(&m_realityBubbleTimer, &QTimer::timeout, this, &CSimulatorFsx::ps_addAircraftCurrentlyOutOfBubble); connect(&m_realityBubbleTimer, &QTimer::timeout, this, &CSimulatorFsx::ps_addAircraftCurrentlyOutOfBubble);
@@ -310,7 +308,12 @@ namespace BlackSimPlugin
void CSimulatorFsx::setSimConnected() void CSimulatorFsx::setSimConnected()
{ {
m_simConnected = true; m_simConnected = true;
this->initInternalsObject();
emitSimulatorCombinedStatus(); emitSimulatorCombinedStatus();
// Internals depends on sim data which take a while to be read
// this is a trich and I re-init again after a while (which is not really expensive)
QTimer::singleShot(1000, this, [this] { this->initInternalsObject(); });
} }
void CSimulatorFsx::onSimRunning() void CSimulatorFsx::onSimRunning()
@@ -1037,6 +1040,18 @@ namespace BlackSimPlugin
} }
} }
void CSimulatorFsx::initInternalsObject()
{
CSimulatorFsCommon::initInternalsObject();
CSimulatorInternals s = this->m_simulatorInternals;
const QString fsxPath = CFsCommonUtil::fsxDirFromRegistry(); // can be empty for remote FSX
if (!fsxPath.isEmpty()) { s.setSimulatorInstallationDirectory(fsxPath); }
s.setValue("fsx/simConnectCfgFilename", CSimConnectUtilities::getLocalSimConnectCfgFilename());
s.setValue("fsx/simConnectVersion", this->m_simConnectVersion);
this->m_simulatorInternals = s;
}
void CSimulatorFsx::reset() void CSimulatorFsx::reset()
{ {
if (m_simconnectTimerId >= 0) { killTimer(m_simconnectTimerId); } if (m_simconnectTimerId >= 0) { killTimer(m_simconnectTimerId); }

View File

@@ -124,11 +124,18 @@ namespace BlackSimPlugin
const CSimConnectObjects &getSimConnectObjects() const { return m_simConnectObjects; } const CSimConnectObjects &getSimConnectObjects() const { return m_simConnectObjects; }
protected: protected:
//! \copydoc BlackCore::ISimulator::isConnected() //! \name Interface overrides
//! @{
virtual bool isConnected() const override; virtual bool isConnected() const override;
//! \copydoc BlackCore::ISimulator::isSimulating
virtual bool isSimulating() const override; virtual bool isSimulating() const override;
//! @}
//! \name Base class overrides
//! @{
virtual void reset() override;
virtual void clearAllAircraft() override;
virtual void initInternalsObject();
//! @}
//! Timer event (our SimConnect event loop), runs ps_dispatch //! Timer event (our SimConnect event loop), runs ps_dispatch
//! \sa m_simconnectTimerId //! \sa m_simconnectTimerId
@@ -192,12 +199,6 @@ namespace BlackSimPlugin
//! Reload weather settings //! Reload weather settings
void reloadWeatherSettings(); void reloadWeatherSettings();
//! Reset values when restarted
virtual void reset() override;
//! Clear all aircraft lists
virtual void clearAllAircraft() override;
//! FSX position as string //! FSX position as string
static QString fsxPositionToString(const SIMCONNECT_DATA_INITPOSITION &position); static QString fsxPositionToString(const SIMCONNECT_DATA_INITPOSITION &position);
@@ -206,6 +207,7 @@ namespace BlackSimPlugin
static constexpr int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again static constexpr int SkipUpdateCyclesForCockpit = 10; //!< skip x cycles before updating cockpit again
static constexpr int IgnoreReceiveExceptions = 10; //!< skip exceptions when displayed more than x times static constexpr int IgnoreReceiveExceptions = 10; //!< skip exceptions when displayed more than x times
QString m_simConnectVersion; //!< SimConnect version
bool m_simConnected = false; //!< Is simulator connected? bool m_simConnected = false; //!< Is simulator connected?
bool m_simSimulating = false; //!< Simulator running? bool m_simSimulating = false; //!< Simulator running?
bool m_useSbOffsets = true; //!< with SB offsets bool m_useSbOffsets = true; //!< with SB offsets

View File

@@ -12,7 +12,6 @@
#include "simconnectdatadefinition.h" #include "simconnectdatadefinition.h"
#include "blackmisc/simulation/fscommon/bcdconversions.h" #include "blackmisc/simulation/fscommon/bcdconversions.h"
#include "blackmisc/simulation/fsx/simconnectutilities.h" #include "blackmisc/simulation/fsx/simconnectutilities.h"
#include "blackmisc/simulation/fsx/fsxsimulatorinternals.h"
#include "blackmisc/simulation/simulatorplugininfo.h" #include "blackmisc/simulation/simulatorplugininfo.h"
#include "blackmisc/aviation/airportlist.h" #include "blackmisc/aviation/airportlist.h"
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
@@ -40,10 +39,10 @@ namespace BlackSimPlugin
case SIMCONNECT_RECV_ID_OPEN: case SIMCONNECT_RECV_ID_OPEN:
{ {
SIMCONNECT_RECV_OPEN *event = (SIMCONNECT_RECV_OPEN *)pData; SIMCONNECT_RECV_OPEN *event = (SIMCONNECT_RECV_OPEN *)pData;
simulatorFsx->simulatorDetails = QString("Open: AppName=\"%1\" AppVersion=%2.%3.%4.%5 SimConnectVersion=%6.%7.%8.%9") simulatorFsx->m_simulatorVersion = QString("%1.%2.%3.%4").arg(event->dwApplicationVersionMajor).arg(event->dwApplicationVersionMinor).arg(event->dwApplicationBuildMajor).arg(event->dwApplicationBuildMinor);
.arg(event->szApplicationName) simulatorFsx->m_simConnectVersion = QString("%1.%2.%3.%4").arg(event->dwSimConnectVersionMajor).arg(event->dwSimConnectVersionMinor).arg(event->dwSimConnectBuildMajor).arg(event->dwSimConnectBuildMinor);
.arg(event->dwApplicationVersionMajor).arg(event->dwApplicationVersionMinor).arg(event->dwApplicationBuildMajor).arg(event->dwApplicationBuildMinor) simulatorFsx->m_simulatorName = QString(event->szApplicationName);
.arg(event->dwSimConnectVersionMajor).arg(event->dwSimConnectVersionMinor).arg(event->dwSimConnectBuildMajor).arg(event->dwSimConnectBuildMinor); simulatorFsx->m_simulatorDetails = QString("Open: AppName=\"%1\" AppVersion=%2 SimConnectVersion=%3").arg(simulatorFsx->m_simulatorName, simulatorFsx->m_simulatorVersion, simulatorFsx->m_simConnectVersion);
CLogMessage(static_cast<CSimulatorFsx *>(nullptr)).info("Connect to FSX: %1") << sApp->swiftVersionString(); CLogMessage(static_cast<CSimulatorFsx *>(nullptr)).info("Connect to FSX: %1") << sApp->swiftVersionString();
simulatorFsx->setSimConnected(); simulatorFsx->setSimConnected();
break; break;
@@ -52,10 +51,10 @@ namespace BlackSimPlugin
{ {
if (!simulatorFsx->stillDisplayReceiveExceptions()) { break; } if (!simulatorFsx->stillDisplayReceiveExceptions()) { break; }
SIMCONNECT_RECV_EXCEPTION *exception = (SIMCONNECT_RECV_EXCEPTION *)pData; SIMCONNECT_RECV_EXCEPTION *exception = (SIMCONNECT_RECV_EXCEPTION *)pData;
const int exceptionId = static_cast<int>(exception->dwException); const DWORD exceptionId = exception->dwException;
const int sendId = static_cast<int>(exception->dwSendID); const DWORD sendId = exception->dwSendID;
const int index = static_cast<int>(exception->dwIndex); const DWORD index = exception->dwIndex;
const int data = static_cast<int>(cbData); const DWORD data = cbData;
QString ex; QString ex;
ex.sprintf("Exception=%d SendID=%d Index=%d cbData=%d", exceptionId, sendId, index, data); ex.sprintf("Exception=%d SendID=%d Index=%d cbData=%d", exceptionId, sendId, index, data);
switch (exceptionId) switch (exceptionId)

View File

@@ -14,7 +14,6 @@
#include "blackcore/context/contextsimulator.h" #include "blackcore/context/contextsimulator.h"
#include "blackmisc/network/networkutils.h" #include "blackmisc/network/networkutils.h"
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
#include "blackmisc/simulation/fsx/fsxsimulatorinternals.h"
#include "blackmisc/simulation/fsx/simconnectutilities.h" #include "blackmisc/simulation/fsx/simconnectutilities.h"
#include <QFileInfo> #include <QFileInfo>
#include <QDesktopServices> #include <QDesktopServices>
@@ -50,27 +49,26 @@ namespace BlackSimPlugin
void CSimConnectSettingsComponent::openSimConnectCfgFile() void CSimConnectSettingsComponent::openSimConnectCfgFile()
{ {
QFileInfo info(CSimConnectUtilities::getLocalSimConnectCfgFilename()); const QFileInfo info(CSimConnectUtilities::getLocalSimConnectCfgFilename());
QString path = QDir::toNativeSeparators(info.absolutePath()); const QString path = QDir::toNativeSeparators(info.absolutePath());
QDesktopServices::openUrl(QUrl(QStringLiteral("file:///") % path)); QDesktopServices::openUrl(QUrl(QStringLiteral("file:///") % path));
} }
void CSimConnectSettingsComponent::deleteSimConnectCfgFile() void CSimConnectSettingsComponent::deleteSimConnectCfgFile()
{ {
QString fileName = CSimConnectUtilities::getLocalSimConnectCfgFilename(); const QString fileName = CSimConnectUtilities::getLocalSimConnectCfgFilename();
bool result = sGui->getIContextApplication()->removeFile(fileName); const bool result = sGui->getIContextApplication()->removeFile(fileName);
if (result) if (result)
{ {
QMessageBox::information(qApp->activeWindow(), tr("File deleted"), QMessageBox::information(qApp->activeWindow(), tr("File deleted"),
tr("File %1 deleted successfully.").arg(fileName)); tr("File %1 deleted successfully.").arg(fileName));
} }
checkSimConnectCfgFile(); checkSimConnectCfgFile();
} }
void CSimConnectSettingsComponent::checkSimConnectCfgFile() void CSimConnectSettingsComponent::checkSimConnectCfgFile()
{ {
QString fileName = CSimConnectUtilities::getLocalSimConnectCfgFilename(); const QString fileName = CSimConnectUtilities::getLocalSimConnectCfgFilename();
if (sGui->getIContextApplication()->existsFile(fileName)) if (sGui->getIContextApplication()->existsFile(fileName))
{ {
ui->le_SettingsFsxExistsSimconncetCfg->setText(fileName); ui->le_SettingsFsxExistsSimconncetCfg->setText(fileName);
@@ -83,8 +81,8 @@ namespace BlackSimPlugin
void CSimConnectSettingsComponent::testSimConnectConnection() void CSimConnectSettingsComponent::testSimConnectConnection()
{ {
QString address = ui->le_SettingsFsxAddress->text().trimmed(); const QString address = ui->le_SettingsFsxAddress->text().trimmed();
QString port = ui->le_SettingsFsxPort->text().trimmed(); const QString port = ui->le_SettingsFsxPort->text().trimmed();
if (address.isEmpty() || port.isEmpty()) if (address.isEmpty() || port.isEmpty())
{ {
@@ -145,7 +143,8 @@ namespace BlackSimPlugin
if (sGui->getIContextSimulator()) if (sGui->getIContextSimulator())
{ {
fileName = sGui->getIContextSimulator()->getSimulatorInternals().getStringValue(CFsxSimulatorInternals::KeyLocalSimConnectCfgFilename()); const BlackMisc::Simulation::CSimulatorInternals internals(sGui->getIContextSimulator()->getSimulatorInternals());
fileName = internals.getStringValue("fsx/simConnectCfgFilename");
} }
if (fileName.isEmpty()) if (fileName.isEmpty())