From 44f01d8d9752073e5047cb9f7206d0f5101f2526 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 9 Jun 2018 00:48:18 +0200 Subject: [PATCH] Ref T275, asynchronous version triggerUpdateRemoteAircraftFromSimulator and only fast updates for moving aircraft --- .../fsxcommon/simulatorfsxcommon.cpp | 23 ++++++++++++++++--- .../simulator/fsxcommon/simulatorfsxcommon.h | 4 ++++ .../fsxcommon/simulatorfsxsimconnectproc.cpp | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 2b5ec154c..6b05f9975 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -571,10 +571,26 @@ namespace BlackSimPlugin } } + void CSimulatorFsxCommon::triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData) + { + if (this->isShuttingDown()) { return; } + QPointer myself(this); + QTimer::singleShot(0, this, [ = ] + { + if (!myself) { return; } + myself->updateRemoteAircraftFromSimulator(simObject, remoteAircraftData); + }); + } + void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData) { + if (this->isShuttingDown()) { return; } + // Near ground we use faster updates - if (remoteAircraftData.aboveGroundFt() <= 100.0) + const CCallsign cs(simObject.getCallsign()); + const CAircraftSituation lastSituation = m_lastSentSituation[cs]; + const bool moving = lastSituation.isMoving(); + if (moving && remoteAircraftData.aboveGroundFt() <= 100.0) { // switch to fast updates if (simObject.getSimDataPeriod() != SIMCONNECT_PERIOD_VISUAL_FRAME) @@ -597,7 +613,7 @@ namespace BlackSimPlugin { CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt); elevation.setSinglePointRadius(); - this->rememberElevationAndCG(simObject.getCallsign(), elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft())); + this->rememberElevationAndCG(cs, elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft())); } } @@ -934,9 +950,9 @@ namespace BlackSimPlugin Q_ASSERT_X(m_dispatchProc, Q_FUNC_INFO, "Missing DispatchProc"); // statistics - const qint64 start = QDateTime::currentMSecsSinceEpoch(); m_dispatchLastReceiveId = SIMCONNECT_RECV_ID_NULL; m_dispatchLastRequest = CSimConnectDefinitions::RequestEndMarker; + const qint64 start = QDateTime::currentMSecsSinceEpoch(); // process const HRESULT hr = SimConnect_CallDispatch(m_hSimConnect, m_dispatchProc, this); @@ -1628,6 +1644,7 @@ namespace BlackSimPlugin bool CSimulatorFsxCommon::requestPositionDataForSimObject(const CSimConnectObject &simObject, SIMCONNECT_PERIOD period) { + if (this->isShuttingDown()) { return false; } if (!simObject.hasValidRequestAndObjectId()) { return false; } if (simObject.isPendingRemoved()) { return false; } if (!m_hSimConnect) { return false; } diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h index beafe81ba..42d5fa053 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h @@ -301,6 +301,10 @@ namespace BlackSimPlugin //! Called when data about our own aircraft are received void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft); + //! Call CSimulatorFsxCommon::updateRemoteAircraftFromSimulator asynchronously + //! \remark can help not to send SimConnect data in event loop + void triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData); + //! Remote aircraft data sent from simulator void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData); diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp index 8d2fffb64..4572bbaa6 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp @@ -263,7 +263,7 @@ namespace BlackSimPlugin // extra check, but ids should be the same if (objectId == simObject.getObjectId()) { - simulatorFsxP3D->updateRemoteAircraftFromSimulator(simObj, *remoteAircraftSimData); + simulatorFsxP3D->triggerUpdateRemoteAircraftFromSimulator(simObject, *remoteAircraftSimData); } } else if (CSimulatorFsxCommon::isRequestForProbe(requestId))