From 01b79a76a69d85879cba21775b2c5d052d78b442 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 1 Feb 2017 19:49:54 +0100 Subject: [PATCH] refs #873, better guessing of parts (clients without aircraft config) --- .../fsx/simconnectdatadefinition.cpp | 21 +++++++++++++ .../simulator/fsx/simconnectdatadefinition.h | 9 ++++++ src/plugins/simulator/fsx/simulatorfsx.cpp | 30 +++++++++++++++---- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/plugins/simulator/fsx/simconnectdatadefinition.cpp b/src/plugins/simulator/fsx/simconnectdatadefinition.cpp index 72728db95..fdc42cb6d 100644 --- a/src/plugins/simulator/fsx/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsx/simconnectdatadefinition.cpp @@ -191,6 +191,27 @@ namespace BlackSimPlugin rhs.engine1Combustion, rhs.engine2Combustion, rhs.engine3Combustion, rhs.engine4Combustion); } + void DataDefinitionRemoteAircraftParts::setAllEngines(bool on) + { + engine1Combustion = on ? 1 : 0; + engine2Combustion = on ? 1 : 0; + engine3Combustion = on ? 1 : 0; + engine4Combustion = on ? 1 : 0; + } + + void DataDefinitionRemoteAircraftParts::resetAllFlaps() + { + flapsLeadingEdgeLeftPercent = 0; + flapsLeadingEdgeRightPercent = 0; + flapsTrailingEdgeLeftPercent = 0; + flapsTrailingEdgeRightPercent = 0; + } + + void DataDefinitionRemoteAircraftParts::resetSpoilers() + { + spoilersHandlePosition = 0; + } + CAircraftLights DataDefinitionRemoteAircraftLights::toLights() const { return CAircraftLights(lightStrobe, lightLanding, lightTaxi, lightBeacon, lightNav, lightLogo); diff --git a/src/plugins/simulator/fsx/simconnectdatadefinition.h b/src/plugins/simulator/fsx/simconnectdatadefinition.h index 64b80182b..0ce60ffe6 100644 --- a/src/plugins/simulator/fsx/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsx/simconnectdatadefinition.h @@ -90,6 +90,15 @@ namespace BlackSimPlugin //! Equal to other parts bool operator==(const DataDefinitionRemoteAircraftParts &rhs) const; + + //! All engines on/off + void setAllEngines(bool on); + + //! Reset all flaps + void resetAllFlaps(); + + //! Reset spoilers + void resetSpoilers(); }; //! Data for aircraft lighs diff --git a/src/plugins/simulator/fsx/simulatorfsx.cpp b/src/plugins/simulator/fsx/simulatorfsx.cpp index 2fff79ade..04b5042b1 100644 --- a/src/plugins/simulator/fsx/simulatorfsx.cpp +++ b/src/plugins/simulator/fsx/simulatorfsx.cpp @@ -954,26 +954,27 @@ namespace BlackSimPlugin if (!simObj.hasValidRequestAndObjectId()) { return false; } if (!interpolationStatus.didInterpolationSucceed()) { return false; } + CAircraftLights lights; DataDefinitionRemoteAircraftParts ddRemoteAircraftParts = {}; // init members const bool isOnGround = interpolatedSituation.isOnGround() == CAircraftSituation::OnGround; - ddRemoteAircraftParts.gearHandlePosition = isOnGround ? 1 : 0; - CAircraftLights lights; + const double gsKts = interpolatedSituation.getGroundSpeed().value(CSpeedUnit::kts()); + ddRemoteAircraftParts.setAllEngines(true); // when first detected moving, lights on if (isOnGround) { + ddRemoteAircraftParts.gearHandlePosition = 1; lights.setTaxiOn(true); lights.setBeaconOn(true); lights.setNavOn(true); - double gskmh = interpolatedSituation.getGroundSpeed().value(CSpeedUnit::km_h()); - if (gskmh > 7.5) + if (gsKts > 5) { // mode taxi lights.setTaxiOn(true); lights.setLandingOn(false); } - else if (gskmh > 40) + else if (gsKts > 30) { // mode accelaration for takeoff lights.setTaxiOn(false); @@ -984,15 +985,34 @@ namespace BlackSimPlugin // slow movements or parking lights.setTaxiOn(false); lights.setLandingOn(false); + ddRemoteAircraftParts.setAllEngines(false); } } else { + // not on ground + ddRemoteAircraftParts.gearHandlePosition = 0; lights.setTaxiOn(false); lights.setBeaconOn(true); lights.setNavOn(true); // landing lights for < 10000ft (normally MSL, here ignored) lights.setLandingOn(interpolatedSituation.getAltitude().value(CLengthUnit::ft()) < 10000); + + if (!simObj.isVtol() && interpolatedSituation.hasGroundElevation()) + { + if (interpolatedSituation.getHeightAboveGround().value(CLengthUnit::ft()) < 1000) + { + ddRemoteAircraftParts.gearHandlePosition = 1; + ddRemoteAircraftParts.flapsTrailingEdgeRightPercent = 25; + ddRemoteAircraftParts.flapsTrailingEdgeLeftPercent = 25; + } + else if (interpolatedSituation.getHeightAboveGround().value(CLengthUnit::ft()) < 2000) + { + ddRemoteAircraftParts.gearHandlePosition = 1; + ddRemoteAircraftParts.flapsTrailingEdgeRightPercent = 10; + ddRemoteAircraftParts.flapsTrailingEdgeLeftPercent = 10; + } + } } return this->sendRemoteAircraftPartsToSimulator(simObj, ddRemoteAircraftParts, lights);