feat: add native msfs2024 support

This commit is contained in:
tzobler
2024-12-17 23:06:46 +01:00
committed by Lars Toenning
parent 6267cab3aa
commit 940b7281c9
57 changed files with 978 additions and 346 deletions

View File

@@ -18,11 +18,11 @@ if(SWIFT_BUILD_XPLANE_PLUGIN)
add_subdirectory(xplaneconfig)
endif()
if(SWIFT_BUILD_FS9_PLUGIN OR SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN)
if(SWIFT_BUILD_FS9_PLUGIN OR SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN OR SWIFT_BUILD_MSFS2024_PLUGIN)
add_subdirectory(fscommon)
endif()
if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN)
if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN OR SWIFT_BUILD_MSFS2024_PLUGIN)
add_subdirectory(fsxcommon)
endif()
@@ -37,7 +37,10 @@ endif()
if(SWIFT_BUILD_MSFS_PLUGIN)
add_subdirectory(msfs)
add_subdirectory(msfsconfig)
endif()
if(SWIFT_BUILD_MSFS2024_PLUGIN)
add_subdirectory(msfs2024)
endif()
if(SWIFT_BUILD_FSX_PLUGIN)

View File

@@ -84,6 +84,7 @@ namespace swift::simplugin::fsxcommon
hr += initSimulatorEnvironment(hSimConnect);
hr += initSbDataArea(hSimConnect);
if (simInfo.isMSFS()) { hr += initMSFSTransponder(hSimConnect); }
if (simInfo.isMSFS2024()) { hr += initMSFS2024Transponder(hSimConnect); }
return hr;
}
@@ -424,6 +425,22 @@ namespace swift::simplugin::fsxcommon
return hr;
}
HRESULT CSimConnectDefinitions::initMSFS2024Transponder(const HANDLE hSimConnect)
{
HRESULT hr = s_ok();
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataTransponderModeMSFS,
"TRANSPONDER STATE:1", "Enum");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataTransponderModeMSFS,
"TRANSPONDER IDENT:1", "Bool");
if (isFailure(hr))
{
CLogMessage(static_cast<CSimConnectDefinitions *>(nullptr))
.error(u"SimConnect error: MSFS2024 transponder data definitions %1")
<< hr;
}
return hr;
}
DataDefinitionRemoteAircraftPartsWithoutLights::DataDefinitionRemoteAircraftPartsWithoutLights()
{
this->resetToInvalid();

View File

@@ -271,6 +271,7 @@ namespace swift::simplugin::fsxcommon
ClientAreaSquawkBox
};
// TODO TZ: are there any changes in MSFS2024
//! Handles SimConnect data definitions
class FSXCOMMON_EXPORT CSimConnectDefinitions
{
@@ -354,6 +355,9 @@ namespace swift::simplugin::fsxcommon
//! Initialize data definition for MSFS transponder
static HRESULT initMSFSTransponder(const HANDLE hSimConnect);
//! Initialize data definition for MSFS transponder
static HRESULT initMSFS2024Transponder(const HANDLE hSimConnect);
};
} // namespace swift::simplugin::fsxcommon

View File

