mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-27 11:05:44 +08:00
Ref T275, asynchronous version triggerUpdateRemoteAircraftFromSimulator and only fast updates for moving aircraft
This commit is contained in:
@@ -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; }
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user