feat: new lights and number of engines increased to 6

This commit is contained in:
tzobler
2025-11-13 13:58:36 +01:00
parent dbe7bf69fb
commit a3d6bb871f
22 changed files with 667 additions and 330 deletions

View File

@@ -551,8 +551,8 @@ namespace swift::core
// TODO TZ remove when testing is done
CLogMessage(this).info(u"CAirspaceMonitor::sendReadyForModelMatching "
u"callsign %1 ")
<< callsign;
u"callsign %1 Flag %2 ")
<< callsign << rf;
// TODO remove
// set flag and init ts
@@ -1212,17 +1212,7 @@ namespace swift::core
const CSimulatedAircraft aircraft = this->getAircraftInRangeForCallsign(callsign);
if (aircraft.hasValidCallsign())
{
// TODO TZ at this point we have a poblem if the model has no DB key yet (msfs2024 liveries)
// only if we do not have a DB model yet
// int testType = aircraft.getModelType();1
CLogMessage(this).info(u"CAirspaceMonitor::addOrUpdateAircraftInRange CHECK:"
u"aircraft.getModelType %1 "
u"callsign %2 "
u"aircraftIcao %3 "
u"incomming modelType %4 ")
<< aircraft.getModelType() << callsign.toQString() << aircraftIcao << modelType;
// we do not change manually assigned models
// we do not change manually assigned models (msfs2024)
if (!aircraft.getModel().hasValidDbKey() && aircraft.getModelType() != CAircraftModel::TypeManuallySet)
{
@@ -1491,6 +1481,7 @@ namespace swift::core
this->updateAircraftInRange(callsign, vm);
}
// TODO TZ I think, we can remove this method in future, as we have now longer IVAO supported protocols
void CAirspaceMonitor::onRevBAircraftConfigReceived(const CCallsign &callsign, const QString &config,
qint64 currentOffsetMs)
{

View File

@@ -1142,10 +1142,6 @@ namespace swift::core::context
if (c)
{
const CSimulatedAircraft aircraft(this->getAircraftInRangeForCallsign(callsign));
// TODO TZ
CLogMessage(this).info(u"CContextNetwork::updateAircraftModel model.getModelString %1 model.getModelLivery "
u"%2 model.getModelType %3 aircraft.getModelType '%4'")
<< model.getModelString() << model.getModelLivery() << model.getModelType() << aircraft.getModelType();
Q_ASSERT_X(!aircraft.getCallsign().isEmpty(), Q_FUNC_INFO, "missing callsign");
emit this->changedRemoteAircraftModel(aircraft, originator); // update aircraft model

View File

@@ -981,15 +981,6 @@ namespace swift::core
bool ISimulator::changeRemoteAircraftEnabled(const CSimulatedAircraft &aircraft)
{
if (this->isShuttingDown()) { return false; }
// TODO TZ remove after testing
CLogMessage(this).info(u"ISimulator::changeRemoteAircraftEnabled CHECK:"
u"aircraft.getModelType %1 "
u"aircraft.getModelString %2 "
u"aircraft.getLiveryString %3 ")
<< aircraft.getModelType() << aircraft.getModelString() << aircraft.getLiveryString();
;
return aircraft.isEnabled() ? this->physicallyAddRemoteAircraft(aircraft) :
this->physicallyRemoveRemoteAircraft(aircraft.getCallsign());
}

View File

@@ -41,7 +41,7 @@
#include "misc/logmessage.h"
#include "misc/network/connectionstatus.h"
#include "misc/network/entityflags.h"
// TODO TZ remove afte testing
// TODO TZ remove after testing. it is in another branch already
#include "misc/network/server.h"
// TODO TZ end remove afte testing
#include "misc/network/serverlist.h"
@@ -301,7 +301,7 @@ namespace swift::gui::components
{
if (!m_updatePilotOnServerChanges) { return; }
const bool vatsim = this->isVatsimNetworkTabSelected();
// TODO TZ remove after testing
// TODO TZ remove after testing. it is on another branch already
// const CUser user = vatsim ? this->getCurrentVatsimServer().getUser() : server.getUser();
const CUser user =
server.getServerType() != CServer::FSDServer ? this->getCurrentVatsimServer().getUser() : server.getUser();

View File

@@ -370,12 +370,6 @@ namespace swift::gui::components
{
const CAircraftModelList models = sGui->getIContextSimulator()->getModelSetModelsStartingWith(modelString);
// TODO TZ DEBUG only for testing
const CStatusMessage msg = CStatusMessage(this).validationInfo(u"Found: %1 models for %2")
<< models.size() << modelString;
this->showOverlayMessage(msg, OverlayMessageMs);
// END testing
if (models.isEmpty())
{
const CStatusMessage msg = CStatusMessage(this).validationError(u"No model for title: '%1'")

View File

@@ -100,6 +100,9 @@ namespace swift::gui::editors
ui->cb_AircraftPartsLightsBeacon->setChecked(on);
ui->cb_AircraftPartsLightsNav->setChecked(on);
ui->cb_AircraftPartsLightsLogo->setChecked(on);
ui->cb_AircraftPartsLightsWing->setChecked(on);
ui->cb_AircraftPartsLightsRecognition->setChecked(on);
ui->cb_AircraftPartsLightsCabin->setChecked(on);
}
void CAircraftPartsForm::setAllEngines()
@@ -115,10 +118,13 @@ namespace swift::gui::editors
aviation::CAircraftParts CAircraftPartsForm::guiToAircraftParts() const
{
// added new values for lights and engines here
const CAircraftLights lights(
ui->cb_AircraftPartsLightsStrobe->isChecked(), ui->cb_AircraftPartsLightsLanding->isChecked(),
ui->cb_AircraftPartsLightsTaxi->isChecked(), ui->cb_AircraftPartsLightsBeacon->isChecked(),
ui->cb_AircraftPartsLightsNav->isChecked(), ui->cb_AircraftPartsLightsLogo->isChecked());
ui->cb_AircraftPartsLightsNav->isChecked(), ui->cb_AircraftPartsLightsLogo->isChecked(),
ui->cb_AircraftPartsLightsRecognition->isChecked(), ui->cb_AircraftPartsLightsCabin->isChecked(),
ui->cb_AircraftPartsLightsWing->isChecked());
const CAircraftEngineList engines(
{ ui->cb_AircraftPartsEngine1->isChecked(), ui->cb_AircraftPartsEngine2->isChecked(),
ui->cb_AircraftPartsEngine3->isChecked(), ui->cb_AircraftPartsEngine4->isChecked(),
@@ -143,6 +149,7 @@ namespace swift::gui::editors
ui->cb_AircraftPartsLightsNav->setChecked(lights.isNavOn());
ui->cb_AircraftPartsLightsStrobe->setChecked(lights.isStrobeOn());
ui->cb_AircraftPartsLightsTaxi->setChecked(lights.isTaxiOn());
ui->cb_AircraftPartsLightsWing->setChecked(lights.isWingOn());
const CAircraftEngineList engines = parts.getEngines();
ui->cb_AircraftPartsEngine1->setChecked(engines.isEngineOn(1));

View File

@@ -32,7 +32,7 @@
<property name="bottomMargin">
<number>3</number>
</property>
<item row="4" column="1">
<item row="3" column="4">
<widget class="QCheckBox" name="cb_AircraftPartsLightsStrobe">
<property name="text">
<string>Strobe</string>
@@ -70,7 +70,31 @@
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QCheckBox" name="cb_AircraftPartsLightsWing">
<property name="text">
<string>Wing</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QCheckBox" name="cb_AircraftPartsLightsRecognition">
<property name="text">
<string>Recognition</string>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QCheckBox" name="cb_AircraftPartsLightsCabin">
<property name="text">
<string>Cabin</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="cb_AircraftPartsLightsNav">
<property name="text">
<string>Nav</string>
@@ -91,7 +115,7 @@
</property>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="3">
<widget class="QCheckBox" name="cb_AircraftPartsLightsBeacon">
<property name="text">
<string>Beacon</string>
@@ -140,7 +164,7 @@
</property>
</widget>
</item>
<item row="4" column="2">
<item row="4" column="0">
<widget class="QCheckBox" name="cb_AircraftPartsLightsLogo">
<property name="text">
<string>Logo</string>

View File

@@ -36,7 +36,6 @@ namespace swift::gui::models
(void)QT_TRANSLATE_NOOP("CAircraftModelListModel", "model");
}
// TODO TZ check if some columns can be hidden automatically for different sims
void CAircraftModelListModel::setAircraftModelMode(CAircraftModelListModel::AircraftModelMode mode)
{
if (m_mode == mode) { return; }

View File

@@ -535,6 +535,8 @@ add_library(misc SHARED
simulation/flightgear/flightgearutil.h
simulation/msfs2024/aircraftmodelloadermsfs2024.cpp
simulation/msfs2024/aircraftmodelloadermsfs2024.h
simulation/msfs2024/simconnectutilities.cpp
simulation/msfs2024/simconnectutilities.h
simulation/fscommon/aircraftcfgentries.cpp
simulation/fscommon/aircraftcfgentries.h
simulation/fscommon/aircraftcfgentrieslist.cpp
@@ -681,7 +683,7 @@ add_library(misc SHARED
weather/windlayer.h
weather/windlayerlist.cpp
weather/windlayerlist.h
)
)
if(APPLE)
target_sources(misc PRIVATE

View File

@@ -20,17 +20,23 @@ namespace swift::misc::aviation
CAircraftLights::CAircraftLights(bool strobeOn, bool landingOn, bool taxiOn, bool beaconOn, bool navOn, bool logoOn,
bool recognition, bool cabin)
: m_strobeOn(strobeOn), m_landingOn(landingOn), m_taxiOn(taxiOn), m_beaconOn(beaconOn), m_navOn(navOn),
m_logoOn(logoOn), m_recognition(recognition), m_cabin(cabin)
m_logoOn(logoOn), m_recognitionOn(recognition), m_cabinOn(cabin)
{}
CAircraftLights::CAircraftLights(bool strobeOn, bool landingOn, bool taxiOn, bool beaconOn, bool navOn, bool logoOn,
bool recognition, bool cabin, bool wing)
: m_strobeOn(strobeOn), m_landingOn(landingOn), m_taxiOn(taxiOn), m_beaconOn(beaconOn), m_navOn(navOn),
m_logoOn(logoOn), m_recognitionOn(recognition), m_cabinOn(cabin), m_wingOn(wing)
{}
CAircraftLights CAircraftLights::allLightsOn()
{
return CAircraftLights { true, true, true, true, true, true, true, true };
return CAircraftLights { true, true, true, true, true, true, true, true, true };
}
CAircraftLights CAircraftLights::allLightsOff()
{
return CAircraftLights { false, false, false, false, false, false, false, false };
return CAircraftLights { false, false, false, false, false, false, false, false, false };
}
QString CAircraftLights::convertToQString(bool i18n) const
@@ -39,7 +45,8 @@ namespace swift::misc::aviation
const QString s = u"strobe: " % boolToYesNo(m_strobeOn) % u" landing: " % boolToYesNo(m_landingOn) %
u" taxi: " % boolToYesNo(m_taxiOn) % u" beacon: " % boolToYesNo(m_beaconOn) % u" nav: " %
boolToYesNo(m_navOn) % u" logo: " % boolToYesNo(m_logoOn) % u" recognition: " %
boolToYesNo(m_recognition) % u" cabin: " % boolToYesNo(m_cabin);
boolToYesNo(m_recognitionOn) % u" cabin: " % boolToYesNo(m_cabinOn) % u" cabin: " %
boolToYesNo(m_wingOn);
return s;
}
@@ -57,8 +64,9 @@ namespace swift::misc::aviation
case IndexNav: return QVariant::fromValue(m_navOn);
case IndexStrobe: return QVariant::fromValue(m_strobeOn);
case IndexTaxi: return QVariant::fromValue(m_taxiOn);
case IndexRecognition: return QVariant::fromValue(m_recognition);
case IndexCabin: return QVariant::fromValue(m_cabin);
case IndexRecognition: return QVariant::fromValue(m_recognitionOn);
case IndexCabin: return QVariant::fromValue(m_cabinOn);
case IndexWing: return QVariant::fromValue(m_wingOn);
default: return CValueObject::propertyByIndex(index);
}
}
@@ -81,8 +89,9 @@ namespace swift::misc::aviation
case IndexNav: m_navOn = variant.toBool(); break;
case IndexStrobe: m_strobeOn = variant.toBool(); break;
case IndexTaxi: m_taxiOn = variant.toBool(); break;
case IndexCabin: m_cabin = variant.toBool(); break;
case IndexRecognition: m_recognition = variant.toBool(); break;
case IndexCabin: m_cabinOn = variant.toBool(); break;
case IndexRecognition: m_recognitionOn = variant.toBool(); break;
case IndexWing: m_wingOn = variant.toBool(); break;
default: CValueObject::setPropertyByIndex(index, variant); break;
}
}
@@ -99,8 +108,9 @@ namespace swift::misc::aviation
case IndexNav: return Compare::compare(m_navOn, compareValue.isNavOn());
case IndexStrobe: return Compare::compare(m_strobeOn, compareValue.isStrobeOn());
case IndexTaxi: return Compare::compare(m_taxiOn, compareValue.isTaxiOn());
case IndexCabin: return Compare::compare(m_cabin, compareValue.isCabinOn());
case IndexRecognition: return Compare::compare(m_recognition, compareValue.isRecognitionOn());
case IndexCabin: return Compare::compare(m_cabinOn, compareValue.isCabinOn());
case IndexRecognition: return Compare::compare(m_recognitionOn, compareValue.isRecognitionOn());
case IndexWing: return Compare::compare(m_wingOn, compareValue.isWingOn());
default: break;
}
return 0;
@@ -114,8 +124,9 @@ namespace swift::misc::aviation
m_navOn = true;
m_strobeOn = true;
m_taxiOn = true;
m_cabin = true;
m_recognition = true;
m_cabinOn = true;
m_recognitionOn = true;
m_wingOn = true;
}
void CAircraftLights::setAllOff()
@@ -126,7 +137,8 @@ namespace swift::misc::aviation
m_navOn = false;
m_strobeOn = false;
m_taxiOn = false;
m_recognition = false;
m_cabin = false;
m_recognitionOn = false;
m_cabinOn = false;
m_wingOn = false;
}
} // namespace swift::misc::aviation