@@ -351,6 +351,37 @@ bool loadAndResolveMSFSimConnect()
}
}
bool loadAndResolveMSFS2024SimConnect()
{
// Check if already loaded
if (gSymbols.SimConnect_Open) { return true; }
QString simConnectFileName(QStringLiteral("SimConnect.MSFS2024"));
QLibrary simConnectDll(simConnectFileName);
simConnectDll.setLoadHints(QLibrary::PreventUnloadHint);
if (simConnectDll.load())
{
const bool resolvedCommon = resolveCommonSimConnectSymbols(simConnectDll);
if (!resolvedCommon)
{
CLogMessage(CLogCategories::driver()).error(u"Failed to resolve common symbols from SimConnect.dll: '%1'")
<< simConnectFileName;
return false;
}
CLogMessage(CLogCategories::driver()).info(u"Loaded and resolved MSFS2024 symbols from SimConnect.dll: '%1'")
<< simConnectFileName;
return resolvedCommon;
}
else
{
CLogMessage(CLogCategories::driver()).error(u"Failed to load SimConnect.dll: '%1' '%2'")
<< simConnectFileName << simConnectDll.errorString();
return false;
}
}
#else
bool loadAndResolveFsxSimConnect(bool manifestProbing)
{

View File

@@ -39,6 +39,8 @@ inline bool loadAndResolveP3DSimConnectByString(const QString &version)
FSXCOMMON_EXPORT bool loadAndResolveMSFSimConnect();
FSXCOMMON_EXPORT bool loadAndResolveMSFS2024SimConnect();
#else
//! Load and resolve FSX SimConnect.

View File

@@ -509,7 +509,8 @@ namespace swift::simplugin::fsxcommon
const CFsxP3DSettings settings = m_detailsSettings.getSettings(this->getSimulatorInfo());
m_useAddSimulatedObj = settings.isAddingAsSimulatedObjectEnabled();
m_useSbOffsets = settings.isSbOffsetsEnabled();
if (this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS())
if (this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS() ||
this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS2024())
{
m_useSbOffsets = false; // Always disable SbOffsets for MSFS. Using new transponder mode property directly
}
@@ -533,7 +534,9 @@ namespace swift::simplugin::fsxcommon
SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED),
"Cannot request sim.env.", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
if (!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS())
// TODO TZ use MSFS2024 FSUIPC?
if (!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS() &&
!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS2024())
{
// Request the data from SB only when its changed and only ONCE so we don't have to run a 1sec event to
// get/set this info ;) there was a bug with SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET, see
@@ -3113,6 +3116,11 @@ namespace swift::simplugin::fsxcommon
// MSFS 2020 drivers only works with MSFS
return connectedSimName.contains("kittyhawk");
}
else if (pluginSim.isMSFS2024())
{
// MSFS2024 drivers only works with MSFS2024
return connectedSimName.contains("sunrise");
}
return false;
}

View File

@@ -0,0 +1,29 @@
# SPDX-FileCopyrightText: Copyright (C) swift Project Community / Contributors
# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
add_library(simulatormsfs2024 SHARED
simulatormsfs2024.cpp
simulatormsfs2024.h
simulatormsfs2024.json
simulatormsfs2024factory.cpp
simulatormsfs2024factory.h
)
set_target_properties(simulatormsfs2024 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator)
set_target_properties(simulatormsfs2024 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator)
target_include_directories(simulatormsfs2024 PUBLIC ${PROJECT_SOURCE_DIR}/src)
target_link_libraries(simulatormsfs2024
PUBLIC
fscommon
fsxcommon
core
misc
Qt::Core
)
install(TARGETS simulatormsfs2024
LIBRARY DESTINATION bin/plugins/simulator
RUNTIME DESTINATION bin/plugins/simulator
)

View File

