fix: error in physicallyAddRemoteAircraftImpl

This commit is contained in:
Thomas Zobler
2025-12-19 18:13:25 +01:00
parent 2bcb5b81e6
commit e1f566e2f5
5 changed files with 88 additions and 23 deletions

View File

@@ -35,10 +35,13 @@ namespace swift::core::fsd
PlaneInformationFsinn PlaneInformationFsinn::fromTokens(const QStringList &tokens)
{
if (tokens.size() != 12)
// TODO TZ
// in same cases we found 13 tokens
if (tokens.size() < 12)
{
swift::misc::CLogMessage(static_cast<PlaneInformationFsinn *>(nullptr))
.debug(u"Wrong number of arguments.");
.debug(u"PlaneInformationFsinn::fromTokens Wrong number of arguments %1.")
<< tokens.size();
return {};
};

View File

@@ -3,6 +3,8 @@
#include "simconnectobjectmsfs2024.h"
#include <misc/logmessage.h>
#include "simulatormsfs2024common.h"
#include "config/buildconfig.h"
@@ -395,10 +397,17 @@ namespace swift::simplugin::msfs2024common
bool CSimConnectObjects::containsPendingAdded() const
{
bool cont = false;
for (const CSimConnectObject &simObject : *this)
{
if (simObject.isPendingAdded()) { return true; }
if (simObject.isPendingAdded())
{
CLogMessage(this).info(u"containsPendingAdded %1 ") << simObject.getCallsign();
cont = true;
}
}
if (cont) return true;
return false;
}

View File

@@ -663,6 +663,7 @@ namespace swift::simplugin::msfs2024common
bool CSimulatorMsfs2024::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation,
const CAircraftParts &parts)
{
Q_UNUSED(situation);
if (!m_simConnectObjects.contains(callsign)) { return false; }
CSimConnectObject simObject = m_simConnectObjects.value(callsign);
int u = 0;
@@ -1238,12 +1239,25 @@ namespace swift::simplugin::msfs2024common
if (this->isShuttingDownOrDisconnected()) { return true; } // pretend everything is fine
const CSimConnectObject simObject = m_simConnectObjects.getSimObjectForObjectId(objectId);
const CCallsign callsign(simObject.getCallsign());
if (!simObject.hasValidRequestAndObjectId() || callsign.isEmpty()) { return false; }
CLogMessage(this).info(u"simulatorReportedObjectAdded 1 %1 %2 %3")
<< callsign.asString() << objectId << this->isSimulating();
if (!simObject.hasValidRequestAndObjectId() || callsign.isEmpty())
{
CLogMessage(this).error(u"simulatorReportedObjectAdded 1 %1 %2 %3")
<< callsign.asString() << objectId << this->isSimulating();
return false;
}
// we know the object has been created. But it can happen it is directly removed afterwards
const CSimulatedAircraft verifyAircraft(simObject.getAircraft());
const QPointer<CSimulatorMsfs2024> myself(this);
QTimer::singleShot(1000, this, [=] {
// TODO TZ check: Why 1000ms? Is this required in MSFS2024?
// QTimer::singleShot(1000, this, [=] {
QTimer::singleShot(100, this, [=] {
// verify aircraft and also triggers new add if required
// do not do this in the event loop, so we do this deferred
if (!myself || this->isShuttingDownOrDisconnected()) { return; }
@@ -1256,6 +1270,8 @@ namespace swift::simplugin::msfs2024common
{
if (this->isShuttingDownOrDisconnected()) { return; }
CLogMessage(this).info(u"verifyAddedRemoteAircraft 1 %1") << remoteAircraftIn.getCallsign();
CStatusMessage msg;
CSimulatedAircraft remoteAircraft = remoteAircraftIn;
const CCallsign callsign(remoteAircraft.getCallsign());
@@ -1318,9 +1334,14 @@ namespace swift::simplugin::msfs2024common
this->requestModelInfoForSimObject(simObject);
this->removeFromAddPendingAndAddAgainAircraft(callsign); // no longer try to add
if (m_addPendingAircraft.contains(callsign))
{
CLogMessage(this).info(u"removeFromAddPendingAndAddAgainAircraft failed 1 %1") << callsign;
}
const bool updated = this->updateAircraftRendered(callsign, true);
if (updated)
{
CLogMessage(this).info(u"updateAircraftRendered 1 %1") << callsign;
static const QString debugMsg("CS: '%1' model: '%2' verified, request/object id: %3 %4");
if (this->showDebugLogMessage())
{
@@ -1490,9 +1511,13 @@ namespace swift::simplugin::msfs2024common
void CSimulatorMsfs2024::addPendingAircraft(AircraftAddMode mode)
{
if (m_addPendingAircraft.isEmpty()) { return; }
if (m_addPendingAircraft.isEmpty())
{
CLogMessage(this).warning(u"addPendingAircraft is Empty");
return;
}
const CCallsignSet aircraftCallsignsInRange(this->getAircraftInRangeCallsigns());
CSimulatedAircraftList toBeAddedAircraft; // aircraft still to be added
// CSimulatedAircraftList toBeAddedAircraft; // aircraft still to be added
CCallsignSet toBeRemovedCallsigns;
for (const CSimConnectObject &pendingSimObj : std::as_const(m_addPendingAircraft))
@@ -1503,11 +1528,12 @@ namespace swift::simplugin::msfs2024common
}
// no longer required to be added
m_addPendingAircraft.removeCallsigns(toBeRemovedCallsigns);
// TOTO TZ
// m_addPendingAircraft.removeCallsigns(toBeRemovedCallsigns);
m_addAgainAircraftWhenRemoved.removeByCallsigns(toBeRemovedCallsigns);
// add aircraft, but "non blocking"
if (!toBeAddedAircraft.isEmpty())
if (!m_addPendingAircraft.isEmpty())
{
const CSimConnectObject oldestSimObject = m_addPendingAircraft.getOldestObject();
const CSimulatedAircraft nextPendingAircraft = oldestSimObject.getAircraft();
@@ -1532,12 +1558,19 @@ namespace swift::simplugin::msfs2024common
CSimConnectObject simObjectOld;
if (callsign.isEmpty()) { return simObjectOld; }
CLogMessage(this).info(u"removeFromAddPendingAndAddAgainAircraft 1 %1") << callsign;
m_addAgainAircraftWhenRemoved.removeByCallsign(callsign);
if (m_addPendingAircraft.contains(callsign))
{
CLogMessage(this).info(
u"removeFromAddPendingAndAddAgainAircraft m_addPendingAircraft.contains(callsign) 2 %1")
<< callsign;
simObjectOld = m_addPendingAircraft[callsign];
m_addPendingAircraft.remove(callsign);
}
CLogMessage(this).info(u"removeFromAddPendingAndAddAgainAircraft 3 %1 m_addPendingAircraft.count: %2")
<< simObjectOld.getCallsignAsString() << m_addPendingAircraft.count();
return simObjectOld;
}
@@ -1789,6 +1822,8 @@ namespace swift::simplugin::msfs2024common
{
const CCallsign callsign(newRemoteAircraft.getCallsign());
CLogMessage(this).info(u"physicallyAddRemoteAircraftImpl %1") << callsign.asString();
// entry checks
Q_ASSERT_X(CThreadUtils::isInThisThread(this), Q_FUNC_INFO, "thread");
Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "empty callsign");
@@ -1823,9 +1858,12 @@ namespace swift::simplugin::msfs2024common
const bool hasPendingAdded = m_simConnectObjects.containsPendingAdded();
bool canAdd = this->isSimulating() && !hasPendingAdded;
CLogMessage(this).info(u"TEST 1 %1 %2 %3 %4")
<< callsign.asString() << canAdd << this->isSimulating() << hasPendingAdded;
Q_ASSERT_X(!hasPendingAdded || m_simConnectObjects.countPendingAdded() < 2, Q_FUNC_INFO,
"There must be only 0..1 pending objects");
if (this->showDebugLogMessage())
if (this->showDebugLogMessage() && true)
{
this->debugLogMessage(Q_FUNC_INFO, QStringLiteral("CS: '%1' mode: '%2' model: '%3'")
.arg(newRemoteAircraft.getCallsignAsString(), modeToString(addMode),
@@ -1841,6 +1879,8 @@ namespace swift::simplugin::msfs2024common
// this handles changed model strings or an update of the model
if (m_simConnectObjects.contains(callsign))
{
CLogMessage(this).info(u"TEST 2 m_simConnectObjects.contains %1 ") << callsign.asString();
const CSimConnectObject simObject = m_simConnectObjects[callsign];
const QString newModelString(newRemoteAircraft.getModelString());
const QString simObjModelString(simObject.getAircraftModelString());
@@ -1876,6 +1916,7 @@ namespace swift::simplugin::msfs2024common
CAircraftSituation situation(newRemoteAircraft.getSituation());
if (canAdd && situation.isPositionOrAltitudeNull())
{
CLogMessage(this).info(u"TEST 3 situation.isPositionOrAltitudeNull %1 ") << callsign.asString();
// invalid position because position or altitude is null
const CAircraftSituationList situations(this->remoteAircraftSituations(callsign));
if (situations.isEmpty())
@@ -1901,11 +1942,15 @@ namespace swift::simplugin::msfs2024common
}
// check if we can add, do not add if simulator is stopped or other objects pending
if (!canAdd)
{
CLogMessage(this).info(u"TEST 4 !canAdd %1 ") << callsign.asString();
CSimConnectObject &addPendingObj = m_addPendingAircraft[newRemoteAircraft.getCallsign()];
addPendingObj.setAircraft(newRemoteAircraft);
addPendingObj.resetTimestampToNow();
m_addPendingAircraft.insert(addPendingObj, true); // insert removed objects and update ts
return false;
}
@@ -1920,6 +1965,7 @@ namespace swift::simplugin::msfs2024common
return false;
}
CLogMessage(this).info(u"TEST 5 CInterpolationAndRenderingSetupPerCallsign %1 ") << callsign.asString();
// setup
const CInterpolationAndRenderingSetupPerCallsign setup =
this->getInterpolationSetupConsolidated(callsign, true);
@@ -2355,16 +2401,18 @@ namespace swift::simplugin::msfs2024common
// in case we sent, we sent everything
const bool simObjectAircraftType = simObject.isAircraftSimulatedObject(); // no real aircraft type
const HRESULT hr1 =
simObjectAircraftType ?
S_OK :
this->logAndTraceSendId(
SimConnect_SetDataOnSimObject(
m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights,
static_cast<SIMCONNECT_OBJECT_ID>(objectId), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0,
sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights),
traceId, simObject, "Failed so set parts", Q_FUNC_INFO,
"SimConnect_SetDataOnSimObject::ddRemoteAircraftPartsWithoutLights");
const HRESULT hr1 = S_OK;
// TODO TZ re-enable if checked
// const HRESULT hr1 =
// simObjectAircraftType ?
// S_OK :
// this->logAndTraceSendId(
// SimConnect_SetDataOnSimObject(
// m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftPartsWithoutLights,
// static_cast<SIMCONNECT_OBJECT_ID>(objectId), SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0,
// sizeof(DataDefinitionRemoteAircraftPartsWithoutLights), &ddRemoteAircraftPartsWithoutLights),
// traceId, simObject, "Failed so set parts", Q_FUNC_INFO,
// "SimConnect_SetDataOnSimObject::ddRemoteAircraftPartsWithoutLights");
// TODO TZ handle flaps more precisely
// Sets flap handle to closest increment (0 to 16383)

View File

@@ -609,7 +609,7 @@ namespace swift::simplugin::msfs2024common
static_cast<int>(CSimConnectDefinitions::SimObjectEndMarker) * MaxSimObjAircraft;
// times
static constexpr int AddPendingAircraftIntervalMs = 20 * 1000;
static constexpr int AddPendingAircraftIntervalMs = 10 * 1000;
static constexpr int DispatchIntervalMs = 10; //!< how often with run the FSX event queue
static constexpr int DeferSimulatingFlagMs =
1500; //!< simulating can jitter at startup (simulating->stopped->simulating, multiple start events), so we

View File

@@ -85,7 +85,7 @@ namespace swift::simplugin::msfs2024common
// 4294967295/0xFFFFFFFF means unknown, 0 means also UNKNOWN INDEX
const DWORD data = cbData;
const TraceFsxSendId trace = simulatorMsfs2024->getSendIdTrace(sendId);
bool logGenericExceptionInfo = true;
bool logGenericExceptionInfo = false;
switch (exceptionId)
{
@@ -93,6 +93,9 @@ namespace swift::simplugin::msfs2024common
case SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID:
break; // Specifies that the client event, request ID, data definition ID, or object ID was not
// recognized
case SIMCONNECT_EXCEPTION_DATA_ERROR:
logGenericExceptionInfo = true;
break; // data error, can happen during data request
case SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED:
{
if (trace.isValid())
@@ -104,6 +107,8 @@ namespace swift::simplugin::msfs2024common
{
if (simObject.isAircraft())
{
CLogMessage(simulatorMsfs2024).warning(u"Adding Aircraft failed: %1 %2")
<< simObject.getCallsign().asString() << simObject.getAircraftModelString();
simulatorMsfs2024->addingAircraftFailed(simObject);
logGenericExceptionInfo = false;
}
@@ -119,7 +124,7 @@ namespace swift::simplugin::msfs2024common
} // trace
} // SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED:
break;
default: break;
default: logGenericExceptionInfo = true; break;
} // switch exception id
// generic exception warning