View File

@@ -33,7 +33,8 @@ namespace swift::misc::aviation
IndexNav,
IndexLogo,
IndexRecognition,
IndexCabin
IndexCabin,
IndexWing,
};
//! Default constructor
@@ -49,6 +50,10 @@ namespace swift::misc::aviation
CAircraftLights(bool strobeOn, bool landingOn, bool taxiOn, bool beaconOn, bool navOn, bool logoOn,
bool recognition, bool cabin);
//! Constructor
CAircraftLights(bool strobeOn, bool landingOn, bool taxiOn, bool beaconOn, bool navOn, bool logoOn,
bool recognitionOn, bool cabin, bool wingOn);
//! Strobes lights on?
bool isStrobeOn() const { return m_strobeOn; }
@@ -86,16 +91,22 @@ namespace swift::misc::aviation
void setLogoOn(bool on) { m_logoOn = on; }
//! Recognition lights on?
bool isRecognitionOn() const { return m_recognition; }
bool isRecognitionOn() const { return m_recognitionOn; }
//! Set recognition lights
void setRecognitionOn(bool on) { m_recognition = on; }
void setRecognitionOn(bool on) { m_recognitionOn = on; }
//! Cabin lights on?
bool isCabinOn() const { return m_cabin; }
bool isCabinOn() const { return m_cabinOn; }
//! Set cabin lights
void setCabinOn(bool on) { m_cabin = on; }
void setCabinOn(bool on) { m_cabinOn = on; }
//! Wing light on?
bool isWingOn() const { return m_wingOn; }
//! Set wing lights
void setWingOn(bool on) { m_wingOn = on; }
//! All on
void setAllOn();
@@ -135,9 +146,11 @@ namespace swift::misc::aviation
bool m_beaconOn = false;
bool m_navOn = false;
bool m_logoOn = false;
bool m_recognition = false; //!< not supported by aircraft config (VATSIM)
bool m_cabin = false; //!< not supported by aircraft config (VATSIM)
bool m_recognitionOn = false; //!< not supported by aircraft config (VATSIM)
bool m_cabinOn = false; //!< not supported by aircraft config (VATSIM)
bool m_wingOn = false; //!< not supported by aircraft config (VATSIM)
// TODO TZ check if disabled lights can be activated. for testing we keep them enabled in JSON
SWIFT_METACLASS(
CAircraftLights,
SWIFT_METAMEMBER(isNull, 0, DisabledForJson), // disable since JSON is used for network
@@ -147,8 +160,12 @@ namespace swift::misc::aviation
SWIFT_METAMEMBER_NAMED(beaconOn, "beacon_on"),
SWIFT_METAMEMBER_NAMED(navOn, "nav_on"),
SWIFT_METAMEMBER_NAMED(logoOn, "logo_on"),
SWIFT_METAMEMBER(recognition, 0, DisabledForJson), // disable since JSON is used for network
SWIFT_METAMEMBER(cabin, 0, DisabledForJson) // disable since JSON is used for network
SWIFT_METAMEMBER_NAMED(recognitionOn,"recognition_on"),
SWIFT_METAMEMBER_NAMED(cabinOn, "cabin_on"),
SWIFT_METAMEMBER_NAMED(wingOn, "wing_on")
//SWIFT_METAMEMBER(recognitionOn, 0, DisabledForJson), // disable since JSON is used for network
//SWIFT_METAMEMBER(cabinOn, 0, DisabledForJson), // disable since JSON is used for network
//SWIFT_METAMEMBER(wingOn, 0, DisabledForJson) // disable since JSON is used for network
);
};
} // namespace swift::misc::aviation

View File

