Ref T180, trace parts and positions even if the object is not yet used with simulator

* interpolator will be prefilled with data
* in case the used SimObject is created, it can already use earlier position/parts updates
This commit is contained in:
Klaus Basan
2017-11-09 13:56:35 +01:00
parent 02c45588c3
commit fd0eec689f
2 changed files with 58 additions and 15 deletions

View File

@@ -877,9 +877,7 @@ namespace BlackSimPlugin
{
// we will request a new aircraft by request ID, later we will receive its object id
// so far this object id is -1
addedAircraft.setRendered(false);
const CSimConnectObject simObject(addedAircraft, requestId, &m_interpolationLogger);
m_simConnectObjects.insert(callsign, simObject);
const CSimConnectObject simObject = this->insertNewSimConnectObject(addedAircraft, requestId);
if (m_traceSendId) { this->traceSendId(simObject.getObjectId(), Q_FUNC_INFO);}
adding = true;
}
@@ -1491,6 +1489,7 @@ namespace BlackSimPlugin
{
m_simConnectObjects.clear();
m_addPendingAircraft.clear();
m_simConnectObjectsPositionAndPartsTraces.clear();
CSimulatorFsCommon::clearAllAircraft();
}
@@ -1502,8 +1501,15 @@ namespace BlackSimPlugin
}
else
{
// update if in pending
m_addPendingAircraft.setAircraftSituation(situation.getCallsign(), situation);
// trace for future usage
if (m_simConnectObjectsPositionAndPartsTraces.contains(situation.getCallsign()))
{
m_simConnectObjectsPositionAndPartsTraces[situation.getCallsign()].addAircraftSituation(situation);
}
else
{
m_simConnectObjectsPositionAndPartsTraces.insert(situation.getCallsign(), CSimConnectObject(situation));
}
}
}
@@ -1515,14 +1521,21 @@ namespace BlackSimPlugin
}
else
{
// update if in pending
m_addPendingAircraft.setAircraftParts(callsign, parts);
// trace for future usage
if (m_simConnectObjectsPositionAndPartsTraces.contains(callsign))
{
m_simConnectObjectsPositionAndPartsTraces[callsign].addAircraftParts(parts);
}
else
{
m_simConnectObjectsPositionAndPartsTraces.insert(callsign, CSimConnectObject(parts, callsign));
}
}
}
QString CSimulatorFsxCommon::fsxPositionToString(const SIMCONNECT_DATA_INITPOSITION &position)
{
const QString positionStr("Lat: %1deg lng: %2deg alt: %3ft pitch: %4deg bank: %5deg hdg: %6deg airspeed: %7kts onGround: %8");
static const QString positionStr("Lat: %1deg lng: %2deg alt: %3ft pitch: %4deg bank: %5deg hdg: %6deg airspeed: %7kts onGround: %8");
return positionStr.
arg(position.Latitude).arg(position.Longitude).arg(position.Altitude).
arg(position.Pitch).arg(position.Bank).arg(position.Heading).arg(position.Airspeed).arg(position.OnGround);
@@ -1549,18 +1562,44 @@ namespace BlackSimPlugin
QString CSimulatorFsxCommon::getSendIdTraceDetails(DWORD sendId) const
{
for (const TraceFsxSendId &t : m_sendIdTraces)
for (const TraceFsxSendId &trace : m_sendIdTraces)
{
if (t.sendId == sendId)
if (trace.sendId == sendId)
{
static const QString d("Send id: %1 obj.id.: %2 cs.: %4 '%3'");
const CCallsign cs = m_simConnectObjects.getCallsignForObjectId(t.simObjectId);
return d.arg(sendId).arg(t.simObjectId).arg(cs.asString(), t.comment);
const CCallsign cs = m_simConnectObjects.getCallsignForObjectId(trace.simObjectId);
return d.arg(sendId).arg(trace.simObjectId).arg(cs.asString(), trace.comment);
}
}
return "";
}
CSimConnectObject CSimulatorFsxCommon::insertNewSimConnectObject(const CSimulatedAircraft &aircraft, DWORD requestId)
{
if (m_simConnectObjects.contains(aircraft.getCallsign()))
{
// error, ...?
return m_simConnectObjects[aircraft.getCallsign()];
}
CSimConnectObject simObject;
if (m_simConnectObjectsPositionAndPartsTraces.contains(aircraft.getCallsign()))
{
simObject = m_simConnectObjectsPositionAndPartsTraces[aircraft.getCallsign()];
m_simConnectObjectsPositionAndPartsTraces.remove(aircraft.getCallsign());
simObject.resetState();
simObject.setRequestId(requestId);
simObject.setAircraft(aircraft);
simObject.attachInterpolatorLogger(&m_interpolationLogger); // setting a logger does not start logging
}
else
{
simObject = CSimConnectObject(aircraft, requestId, &m_interpolationLogger);
}
m_simConnectObjects.insert(aircraft.getCallsign(), simObject);
return simObject;
}
CCallsignSet CSimulatorFsxCommon::physicallyRemoveAircraftNotInProvider()
{
const CCallsignSet toBeRemoved(getCallsignsMissingInProvider());

View File

@@ -317,6 +317,9 @@ namespace BlackSimPlugin
//! Get the trace details, otherwise empty string
QString getSendIdTraceDetails(DWORD sendId) const;
//! Insert an new SimConnect object
CSimConnectObject insertNewSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, DWORD requestId);
//! Request for sim data (request in range of sim data)?
static bool isRequestForSimData(DWORD requestId) { return requestId >= (RequestSimDataStart + RequestSimDataOffset) && requestId < (RequestSimDataStart + RequestSimDataOffset + MaxSimObjects); }
@@ -350,11 +353,12 @@ namespace BlackSimPlugin
int m_dispatchErrors = 0; //!< number of dispatched failed, \sa dispatch
int m_receiveExceptionCount = 0; //!< exceptions
HANDLE m_hSimConnect = nullptr; //!< handle to SimConnect object
CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids
QList<TraceFsxSendId> m_sendIdTraces; //!< Send id traces for debugging
QTimer m_addPendingAircraftTimer { this }; //!< updating of aircraft awaiting add
CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids
CSimConnectObjects m_simConnectObjectsPositionAndPartsTraces; //!< position/parts received, but object not yet added, excluded, disabled etc.
SIMCONNECT_DATA_REQUEST_ID m_requestIdSimData = static_cast<SIMCONNECT_DATA_REQUEST_ID>(RequestSimDataStart); //!< request id, use obtainRequestId() to get id
BlackMisc::Simulation::CSimulatedAircraftList m_addPendingAircraft; //!< aircraft awaiting to be added
BlackMisc::Simulation::CSimulatedAircraftList m_addPendingAircraft; //!< aircraft awaiting to be added
QTimer m_addPendingAircraftTimer { this }; //!< updating of aircraft awaiting to be added
};
//! Listener for FSX