mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-05-02 07:05:38 +08:00
Ref T180, support for SimConnect.ini files and some renamings in CSimConnectUtilities
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
#include <QMetaEnum>
|
#include <QMetaEnum>
|
||||||
#include <QMetaObject>
|
#include <QMetaObject>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
|
||||||
using namespace BlackMisc::Aviation;
|
using namespace BlackMisc::Aviation;
|
||||||
using namespace BlackMisc::PhysicalQuantities;
|
using namespace BlackMisc::PhysicalQuantities;
|
||||||
@@ -36,14 +37,27 @@ namespace BlackMisc
|
|||||||
return fn;
|
return fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CSimConnectUtilities::getLocalSimConnectCfgFilename()
|
const QString &CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename()
|
||||||
{
|
{
|
||||||
return CFileUtils::appendFilePaths(QCoreApplication::applicationDirPath(), simConnectFilename());
|
static const QString n = CFileUtils::appendFilePaths(QCoreApplication::applicationDirPath(), simConnectFilename());
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSimConnectUtilities::hasLocalSimConnectCfgFilename()
|
const QString &CSimConnectUtilities::getUserSimConnectCfgFilename()
|
||||||
{
|
{
|
||||||
const QFile f(getLocalSimConnectCfgFilename());
|
static const QString n = CFileUtils::appendFilePaths(QStandardPaths::locate(QStandardPaths::DocumentsLocation, "", QStandardPaths::LocateDirectory), simConnectFilename());
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSimConnectUtilities::hasSwiftLocalSimConnectCfgFile()
|
||||||
|
{
|
||||||
|
const QFile f(getSwiftLocalSimConnectCfgFilename());
|
||||||
|
return f.exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSimConnectUtilities::hasUserSimConnectCfgFile()
|
||||||
|
{
|
||||||
|
const QFile f(getUserSimConnectCfgFilename());
|
||||||
return f.exists();
|
return f.exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +103,7 @@ namespace BlackMisc
|
|||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString CSimConnectUtilities::resolveEnumToString(const DWORD id, const char *enumName)
|
QString CSimConnectUtilities::resolveEnumToString(const DWORD id, const char *enumName)
|
||||||
{
|
{
|
||||||
const int i = CSimConnectUtilities::staticMetaObject.indexOfEnumerator(enumName);
|
const int i = CSimConnectUtilities::staticMetaObject.indexOfEnumerator(enumName);
|
||||||
if (i < 0) return QString("No enumerator for %1").arg(enumName);
|
if (i < 0) return QString("No enumerator for %1").arg(enumName);
|
||||||
@@ -98,6 +112,12 @@ namespace BlackMisc
|
|||||||
return (k) ? QLatin1String(k) : QString("Id %1 not found for %2").arg(id).arg(enumName);
|
return (k) ? QLatin1String(k) : QString("Id %1 not found for %2").arg(id).arg(enumName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QString &CSimConnectUtilities::simConnectIniFilename()
|
||||||
|
{
|
||||||
|
static const QString n("SimConnect.ini");
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
const QString CSimConnectUtilities::simConnectExceptionToString(const DWORD id)
|
const QString CSimConnectUtilities::simConnectExceptionToString(const DWORD id)
|
||||||
{
|
{
|
||||||
return CSimConnectUtilities::resolveEnumToString(id, "SIMCONNECT_EXCEPTION");
|
return CSimConnectUtilities::resolveEnumToString(id, "SIMCONNECT_EXCEPTION");
|
||||||
@@ -109,6 +129,64 @@ namespace BlackMisc
|
|||||||
return beautify ? sf.replace('_', ' ') : sf;
|
return beautify ? sf.replace('_', ' ') : sf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList CSimConnectUtilities::getSimConnectIniFileDirectories()
|
||||||
|
{
|
||||||
|
const QString docDir = QStandardPaths::locate(QStandardPaths::DocumentsLocation, "", QStandardPaths::LocateDirectory);
|
||||||
|
if (docDir.isEmpty()) return QStringList();
|
||||||
|
|
||||||
|
QDir directory(docDir);
|
||||||
|
directory.setFilter(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
|
||||||
|
const QStringList dirList = directory.entryList();
|
||||||
|
QStringList simDirs;
|
||||||
|
for (const QString &dir : dirList)
|
||||||
|
{
|
||||||
|
if (dir.contains("Flight Simulator", Qt::CaseInsensitive) || dir.contains("Prepar3D", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
simDirs.push_back(CFileUtils::appendFilePaths(docDir, dir));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// gets the latest P3D as first
|
||||||
|
simDirs.sort();
|
||||||
|
std::reverse(std::begin(simDirs), std::end(simDirs));
|
||||||
|
return simDirs;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList CSimConnectUtilities::getSimConnectIniFiles()
|
||||||
|
{
|
||||||
|
QStringList files;
|
||||||
|
for (const QString &dir : getSimConnectIniFileDirectories())
|
||||||
|
{
|
||||||
|
const QFileInfo f(CFileUtils::appendFilePaths(dir, simConnectIniFilename()));
|
||||||
|
if (f.exists()) { files.push_back(f.absoluteFilePath()); }
|
||||||
|
}
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CSimConnectUtilities::getSimConnectIniFileDirectory(CSimulatorInfo &simulator)
|
||||||
|
{
|
||||||
|
static const QString docDir = QStandardPaths::locate(QStandardPaths::DocumentsLocation, "", QStandardPaths::LocateDirectory);
|
||||||
|
if (docDir.isEmpty()) { return ""; }
|
||||||
|
if (!simulator.isSingleSimulator() || !simulator.isFsxP3DFamily()) return "";
|
||||||
|
|
||||||
|
const QString iniDir = CFileUtils::appendFilePaths(docDir, simulator.p3d() ? "Prepar3D v4 Files" : "Flight Simulator X Files");
|
||||||
|
if (getSimConnectIniFileDirectories().isEmpty()) { return iniDir; }
|
||||||
|
|
||||||
|
for (const QString &dir : getSimConnectIniFileDirectories())
|
||||||
|
{
|
||||||
|
if (simulator.p3d())
|
||||||
|
{
|
||||||
|
if (dir.contains("Prepar3D", Qt::CaseInsensitive)) { return dir; }
|
||||||
|
}
|
||||||
|
else if (simulator.fsx())
|
||||||
|
{
|
||||||
|
if (dir.contains("Flight Simulator", Qt::CaseInsensitive)) { return dir; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return iniDir;
|
||||||
|
}
|
||||||
|
|
||||||
int CSimConnectUtilities::lightsToLightStates(const CAircraftLights &lights)
|
int CSimConnectUtilities::lightsToLightStates(const CAircraftLights &lights)
|
||||||
{
|
{
|
||||||
int lightMask = 0;
|
int lightMask = 0;
|
||||||
|
|||||||
@@ -12,10 +12,12 @@
|
|||||||
#ifndef BLACKMISC_SIMULATION_FSX_SIMCONNECTUTILITIES_H
|
#ifndef BLACKMISC_SIMULATION_FSX_SIMCONNECTUTILITIES_H
|
||||||
#define BLACKMISC_SIMULATION_FSX_SIMCONNECTUTILITIES_H
|
#define BLACKMISC_SIMULATION_FSX_SIMCONNECTUTILITIES_H
|
||||||
|
|
||||||
|
#include "blackmisc/simulation/simulatorinfo.h"
|
||||||
#include "blackmisc/aviation/aircraftlights.h"
|
#include "blackmisc/aviation/aircraftlights.h"
|
||||||
#include "blackmisc/weather/gridpoint.h"
|
#include "blackmisc/weather/gridpoint.h"
|
||||||
#include "blackmisc/blackmiscexport.h"
|
#include "blackmisc/blackmiscexport.h"
|
||||||
#include "blackmisc/windllutils.h"
|
#include "blackmisc/windllutils.h"
|
||||||
|
#include "simconnectutilities.h"
|
||||||
|
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
@@ -50,14 +52,20 @@ namespace BlackMisc
|
|||||||
//! Filename of the file
|
//! Filename of the file
|
||||||
static const QString &simConnectFilename();
|
static const QString &simConnectFilename();
|
||||||
|
|
||||||
//! Path to local config file
|
//! Path to swift local config file (generated by us, in swift dir)
|
||||||
static QString getLocalSimConnectCfgFilename();
|
static const QString &getSwiftLocalSimConnectCfgFilename();
|
||||||
|
|
||||||
//! Path to local config file
|
//! Path to user's config file
|
||||||
static bool hasLocalSimConnectCfgFilename();
|
static const QString &getUserSimConnectCfgFilename();
|
||||||
|
|
||||||
|
//! Has a swift local config file
|
||||||
|
static bool hasSwiftLocalSimConnectCfgFile();
|
||||||
|
|
||||||
|
//! Has a user config file
|
||||||
|
static bool hasUserSimConnectCfgFile();
|
||||||
|
|
||||||
//! The simconnect.cfg as settings (or nullptr settings if no such file)
|
//! The simconnect.cfg as settings (or nullptr settings if no such file)
|
||||||
static QSharedPointer<QSettings> simConnectFileAsSettings(const QString &fileName = getLocalSimConnectCfgFilename());
|
static QSharedPointer<QSettings> simConnectFileAsSettings(const QString &fileName = getSwiftLocalSimConnectCfgFilename());
|
||||||
|
|
||||||
//! IP address from settings (of simconnect.cfg), "" if not available
|
//! IP address from settings (of simconnect.cfg), "" if not available
|
||||||
static QString ipAddress(const QSettings *simConnectSettings);
|
static QString ipAddress(const QSettings *simConnectSettings);
|
||||||
@@ -89,6 +97,16 @@ namespace BlackMisc
|
|||||||
//! \return
|
//! \return
|
||||||
static const QString simConnectSurfaceTypeToString(const DWORD type, bool beautify = true);
|
static const QString simConnectSurfaceTypeToString(const DWORD type, bool beautify = true);
|
||||||
|
|
||||||
|
//! For all P3D and FSX simulators
|
||||||
|
//! \remark reevaluating directories every time
|
||||||
|
static QStringList getSimConnectIniFileDirectories();
|
||||||
|
|
||||||
|
//! For all P3D and FSX simulators
|
||||||
|
static QStringList getSimConnectIniFiles();
|
||||||
|
|
||||||
|
//! Directory where SimConnect.ini is located
|
||||||
|
static QString getSimConnectIniFileDirectory(Simulation::CSimulatorInfo &simulator);
|
||||||
|
|
||||||
//! SimConnect surfaces.
|
//! SimConnect surfaces.
|
||||||
//! \sa http://msdn.microsoft.com/en-us/library/cc526981.aspx#AircraftFlightInstrumentationData
|
//! \sa http://msdn.microsoft.com/en-us/library/cc526981.aspx#AircraftFlightInstrumentationData
|
||||||
enum SIMCONNECT_SURFACE
|
enum SIMCONNECT_SURFACE
|
||||||
@@ -190,6 +208,9 @@ namespace BlackMisc
|
|||||||
//! Get info about SimConnect DLL
|
//! Get info about SimConnect DLL
|
||||||
static BlackMisc::CWinDllUtils::DLLInfo simConnectDllInfo();
|
static BlackMisc::CWinDllUtils::DLLInfo simConnectDllInfo();
|
||||||
|
|
||||||
|
//! SimConnect.ini file name
|
||||||
|
static const QString &simConnectIniFilename();
|
||||||
|
|
||||||
//! Register metadata
|
//! Register metadata
|
||||||
static void registerMetadata();
|
static void registerMetadata();
|
||||||
|
|
||||||
@@ -199,7 +220,7 @@ namespace BlackMisc
|
|||||||
//! \param id enum element
|
//! \param id enum element
|
||||||
//! \param enumName name of the resolved enum
|
//! \param enumName name of the resolved enum
|
||||||
//! \return enum element's name
|
//! \return enum element's name
|
||||||
static const QString resolveEnumToString(const DWORD id, const char *enumName);
|
static QString resolveEnumToString(const DWORD id, const char *enumName);
|
||||||
|
|
||||||
static QString windsToSimConnectMetar(const BlackMisc::Weather::CWindLayerList &windLayers);
|
static QString windsToSimConnectMetar(const BlackMisc::Weather::CWindLayerList &windLayers);
|
||||||
static QString visibilitiesToSimConnectMetar(const BlackMisc::Weather::CVisibilityLayerList &visibilityLayers);
|
static QString visibilitiesToSimConnectMetar(const BlackMisc::Weather::CVisibilityLayerList &visibilityLayers);
|
||||||
|
|||||||
@@ -1409,7 +1409,7 @@ namespace BlackSimPlugin
|
|||||||
const QString fsxPath = CFsCommonUtil::fsxDirFromRegistry(); // can be empty for remote FSX
|
const QString fsxPath = CFsCommonUtil::fsxDirFromRegistry(); // can be empty for remote FSX
|
||||||
if (!fsxPath.isEmpty()) { s.setSimulatorInstallationDirectory(fsxPath); }
|
if (!fsxPath.isEmpty()) { s.setSimulatorInstallationDirectory(fsxPath); }
|
||||||
|
|
||||||
s.setValue("fsx/simConnectCfgFilename", CSimConnectUtilities::getLocalSimConnectCfgFilename());
|
s.setValue("fsx/simConnectCfgFilename", CSimConnectUtilities::getSwiftLocalSimConnectCfgFilename());
|
||||||
s.setValue("fsx/simConnectVersion", m_simConnectVersion);
|
s.setValue("fsx/simConnectVersion", m_simConnectVersion);
|
||||||
m_simulatorInternals = s;
|
m_simulatorInternals = s;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user