@@ -131,7 +131,7 @@ namespace swift::misc::simulation
return;
}
// TODO TZ
// TODO TZ 2024: skip loading for MSFS2024?
QStringList modelDirs = { "", "" };
// if (simulator.isMSFS2024())
//{

View File

@@ -58,7 +58,7 @@ namespace swift::misc::simulation::msfs2024
// TODO TZ Implement model queries via SimConnect if possible
// misc shut not include simconnect headers or plugins directly
// still no idea how to do that
const CSimulatorInfo simulatorInfo = CSimulatorInfo::msfs2024();
allModels =
CCentralMultiSimulatorModelCachesProvider::modelCachesInstance().getSynchronizedCachedModels(simulatorInfo);
@@ -83,7 +83,7 @@ namespace swift::misc::simulation::msfs2024
if (m_parserWorker && !m_parserWorker->isFinished()) { return; }
emit this->diskLoadingStarted(simulator, mode);
// TODO TZ simplify, we don't need directories
// TODO TZ need help: simplify, we don't need directories in this->performParsing for MSFS2024
m_parserWorker = CWorker::fromTask(this, "CAircraftModelLoaderMsfs2024::performParsing",
[this, modelDirs, excludedDirectoryPatterns, modelConsolidation]() {
auto models = this->performParsing();

View File

@@ -0,0 +1,75 @@
// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
#include "misc/simulation/msfs2024/simconnectutilities.h"
#include <QFlags>
#include <QLatin1String>
#include <QMetaEnum>
#include <QMetaObject>
#include "misc/stringutils.h"
using namespace swift::misc;
using namespace swift::misc::aviation;
namespace swift::misc::simulation::msfs2024
{
CSimConnectUtilities::CSimConnectUtilities() {}
QString CSimConnectUtilities::resolveEnumToString(const DWORD id, const char *enumName)
{
const int i = CSimConnectUtilities::staticMetaObject.indexOfEnumerator(enumName);
if (i < 0) { return QStringLiteral("No enumerator for %1").arg(enumName); }
const QMetaEnum m = CSimConnectUtilities::staticMetaObject.enumerator(i);
const char *k = m.valueToKey(static_cast<int>(id));
return (k) ? QLatin1String(k) : QStringLiteral("Id '%1' not found for %2").arg(id).arg(enumName);
}
QString CSimConnectUtilities::simConnectExceptionToString(const DWORD id)
{
return CSimConnectUtilities::resolveEnumToString(id, "SIMCONNECT_EXCEPTION");
}
QString CSimConnectUtilities::simConnectSurfaceTypeToString(const DWORD type, bool beautify)
{
QString sf = CSimConnectUtilities::resolveEnumToString(type, "SIMCONNECT_SURFACE");
return beautify ? sf.replace('_', ' ') : sf;
}
QString CSimConnectUtilities::simConnectReceiveIdToString(DWORD type)
{
const QString ri = CSimConnectUtilities::resolveEnumToString(type, "SIMCONNECT_RECV_ID");
return ri;
}
int CSimConnectUtilities::lightsToLightStates(const CAircraftLights &lights)
{
int lightMask = 0;
if (lights.isBeaconOn()) { lightMask |= Beacon; }
if (lights.isLandingOn()) { lightMask |= Landing; }
if (lights.isLogoOn()) { lightMask |= Logo; }
if (lights.isNavOn()) { lightMask |= Nav; }
if (lights.isStrobeOn()) { lightMask |= Strobe; }
if (lights.isTaxiOn()) { lightMask |= Taxi; }
return lightMask;
}
void CSimConnectUtilities::registerMetadata()
{
qRegisterMetaType<CSimConnectUtilities::SIMCONNECT_EXCEPTION>();
qRegisterMetaType<CSimConnectUtilities::SIMCONNECT_SURFACE>();
}
CWinDllUtils::DLLInfo CSimConnectUtilities::simConnectDllInfo()
{
const QList<CWinDllUtils::ProcessModule> modules = CWinDllUtils::getModules(-1, "simconnect");
if (modules.isEmpty())
{
CWinDllUtils::DLLInfo info;
info.errorMsg = "No SimConnect.dll loaded";
return info;
}
return CWinDllUtils::getDllInfo(modules.first().executable);
}
} // namespace swift::misc::simulation::msfs2024

View File

@@ -0,0 +1,204 @@
// 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_MISC_SIMULATION_MSFS2024_SIMCONNECTUTILITIES_H
#define SWIFT_MISC_SIMULATION_MSFS2024_SIMCONNECTUTILITIES_H
#include <QMetaType>
#include <QObject>
#include <QSettings>
#include <QString>
#include "misc/aviation/aircraftlights.h"
#include "misc/simulation/simulatorinfo.h"
#include "misc/swiftmiscexport.h"
#include "misc/windllutils.h"
// Apart from the below definitions, the following code is OS independent,
// though it does not make sense to be used on non WIN machines.
// But it allows such parts to compile on all platforms.
#ifdef Q_OS_WIN
# ifndef NOMINMAX
# define NOMINMAX
# endif
# include <Windows.h>
#else
using DWORD = unsigned long; //!< Fake Windows DWORD
#endif
namespace swift::misc::simulation::msfs2024
{
//! Utilities for SimConnect
//! \remark not using the simconnect.h headers as Misc classes are not driver aware
class SWIFT_MISC_EXPORT CSimConnectUtilities : public QObject
{
Q_OBJECT
public:
//! Resolve SimConnect exception (based on Qt metadata).
//! \param id enum element
//! \return enum element's name
static QString simConnectExceptionToString(const DWORD id);
//! Resolve SimConnect surface (based on Qt metadata).
//! \param type enum element
//! \param beautify remove "_"
static QString simConnectSurfaceTypeToString(const DWORD type, bool beautify = true);
//! SimConnect surfaces.
//! \sa http://msdn.microsoft.com/en-us/library/cc526981.aspx#AircraftFlightInstrumentationData
enum SIMCONNECT_SURFACE
{
Concrete,
Grass,
Water,
Grass_bumpy,
Asphalt,
Short_grass,
Long_grass,
Hard_turf,
Snow,
Ice,
Urban,
Forest,
Dirt,
Coral,
Gravel,
Oil_treated,
Steel_mats,
Bituminus,
Brick,
Macadam,
Planks,
Sand,
Shale,
Tarmac,
Wright_flyer_track
};
Q_ENUM(SIMCONNECT_SURFACE)
//! SimConnect exceptions.
enum SIMCONNECT_EXCEPTION
{
SIMCONNECT_EXCEPTION_NONE,
SIMCONNECT_EXCEPTION_ERROR,
SIMCONNECT_EXCEPTION_SIZE_MISMATCH,
SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID,
SIMCONNECT_EXCEPTION_UNOPENED,
SIMCONNECT_EXCEPTION_VERSION_MISMATCH,
SIMCONNECT_EXCEPTION_TOO_MANY_GROUPS,
SIMCONNECT_EXCEPTION_NAME_UNRECOGNIZED,
SIMCONNECT_EXCEPTION_TOO_MANY_EVENT_NAMES,
SIMCONNECT_EXCEPTION_EVENT_ID_DUPLICATE,
SIMCONNECT_EXCEPTION_TOO_MANY_MAPS,
SIMCONNECT_EXCEPTION_TOO_MANY_OBJECTS,
SIMCONNECT_EXCEPTION_TOO_MANY_REQUESTS,
SIMCONNECT_EXCEPTION_WEATHER_INVALID_PORT,
SIMCONNECT_EXCEPTION_WEATHER_INVALID_METAR,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_GET_OBSERVATION,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_CREATE_STATION,
SIMCONNECT_EXCEPTION_WEATHER_UNABLE_TO_REMOVE_STATION,
SIMCONNECT_EXCEPTION_INVALID_DATA_TYPE,
SIMCONNECT_EXCEPTION_INVALID_DATA_SIZE,
SIMCONNECT_EXCEPTION_DATA_ERROR,
SIMCONNECT_EXCEPTION_INVALID_ARRAY,
SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED,
SIMCONNECT_EXCEPTION_LOAD_FLIGHTPLAN_FAILED,
SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE,
SIMCONNECT_EXCEPTION_ILLEGAL_OPERATION,
SIMCONNECT_EXCEPTION_ALREADY_SUBSCRIBED,
SIMCONNECT_EXCEPTION_INVALID_ENUM,
SIMCONNECT_EXCEPTION_DEFINITION_ERROR,
SIMCONNECT_EXCEPTION_DUPLICATE_ID,
SIMCONNECT_EXCEPTION_DATUM_ID,
SIMCONNECT_EXCEPTION_OUT_OF_BOUNDS,
SIMCONNECT_EXCEPTION_ALREADY_CREATED,
SIMCONNECT_EXCEPTION_OBJECT_OUTSIDE_REALITY_BUBBLE,
SIMCONNECT_EXCEPTION_OBJECT_CONTAINER,
SIMCONNECT_EXCEPTION_OBJECT_AI,
SIMCONNECT_EXCEPTION_OBJECT_ATC,
SIMCONNECT_EXCEPTION_OBJECT_SCHEDULE
};
Q_ENUM(SIMCONNECT_EXCEPTION)
//! Lights for FSX/P3D "LIGHT ON STATES"
//! \sa http://www.prepar3d.com/SDKv2/LearningCenter/utilities/variables/simulation_variables.html
enum LIGHT_STATES
{
Nav = 0x0001,
Beacon = 0x0002,
Landing = 0x0004,
Taxi = 0x0008,
Strobe = 0x0010,
Panel = 0x0020,
Recognition = 0x0040,
Wing = 0x0080,
Logo = 0x0100,
Cabin = 0x0200
};
//! Receive IDs for SimConnect
enum SIMCONNECT_RECV_ID
{
SIMCONNECT_RECV_ID_NULL,
SIMCONNECT_RECV_ID_EXCEPTION,
SIMCONNECT_RECV_ID_OPEN,
SIMCONNECT_RECV_ID_QUIT,
SIMCONNECT_RECV_ID_EVENT,
SIMCONNECT_RECV_ID_EVENT_OBJECT_ADDREMOVE,
SIMCONNECT_RECV_ID_EVENT_FILENAME,
SIMCONNECT_RECV_ID_EVENT_FRAME,
SIMCONNECT_RECV_ID_SIMOBJECT_DATA,
SIMCONNECT_RECV_ID_SIMOBJECT_DATA_BYTYPE,
SIMCONNECT_RECV_ID_WEATHER_OBSERVATION,
SIMCONNECT_RECV_ID_CLOUD_STATE,
SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID,
SIMCONNECT_RECV_ID_RESERVED_KEY,
SIMCONNECT_RECV_ID_CUSTOM_ACTION,
SIMCONNECT_RECV_ID_SYSTEM_STATE,
SIMCONNECT_RECV_ID_CLIENT_DATA,
SIMCONNECT_RECV_ID_EVENT_WEATHER_MODE,
SIMCONNECT_RECV_ID_AIRPORT_LIST,
SIMCONNECT_RECV_ID_VOR_LIST,
SIMCONNECT_RECV_ID_NDB_LIST,
SIMCONNECT_RECV_ID_WAYPOINT_LIST,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SERVER_STARTED,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_CLIENT_STARTED,
SIMCONNECT_RECV_ID_EVENT_MULTIPLAYER_SESSION_ENDED,
SIMCONNECT_RECV_ID_EVENT_RACE_END,
SIMCONNECT_RECV_ID_EVENT_RACE_LAP,
};
Q_ENUM(SIMCONNECT_RECV_ID)
//! Receive id to string
static QString simConnectReceiveIdToString(DWORD type);
//! Lights to states
static int lightsToLightStates(const aviation::CAircraftLights &lights);
//! Get info about SimConnect DLL
static swift::misc::CWinDllUtils::DLLInfo simConnectDllInfo();
//! Register metadata
static void registerMetadata();
private:
//!
//! Resolve enum value to its cleartext (based on Qt metadata).
//! \param id enum element
//! \param enumName name of the resolved enum
//! \return enum element's name
static QString resolveEnumToString(const DWORD id, const char *enumName);
//! Hidden constructor
CSimConnectUtilities();
};
} // namespace swift::misc::simulation::msfs2024
Q_DECLARE_METATYPE(swift::misc::simulation::msfs2024::CSimConnectUtilities::SIMCONNECT_EXCEPTION)
Q_DECLARE_METATYPE(swift::misc::simulation::msfs2024::CSimConnectUtilities::SIMCONNECT_SURFACE)
Q_DECLARE_METATYPE(swift::misc::simulation::msfs2024::CSimConnectUtilities::SIMCONNECT_RECV_ID)
#endif // SWIFT_MISC_SIMULATION_MSFS2024_SIMCONNECTUTILITIES_H

View File

@@ -130,6 +130,13 @@ namespace swift::simplugin::msfs2024common
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "LIGHT NAV", "Bool");
hr +=
SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "LIGHT LOGO", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "LIGHT RECOGNITION",
"Bool");
hr +=
SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "LIGHT CABIN", "Bool");
hr +=
SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "LIGHT WING", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "TRANSPONDER CODE:1",
nullptr);
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
@@ -171,6 +178,11 @@ namespace swift::simplugin::msfs2024common
"GENERAL ENG COMBUSTION:3", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"GENERAL ENG COMBUSTION:4", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"GENERAL ENG COMBUSTION:5", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft,
"GENERAL ENG COMBUSTION:6", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "VELOCITY WORLD X",
"Feet per second");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraft, "VELOCITY WORLD Y",
@@ -236,6 +248,10 @@ namespace swift::simplugin::msfs2024common
"GENERAL ENG COMBUSTION:3", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights,
"GENERAL ENG COMBUSTION:4", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights,
"GENERAL ENG COMBUSTION:5", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights,
"GENERAL ENG COMBUSTION:6", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraftTitle, "TITLE",
nullptr, SIMCONNECT_DATATYPE_STRING256);
@@ -255,12 +271,12 @@ namespace swift::simplugin::msfs2024common
"Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftLights,
"LIGHT LOGO", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftLights, "LIGHT NAV",
"Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftLights,
"LIGHT RECOGNITION", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftLights,
"LIGHT CABIN", "Bool");
hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftLights,
"LIGHT WING", "Bool");
if (isFailure(hr))
{
@@ -473,11 +489,12 @@ namespace swift::simplugin::msfs2024common
{
return std::tie(flapsLeadingEdgeLeftPercent, flapsLeadingEdgeRightPercent, flapsTrailingEdgeLeftPercent,
flapsTrailingEdgeRightPercent, gearHandlePosition, spoilersHandlePosition, engine1Combustion,
engine2Combustion, engine3Combustion, engine4Combustion) ==
engine2Combustion, engine3Combustion, engine4Combustion, engine5Combustion,
engine6Combustion) ==
std::tie(rhs.flapsLeadingEdgeLeftPercent, rhs.flapsLeadingEdgeRightPercent,
rhs.flapsTrailingEdgeLeftPercent, rhs.flapsTrailingEdgeRightPercent, rhs.gearHandlePosition,
rhs.spoilersHandlePosition, rhs.engine1Combustion, rhs.engine2Combustion, rhs.engine3Combustion,
rhs.engine4Combustion);
rhs.engine4Combustion, rhs.engine5Combustion, rhs.engine6Combustion);
}
void DataDefinitionRemoteAircraftPartsWithoutLights::setAllEngines(bool on)
@@ -486,6 +503,8 @@ namespace swift::simplugin::msfs2024common
engine2Combustion = on ? 1 : 0;
engine3Combustion = on ? 1 : 0;
engine4Combustion = on ? 1 : 0;
engine5Combustion = on ? 1 : 0;
engine6Combustion = on ? 1 : 0;
}
void DataDefinitionRemoteAircraftPartsWithoutLights::setEngine(int number1based, bool on)
@@ -497,6 +516,8 @@ namespace swift::simplugin::msfs2024common
case 2: engine2Combustion = v; break;
case 3: engine3Combustion = v; break;
case 4: engine4Combustion = v; break;
case 5: engine5Combustion = v; break;
case 6: engine6Combustion = v; break;
default: break;
}
}
@@ -523,6 +544,8 @@ namespace swift::simplugin::msfs2024common
engine2Combustion = -1;
engine3Combustion = -1;
engine4Combustion = -1;
engine5Combustion = -1;
engine6Combustion = -1;
}
void DataDefinitionRemoteAircraftPartsWithoutLights::initFromParts(const CAircraftParts &parts)
@@ -544,7 +567,7 @@ namespace swift::simplugin::msfs2024common
CAircraftLights DataDefinitionRemoteAircraftLights::toLights() const
{
return CAircraftLights(dtb(lightStrobe), dtb(lightLanding), dtb(lightTaxi), dtb(lightBeacon), dtb(lightNav),
dtb(lightLogo), dtb(lightRecognition), dtb(lightCabin));
dtb(lightLogo), dtb(lightRecognition), dtb(lightCabin), dtb(lightWing));
}
QString DataDefinitionClientAreaSb::toQString() const

