From de005ac80fbd6780a590ee9b8a6b0b7dd883c271 Mon Sep 17 00:00:00 2001 From: Lars Toenning Date: Sat, 20 Jun 2026 16:15:17 +0200 Subject: [PATCH] feat(msfs): Set engine RPM on remote aircraft --- src/gui/editors/aircraftpartsform.cpp | 21 +++- src/gui/editors/aircraftpartsform.ui | 100 +++++++++++++++++- .../fsxcommon/simconnectdatadefinition.cpp | 47 ++++++-- .../fsxcommon/simconnectdatadefinition.h | 8 +- .../fsxcommon/simulatorfsxcommon.cpp | 2 +- 5 files changed, 162 insertions(+), 16 deletions(-) diff --git a/src/gui/editors/aircraftpartsform.cpp b/src/gui/editors/aircraftpartsform.cpp index e4ceaff2c..287f9f752 100644 --- a/src/gui/editors/aircraftpartsform.cpp +++ b/src/gui/editors/aircraftpartsform.cpp @@ -114,6 +114,12 @@ namespace swift::gui::editors ui->cb_AircraftPartsEngine4->setChecked(on); ui->cb_AircraftPartsEngine5->setChecked(on); ui->cb_AircraftPartsEngine6->setChecked(on); + ui->sb_AircraftPartsEngine1RpmPercentage->setValue(on ? 80 : 0); + ui->sb_AircraftPartsEngine2RpmPercentage->setValue(on ? 80 : 0); + ui->sb_AircraftPartsEngine3RpmPercentage->setValue(on ? 80 : 0); + ui->sb_AircraftPartsEngine4RpmPercentage->setValue(on ? 80 : 0); + ui->sb_AircraftPartsEngine5RpmPercentage->setValue(on ? 80 : 0); + ui->sb_AircraftPartsEngine6RpmPercentage->setValue(on ? 80 : 0); } aviation::CAircraftParts CAircraftPartsForm::guiToAircraftParts() const @@ -125,9 +131,12 @@ namespace swift::gui::editors 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(), - ui->cb_AircraftPartsEngine5->isChecked(), ui->cb_AircraftPartsEngine6->isChecked() }); + { { ui->cb_AircraftPartsEngine1->isChecked(), ui->sb_AircraftPartsEngine1RpmPercentage->value() }, + { ui->cb_AircraftPartsEngine2->isChecked(), ui->sb_AircraftPartsEngine2RpmPercentage->value() }, + { ui->cb_AircraftPartsEngine3->isChecked(), ui->sb_AircraftPartsEngine3RpmPercentage->value() }, + { ui->cb_AircraftPartsEngine4->isChecked(), ui->sb_AircraftPartsEngine4RpmPercentage->value() }, + { ui->cb_AircraftPartsEngine5->isChecked(), ui->sb_AircraftPartsEngine5RpmPercentage->value() }, + { ui->cb_AircraftPartsEngine6->isChecked(), ui->sb_AircraftPartsEngine6RpmPercentage->value() } }); const CAircraftParts parts( lights, ui->cb_AircraftPartsGearDown->isChecked(), ui->sb_AircraftPartsFlapsPercentage->value(), ui->cb_AircraftPartsSpoilers->isChecked(), engines, ui->cb_AircraftPartsIsOnGround->isChecked()); @@ -157,6 +166,12 @@ namespace swift::gui::editors ui->cb_AircraftPartsEngine4->setChecked(engines.isEngineOn(4)); ui->cb_AircraftPartsEngine5->setChecked(engines.isEngineOn(5)); ui->cb_AircraftPartsEngine6->setChecked(engines.isEngineOn(6)); + ui->sb_AircraftPartsEngine1RpmPercentage->setValue(engines.getEngineRpmPct(1)); + ui->sb_AircraftPartsEngine2RpmPercentage->setValue(engines.getEngineRpmPct(2)); + ui->sb_AircraftPartsEngine3RpmPercentage->setValue(engines.getEngineRpmPct(3)); + ui->sb_AircraftPartsEngine4RpmPercentage->setValue(engines.getEngineRpmPct(4)); + ui->sb_AircraftPartsEngine5RpmPercentage->setValue(engines.getEngineRpmPct(5)); + ui->sb_AircraftPartsEngine6RpmPercentage->setValue(engines.getEngineRpmPct(6)); } void CAircraftPartsForm::guiToJson() diff --git a/src/gui/editors/aircraftpartsform.ui b/src/gui/editors/aircraftpartsform.ui index 9d28ebb74..e7ed53dbb 100644 --- a/src/gui/editors/aircraftpartsform.ui +++ b/src/gui/editors/aircraftpartsform.ui @@ -178,7 +178,7 @@ - + @@ -260,7 +260,97 @@ - + + + + + 0 + 20 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 100 + + + 7 + + + + + + + 100 + + + 8 + + + + + + + 100 + + + 9 + + + + + + + 100 + + + 7 + + + + + + + 100 + + + 10 + + + + + + + 100 + + + 11 + + + + + + + set @@ -291,6 +381,12 @@ cb_AircraftPartsEngine4 cb_AircraftPartsEngine5 cb_AircraftPartsEngine6 + sb_AircraftPartsEngine1RpmPercentage + sb_AircraftPartsEngine2RpmPercentage + sb_AircraftPartsEngine3RpmPercentage + sb_AircraftPartsEngine4RpmPercentage + sb_AircraftPartsEngine5RpmPercentage + sb_AircraftPartsEngine6RpmPercentage te_AircraftPartsJson pb_Set diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp index 894d78e69..61bc11eaf 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp @@ -236,6 +236,14 @@ namespace swift::simplugin::fsxcommon "GENERAL ENG COMBUSTION:3", "Bool"); hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights, "GENERAL ENG COMBUSTION:4", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights, + "GENERAL ENG THROTTLE LEVER POSITION:1", "percent"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights, + "GENERAL ENG THROTTLE LEVER POSITION:2", "percent"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights, + "GENERAL ENG THROTTLE LEVER POSITION:3", "percent"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights, + "GENERAL ENG THROTTLE LEVER POSITION:4", "percent"); // Lights (other definition) hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataOwnAircraftTitle, "TITLE", @@ -470,23 +478,39 @@ namespace swift::simplugin::fsxcommon rhs.engine4Combustion); } - void DataDefinitionRemoteAircraftPartsWithoutLights::setAllEngines(bool on) + void DataDefinitionRemoteAircraftPartsWithoutLights::setAllEngines(bool on, double engineRpmPct) { engine1Combustion = on ? 1 : 0; engine2Combustion = on ? 1 : 0; engine3Combustion = on ? 1 : 0; engine4Combustion = on ? 1 : 0; + engine1RpmPct = engineRpmPct; + engine2RpmPct = engineRpmPct; + engine3RpmPct = engineRpmPct; + engine4RpmPct = engineRpmPct; } - void DataDefinitionRemoteAircraftPartsWithoutLights::setEngine(int number1based, bool on) + void DataDefinitionRemoteAircraftPartsWithoutLights::setEngine(int number1based, bool on, double engineRpmPct) { double v = on ? 1.0 : 0.0; switch (number1based) { - case 1: engine1Combustion = v; break; - case 2: engine2Combustion = v; break; - case 3: engine3Combustion = v; break; - case 4: engine4Combustion = v; break; + case 1: + engine1Combustion = v; + engine1RpmPct = engineRpmPct; + break; + case 2: + engine2Combustion = v; + engine2RpmPct = engineRpmPct; + break; + case 3: + engine3Combustion = v; + engine3RpmPct = engineRpmPct; + break; + case 4: + engine4Combustion = v; + engine4RpmPct = engineRpmPct; + break; default: break; } } @@ -513,6 +537,10 @@ namespace swift::simplugin::fsxcommon engine2Combustion = -1; engine3Combustion = -1; engine4Combustion = -1; + engine1RpmPct = -1; + engine2RpmPct = -1; + engine3RpmPct = -1; + engine4RpmPct = -1; } void DataDefinitionRemoteAircraftPartsWithoutLights::initFromParts(const CAircraftParts &parts) @@ -525,10 +553,13 @@ namespace swift::simplugin::fsxcommon flapsLeadingEdgeLeftPercent = lead; flapsLeadingEdgeRightPercent = lead; spoilersHandlePosition = parts.isSpoilersOut() ? 1.0 : 0.0; - this->setAllEngines(false); // init + this->setAllEngines(false, 0.0); // init int e = 1; - for (const CAircraftEngine &engine : parts.getEngines()) { this->setEngine(e++, engine.isOn()); } + for (const CAircraftEngine &engine : parts.getEngines()) + { + this->setEngine(e++, engine.isOn(), engine.getEngineRpmPct()); + } } CAircraftLights DataDefinitionRemoteAircraftLights::toLights() const diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h index 169050752..92ec31cd6 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h @@ -152,6 +152,10 @@ namespace swift::simplugin::fsxcommon double engine2Combustion; //!< Engine 2 combustion flag double engine3Combustion; //!< Engine 3 combustion flag double engine4Combustion; //!< Engine 4 combustion flag + double engine1RpmPct; //!< Engine 1 RPM [%] + double engine2RpmPct; //!< Engine 2 RPM [%] + double engine3RpmPct; //!< Engine 3 RPM [%] + double engine4RpmPct; //!< Engine 4 RPM [%] //! Ctor DataDefinitionRemoteAircraftPartsWithoutLights(); @@ -163,10 +167,10 @@ namespace swift::simplugin::fsxcommon bool operator==(const DataDefinitionRemoteAircraftPartsWithoutLights &rhs) const; //! All engines on/off - void setAllEngines(bool on); + void setAllEngines(bool on, double engineRpmPct); //! Set given engine - void setEngine(int number1based, bool on); + void setEngine(int number1based, bool on, double engineRpmPct); //! Reset all flaps void resetAllFlaps(); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index ff1f9030d..35260c9e2 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -2101,7 +2101,7 @@ namespace swift::simplugin::fsxcommon void CSimulatorFsxCommon::updateRemoteAircraft() { - static_assert(sizeof(DataDefinitionRemoteAircraftPartsWithoutLights) == sizeof(double) * 10, + static_assert(sizeof(DataDefinitionRemoteAircraftPartsWithoutLights) == sizeof(double) * 14, "DataDefinitionRemoteAircraftPartsWithoutLights has an incorrect size."); Q_ASSERT_X(CThreadUtils::isInThisThread(this), Q_FUNC_INFO, "thread");