diff --git a/src/plugins/simulator/fsx/simconnect_datadefinition.cpp b/src/plugins/simulator/fsx/simconnect_datadefinition.cpp index 0492cd1e5..2587302cd 100644 --- a/src/plugins/simulator/fsx/simconnect_datadefinition.cpp +++ b/src/plugins/simulator/fsx/simconnect_datadefinition.cpp @@ -23,8 +23,7 @@ namespace BlackSimPlugin { HRESULT hr = S_OK; hr += initOwnAircraft(hSimConnect); - hr += initRemoteAircraftSituation(hSimConnect); - hr += initGearHandlePosition(hSimConnect); + hr += initRemoteAircraft(hSimConnect); hr += initSimulatorEnvironment(hSimConnect); hr += initSbDataArea(hSimConnect); return hr; @@ -69,25 +68,40 @@ namespace BlackSimPlugin return hr; } - HRESULT CSimConnectDefinitions::initRemoteAircraftSituation(const HANDLE hSimConnect) + HRESULT CSimConnectDefinitions::initRemoteAircraft(const HANDLE hSimConnect) { HRESULT hr = S_OK; - hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSituation, "Initial Position", "", SIMCONNECT_DATATYPE_INITPOSITION); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "Initial Position", NULL, SIMCONNECT_DATATYPE_INITPOSITION); + + // Lights + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LIGHT STROBE", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LIGHT LANDING", "Bool"); +// hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LIGHT TAXI", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LIGHT BEACON", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LIGHT NAV", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LIGHT LOGO", "Bool"); + + // Flaps + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LEADING EDGE FLAPS LEFT PERCENT", "Percent Over 100"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "LEADING EDGE FLAPS RIGHT PERCENT", "Percent Over 100"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "TRAILING EDGE FLAPS LEFT PERCENT", "Percent Over 100"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "TRAILING EDGE FLAPS RIGHT PERCENT", "Percent Over 100"); + + // Gear & Spoiler + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "GEAR HANDLE POSITION", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "SPOILERS HANDLE POSITION", "Percent Over 100"); + + // Engines + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "GENERAL ENG COMBUSTION:1", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "GENERAL ENG COMBUSTION:2", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "GENERAL ENG COMBUSTION:3", "Bool"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, "GENERAL ENG COMBUSTION:4", "Bool"); + if (hr != S_OK) { CLogMessage(static_cast(nullptr)).error("SimConnect error: initRemoteAircraftSituation %1") << hr; } - return hr; - } - HRESULT CSimConnectDefinitions::initGearHandlePosition(const HANDLE hSimConnect) - { - HRESULT hr = S_OK; - hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataGearHandlePosition, "GEAR HANDLE POSITION", "BOOL", SIMCONNECT_DATATYPE_INT32); - if (hr != S_OK) - { - CLogMessage(static_cast(nullptr)).error("SimConnect error: initGearHandlePosition %1") << hr; - } return hr; } diff --git a/src/plugins/simulator/fsx/simconnect_datadefinition.h b/src/plugins/simulator/fsx/simconnect_datadefinition.h index 61f892cd6..40db6bf98 100644 --- a/src/plugins/simulator/fsx/simconnect_datadefinition.h +++ b/src/plugins/simulator/fsx/simconnect_datadefinition.h @@ -70,16 +70,26 @@ namespace BlackSimPlugin char title[256]; //!< Aircraft model string }; - //! Data struct of aircraft position - struct DataDefinitionRemoteAircraftSituation + //! Data struct of remote aircraft + struct DataDefinitionRemoteAircraft { - SIMCONNECT_DATA_INITPOSITION position; //!< Position struct - }; - - //! Data struct of aircraft position - struct DataDefinitionGearHandlePosition - { - qint32 gearHandlePosition; //!< Bool, 1 if gear handle is applied otherwise 0 + SIMCONNECT_DATA_INITPOSITION position; //!< Aircrafts position + double lightStrobe; //!< Is strobe light on? + double lightLanding; //!< Is landing light on? +// double lightTaxi; //!< Is taxi light on? + double lightBeacon; //!< Is beacon light on? + double lightNav; //!< Is nav light on? + double lightLogo; //!< Is logo light on? + double flapsLeadingEdgeLeftPercent; //!< Leading edge left in percent + double flapsLeadingEdgeRightPercent; //!< Leading edge right in percent + double flapsTrailingEdgeLeftPercent; //!< Trailing edge left in percent + double flapsTrailingEdgeRightPercent; //!< Trailing edge right in percent + double gearHandlePosition; //!< Gear handle position + double spoilersHandlePosition; //!< Spoilers out? + double engine1Combustion; //!< Engine 1 combustion flag + double engine2Combustion; //!< Engine 2 combustion flag + double engine3Combustion; //!< Engine 3 combustion flag + double engine4Combustion; //!< Engine 4 combustion flag }; //! Data struct simulator environment @@ -131,8 +141,7 @@ namespace BlackSimPlugin { DataOwnAircraft, DataOwnAircraftTitle, - DataRemoteAircraftSituation, - DataGearHandlePosition, + DataRemoteAircraft, DataSimEnvironment, DataClientAreaSb, //!< whole SB area DataClientAreaSbIdent, //!< ident single value @@ -164,10 +173,7 @@ namespace BlackSimPlugin static HRESULT initOwnAircraft(const HANDLE hSimConnect); //! Initialize data definition for remote aircrafts - static HRESULT initRemoteAircraftSituation(const HANDLE hSimConnect); - - //! Initialize data definition for remote aircraft configuration - static HRESULT initGearHandlePosition(const HANDLE hSimConnect); + static HRESULT initRemoteAircraft(const HANDLE hSimConnect); //! Initialize data definition for Simulator environment static HRESULT initSimulatorEnvironment(const HANDLE hSimConnect); diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index 972cd9bda..bcad67ccf 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -23,6 +23,8 @@ #include #include +#include + using namespace BlackMisc; using namespace BlackMisc::Aviation; using namespace BlackMisc::PhysicalQuantities; @@ -460,11 +462,6 @@ namespace BlackSimPlugin SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EventFreezeAtt, 1, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); - - DataDefinitionGearHandlePosition gearHandle; - gearHandle.gearHandlePosition = 1; - - SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataGearHandlePosition, objectID, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(gearHandle), &gearHandle); } void CSimulatorFsx::timerEvent(QTimerEvent *event) @@ -593,24 +590,49 @@ namespace BlackSimPlugin void CSimulatorFsx::updateOtherAircraft() { + static_assert(sizeof(DataDefinitionRemoteAircraft) == 176, "DataDefinitionRemoteAircraft has an incorrect size."); BlackCore::CInterpolatorLinear interpolator(this->m_renderedAircraftProvider); for (const CSimConnectObject &simObj : m_simConnectObjects) { if (!interpolator.hasEnoughAircraftSituations(simObj.getCallsign())) { continue; } SIMCONNECT_DATA_INITPOSITION position = aircraftSituationToFsxInitPosition(interpolator.getCurrentInterpolatedSituation(simObj.getCallsign())); - DataDefinitionRemoteAircraftSituation ddAircraftSituation; - ddAircraftSituation.position = position; - DataDefinitionGearHandlePosition gearHandle; - gearHandle.gearHandlePosition = position.Altitude < 1000 ? 1 : 0; + CAircraftParts parts; + if(renderedAircraftParts().findBeforeNowMinusOffset(6000).containsCallsign(simObj.getCallsign())) + parts = renderedAircraftParts().findBeforeNowMinusOffset(6000).latestValue(); + + position.OnGround = parts.isOnGround() ? 1 : 0; + + DataDefinitionRemoteAircraft ddRemoteAircraft; + ddRemoteAircraft.position = position; + ddRemoteAircraft.lightStrobe = parts.getLights().isStrobeOn() ? 1.0 : 0.0; + ddRemoteAircraft.lightLanding = parts.getLights().isLandingOn() ? 1.0 : 0.0; +// ddRemoteAircraft.lightTaxi = parts.getLights().isTaxiOn() ? 1.0 : 0.0; + ddRemoteAircraft.lightBeacon = parts.getLights().isBeaconOn() ? 1.0 : 0.0; + ddRemoteAircraft.lightNav = parts.getLights().isNavOn() ? 1.0 : 0.0; + ddRemoteAircraft.lightLogo = parts.getLights().isLogoOn() ? 1.0 : 0.0; + ddRemoteAircraft.flapsLeadingEdgeLeftPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraft.flapsLeadingEdgeRightPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraft.flapsTrailingEdgeLeftPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraft.flapsTrailingEdgeRightPercent = parts.getFlapsPercent() / 100.0; + ddRemoteAircraft.spoilersHandlePosition = parts.isSpoilersOut() ? 1.0 : 0.0; + ddRemoteAircraft.gearHandlePosition = parts.isGearDown() ? 1 : 0; + ddRemoteAircraft.engine1Combustion = parts.getEngines().findBy(&CAircraftEngine::getNumber, 1).frontOrDefault().isOn() ? 1 : 0; + ddRemoteAircraft.engine2Combustion = parts.getEngines().findBy(&CAircraftEngine::getNumber, 2).frontOrDefault().isOn() ? 1 : 0; + ddRemoteAircraft.engine3Combustion = parts.getEngines().findBy(&CAircraftEngine::getNumber, 3).frontOrDefault().isOn() ? 1 : 0; + ddRemoteAircraft.engine4Combustion = parts.getEngines().findBy(&CAircraftEngine::getNumber, 4).frontOrDefault().isOn() ? 1 : 0; if (simObj.getObjectId() != 0) { - SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSituation, simObj.getObjectId(), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(ddAircraftSituation), &ddAircraftSituation); + HRESULT hr = S_OK; + + hr += SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraft, + simObj.getObjectId(), 0, 0, + sizeof(DataDefinitionRemoteAircraft), &ddRemoteAircraft); + + if (hr != S_OK) CLogMessage(this).warning("Failed so set data on SimObject"); - // With the following SimConnect call all aircrafts loose their red tag. No idea why though. - SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataGearHandlePosition, simObj.getObjectId(), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(DataDefinitionGearHandlePosition), &gearHandle); } } } @@ -625,9 +647,6 @@ namespace BlackSimPlugin position.Bank = situation.getBank().value(); position.Heading = situation.getHeading().value(CAngleUnit::deg()); position.Airspeed = situation.getGroundSpeed().value(CSpeedUnit::kts()); - - // TODO: epic fail for helicopters and VTOPs! - position.OnGround = position.Airspeed < 30 ? 1 : 0; return position; }