View File

@@ -47,7 +47,10 @@ namespace swift::simplugin::msfs2024common
double lightBeacon; //!< Is beacon light on?
double lightNav; //!< Is nav light on?
double lightLogo; //!< Is logo light on?
// 18
double lightRecognition;
double lightCabin; //!< Is cabin light on?
double lightWing; //!< Is wing light on?
// 21
double transponderCode; //!< Transponder Code
double com1ActiveMHz; //!< COM1 active frequency
double com2ActiveMHz; //!< COM2 active frequency
@@ -60,26 +63,28 @@ namespace swift::simplugin::msfs2024common
double comTest2; //!< COM2 test
double comStatus1; //!< COM1 status
double comStatus2; //!< COM2 status
// 30
// 33
double flapsHandlePosition; //!< Flaps handle position in percent
double spoilersHandlePosition; //!< Spoilers out? (flag)
double gearHandlePosition; //!< Gear handle position (flag)
// 33
// 36
double numberOfEngines; //!< Number of engines
double engine1Combustion; //!< Engine 1 combustion flag
double engine2Combustion; //!< Engine 2 combustion flag
double engine3Combustion; //!< Engine 3 combustion flag
double engine4Combustion; //!< Engine 4 combustion flag
// 38
double engine5Combustion; //!< Engine 5 combustion flag
double engine6Combustion; //!< Engine 6 combustion flag
// 43
double velocityWorldX; //!< Velocity World X
double velocityWorldY; //!< Velocity World Y
double velocityWorldZ; //!< Velocity World Z
double rotationVelocityBodyX; //!< Rotation Velocity Body X
double rotationVelocityBodyY; //!< Rotation Velocity Body Y
double rotationVelocityBodyZ; //!< Rotation Velocity Body Z
// 44
// 49
double altitudeCalibratedFt; //!< Altitude without temperature effect (ft, FS2020)
// 45
// 50
};
//! Data struct of aircraft position
@@ -159,6 +164,8 @@ namespace swift::simplugin::msfs2024common
double engine2Combustion; //!< Engine 2 combustion flag
double engine3Combustion; //!< Engine 3 combustion flag
double engine4Combustion; //!< Engine 4 combustion flag
double engine5Combustion; //!< Engine 5 combustion flag
double engine6Combustion; //!< Engine 6 combustion flag
//! Ctor
DataDefinitionRemoteAircraftPartsWithoutLights();
@@ -199,7 +206,7 @@ namespace swift::simplugin::msfs2024common
double lightLogo; //!< Is logo light on?
double lightRecognition; //!< Is recognition light on
double lightCabin; //!< Is cabin light on
double lightWing; //!< Is cabin light on
//! Convert to lights
swift::misc::aviation::CAircraftLights toLights() const;
};