@@ -0,0 +1,50 @@
// SPDX-FileCopyrightText: Copyright (C) 2020 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
#include "simulatorMsFs2024.h"
#include "../fsxcommon/simconnectsymbols.h"
using namespace swift::misc;
using namespace swift::misc::aviation;
using namespace swift::misc::physical_quantities;
using namespace swift::misc::geo;
using namespace swift::misc::network;
using namespace swift::misc::simulation;
using namespace swift::misc::simulation::fscommon;
using namespace swift::core;
using namespace swift::simplugin::fsxcommon;
namespace swift::simplugin::msfs2024
{
CSimulatorMsFs2024::CSimulatorMsFs2024(const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider,
IRemoteAircraftProvider *remoteAircraftProvider,
IClientProvider *clientProvider, QObject *parent)
: CSimulatorFsxCommon(info, ownAircraftProvider, remoteAircraftProvider, clientProvider, parent)
{
this->setDefaultModel({ "Airbus A320 Neo Asobo", CAircraftModel::TypeModelMatchingDefaultModel,
"Airbus A320 default model", CAircraftIcaoCode("A320", "L2J") });
}
bool CSimulatorMsFs2024::connectTo()
{
if (!loadAndResolveMSFS2024SimConnect()) { return false; }
return CSimulatorFsxCommon::connectTo();
}
void CSimulatorMsFs2024::setTrueAltitude(CAircraftSituation &aircraftSituation,
const DataDefinitionOwnAircraft &simulatorOwnAircraft)
{
aircraftSituation.setAltitude(
CAltitude(simulatorOwnAircraft.altitudeCalibratedFt, CAltitude::MeanSeaLevel, CLengthUnit::ft()));
m_altitudeDelta = { simulatorOwnAircraft.altitudeFt - simulatorOwnAircraft.altitudeCalibratedFt,
CLengthUnit::ft() };
}
void CSimulatorMsFs2024Listener::startImpl()
{
if (!loadAndResolveMSFS2024SimConnect()) { return; }
CSimulatorFsxCommonListener::startImpl();
}
} // namespace swift::simplugin::msfs2024

View File

@@ -0,0 +1,49 @@
// SPDX-FileCopyrightText: Copyright (C) 2020 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
//! \file
#ifndef SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFS2024_H
#define SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFS2024_H
#include "../fsxcommon/simulatorfsxcommon.h"
namespace swift::simplugin::msfs2024
{
//! FSX simulator implementation
class CSimulatorMsFs2024 : public swift::simplugin::fsxcommon::CSimulatorFsxCommon
{
Q_OBJECT
public:
//! Constructor, parameters as in \sa swift::core::ISimulatorFactory::create
CSimulatorMsFs2024(const swift::misc::simulation::CSimulatorPluginInfo &info,
swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider,
swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
swift::misc::network::IClientProvider *clientProvider, QObject *parent = nullptr);
//! \name ISimulator implementations
//! @{
virtual bool connectTo() override;
//! @}
virtual void
setTrueAltitude(swift::misc::aviation::CAircraftSituation &aircraftSituation,
const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft) override;
};
//! Listener for MSFS2024
class CSimulatorMsFs2024Listener : public fsxcommon::CSimulatorFsxCommonListener
{
Q_OBJECT
public:
//! Constructor
using CSimulatorFsxCommonListener::CSimulatorFsxCommonListener;
protected:
virtual void startImpl() override;
};
} // namespace swift::simplugin::msfs2024
#endif // guard

View File

@@ -0,0 +1,7 @@
{
"identifier" : "org.swift-project.plugins.simulator.msfs2024",
"name" : "Flight Simulator 2024",
"simulator" : "msfs2024",
"description" : "Microsoft Flight Simulator 2024",
"config" : "org.swift-project.plugins.simulator.msfs2024.config"
}

View File

@@ -0,0 +1,29 @@
// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
#include "simulatormsfs2024factory.h"
#include "simulatormsfs2024.h"
#include "misc/simulation/simulatorplugininfo.h"
using namespace swift::misc::network;
using namespace swift::misc::simulation;
using namespace swift::core;
namespace swift::simplugin::msfs2024
{
ISimulator *CSimulatorMsFs2024Factory::create(const CSimulatorPluginInfo &info,
IOwnAircraftProvider *ownAircraftProvider,
IRemoteAircraftProvider *remoteAircraftProvider,
IClientProvider *clientProvider)
{
Q_ASSERT(ownAircraftProvider);
return new CSimulatorMsFs2024(info, ownAircraftProvider, remoteAircraftProvider, clientProvider, this);
}
ISimulatorListener *CSimulatorMsFs2024Factory::createListener(const CSimulatorPluginInfo &info)
{
return new CSimulatorMsFs2024Listener(info);
}
} // namespace swift::simplugin::msfs2024

