Ref T275, asynchronous version triggerUpdateRemoteAircraftFromSimulator and only fast updates for moving aircraft

This commit is contained in:
Klaus Basan
2018-06-09 00:48:18 +02:00
parent d71138cee1
commit 44f01d8d97
3 changed files with 25 additions and 4 deletions

View File

@@ -571,10 +571,26 @@ namespace BlackSimPlugin
} }
} }
void CSimulatorFsxCommon::triggerUpdateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData)
{
if (this->isShuttingDown()) { return; }
QPointer<CSimulatorFsxCommon> myself(this);
QTimer::singleShot(0, this, [ = ]
{
if (!myself) { return; }
myself->updateRemoteAircraftFromSimulator(simObject, remoteAircraftData);
});
}
void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData) void CSimulatorFsxCommon::updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData)
{ {
if (this->isShuttingDown()) { return; }
// Near ground we use faster updates // 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 // switch to fast updates
if (simObject.getSimDataPeriod() != SIMCONNECT_PERIOD_VISUAL_FRAME) if (simObject.getSimDataPeriod() != SIMCONNECT_PERIOD_VISUAL_FRAME)
@@ -597,7 +613,7 @@ namespace BlackSimPlugin
{ {
CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt); CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt);
elevation.setSinglePointRadius(); 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"); Q_ASSERT_X(m_dispatchProc, Q_FUNC_INFO, "Missing DispatchProc");
// statistics // statistics
const qint64 start = QDateTime::currentMSecsSinceEpoch();
m_dispatchLastReceiveId = SIMCONNECT_RECV_ID_NULL; m_dispatchLastReceiveId = SIMCONNECT_RECV_ID_NULL;
m_dispatchLastRequest = CSimConnectDefinitions::RequestEndMarker; m_dispatchLastRequest = CSimConnectDefinitions::RequestEndMarker;
const qint64 start = QDateTime::currentMSecsSinceEpoch();
// process // process
const HRESULT hr = SimConnect_CallDispatch(m_hSimConnect, m_dispatchProc, this); 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) bool CSimulatorFsxCommon::requestPositionDataForSimObject(const CSimConnectObject &simObject, SIMCONNECT_PERIOD period)
{ {
if (this->isShuttingDown()) { return false; }
if (!simObject.hasValidRequestAndObjectId()) { return false; } if (!simObject.hasValidRequestAndObjectId()) { return false; }
if (simObject.isPendingRemoved()) { return false; } if (simObject.isPendingRemoved()) { return false; }
if (!m_hSimConnect) { return false; } if (!m_hSimConnect) { return false; }

View File

@@ -301,6 +301,10 @@ namespace BlackSimPlugin
//! Called when data about our own aircraft are received //! Called when data about our own aircraft are received
void updateOwnAircraftFromSimulator(const DataDefinitionOwnAircraft &simulatorOwnAircraft); 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 //! Remote aircraft data sent from simulator
void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData); void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData);

View File

@@ -263,7 +263,7 @@ namespace BlackSimPlugin
// extra check, but ids should be the same // extra check, but ids should be the same
if (objectId == simObject.getObjectId()) if (objectId == simObject.getObjectId())
{ {
simulatorFsxP3D->updateRemoteAircraftFromSimulator(simObj, *remoteAircraftSimData); simulatorFsxP3D->triggerUpdateRemoteAircraftFromSimulator(simObject, *remoteAircraftSimData);
} }
} }
else if (CSimulatorFsxCommon::isRequestForProbe(requestId)) else if (CSimulatorFsxCommon::isRequestForProbe(requestId))