Ref T307, logAndTraceSendId as traceable function for SimConnect calls

* ts for tracing now time + offset
* SimConnect calls will be traced
This commit is contained in:
Klaus Basan
2018-08-20 01:25:13 +02:00
parent 3a7519f4bd
commit 44d9fa35a4
2 changed files with 219 additions and 172 deletions

View File

@@ -28,6 +28,7 @@
#include <QTimer>
#include <QPointer>
#include <QStringBuilder>
#include <type_traits>
using namespace BlackConfig;
@@ -50,7 +51,9 @@ namespace BlackSimPlugin
//! Correctly casted values/checks @{
static HRESULT inline s_ok() { return S_OK; }
static bool inline isOk(HRESULT result) { return result == s_ok(); }
static bool inline isOk(HRESULT hr1, HRESULT hr2, HRESULT hr3 = s_ok(), HRESULT hr4 = s_ok()) { return isOk(hr1) && isOk(hr2) && isOk(hr3) && isOk(hr4); }
static bool inline isFailure(HRESULT result) { return !isOk(result); }
static bool inline isFailure(HRESULT hr1, HRESULT hr2, HRESULT hr3 = s_ok(), HRESULT hr4 = s_ok()) { return !isOk(hr1, hr2, hr3, hr4); }
static bool inline dtb(double doubleBool) { return static_cast<bool>(qRound(doubleBool)); }
//! @}
@@ -97,14 +100,17 @@ namespace BlackSimPlugin
if (!loadAndResolveSimConnect(true)) { return false; }
if (FAILED(SimConnect_Open(&m_hSimConnect, sApp->swiftVersionChar(), nullptr, 0, nullptr, 0)))
const HRESULT hr = SimConnect_Open(&m_hSimConnect, sApp->swiftVersionChar(), nullptr, 0, nullptr, 0);
if (isFailure(hr))
{
// reset state as expected for unconnected
this->reset();
return false;
}
if (m_useFsuipc) { m_fsuipc->connect(); } // FSUIPC too
// set structures and move on
this->triggerAutoTraceSendId(); // we trace the init phase, so in case something goes wrong there
this->initEvents();
this->initEventsP3D();
this->initDataDefinitionsWhenConnected();
@@ -117,18 +123,18 @@ namespace BlackSimPlugin
bool CSimulatorFsxCommon::disconnectFrom()
{
if (!m_simConnected) { return true; }
this->safeKillTimer();
m_simSimulating = false; // treat as stopped, just setting the flag here avoids overhead of on onSimStopped
m_traceAutoTs = -1;
m_traceAutoUntilTs = -1;
m_traceSendId = false;
this->reset(); // mark as disconnected and reset all values
if (m_hSimConnect)
{
SimConnect_Close(m_hSimConnect);
m_hSimConnect = nullptr;
m_simConnected = false;
}
this->reset(); // mark as disconnected and reset all values
// emit status and disconnect FSUIPC
return CSimulatorFsCommon::disconnectFrom();
}
@@ -293,38 +299,32 @@ namespace BlackSimPlugin
const CSimConnectObject simObject = m_simConnectProbes.values().front();
SIMCONNECT_DATA_INITPOSITION position = this->coordinateToFsxPosition(pos);
const HRESULT hr = SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
simObject.getObjectId(), 0, 0,
sizeof(SIMCONNECT_DATA_INITPOSITION), &position);
if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO); }
const HRESULT hr = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
simObject.getObjectId(), 0, 0,
sizeof(SIMCONNECT_DATA_INITPOSITION), &position),
simObject, "Cannot request AI elevation", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
if (isOk(hr))
{
this->requestTerrainProbeData(callsign);
emit this->requestedElevation(callsign);
}
else
{
this->triggerAutoTraceSendId();
const CStatusMessage msg = CStatusMessage(this).error("Cannot request AI position: '%1'") << callsign.asString();
CLogMessage::preformatted(msg);
}
return isOk(hr);
if (isFailure(hr)) { return false; }
this->requestTerrainProbeData(callsign);
emit this->requestedElevation(callsign);
return true;
}
bool CSimulatorFsxCommon::isTracingSendId() const
{
if (m_traceSendId) { return true; }
if (m_traceAutoTs < 0) { return false; }
const qint64 ts = (QDateTime::currentMSecsSinceEpoch() - AutoTraceOffsetMs);
const bool trace = ts < m_traceAutoTs;
if (m_traceSendId) { return true; } // explicit
if (m_traceAutoUntilTs < 0) { return false; } // no auto
const qint64 ts = QDateTime::currentMSecsSinceEpoch();
const bool trace = ts <= m_traceAutoUntilTs;
return trace;
}
void CSimulatorFsxCommon::setTractingSendId(bool trace)
{
m_traceSendId = trace;
m_traceAutoTs = -1;
m_traceAutoUntilTs = -1;
}
void CSimulatorFsxCommon::resetAircraftStatistics()
@@ -396,7 +396,7 @@ namespace BlackSimPlugin
const QPointer<CSimulatorFsxCommon> myself(this);
QTimer::singleShot(2500, this, [myself]
{
if (myself.isNull()) { return; }
if (!myself) { return; }
myself->initSimulatorInternals();
});
}
@@ -418,35 +418,31 @@ namespace BlackSimPlugin
if (referenceTs != m_simulatingChangedTs) { return; } // changed, so no longer valid
m_simSimulating = true; // only place where this should be set to true
m_simConnected = true;
HRESULT hr = SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestOwnAircraft,
CSimConnectDefinitions::DataOwnAircraft, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_VISUAL_FRAME);
HRESULT hr1 = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestOwnAircraft,
CSimConnectDefinitions::DataOwnAircraft, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_VISUAL_FRAME),
0, "Cannot request own aircraft data", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
hr += SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestOwnAircraftTitle,
CSimConnectDefinitions::DataOwnAircraftTitle,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED);
HRESULT hr2 = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestOwnAircraftTitle,
CSimConnectDefinitions::DataOwnAircraftTitle,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED),
0, "Cannot request title", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
hr += SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestSimEnvironment,
CSimConnectDefinitions::DataSimEnvironment,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED);
HRESULT hr3 = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::RequestSimEnvironment,
CSimConnectDefinitions::DataSimEnvironment,
SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED),
0, "Cannot request sim.env.", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
if (isFailure(hr))
{
this->triggerAutoTraceSendId();
CLogMessage(this).error("FSX plugin: SimConnect_RequestDataOnSimObject failed");
return;
}
// Request the data from SB only when its changed and only ONCE so we don't have to run a 1sec event to get/set this info ;)
hr += SimConnect_RequestClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::RequestSbData,
CSimConnectDefinitions::DataClientAreaSb, SIMCONNECT_CLIENT_DATA_PERIOD_SECOND, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED);
if (isFailure(hr))
{
this->triggerAutoTraceSendId();
CLogMessage(this).error("FSX plugin: SimConnect_RequestClientData failed");
return;
}
HRESULT hr4 = this->logAndTraceSendId(
SimConnect_RequestClientData(m_hSimConnect, ClientAreaSquawkBox, CSimConnectDefinitions::RequestSbData,
CSimConnectDefinitions::DataClientAreaSb, SIMCONNECT_CLIENT_DATA_PERIOD_SECOND, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG_CHANGED),
0, "Cannot request client data", Q_FUNC_INFO, "SimConnect_RequestClientData");
if (isFailure(hr1, hr2, hr3, hr4)) { return; }
this->emitSimulatorCombinedStatus(); // force sending status
}
@@ -484,8 +480,8 @@ namespace BlackSimPlugin
QPointer<CSimulatorFsxCommon> myself(this);
QTimer::singleShot(0, this, [ = ]
{
if (myself.isNull()) { return; }
myself->disconnectFrom();
if (!myself) { return; }
this->disconnectFrom();
});
}
@@ -511,23 +507,27 @@ namespace BlackSimPlugin
return true;
}
bool CSimulatorFsxCommon::triggerAutoTraceSendId()
bool CSimulatorFsxCommon::triggerAutoTraceSendId(qint64 traceTimeMs)
{
if (m_traceSendId) { return false; } // no need
if (this->isShuttingDownOrDisconnected()) { return false; }
const qint64 ts = QDateTime::currentMSecsSinceEpoch();
m_traceAutoTs = ts; // auto trace on
CLogMessage(this).warning("Triggered auto trace until %1") << ts;
const qint64 traceUntil = traceTimeMs + ts;
if (traceUntil <= m_traceAutoUntilTs) { return false; }
m_traceAutoUntilTs = traceUntil;
static const QString format("hh:mm:ss.zzz");
const QString untilString = QDateTime::fromMSecsSinceEpoch(traceUntil).toString(format);
CLogMessage(this).info("Triggered auto trace until %1") << untilString;
const QPointer<CSimulatorFsxCommon> myself(this);
QTimer::singleShot(AutoTraceOffsetMs * 1.2, this, [ = ]
QTimer::singleShot(traceTimeMs * 1.2, this, [ = ]
{
// triggered by mself (ts check), otherwise ignore
if (myself.isNull()) { return; }
if (myself->m_traceAutoTs == ts)
{
CLogMessage(this).warning("Auto trace id off");
myself->m_traceAutoTs = -1;
}
if (!myself) { return; }
if (m_traceAutoUntilTs > QDateTime::currentMSecsSinceEpoch()) { return; }
if (m_traceAutoUntilTs < 0) { return; } // alread off
CLogMessage(this).info("Auto trace id off");
m_traceAutoUntilTs = -1;
});
return true;
}
@@ -774,7 +774,7 @@ namespace BlackSimPlugin
{
if (aircraftStillInRange)
{
msg = CLogMessage(this).warning("Callsign '%1' removed in meantime, but still in range") << callsign.toQString();
msg = CLogMessage(this).warning("Callsign '%1' removed in meantime from AI objects, but still in range") << callsign.toQString();
}
else
{
@@ -825,7 +825,7 @@ namespace BlackSimPlugin
}
else
{
CLogMessage(this).warning("Verified aircraft '%1' model '%2', request/object id: %3 %4 already rendered") << callsign.asString() << remoteAircraft.getModelString() << requestId << objectId;
CLogMessage(this).warning("Verified aircraft '%1' model '%2', request/object id: %3 %4 was already rendered") << callsign.asString() << remoteAircraft.getModelString() << requestId << objectId;
}
}
while (false);
@@ -1271,13 +1271,13 @@ namespace BlackSimPlugin
{
// problem: we try to delete an aircraft just requested to be added
// best solution so far, call remove again with a delay
CLogMessage(this).warning("Object: %1 pending added: %2 / lights: %3 about to be removed")
<< simObject.toQString() << boolToYesNo(pendingAdded) << boolToYesNo(stillWaitingForLights);
CLogMessage(this).warning("Object: %1 requested to be removed, but pedning added (%2) / or pending lights(%3). CS '%3' will be removed again.")
<< simObject.toQString() << boolToYesNo(pendingAdded) << boolToYesNo(stillWaitingForLights) << callsign.asString();
simObject.fakeCurrentLightsInSimulator(); // next time looks like we have lights
QPointer<CSimulatorFsxCommon> myself(this);
QTimer::singleShot(2000, this, [ = ]
{
if (myself.isNull()) { return; }
if (!myself) { return; }
myself->physicallyRemoveRemoteAircraft(callsign);
});
return false; // not yet deleted
@@ -1460,6 +1460,7 @@ namespace BlackSimPlugin
const QList<CSimConnectObject> simObjects(m_simConnectObjects.values());
int simObjectNumber = 0;
const bool traceSendId = this->isTracingSendId();
for (const CSimConnectObject &simObject : simObjects)
{
// happening if aircraft is not yet added to simulator or to be deleted
@@ -1484,19 +1485,15 @@ namespace BlackSimPlugin
if (!this->isEqualLastSent(result))
{
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(result, sendGround);
const HRESULT hr = SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
static_cast<SIMCONNECT_OBJECT_ID>(objectId), 0, 0,
sizeof(SIMCONNECT_DATA_INITPOSITION), &position);
const HRESULT hr = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
static_cast<SIMCONNECT_OBJECT_ID>(objectId), 0, 0, sizeof(SIMCONNECT_DATA_INITPOSITION), &position),
traceSendId, simObject, "Failed so set position", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
if (isOk(hr))
{
this->rememberLastSent(result); // remember
if (this->isTracingSendId()) { this->traceSendId(objectId, Q_FUNC_INFO, simObject.toQString()); }
this->removedClampedLog(callsign);
}
else
{
CLogMessage(this).warning("Failed so set position on SimObject '%1' callsign: '%2'") << objectId << callsign;
}
}
}
else
@@ -1566,33 +1563,33 @@ namespace BlackSimPlugin
{
Q_ASSERT(m_hSimConnect);
const DWORD objectId = simObject.getObjectId();
const bool traceId = this->isTracingSendId();
// in case we sent, we sent everything
const HRESULT hr = SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftParts,
objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0,
sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights);
if (isOk(hr) && m_simConnectObjects.contains(simObject.getCallsign()))
{
if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO);}
}
else
{
CLogMessage(this).warning("Failed so set parts on SimObject '%1' callsign: '%2'") << simObject.getObjectId() << simObject.getCallsign();
}
HRESULT hr1 = this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftParts,
objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0,
sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights),
traceId, simObject, "Failed so set parts", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
// lights we can set directly
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventLandingLightsSet, lights.isLandingOn() ? 1.0 : 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventStrobesSet, lights.isStrobeOn() ? 1.0 : 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
HRESULT hr2 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventLandingLightsSet, lights.isLandingOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed so set landing lights", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventLandingLightsSet");
HRESULT hr3 = this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventStrobesSet, lights.isStrobeOn() ? 1.0 : 0.0,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
traceId, simObject, "Failed to set strobe lights", Q_FUNC_INFO, "SimConnect_TransmitClientEvent::EventStrobesSet");
// lights we need to toggle
// (potential risk with quickly changing values that we accidentally toggle back, also we need the light state before we can toggle)
this->sendToggledLightsToSimulator(simObject, lights);
// done
const bool ok = isOk(hr);
if (!ok) { this->triggerAutoTraceSendId(); }
return ok;
return isOk(hr1, hr2, hr3);
}
void CSimulatorFsxCommon::sendToggledLightsToSimulator(const CSimConnectObject &simObj, const CAircraftLights &lightsWanted, bool force)
@@ -1614,29 +1611,43 @@ namespace BlackSimPlugin
if (!lightsIsState.isNull())
{
const DWORD objectId = simObj.getObjectId();
const bool trace = this->isTracingSendId();
if (lightsWanted.isTaxiOn() != lightsIsState.isTaxiOn())
{
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleTaxiLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleTaxiLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle taxi lights", Q_FUNC_INFO, "EventToggleTaxiLights");
}
if (lightsWanted.isNavOn() != lightsIsState.isNavOn())
{
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleNavLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleNavLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle nav.lights", Q_FUNC_INFO, "EventToggleNavLights");
}
if (lightsWanted.isBeaconOn() != lightsIsState.isBeaconOn())
{
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleBeaconLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleBeaconLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle becon lights", Q_FUNC_INFO, "EventToggleBeaconLights");
}
if (lightsWanted.isLogoOn() != lightsIsState.isLogoOn())
{
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleLogoLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleLogoLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle logo lights", Q_FUNC_INFO, "EventToggleLogoLights");
}
if (lightsWanted.isRecognitionOn() != lightsIsState.isRecognitionOn())
{
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleRecognitionLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleRecognitionLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle recognition lights", Q_FUNC_INFO, "EventToggleRecognitionLights");
}
if (lightsWanted.isCabinOn() != lightsIsState.isCabinOn())
{
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleCabinLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
this->logAndTraceSendId(
SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventToggleCabinLights, 0.0, SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY),
trace, simObj, "Toggle cabin lights", Q_FUNC_INFO, "EventToggleCabinLights");
}
return;
}
@@ -1647,7 +1658,7 @@ namespace BlackSimPlugin
const QPointer<CSimulatorFsxCommon> myself(this);
QTimer::singleShot(DeferResendingLights, this, [ = ]
{
if (myself.isNull()) { return; }
if (!myself) { return; }
if (!m_simConnectObjects.contains(callsign)) { return; }
const CSimConnectObject currentSimObject = m_simConnectObjects[callsign];
if (!currentSimObject.hasValidRequestAndObjectId()) { return; } // stale
@@ -1669,7 +1680,7 @@ namespace BlackSimPlugin
// MSFS has inverted pitch and bank angles
position.Pitch = -situation.getPitch().value(CAngleUnit::deg());
position.Bank = -situation.getBank().value(CAngleUnit::deg());
position.OnGround = 0U;
position.OnGround = 0U; // not on ground
if (sendGnd && situation.isOnGroundInfoAvailable())
{
@@ -1752,21 +1763,19 @@ namespace BlackSimPlugin
// always request, not only when something has changed
const SIMCONNECT_DATA_REQUEST_ID reqId = static_cast<SIMCONNECT_DATA_REQUEST_ID>(simObject.getRequestId(CSimConnectDefinitions::SimObjectPositionData));
const HRESULT result = SimConnect_RequestDataOnSimObject(
m_hSimConnect, reqId,
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
simObject.getObjectId(), period);
const HRESULT result = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(
m_hSimConnect, reqId,
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
simObject.getObjectId(), period),
simObject, "Cannot request simulator data", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
if (isOk(result))
{
m_requestSimObjectDataCount++;
if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO);}
m_simConnectObjects[simObject.getCallsign()].setSimDataPeriod(period);
return true;
}
// failure
CLogMessage(this).error("Cannot request simulator data on object '%1'") << simObject.getObjectId();
return false;
}
@@ -1775,22 +1784,18 @@ namespace BlackSimPlugin
if (m_simConnectProbes.countConfirmedAdded() < 1) { return false; }
if (!m_simConnectObjects.contains(callsign)) { return false; } // removed in meantime
static const QString w("Cannot request terrain probe data for id '%1'");
const CSimConnectObject simObject = m_simConnectProbes.values().front();
const SIMCONNECT_DATA_REQUEST_ID requestId = simObject.getRequestId(CSimConnectDefinitions::SimObjectPositionData);
const DWORD objectId = simObject.getObjectId();
const HRESULT result = SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
objectId, SIMCONNECT_PERIOD_ONCE);
if (isOk(result))
{
if (this->isTracingSendId()) { this->traceSendId(requestId, Q_FUNC_INFO); }
m_pendingProbeRequests.insert(requestId, callsign);
return true;
}
CLogMessage(this).error("Cannot request terrain probe data for id '%1' ''%2") << requestId << callsign.asString();
return false;
const HRESULT result =
this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
objectId, SIMCONNECT_PERIOD_ONCE),
simObject, w.arg(requestId), Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
return isOk(result);
}
bool CSimulatorFsxCommon::requestLightsForSimObject(const CSimConnectObject &simObject)
@@ -1800,17 +1805,12 @@ namespace BlackSimPlugin
// always request, not only when something has changed
const SIMCONNECT_DATA_REQUEST_ID requestId = simObject.getRequestId(CSimConnectDefinitions::SimObjectLights);
const HRESULT result = SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftLights, simObject.getObjectId(),
SIMCONNECT_PERIOD_SECOND);
if (isOk(result))
{
if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO);}
return true;
}
CLogMessage(this).error("Cannot request lights data on object '%1'") << simObject.getObjectId();
return false;
const HRESULT result = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId, CSimConnectDefinitions::DataRemoteAircraftLights,
simObject.getObjectId(), SIMCONNECT_PERIOD_SECOND),
true, simObject, "Cannot request lights data", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
return isOk(result);
}
bool CSimulatorFsxCommon::requestModelInfoForSimObject(const CSimConnectObject &simObject)
@@ -1820,17 +1820,13 @@ namespace BlackSimPlugin
// always request, not only when something has changed
const SIMCONNECT_DATA_REQUEST_ID requestId = simObject.getRequestId(CSimConnectDefinitions::SimObjectModel);
const HRESULT result = SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftModelData, simObject.getObjectId(),
SIMCONNECT_PERIOD_ONCE);
if (isOk(result))
{
if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO);}
return true;
}
CLogMessage(this).error("Cannot request model info on object '%1'") << simObject.getObjectId();
return false;
const HRESULT result = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftModelData, simObject.getObjectId(),
SIMCONNECT_PERIOD_ONCE),
simObject, "Cannot request model info", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
return isOk(result);
}
bool CSimulatorFsxCommon::stopRequestingDataForSimObject(const CSimConnectObject &simObject)
@@ -1840,20 +1836,21 @@ namespace BlackSimPlugin
// stop by setting SIMCONNECT_PERIOD_NEVER
SIMCONNECT_DATA_REQUEST_ID requestId = simObject.getRequestId(CSimConnectDefinitions::SimObjectPositionData);
HRESULT result = SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
simObject.getObjectId(), SIMCONNECT_PERIOD_NEVER);
if (isOk(result)) { if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO, "Position");} }
const HRESULT hr1 = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
simObject.getObjectId(), SIMCONNECT_PERIOD_NEVER),
simObject, "Stopping position request", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
requestId = simObject.getRequestId(CSimConnectDefinitions::SimObjectLights);
result = SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftLights, simObject.getObjectId(),
SIMCONNECT_PERIOD_NEVER);
if (isOk(result)) { if (this->isTracingSendId()) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO, "Lights");} }
Q_UNUSED(result);
return true;
const HRESULT hr2 = this->logAndTraceSendId(
SimConnect_RequestDataOnSimObject(
m_hSimConnect, requestId,
CSimConnectDefinitions::DataRemoteAircraftLights, simObject.getObjectId(),
SIMCONNECT_PERIOD_NEVER),
simObject, "Stopping lights request", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject");
return isOk(hr1, hr2);
}
void CSimulatorFsxCommon::initSimulatorInternals()
@@ -1866,6 +1863,16 @@ namespace BlackSimPlugin
void CSimulatorFsxCommon::reset()
{
this->safeKillTimer();
this->removeAllProbes(); // still requires connection
// cleared below:
// m_simConnectObjects
// m_simConnectObjectsPositionAndPartsTraces
// m_addPendingAircraft
// m_updateRemoteAircraftInProgress
CSimulatorFsCommon::reset(); // clears all pending aircraft etc
// reset values
m_simulatingChangedTs = -1;
m_simConnected = false;
m_simSimulating = false;
@@ -1875,13 +1882,6 @@ namespace BlackSimPlugin
m_dispatchErrors = 0;
m_receiveExceptionCount = 0;
m_sendIdTraces.clear();
this->removeAllProbes();
// cleared below:
// m_simConnectObjects
// m_simConnectObjectsPositionAndPartsTraces
// m_addPendingAircraft
// m_updateRemoteAircraftInProgress
CSimulatorFsCommon::reset(); // clears all pending aircraft etc
}
void CSimulatorFsxCommon::clearAllRemoteAircraftData()
@@ -1909,17 +1909,51 @@ namespace BlackSimPlugin
return simObjectCallsigns.difference(providerCallsigns);
}
void CSimulatorFsxCommon::traceSendId(DWORD simObjectId, const QString &function, const QString &details)
void CSimulatorFsxCommon::traceSendId(DWORD simObjectId, const QString &functionName, const QString &details)
{
if (!this->isTracingSendId()) { return; }
if (MaxSendIdTraces < 1) { return; }
DWORD dwLastId = 0;
const HRESULT hr = SimConnect_GetLastSentPacketID(m_hSimConnect, &dwLastId);
if (isFailure(hr)) { return; }
if (m_sendIdTraces.size() > MaxSendIdTraces) { m_sendIdTraces.removeFirst(); }
const TraceFsxSendId trace(dwLastId, simObjectId,
details.isEmpty() ? function : details + ", " + function);
m_sendIdTraces.push_back(trace);
if (m_sendIdTraces.size() > MaxSendIdTraces) { m_sendIdTraces.removeLast(); }
const TraceFsxSendId trace(dwLastId, simObjectId, details.isEmpty() ? functionName : details % QStringLiteral(", ") % functionName);
m_sendIdTraces.push_front(trace);
}
HRESULT CSimulatorFsxCommon::logAndTraceSendId(HRESULT hr, DWORD simObjectId, const QString &warningMsg, const QString &functionName, const QString &functionDetails)
{
return this->logAndTraceSendId(hr, this->isTracingSendId(), simObjectId, warningMsg, functionName, functionDetails);
}
HRESULT CSimulatorFsxCommon::logAndTraceSendId(HRESULT hr, bool traceSendId, DWORD simObjectId, const QString &warningMsg, const QString &functionName, const QString &functionDetails)
{
if (traceSendId) { this->traceSendId(simObjectId, functionName, functionDetails); }
if (isOk(hr)) { return hr; }
if (!warningMsg.isEmpty())
{
CSimConnectObject simObject = (simObjectId == 0) ? CSimConnectObject() : m_simConnectObjects.getSimObjectForObjectId(simObjectId);
CLogMessage(this).warning(warningMsg % QStringLiteral(" ") % simObject.toQString());
}
this->triggerAutoTraceSendId();
return hr;
}
HRESULT CSimulatorFsxCommon::logAndTraceSendId(HRESULT hr, const CSimConnectObject &simObject, const QString &warningMsg, const QString &functionName, const QString &functionDetails)
{
return this->logAndTraceSendId(hr, this->isTracingSendId(), simObject, warningMsg, functionName, functionDetails);
}
HRESULT CSimulatorFsxCommon::logAndTraceSendId(HRESULT hr, bool traceSendId, const CSimConnectObject &simObject, const QString &warningMsg, const QString &functionName, const QString &functionDetails)
{
if (traceSendId) { this->traceSendId(simObject.getObjectId(), functionName, functionDetails); }
if (isOk(hr)) { return hr; }
if (!warningMsg.isEmpty())
{
CLogMessage(this).warning(warningMsg % QStringLiteral(" SimObject: ") % simObject.toQString());
}
this->triggerAutoTraceSendId();
return hr;
}
QString CSimulatorFsxCommon::getSendIdTraceDetails(DWORD sendId) const
@@ -1928,9 +1962,9 @@ namespace BlackSimPlugin
{
if (trace.sendId == sendId)
{
static const QString d("Send id: %1 obj.id.: %2 cs.: %4 '%3'");
const CCallsign cs = m_simConnectObjects.getCallsignForObjectId(trace.simObjectId);
return d.arg(sendId).arg(trace.simObjectId).arg(cs.asString(), trace.comment);
static const QString d("Send id: %1 obj.id.: %2 SimObj: %3 | '%4'");
const CSimConnectObject simObj = m_simConnectObjects.getSimObjectForObjectId(trace.simObjectId);
return d.arg(sendId).arg(trace.simObjectId).arg(simObj.toQString(), trace.comment);
}
}
return "";
@@ -1938,6 +1972,7 @@ namespace BlackSimPlugin
int CSimulatorFsxCommon::removeAllProbes()
{
if (!m_hSimConnect) { return 0; } // already disconnected
if (m_simConnectProbes.isEmpty()) { return 0; }
int c = 0;
for (const CSimConnectObject &probeSimObject : m_simConnectProbes.values())

View File

@@ -410,7 +410,19 @@ namespace BlackSimPlugin
void setTraceSendId(bool traceSendId) { m_traceSendId = traceSendId; }
//! Trace the send id
void traceSendId(DWORD simObjectId, const QString &function, const QString &details = {});
void traceSendId(DWORD simObjectId, const QString &functionName, const QString &details = {});
//! Trace if required, log errors
HRESULT logAndTraceSendId(HRESULT hr, DWORD simObjectId, const QString &warningMsg, const QString &functionName, const QString &functionDetails = {});
//! Trace if required, log errors
HRESULT logAndTraceSendId(HRESULT hr, bool traceSendId, DWORD simObjectId, const QString &warningMsg, const QString &functionName, const QString &functionDetails = {});
//! Trace if required, log errors
HRESULT logAndTraceSendId(HRESULT hr, const CSimConnectObject &simObject, const QString &warningMsg, const QString &functionName, const QString &functionDetails = {});
//! Trace if required, log errors
HRESULT logAndTraceSendId(HRESULT hr, bool traceSendId, const CSimConnectObject &simObject, const QString &warningMsg, const QString &functionName, const QString &functionDetails = {});
//! Get the trace details, otherwise empty string
QString getSendIdTraceDetails(DWORD sendId) const;
@@ -449,7 +461,7 @@ namespace BlackSimPlugin
bool m_simSimulating = false; //!< Simulator running?
bool m_useSbOffsets = true; //!< with SB offsets
bool m_traceSendId = false; //!< trace the send ids, meant for debugging
qint64 m_traceAutoTs = -1; //!< allows to automatically trace for some time
qint64 m_traceAutoUntilTs = -1; //!< allows to automatically trace for some time
qint64 m_simulatingChangedTs = -1; //!< timestamp, when simulating changed (used to avoid jitter)
int m_syncDeferredCounter = 0; //!< Set when synchronized, used to wait some time
int m_skipCockpitUpdateCycles = 0; //!< skip some update cycles to allow changes in simulator cockpit to be set