View File

@@ -0,0 +1,38 @@
// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
//! \file
#ifndef SWIFT_SIMPLUGIN_SIMULATOR_MSFS2024FACTORY_H
#define SWIFT_SIMPLUGIN_SIMULATOR_MSFS2024FACTORY_H
#include <QObject>
#include <QtPlugin>
#include "core/simulator.h"
#include "misc/simulation/simulatorplugininfo.h"
namespace swift::simplugin::msfs2024
{
//! Factory implementation to create CSimulatorFsx instances
class CSimulatorMsFs2024Factory : public QObject, public swift::core::ISimulatorFactory
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.swift-project.swift_core.simulatorinterface" FILE "simulatormsfs2024.json")
Q_INTERFACES(swift::core::ISimulatorFactory)
public:
//! \copydoc swift::core::ISimulatorFactory::create
virtual swift::core::ISimulator *
create(const swift::misc::simulation::CSimulatorPluginInfo &info,
swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider,
swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider,
swift::misc::network::IClientProvider *clientProvider) override;
//! \copydoc swift::core::ISimulatorFactory::createListener
virtual swift::core::ISimulatorListener *
createListener(const swift::misc::simulation::CSimulatorPluginInfo &info) override;
};
} // namespace swift::simplugin::msfs2024
#endif // guard

View File

@@ -1,27 +0,0 @@
# SPDX-FileCopyrightText: Copyright (C) swift Project Community / Contributors
# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
add_library(simulatormsfsconfig SHARED
simulatormsfsconfig.cpp
simulatormsfsconfig.h
simulatormsfsconfig.json
)
set_target_properties(simulatormsfsconfig PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator)
set_target_properties(simulatormsfsconfig PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator)
target_include_directories(simulatormsfsconfig PUBLIC ${PROJECT_SOURCE_DIR}/src)
target_link_libraries(simulatormsfsconfig
PUBLIC
gui
misc
Qt::Core
PRIVATE
fsxcommon
)
install(TARGETS simulatormsfsconfig
LIBRARY DESTINATION bin/plugins/simulator
RUNTIME DESTINATION bin/plugins/simulator
)

View File

@@ -1,19 +0,0 @@
// SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
#include "simulatormsfsconfig.h"
#include "../fsxcommon/simulatorfsxconfigwindow.h"
namespace swift::simplugin::msfs
{
CSimulatorMsfsConfig::CSimulatorMsfsConfig(QObject *parent) : QObject(parent)
{
// void
}
swift::gui::CPluginConfigWindow *CSimulatorMsfsConfig::createConfigWindow(QWidget *parent)
{
return new fsxcommon::CSimulatorFsxConfigWindow("MSFS", parent);
}
} // namespace swift::simplugin::msfs

View File

@@ -1,34 +0,0 @@
// SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
//! \file
#ifndef SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFSCONFIG_H
#define SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFSCONFIG_H
#include "gui/pluginconfig.h"
namespace swift::simplugin::msfs
{
/*!
* Window for setting up the MSFS plugin.
*/
class CSimulatorMsfsConfig : public QObject, public swift::gui::IPluginConfig
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.swift-project.swiftgui.pluginconfiginterface" FILE "simulatormsfsconfig.json")
Q_INTERFACES(swift::gui::IPluginConfig)
public:
//! Ctor
CSimulatorMsfsConfig(QObject *parent = nullptr);
//! Dtor
virtual ~CSimulatorMsfsConfig() {}
//! \copydoc swift::gui::IPluginConfig::createConfigWindow()
swift::gui::CPluginConfigWindow *createConfigWindow(QWidget *parent) override;
};
} // namespace swift::simplugin::msfs
#endif // SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFSCONFIG_H

View File

@@ -1,3 +0,0 @@
{
"identifier" : "org.swift-project.plugins.simulator.msfs.config"
}