View File

@@ -22,7 +22,7 @@ namespace swift::simplugin::msfs2024
IClientProvider *clientProvider, QObject *parent)
: CSimulatorMsfs2024(info, ownAircraftProvider, remoteAircraftProvider, clientProvider, parent)
{
this->setDefaultModel({ "A320neo V2", CAircraftModel::TypeModelMatchingDefaultModel,
this->setDefaultModel({ "A320NEO V2", CAircraftModel::TypeModelMatchingDefaultModel,
"Airbus A320 default model", CAircraftIcaoCode("A320", "L2J") });
}

View File

@@ -37,8 +37,8 @@
#include "misc/simulation/fscommon/aircraftcfgparser.h"
#include "misc/simulation/fscommon/bcdconversions.h"
#include "misc/simulation/fscommon/fscommonutil.h"
#include "misc/simulation/fsx/simconnectutilities.h"
#include "misc/simulation/interpolation/interpolatormulti.h"
#include "misc/simulation/msfs2024/simconnectutilities.h"
#include "misc/simulation/settings/simulatorsettings.h"
#include "misc/simulation/simulatorplugininfo.h"
#include "misc/statusmessagelist.h"
@@ -56,8 +56,7 @@ using namespace swift::misc::math;
using namespace swift::misc::simulation;
using namespace swift::misc::simulation::data;
using namespace swift::misc::simulation::fscommon;
using namespace swift::misc::simulation::fsx;
// using namespace swift::misc::simulation::msfs2024;
using namespace swift::misc::simulation::msfs2024;
using namespace swift::misc::simulation::settings;
using namespace swift::core;
using namespace swift::core::db;
@@ -362,7 +361,6 @@ namespace swift::simplugin::msfs2024common
sSimmobjectLoadedState.bLoadStarted = true;
CLogMessage(this).info(u"Start loading SimObjects and liverys from simulator");
// TODO TZ a message should be displayed here because the gui freezes during loading large amounts of data
const CStatusMessage m = CStatusMessage(this, CStatusMessage::SeverityInfo,
u"Start loading SimObjects and liverys from simulator");
}
@@ -399,9 +397,6 @@ namespace swift::simplugin::msfs2024common
void CSimulatorMsfs2024::setSimObjectAndLiveries()
{
// TODO TZ a message should be displayed here because the gui freezes during loading
// better: move to the background (e.g., use CWorker::fromTask(...)), avoid GUI freeze.
CLogMessage(this).info(u"%1 SimObjects and Liveries in vSimObjectsAndLiveries")
<< vSimObjectsAndLiveries.size();
@@ -410,7 +405,7 @@ namespace swift::simplugin::msfs2024common
return QVariant(); // void-Result
});
// TODO TZ where to place this message better?
// TODO TZ need help: Where can a message be placed indicating that loading is complete?
worker->then(this, [=] { CLogMessage(this).info(u"SimObjects and Liveries in vSimObjectsAndLiveries ready"); });
}
@@ -567,7 +562,7 @@ namespace swift::simplugin::msfs2024common
CLogMessage(this).info(u"%1 SimObjects and Liveries in DbModelList") << NewSet.size();
// TODO TZ only for debugging
// TODO TZ can used only for debugging
// int cstoremodels = writeSimObjectsAndLiveriesToFile(NewSet);
}
}
@@ -676,17 +671,18 @@ namespace swift::simplugin::msfs2024common
this->sendRemoteAircraftPartsToSimulator(simObject, parts);
u++;
}
if (!situation.isNull())
{
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(situation, true);
const bool traceSendId = this->isTracingSendId();
const HRESULT hr = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
static_cast<SIMCONNECT_OBJECT_ID>(simObject.getObjectId()), 0, 0,
sizeof(SIMCONNECT_DATA_INITPOSITION), &position),
traceSendId, simObject, "Failed to set position", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
if (hr == S_OK) { u++; }
}
// TODO TZ check: The function call destroys the configured simulation.
// if (!situation.isNull())
//{
// SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToPosition(situation, true);
// const bool traceSendId = this->isTracingSendId();
// const HRESULT hr = this->logAndTraceSendId(
// SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
// static_cast<SIMCONNECT_OBJECT_ID>(simObject.getObjectId()), 0, 0,
// sizeof(SIMCONNECT_DATA_INITPOSITION), &position),
// traceSendId, simObject, "Failed to set position", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
// if (hr == S_OK) { u++; }
//}
return u > 0;
}
@@ -860,12 +856,14 @@ namespace swift::simplugin::msfs2024common
return m_simConnectObjects.removeByOtherSimObject(trace.simObject);
}
// TODO TZ check if nessesary in MSFS2024
void CSimulatorMsfs2024::removeCamera(CSimConnectObject &simObject)
{
// not in FSX
Q_UNUSED(simObject)
}
// TODO TZ check if nessesary in MSFS2024
void CSimulatorMsfs2024::removeObserver(CSimConnectObject &simObject)
{
// not in FSX
@@ -883,7 +881,7 @@ namespace swift::simplugin::msfs2024common
static const QString format("hh:mm:ss.zzz");
const QString untilString = QDateTime::fromMSecsSinceEpoch(traceUntil).toString(format);
CLogMessage(this).info(u"Triggered FSX/P3D auto trace until %1") << untilString;
CLogMessage(this).info(u"Triggered MSFS2024 auto trace until %1") << untilString;
const QPointer<CSimulatorMsfs2024> myself(this);
QTimer::singleShot(traceTimeMs * 1.2, this, [=] {
// triggered by mself (ts check), otherwise ignore
@@ -914,13 +912,13 @@ namespace swift::simplugin::msfs2024common
if (simulatorOwnAircraft.pitchDeg < -90.0 || simulatorOwnAircraft.pitchDeg >= 90.0)
{
CLogMessage(this).warning(u"FSX: Pitch value (own aircraft) out of limits: %1")
CLogMessage(this).warning(u"MSFS2024: Pitch value (own aircraft) out of limits: %1")
<< simulatorOwnAircraft.pitchDeg;
}
CAircraftSituation aircraftSituation;
aircraftSituation.setMSecsSinceEpoch(ts);
aircraftSituation.setPosition(position);
// MSFS has inverted pitch and bank angles
// MSFS2024 has inverted pitch and bank angles
aircraftSituation.setPitch(CAngle(-simulatorOwnAircraft.pitchDeg, CAngleUnit::deg()));
aircraftSituation.setBank(CAngle(-simulatorOwnAircraft.bankDeg, CAngleUnit::deg()));
aircraftSituation.setHeading(CHeading(simulatorOwnAircraft.trueHeadingDeg, CHeading::True, CAngleUnit::deg()));
@@ -946,13 +944,18 @@ namespace swift::simplugin::msfs2024common
const CAircraftLights lights(dtb(simulatorOwnAircraft.lightStrobe), dtb(simulatorOwnAircraft.lightLanding),
dtb(simulatorOwnAircraft.lightTaxi), dtb(simulatorOwnAircraft.lightBeacon),
dtb(simulatorOwnAircraft.lightNav), dtb(simulatorOwnAircraft.lightLogo));
dtb(simulatorOwnAircraft.lightNav), dtb(simulatorOwnAircraft.lightLogo),
dtb(simulatorOwnAircraft.lightRecognition), dtb(simulatorOwnAircraft.lightCabin),
dtb(simulatorOwnAircraft.lightWing)
);
CAircraftEngineList engines;
const QList<bool> helperList { dtb(simulatorOwnAircraft.engine1Combustion),
dtb(simulatorOwnAircraft.engine2Combustion),
dtb(simulatorOwnAircraft.engine3Combustion),
dtb(simulatorOwnAircraft.engine4Combustion) };
const QList<bool> helperList {
dtb(simulatorOwnAircraft.engine1Combustion), dtb(simulatorOwnAircraft.engine2Combustion),
dtb(simulatorOwnAircraft.engine3Combustion), dtb(simulatorOwnAircraft.engine4Combustion),
dtb(simulatorOwnAircraft.engine5Combustion), dtb(simulatorOwnAircraft.engine6Combustion)
};
for (int index = 0; index < simulatorOwnAircraft.numberOfEngines; ++index)
{
@@ -1057,7 +1060,7 @@ namespace swift::simplugin::msfs2024common
}
else { --m_skipCockpitUpdateCycles; }
// TODO TZ check if we need to update terrain probes
// TODO TZ check this entire function for msfs2024
// slower updates
if (m_ownAircraftUpdateCycles % 10 == 0)
{
@@ -1165,7 +1168,6 @@ namespace swift::simplugin::msfs2024common
CSimConnectObject &so = m_simConnectObjects[cs];
if (so.isPendingRemoved()) { return; }
// TODO TZ verify model and livery
QString combinedModelstring =
QString::fromUtf8(remoteAircraftModel.title) + " " + QString::fromUtf8(remoteAircraftModel.livery);
const QString modelString(combinedModelstring.trimmed());
@@ -1943,7 +1945,7 @@ namespace swift::simplugin::msfs2024common
// TODO TZ handle underflow properly
CStatusMessage underflowStatus;
const SIMCONNECT_DATA_INITPOSITION initialPosition =
CSimulatorMsfs2024::aircraftSituationToFsxPosition(initialSituation, sendGround, true, &underflowStatus);
CSimulatorMsfs2024::aircraftSituationToPosition(initialSituation, sendGround, true, &underflowStatus);
QString modelString(newRemoteAircraft.getShortModelString());
const QString modelLiveryString(newRemoteAircraft.getLiveryString());
@@ -1968,12 +1970,12 @@ namespace swift::simplugin::msfs2024common
correspondingSimObject.getType() == CSimConnectObject::AircraftNonAtc)
{
CStatusMessage(this).warning(
u"Model '%1' for '%2' failed %1 time(s) before, using AICreateSimulatedObject now")
<< newRemoteAircraft.getModelString() << callsign.toQString();
u"Model '%1' for '%2' failed %3 time(s) before, using SimConnect_AICreateSimulatedObject_EX1 now")
<< newRemoteAircraft.getModelString() << callsign.toQString()
<< correspondingSimObject.getAddingExceptions();
hr = SimConnect_AICreateNonATCAircraft_EX1(m_hSimConnect, modelStringBa.constData(),
modelLiveryBa.constData(), csBa.constData(), initialPosition,
requestId);
hr = SimConnect_AICreateSimulatedObject_EX1(m_hSimConnect, modelStringBa.constData(),
modelLiveryBa.constData(), initialPosition, requestId);
type = CSimConnectObject::AircraftSimulatedObject;
}
@@ -2121,7 +2123,7 @@ namespace swift::simplugin::msfs2024common
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, SystemEventFlightLoaded, "FlightLoaded");
if (isFailure(hr))
{
CLogMessage(this).error(u"FSX plugin error: %1") << "SimConnect_SubscribeToSystemEvent failed";
CLogMessage(this).error(u"MSFS2024 plugin error: %1") << "SimConnect_SubscribeToSystemEvent failed";
return hr;
}
@@ -2147,31 +2149,34 @@ namespace swift::simplugin::msfs2024common
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTimeZuluHours, "ZULU_HOURS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTimeZuluMinutes, "ZULU_MINUTES_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandingLightsOff, "LANDING_LIGHTS_OFF");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandinglightsOn, "LANDING_LIGHTS_ON");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandingLightsOff, "LANDING_LIGHTS_OFF");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandinglightsOn, "LANDING_LIGHTS_ON");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandingLightsSet, "LANDING_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandingLightsToggle, "LANDING_LIGHTS_TOGGLE");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventPanelLightsOff, "PANEL_LIGHTS_OFF");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventPanelLightsOn, "PANEL_LIGHTS_ON");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventPanelLightsSet, "PANEL_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesOff, "STROBES_OFF");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesOn, "STROBES_ON");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesSet, "STROBES_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesToggle, "STROBES_TOGGLE");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleBeaconLights, "TOGGLE_BEACON_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleCabinLights, "TOGGLE_CABIN_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleLogoLights, "TOGGLE_LOGO_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleNavLights, "TOGGLE_NAV_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleRecognitionLights,
"TOGGLE_RECOGNITION_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleTaxiLights, "TOGGLE_TAXI_LIGHTS");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventToggleWingLights, "TOGGLE_WING_LIGHTS");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLandingLightsToggle, "LANDING_LIGHTS_TOGGLE");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventPanelLightsOff, "PANEL_LIGHTS_OFF");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventPanelLightsOn, "PANEL_LIGHTS_ON");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventPanelLightsSet, "PANEL_LIGHTS_SET");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesOff, "STROBES_OFF");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesOn, "STROBES_ON");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesSet, "STROBES_SET");
// hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventStrobesToggle, "STROBES_TOGGLE");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventBeaconLightsSet, "BEACON_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventCabinLightsSet, "CABIN_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventLogoLightsSet, "LOGO_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventNavLightsSet, "NAV_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventRecognitionLightsSet, "RECOGNITION_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventTaxiLightsSet, "TAXI_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventWingLightsSet, "WING_LIGHTS_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventGearSet, "GEAR_SET");
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventFlapsSet, "FLAPS_SET");
if (isFailure(hr))
{
CLogMessage(this).error(u"FSX plugin error: %1") << "SimConnect_MapClientEventToSimEvent failed";
CLogMessage(this).error(u"MSFS2024 plugin error: %1") << "SimConnect_MapClientEventToSimEvent failed";
return hr;
}
@@ -2201,7 +2206,7 @@ namespace swift::simplugin::msfs2024common
HRESULT hr = this->initEvents();
if (isFailure(hr))
{
CLogMessage(this).error(u"FSX plugin: initEvents failed");
CLogMessage(this).error(u"MSFS2024 plugin: initEvents failed");
return hr;
}
@@ -2209,7 +2214,7 @@ namespace swift::simplugin::msfs2024common
hr += this->initDataDefinitionsWhenConnected();
if (isFailure(hr))
{
CLogMessage(this).error(u"FSX plugin: initDataDefinitionsWhenConnected failed");
CLogMessage(this).error(u"MSFS2024 plugin: initDataDefinitionsWhenConnected failed");
return hr;
}
@@ -2218,7 +2223,7 @@ namespace swift::simplugin::msfs2024common
void CSimulatorMsfs2024::updateRemoteAircraft()
{
static_assert(sizeof(DataDefinitionRemoteAircraftPartsWithoutLights) == sizeof(double) * 10,
static_assert(sizeof(DataDefinitionRemoteAircraftPartsWithoutLights) == sizeof(double) * 12,
"DataDefinitionRemoteAircraftPartsWithoutLights has an incorrect size.");
Q_ASSERT_X(CThreadUtils::isInThisThread(this), Q_FUNC_INFO, "thread");
@@ -2283,7 +2288,7 @@ namespace swift::simplugin::msfs2024common
situation.setAltitude({ situation.getAltitude() + m_altitudeDelta * altitudeDeltaWeight,
situation.getAltitude().getReferenceDatum() });
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(situation, sendGround);
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToPosition(situation, sendGround);
const HRESULT hr = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(m_hSimConnect,
CSimConnectDefinitions::DataRemoteAircraftSetPosition,
@@ -2371,28 +2376,81 @@ namespace swift::simplugin::msfs2024common
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed so set flaps", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventFlapsSet");
// lights we can set directly
const HRESULT hr3 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventGearSet, parts.isFixedGearDown() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed so set gears", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventGearSet");
const CAircraftLights lightsIsState = simObject.getCurrentLightsInSimulator();
if (lights == lightsIsState) { return isOk(hr1, hr2, hr3); }
// lights we can set directly
const HRESULT hr4 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventLandingLightsSet,
lights.isLandingOn() ? 1.0 : 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed so set landing lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventLandingLightsSet");
const HRESULT hr4 =
const HRESULT hr5 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventStrobesSet, lights.isStrobeOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set strobe lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventStrobesSet");
// lights we need to toggle
// (potential risk with quickly changing values that we accidentally toggle back, also we need the light
// state before we can toggle)
this->sendToggledLightsToSimulator(simObject, lights);
const HRESULT hr6 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventTaxiLightsSet, lights.isTaxiOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set taxi lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventTaxiLightsSet");
const HRESULT hr7 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventNavLightsSet, lights.isNavOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set nav lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventNavLightsSet");
const HRESULT hr8 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventLogoLightsSet, lights.isLogoOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set logo lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventLogoLightsSet");
const HRESULT hr9 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventRecognitionLightsSet,
lights.isRecognitionOn() ? 1.0 : 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set recognitione lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventRecognitionLightsSet");
const HRESULT hr10 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventCabinLightsSet, lights.isCabinOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set cabin lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventCabinLightsSet");
const HRESULT hr11 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventBeaconLightsSet, lights.isBeaconOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set beacon lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventBeaconLightsSet");
const HRESULT hr12 =
this->logAndTraceSendId(SimConnect_TransmitClientEvent(
m_hSimConnect, objectId, EventWingLightsSet, lights.isWingOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set wing lights", Q_FUNC_INFO,
"SimConnect_TransmitClientEvent::EventWingLightsSet");
// done
return isOk(hr1, hr2, hr3, hr4);
return isOk(hr1, hr2, hr3, (hr4 & hr5 & hr6 & hr7 & hr8 & hr9 & hr10 & hr11 & hr12));
}
bool CSimulatorMsfs2024::sendRemoteAircraftAtcDataToSimulator(const CSimConnectObject &simObject)
@@ -2423,104 +2481,107 @@ namespace swift::simplugin::msfs2024common
return isOk(hr);
}
void CSimulatorMsfs2024::sendToggledLightsToSimulator(const CSimConnectObject &simObj,
const CAircraftLights &lightsWanted, bool force)
{
if (!simObj.isReadyToSend()) { return; } // stale
// TODO TZ under investigation, toggling lights seems to be unreliable. The settings mentioned above can be used
// directly. void CSimulatorMsfs2024::sendToggledLightsToSimulator(const CSimConnectObject &simObj,
// const CAircraftLights &lightsWanted, bool force)
//{
// if (!simObj.isReadyToSend()) { return; } // stale
const CAircraftLights lightsIsState = simObj.getCurrentLightsInSimulator();
if (lightsWanted == lightsIsState) { return; }
if (!force && lightsWanted == simObj.getLightsAsSent()) { return; }
const CCallsign callsign(simObj.getCallsign());
// const CAircraftLights lightsIsState = simObj.getCurrentLightsInSimulator();
// if (lightsWanted == lightsIsState) { return; }
// if (!force && lightsWanted == simObj.getLightsAsSent()) { return; }
// const CCallsign callsign(simObj.getCallsign());
// Update data
if (m_simConnectObjects.contains(callsign))
{
CSimConnectObject &simObjToUpdate = m_simConnectObjects[callsign];
simObjToUpdate.setLightsAsSent(lightsWanted);
}
// // Update data
// if (m_simConnectObjects.contains(callsign))
// {
// CSimConnectObject &simObjToUpdate = m_simConnectObjects[callsign];
// simObjToUpdate.setLightsAsSent(lightsWanted);
// }
// state available, then I can toggle
if (!lightsIsState.isNull())
{
const DWORD objectId = simObj.getObjectId();
const bool trace = this->isTracingSendId();
// // state available, then I can toggle
// if (!lightsIsState.isNull())
// {
// const DWORD objectId = simObj.getObjectId();
// const bool trace = this->isTracingSendId();
if (lightsWanted.isTaxiOn() != lightsIsState.isTaxiOn())
{
this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleTaxiLights,
0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle taxi lights", Q_FUNC_INFO, "EventToggleTaxiLights");
}
if (lightsWanted.isNavOn() != lightsIsState.isNavOn())
{
this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleNavLights,
0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle nav.lights", Q_FUNC_INFO, "EventToggleNavLights");
}
if (lightsWanted.isBeaconOn() != lightsIsState.isBeaconOn())
{
this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleBeaconLights,
0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle becon lights", Q_FUNC_INFO, "EventToggleBeaconLights");
}
if (lightsWanted.isLogoOn() != lightsIsState.isLogoOn())
{
this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleLogoLights,
0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle logo lights", Q_FUNC_INFO, "EventToggleLogoLights");
}
if (lightsWanted.isRecognitionOn() != lightsIsState.isRecognitionOn())
{
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleRecognitionLights, 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle recognition lights", Q_FUNC_INFO, "EventToggleRecognitionLights");
}
if (lightsWanted.isCabinOn() != lightsIsState.isCabinOn())
{
this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleCabinLights,
0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle cabin lights", Q_FUNC_INFO, "EventToggleCabinLights");
}
return;
}
// if (lightsWanted.isTaxiOn() != lightsIsState.isTaxiOn())
// {
// this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleTaxiLights,
// 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
// SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
// trace, simObj, "Toggle taxi lights", Q_FUNC_INFO, "EventToggleTaxiLights");
// }
// if (lightsWanted.isNavOn() != lightsIsState.isNavOn())
// {
// this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleNavLights,
// 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
// SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
// trace, simObj, "Toggle nav.lights", Q_FUNC_INFO, "EventToggleNavLights");
// }
// if (lightsWanted.isBeaconOn() != lightsIsState.isBeaconOn())
// {
// this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId,
// EventToggleBeaconLights,
// 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
// SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
// trace, simObj, "Toggle becon lights", Q_FUNC_INFO, "EventToggleBeaconLights");
// }
// if (lightsWanted.isLogoOn() != lightsIsState.isLogoOn())
// {
// this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleLogoLights,
// 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
// SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
// trace, simObj, "Toggle logo lights", Q_FUNC_INFO, "EventToggleLogoLights");
// }
// if (lightsWanted.isRecognitionOn() != lightsIsState.isRecognitionOn())
// {
// this->logAndTraceSendId(
// SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleRecognitionLights, 0.0,
// SIMCONNECT_GROUP_PRIORITY_HIGHEST,
// SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
// trace, simObj, "Toggle recognition lights", Q_FUNC_INFO, "EventToggleRecognitionLights");
// }
// if (lightsWanted.isCabinOn() != lightsIsState.isCabinOn())
// {
// this->logAndTraceSendId(SimConnect_TransmitClientEvent(m_hSimConnect, objectId,
// EventToggleCabinLights,
// 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST,
// SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
// trace, simObj, "Toggle cabin lights", Q_FUNC_INFO, "EventToggleCabinLights");
// }
// return;
// }
// missing lights info from simulator so far
if (this->showDebugLogMessage())
{
this->debugLogMessage(Q_FUNC_INFO, QStringLiteral("Missing light state in simulator for '%1', model '%2'")
.arg(callsign.asString(), simObj.getAircraftModelString()));
}
// // missing lights info from simulator so far
// if (this->showDebugLogMessage())
// {
// this->debugLogMessage(Q_FUNC_INFO, QStringLiteral("Missing light state in simulator for '%1', model '%2'")
// .arg(callsign.asString(), simObj.getAircraftModelString()));
// }
const QPointer<CSimulatorMsfs2024> myself(this);
QTimer::singleShot(DeferResendingLights, this, [=] {
if (!myself) { return; }
if (!m_simConnectObjects.contains(callsign)) { return; }
const CSimConnectObject currentSimObject = m_simConnectObjects[callsign];
if (!currentSimObject.isReadyToSend()) { return; } // stale
if (lightsWanted != currentSimObject.getLightsAsSent())
{
return;
} // changed in between, so another call sendToggledLightsToSimulator is pending
if (this->showDebugLogMessage())
{
this->debugLogMessage(Q_FUNC_INFO, QStringLiteral("Resending light state for '%1', model '%2'")
.arg(callsign.asString(), simObj.getAircraftModelString()));
}
this->sendToggledLightsToSimulator(currentSimObject, lightsWanted, true);
});
}
// const QPointer<CSimulatorMsfs2024> myself(this);
// QTimer::singleShot(DeferResendingLights, this, [=] {
// if (!myself) { return; }
// if (!m_simConnectObjects.contains(callsign)) { return; }
// const CSimConnectObject currentSimObject = m_simConnectObjects[callsign];
// if (!currentSimObject.isReadyToSend()) { return; } // stale
// if (lightsWanted != currentSimObject.getLightsAsSent())
// {
// return;
// } // changed in between, so another call sendToggledLightsToSimulator is pending
// if (this->showDebugLogMessage())
// {
// this->debugLogMessage(Q_FUNC_INFO, QStringLiteral("Resending light state for '%1', model '%2'")
// .arg(callsign.asString(), simObj.getAircraftModelString()));
// }
// this->sendToggledLightsToSimulator(currentSimObject, lightsWanted, true);
// });
//}
SIMCONNECT_DATA_INITPOSITION
CSimulatorMsfs2024::aircraftSituationToFsxPosition(const CAircraftSituation &situation, bool sendGnd,
bool forceUnderflowDetection, CStatusMessage *details)
CSimulatorMsfs2024::aircraftSituationToPosition(const CAircraftSituation &situation, bool sendGnd,
bool forceUnderflowDetection, CStatusMessage *details)
{
Q_ASSERT_X(!situation.isGeodeticHeightNull(), Q_FUNC_INFO, "Missing height (altitude)");
Q_ASSERT_X(!situation.isPositionNull(), Q_FUNC_INFO, "Missing position");
@@ -2583,7 +2644,7 @@ namespace swift::simplugin::msfs2024common
// crosscheck
if (CBuildConfig::isLocalDeveloperDebugBuild())
{
SWIFT_VERIFY_X(isValidFsxPosition(position), Q_FUNC_INFO, "Invalid FSX pos.");
SWIFT_VERIFY_X(isValidFsxPosition(position), Q_FUNC_INFO, "Invalid MSFS2024 pos.");
}
return position;
@@ -3091,24 +3152,7 @@ namespace swift::simplugin::msfs2024common
const QString connectedSimName = m_simulatorName.toLower().trimmed();
if (connectedSimName.isEmpty()) { return false; }
if (pluginSim.isP3D())
{
// P3D drivers only works with P3D
return connectedSimName.contains("lockheed") || connectedSimName.contains("martin") ||
connectedSimName.contains("p3d") || connectedSimName.contains("prepar");
}
else if (pluginSim.isFSX())
{
// FSX drivers only works with FSX
return connectedSimName.contains("fsx") || connectedSimName.contains("microsoft") ||
connectedSimName.contains("simulator x");
}
else if (pluginSim.isMSFS())
{
// MSFS 2020 drivers only works with MSFS
return connectedSimName.contains("kittyhawk");
}
else if (pluginSim.isMSFS2024())
if (pluginSim.isMSFS2024())
{
// MSFS2024 drivers only works with MSFS2024
return connectedSimName.contains("sunrise");

View File

@@ -68,26 +68,27 @@ namespace swift::simplugin::msfs2024common
EventSetTimeZuluHours,
EventSetTimeZuluMinutes,
// ------------ lights -------------
EventLandingLightsOff,
EventLandinglightsOn,
// EventLandingLightsOff,
// EventLandinglightsOn,
EventLandingLightsSet,
EventLandingLightsToggle,
EventPanelLightsOff,
EventPanelLightsOn,
// EventLandingLightsToggle,
// EventPanelLightsOff,
// EventPanelLightsOn,
EventPanelLightsSet,
EventStrobesOff,
EventStrobesOn,
// EventStrobesOff,
// EventStrobesOn,
EventStrobesSet,
EventStrobesToggle,
EventToggleBeaconLights,
EventToggleCabinLights,
EventToggleLogoLights,
EventToggleNavLights,
EventToggleRecognitionLights,
EventToggleTaxiLights,
EventToggleWingLights,
// EventStrobesToggle,
EventBeaconLightsSet,
EventCabinLightsSet,
EventLogoLightsSet,
EventNavLightsSet,
EventRecognitionLightsSet,
EventTaxiLightsSet,
EventWingLightsSet,
// ------------- flaps -------------
EventFlapsSet,
EventGearSet,
// ---------- end marker -----------
EventFSXEndMarker
};
@@ -337,9 +338,9 @@ namespace swift::simplugin::msfs2024common
//! Format conversion
//! \note must be valid situation
static SIMCONNECT_DATA_INITPOSITION
aircraftSituationToFsxPosition(const swift::misc::aviation::CAircraftSituation &situation, bool sendGnd = true,
bool forceUnderflowDetection = false,
swift::misc::CStatusMessage *details = nullptr);
aircraftSituationToPosition(const swift::misc::aviation::CAircraftSituation &situation, bool sendGnd = true,
bool forceUnderflowDetection = false,
swift::misc::CStatusMessage *details = nullptr);
//! Format conversion
//! \note must be valid situation
@@ -474,9 +475,9 @@ namespace swift::simplugin::msfs2024common
//! Send lights to simulator (those which have to be toggled)
//! \remark challenge here is that I can only sent those value if I have already obtained the current light
//! state from simulator \param force send lights even if they appear to be the same
void sendToggledLightsToSimulator(const CSimConnectObject &simObject,
const swift::misc::aviation::CAircraftLights &lightsWanted,
bool force = false);
// void sendToggledLightsToSimulator(const CSimConnectObject &simObject,
// const swift::misc::aviation::CAircraftLights &lightsWanted,
// bool force = false);
//! Call CSimulatorFsxCommon::updateRemoteAircraftFromSimulator asynchronously
//! \remark do not to send SimConnect data in event loop

View File

@@ -281,7 +281,7 @@ namespace swift::simplugin::msfs2024common
{
case CSimConnectDefinitions::RequestOwnAircraft:
{
static_assert(sizeof(DataDefinitionOwnAircraft) == 45 * sizeof(double),
static_assert(sizeof(DataDefinitionOwnAircraft) == 50 * sizeof(double),
"DataDefinitionOwnAircraft has an incorrect size.");
const DataDefinitionOwnAircraft *ownAircaft =
reinterpret_cast<const DataDefinitionOwnAircraft *>(&pObjData->dwData);
@@ -333,7 +333,7 @@ namespace swift::simplugin::msfs2024common
} // model
else if (subRequest == CSimConnectDefinitions::SimObjectLights)
{
static_assert(sizeof(DataDefinitionRemoteAircraftLights) == 8 * sizeof(double),
static_assert(sizeof(DataDefinitionRemoteAircraftLights) == 9 * sizeof(double),
"DataDefinitionRemoteAircraftLights has an incorrect size.");
const DataDefinitionRemoteAircraftLights *remoteAircraftLights =
reinterpret_cast<const DataDefinitionRemoteAircraftLights *>(&pObjData->dwData);
@@ -374,11 +374,6 @@ namespace swift::simplugin::msfs2024common
(SIMCONNECT_RECV_ENUMERATE_SIMOBJECT_AND_LIVERY_LIST *)pData;
switch (msg->dwRequestID)
{
// case CSimConnectDefinitions::REQUEST_ALL:
// case CSimConnectDefinitions::REQUEST_USER:
// case CSimConnectDefinitions::REQUEST_BOAT:
// case CSimConnectDefinitions::REQUEST_GROUND:
// case CSimConnectDefinitions::REQUEST_ANIMAL:
case CSimConnectDefinitions::REQUEST_AIRPLANE:
case CSimConnectDefinitions::REQUEST_HELICOPTER:
case CSimConnectDefinitions::REQUEST_HOT_AIR: simulatorMsfs2024->CacheSimObjectAndLiveries(msg); break;

View File

@@ -23,7 +23,6 @@ CSwiftDataApplication::CSwiftDataApplication()
// this->addAudioOptions();
}
// TODO TZ remove commented code after testing
CStatusMessageList CSwiftDataApplication::startHookIn()
{
Q_ASSERT_X(m_parsed, Q_FUNC_INFO, "Not yet parsed cmd line arguments");
@@ -33,59 +32,15 @@ CStatusMessageList CSwiftDataApplication::startHookIn()
this->isParserOptionSet(m_cmdFacadeMode) ? this->getParserValue(m_cmdFacadeMode) : QString();
CoreModes::CoreMode coreMode = CoreModes::stringToCoreMode(coreModeStr);
//// Valid combination?
// if (!coreModeStr.isEmpty())
//{
// if (coreMode == CoreModes::Standalone && !dBusAddress.isEmpty())
// {
// const CStatusMessage m =
// CStatusMessage(this, CLogCategories::validation()).error(u"Inconsistent pair DBus: '%1' and core:
// '%2'")
// << dBusAddress << coreModeStr;
// return CStatusMessageList(m);
// }
// }
//// Implicit configuration
CStatusMessageList msgs;
// if (!dBusAddress.isEmpty() && coreModeStr.isEmpty())
//{
// coreMode = CoreModes::Distributed; // default
// const CStatusMessage m =
// CStatusMessage(this, CLogCategories::validation()).info(u"No DBus address, setting core mode: '%1'")
// << CoreModes::coreModeToString(coreMode);
// msgs.push_back(m);
// }
// else if (dBusAddress.isEmpty() && coreMode == CoreModes::Distributed)
//{
// dBusAddress = CDBusServer::sessionBusAddress(); // a possible default
// const CStatusMessage m =
// CStatusMessage(this, CLogCategories::validation()).info(u"Setting DBus address to '%1'") << dBusAddress;
// msgs.push_back(m);
// }
CCoreFacadeConfig runtimeConfig = coreModeToCoreFacadeConfig(coreMode, dBusAddress);
const CStatusMessageList contextMsgs = this->initContextsAndStartCoreFacade(runtimeConfig);
// const CStatusMessageList contextMsgs = { CStatusMessage(this, CLogCategories::validation()).info(u"TEST") };
msgs.push_back(contextMsgs);
return contextMsgs;
}
bool CSwiftDataApplication::parsingHookIn()
{
// Parse core relevant arguments
// const QString dBusAddress(this->getCmdDBusAddressValue());
// if (!dBusAddress.isEmpty())
//{
// // check if reachable
// if (!CDBusServer::isDBusAvailable(dBusAddress))
// {
// this->cmdLineErrorMessage("DBus error", "DBus server at '" + dBusAddress + "' can not be reached");
// return false;
// }
// }
return CGuiApplication::parsingHookIn();
}
bool CSwiftDataApplication::parsingHookIn() { return CGuiApplication::parsingHookIn(); }
CSwiftDataApplication *CSwiftDataApplication::instance()
{