mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-03 15:45:46 +08:00
Ref T260, implemented 1st version of FSX terrain probe
This commit is contained in:
committed by
Roland Winklmeier
parent
51f7b5aeb7
commit
4bef444f40
@@ -219,8 +219,7 @@ namespace BlackSimPlugin
|
||||
case CStatusMessage::SeverityWarning: type = SIMCONNECT_TEXT_TYPE_PRINT_YELLOW; break;
|
||||
case CStatusMessage::SeverityError: type = SIMCONNECT_TEXT_TYPE_PRINT_RED; break;
|
||||
}
|
||||
const HRESULT hr = SimConnect_Text(m_hSimConnect, type, 7.5, EventTextMessage,
|
||||
static_cast<DWORD>(m.size()), m.data());
|
||||
const HRESULT hr = SimConnect_Text(m_hSimConnect, type, 7.5, EventTextMessage, static_cast<DWORD>(m.size()), m.data());
|
||||
Q_UNUSED(hr);
|
||||
}
|
||||
|
||||
@@ -273,8 +272,31 @@ namespace BlackSimPlugin
|
||||
Q_UNUSED(callsign);
|
||||
if (this->isShuttingDown()) { return false; }
|
||||
if (reference.isNull()) { return false; }
|
||||
this->physicallyAddAITerrainProbe(reference);
|
||||
return false;
|
||||
|
||||
static const CAltitude alt(50000, CLengthUnit::ft());
|
||||
CCoordinateGeodetic pos(reference);
|
||||
pos.setGeodeticHeight(alt);
|
||||
|
||||
if (m_simConnectProbes.isEmpty()) { return this->physicallyAddAITerrainProbe(pos); }
|
||||
if (m_simConnectProbes.countConfirmedAdded() < 1) { return false; } // pending probes
|
||||
CSimConnectObject simObj = m_simConnectProbes.values().front();
|
||||
|
||||
SIMCONNECT_DATA_INITPOSITION position = this->coordinateToFsxPosition(pos);
|
||||
const HRESULT hr = SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
|
||||
simObj.getObjectId(), 0, 0,
|
||||
sizeof(SIMCONNECT_DATA_INITPOSITION), &position);
|
||||
if (m_traceSendId) { this->traceSendId(simObj.getObjectId(), Q_FUNC_INFO); }
|
||||
|
||||
if (hr == S_OK)
|
||||
{
|
||||
this->requestTerrainProbeData(callsign);
|
||||
}
|
||||
else
|
||||
{
|
||||
const CStatusMessage msg = CStatusMessage(this).error("Can not request AI position: '%1'") << callsign.asString();
|
||||
CLogMessage::preformatted(msg);
|
||||
}
|
||||
return hr == S_OK;
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::stillDisplayReceiveExceptions()
|
||||
@@ -291,7 +313,12 @@ namespace BlackSimPlugin
|
||||
|
||||
// Internals depends on sim data which take a while to be read
|
||||
// this is a trick and I re-init again after a while (which is not really expensive)
|
||||
QTimer::singleShot(1000, this, [this] { this->initSimulatorInternals(); });
|
||||
const QPointer<CSimulatorFsxCommon> myself(this);
|
||||
QTimer::singleShot(1000, this, [myself]
|
||||
{
|
||||
if (myself.isNull()) { return; }
|
||||
myself->initSimulatorInternals();
|
||||
});
|
||||
}
|
||||
|
||||
void CSimulatorFsxCommon::onSimRunning()
|
||||
@@ -345,6 +372,7 @@ namespace BlackSimPlugin
|
||||
void CSimulatorFsxCommon::onSimStopped()
|
||||
{
|
||||
// stopping events in FSX: Load menu, weather and season
|
||||
CLogMessage(this).info("Simulator stopped: %1") << this->m_simulatorDetails;
|
||||
const SimulatorStatus oldStatus = this->getSimulatorStatus();
|
||||
m_simSimulating = false;
|
||||
m_simulatingChangedTs = QDateTime::currentMSecsSinceEpoch();
|
||||
@@ -358,6 +386,8 @@ namespace BlackSimPlugin
|
||||
|
||||
void CSimulatorFsxCommon::onSimExit()
|
||||
{
|
||||
CLogMessage(this).info("Simulator exit: %1") << this->m_simulatorDetails;
|
||||
|
||||
// reset complete state, we are going down
|
||||
m_simulatingChangedTs = QDateTime::currentMSecsSinceEpoch();
|
||||
this->safeKillTimer();
|
||||
@@ -510,6 +540,13 @@ namespace BlackSimPlugin
|
||||
this->rememberElevationAndCG(simObject.getCallsign(), elevation, CLength(remoteAircraftData.cgToGroundFt, CLengthUnit::ft()));
|
||||
}
|
||||
|
||||
void CSimulatorFsxCommon::updatProbeFromSimulator(const CCallsign &callsign, const DataDefinitionRemoteAircraftSimData &remoteAircraftData)
|
||||
{
|
||||
CElevationPlane elevation(remoteAircraftData.latitudeDeg, remoteAircraftData.longitudeDeg, remoteAircraftData.elevationFt);
|
||||
elevation.setSinglePointRadius();
|
||||
this->callbackReceivedRequestedElevation(elevation, callsign);
|
||||
}
|
||||
|
||||
void CSimulatorFsxCommon::updateOwnAircraftFromSimulator(const DataDefinitionClientAreaSb &sbDataArea)
|
||||
{
|
||||
CTransponder::TransponderMode newMode;
|
||||
@@ -531,6 +568,7 @@ namespace BlackSimPlugin
|
||||
|
||||
bool CSimulatorFsxCommon::simulatorReportedObjectAdded(DWORD objectId)
|
||||
{
|
||||
if (this->isShuttingDown()) { 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; }
|
||||
@@ -545,8 +583,18 @@ namespace BlackSimPlugin
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::simulatorReportedProbeAdded(DWORD objectId)
|
||||
{
|
||||
if (this->isShuttingDown()) { return true; } // pretend everything is fine
|
||||
const CSimConnectObject simObject = m_simConnectProbes.markObjectAsAdded(objectId);
|
||||
const bool valid(simObject.hasValidRequestAndObjectId() && simObject.isConfirmedAdded());
|
||||
return valid;
|
||||
}
|
||||
|
||||
void CSimulatorFsxCommon::verifyAddedRemoteAircraft(const CSimulatedAircraft &remoteAircraftIn)
|
||||
{
|
||||
if (this->isShuttingDown()) { return; }
|
||||
|
||||
CStatusMessage msg;
|
||||
CSimulatedAircraft remoteAircraft = remoteAircraftIn;
|
||||
const CCallsign callsign(remoteAircraft.getCallsign());
|
||||
@@ -733,9 +781,11 @@ namespace BlackSimPlugin
|
||||
{
|
||||
const CSimulatedAircraft aircraftAddAgain = m_addAgainAircraftWhenRemoved.findFirstByCallsign(callsign);
|
||||
m_addAgainAircraftWhenRemoved.removeByCallsign(callsign);
|
||||
QTimer::singleShot(2500, this, [ = ]
|
||||
QPointer<CSimulatorFsxCommon> myself(this);
|
||||
QTimer::singleShot(2500, this, [ = ]
|
||||
{
|
||||
this->physicallyAddRemoteAircraftImpl(aircraftAddAgain, AddedAfterRemoved);
|
||||
if (myself.isNull()) { return; }
|
||||
myself->physicallyAddRemoteAircraftImpl(aircraftAddAgain, AddedAfterRemoved);
|
||||
});
|
||||
}
|
||||
return removedAny;
|
||||
@@ -746,6 +796,11 @@ namespace BlackSimPlugin
|
||||
return m_simConnectObjects.setSimConnectObjectIdForRequestId(requestId, objectId, true);
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::setSimConnectProbeId(DWORD requestId, DWORD objectId)
|
||||
{
|
||||
return m_simConnectProbes.setSimConnectObjectIdForRequestId(requestId, objectId, true);
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::setCurrentLights(const CCallsign &callsign, const CAircraftLights &lights)
|
||||
{
|
||||
if (!m_simConnectObjects.contains(callsign)) { return false; }
|
||||
@@ -859,7 +914,7 @@ namespace BlackSimPlugin
|
||||
Q_ASSERT_X(newRemoteAircraft.hasModelString(), Q_FUNC_INFO, "missing model string");
|
||||
|
||||
// reset timer
|
||||
m_addPendingAircraftTimer.start(AddPendingAircraftIntervalMs); // restart
|
||||
m_addPendingSimObjTimer.start(AddPendingAircraftIntervalMs); // restart
|
||||
|
||||
const bool hasPendingAdded = m_simConnectObjects.containsPendingAdded();
|
||||
const bool canAdd = m_simSimulating && m_simConnected && !hasPendingAdded;
|
||||
@@ -930,23 +985,37 @@ namespace BlackSimPlugin
|
||||
bool CSimulatorFsxCommon::physicallyAddAITerrainProbe(const ICoordinateGeodetic &coordinate)
|
||||
{
|
||||
if (coordinate.isNull()) { return false; }
|
||||
return false;
|
||||
|
||||
// entry checks
|
||||
/**
|
||||
Q_ASSERT_X(CThreadUtils::isCurrentThreadObjectThread(this), Q_FUNC_INFO, "thread");
|
||||
|
||||
// static const QString modelString = this->getDefaultModel().getModelString();
|
||||
static const QString modelString("OrcaWhale");
|
||||
static const QString pseudoCallsign("swift pr: %1"); // max 12 chars
|
||||
const int index = m_simConnectProbes.size() + 1;
|
||||
const CCallsign cs(pseudoCallsign.arg(index));
|
||||
const SIMCONNECT_DATA_REQUEST_ID requestId = this->obtainRequestIdForProbe();
|
||||
const SIMCONNECT_DATA_INITPOSITION initialPosition = CSimulatorFsxCommon::coordinateToFsxPosition(coordinate);
|
||||
const HRESULT hr = SimConnect_AICreateNonATCAircraft(m_hSimConnect, qPrintable(""), qPrintable(""), initialPosition, requestId);
|
||||
if (hr != S_OK)
|
||||
// const HRESULT hr = SimConnect_AICreateNonATCAircraft(m_hSimConnect, qPrintable(modelString), qPrintable(cs.asString().right(12)), initialPosition, requestId);
|
||||
const HRESULT hr = SimConnect_AICreateSimulatedObject(m_hSimConnect, qPrintable(modelString), initialPosition, requestId);
|
||||
if (m_traceSendId) { this->traceSendId(0, Q_FUNC_INFO, QString("Adding probe, req.id: %1").arg(requestId));}
|
||||
|
||||
bool ok = false;
|
||||
if (hr == S_OK)
|
||||
{
|
||||
ok = true;
|
||||
const CAircraftModel model(modelString, CAircraftModel::TypeTerrainProbe, QStringLiteral("swift terrain probe"), CAircraftIcaoCode::unassignedIcao());
|
||||
const CAircraftSituation situation(cs, coordinate);
|
||||
const CSimulatedAircraft pseudoAircraft(cs, model, CUser("123456", "swift", cs), situation);
|
||||
CSimConnectObject simObj(CSimConnectObject::Probe);
|
||||
simObj.setRequestId(requestId);
|
||||
simObj.setAircraft(pseudoAircraft);
|
||||
m_simConnectProbes.insert(cs, simObj);
|
||||
}
|
||||
else
|
||||
{
|
||||
const CStatusMessage msg = CStatusMessage(this).error("SimConnect, can not create terrain AI: '%1'") << requestId;
|
||||
CLogMessage::preformatted(msg);
|
||||
}
|
||||
|
||||
return hr == S_OK;
|
||||
**/
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::physicallyRemoveRemoteAircraft(const CCallsign &callsign)
|
||||
@@ -973,9 +1042,11 @@ namespace BlackSimPlugin
|
||||
// problem: we try to delete an aircraft just requested to be added
|
||||
// best solution so far, call remove again with a delay
|
||||
simObject.fakeCurrentLightsInSimulator(); // next time looks like we have lights
|
||||
QPointer<CSimulatorFsxCommon> myself(this);
|
||||
QTimer::singleShot(2000, this, [ = ]
|
||||
{
|
||||
this->physicallyRemoveRemoteAircraft(callsign);
|
||||
if (myself.isNull()) { return; }
|
||||
myself->physicallyRemoveRemoteAircraft(callsign);
|
||||
});
|
||||
return false; // not yet deleted
|
||||
}
|
||||
@@ -1112,7 +1183,7 @@ namespace BlackSimPlugin
|
||||
{
|
||||
// called when connected
|
||||
|
||||
HRESULT hr = initEvents();
|
||||
HRESULT hr = this->initEvents();
|
||||
if (hr != S_OK)
|
||||
{
|
||||
CLogMessage(this).error("FSX plugin: initEvents failed");
|
||||
@@ -1120,7 +1191,7 @@ namespace BlackSimPlugin
|
||||
}
|
||||
|
||||
// init data definitions and SB data area
|
||||
hr += initDataDefinitionsWhenConnected();
|
||||
hr += this->initDataDefinitionsWhenConnected();
|
||||
if (hr != S_OK)
|
||||
{
|
||||
CLogMessage(this).error("FSX plugin: initDataDefinitionsWhenConnected failed");
|
||||
@@ -1164,18 +1235,17 @@ namespace BlackSimPlugin
|
||||
Q_ASSERT_X(simObject.hasValidRequestAndObjectId(), Q_FUNC_INFO, "Missing ids");
|
||||
|
||||
// setup
|
||||
const CInterpolationAndRenderingSetupPerCallsign setup = this->getInterpolationSetupPerCallsignOrDefault(callsign);
|
||||
const bool useAircraftParts = setup.isAircraftPartsEnabled() && aircraftWithParts.contains(callsign);
|
||||
const CInterpolationAndRenderingSetupPerCallsign setup = this->getInterpolationSetupConsolidated(callsign);
|
||||
const bool logInterpolationAndParts = setup.logInterpolation();
|
||||
const bool sendGround = setup.sendGndFlagToSimulator();
|
||||
CPartsStatus partsStatus(useAircraftParts);
|
||||
|
||||
// Interpolated situation
|
||||
CInterpolationStatus interpolatorStatus;
|
||||
const CAircraftSituation interpolatedSituation = simObject.getInterpolatedSituation(currentTimestamp, setup, interpolatorStatus);
|
||||
|
||||
// Interpolated parts
|
||||
const CAircraftParts parts = useAircraftParts ? simObject.getInterpolatedOrGuessedParts(currentTimestamp, setup, partsStatus, logInterpolationAndParts) : CAircraftParts::guessedParts(interpolatedSituation, simObject.isVtol(), simObject.getEngineCount());
|
||||
CPartsStatus partsStatus;
|
||||
const CAircraftParts parts = simObject.getInterpolatedOrGuessedParts(currentTimestamp, setup, partsStatus, logInterpolationAndParts);
|
||||
|
||||
if (interpolatorStatus.hasValidSituation())
|
||||
{
|
||||
@@ -1205,10 +1275,8 @@ namespace BlackSimPlugin
|
||||
<< interpolatorStatus.toQString();
|
||||
}
|
||||
|
||||
if (useAircraftParts)
|
||||
{
|
||||
this->updateRemoteAircraftParts(simObject, parts, partsStatus);
|
||||
}
|
||||
this->updateRemoteAircraftParts(simObject, parts, partsStatus);
|
||||
|
||||
} // all callsigns
|
||||
|
||||
const qint64 dt = QDateTime::currentMSecsSinceEpoch() - currentTimestamp;
|
||||
@@ -1217,13 +1285,13 @@ namespace BlackSimPlugin
|
||||
m_statsUpdateAircraftTimeAvgMs = m_statsUpdateAircraftTimeTotalMs / m_statsUpdateAircraftCountMs;
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::updateRemoteAircraftParts(const CSimConnectObject &simObj, const CAircraftParts &parts, const CPartsStatus &partsStatus)
|
||||
bool CSimulatorFsxCommon::updateRemoteAircraftParts(const CSimConnectObject &simObject, const CAircraftParts &parts, const CPartsStatus &partsStatus)
|
||||
{
|
||||
if (!simObj.hasValidRequestAndObjectId()) { return false; }
|
||||
if (!partsStatus.isSupportingParts()) { return false; }
|
||||
if (!simObject.hasValidRequestAndObjectId()) { return false; }
|
||||
if (parts.getPartsDetails() != CAircraftParts::GuessedParts && !partsStatus.isSupportingParts()) { return false; }
|
||||
|
||||
DataDefinitionRemoteAircraftPartsWithoutLights ddRemoteAircraftPartsWithoutLights(parts); // no init, all values will be set
|
||||
return this->sendRemoteAircraftPartsToSimulator(simObj, ddRemoteAircraftPartsWithoutLights, parts.getAdjustedLights());
|
||||
return this->sendRemoteAircraftPartsToSimulator(simObject, ddRemoteAircraftPartsWithoutLights, parts.getAdjustedLights());
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::sendRemoteAircraftPartsToSimulator(const CSimConnectObject &simObject, DataDefinitionRemoteAircraftPartsWithoutLights &ddRemoteAircraftPartsWithoutLights, const CAircraftLights &lights)
|
||||
@@ -1436,6 +1504,26 @@ namespace BlackSimPlugin
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::requestTerrainProbeData(const CCallsign &callsign)
|
||||
{
|
||||
if (m_simConnectProbes.countConfirmedAdded() < 1) { return false; }
|
||||
const DWORD id = this->obtainRequestIdForProbe();
|
||||
const DWORD objectId = m_simConnectProbes.values().front().getObjectId();
|
||||
const HRESULT result = SimConnect_RequestDataOnSimObject(
|
||||
m_hSimConnect, id,
|
||||
CSimConnectDefinitions::DataRemoteAircraftGetPosition,
|
||||
objectId, SIMCONNECT_PERIOD_ONCE);
|
||||
if (m_traceSendId) { this->traceSendId(id, Q_FUNC_INFO); }
|
||||
|
||||
if (result == S_OK)
|
||||
{
|
||||
m_pendingProbeRequests.insert(id, callsign);
|
||||
return true;
|
||||
}
|
||||
CLogMessage(this).error("Cannot request terrain probe data for id '%1' ''%2") << id << callsign.asString();
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::requestLightsForSimObject(const CSimConnectObject &simObject)
|
||||
{
|
||||
if (!simObject.hasValidRequestAndObjectId()) { return false; }
|
||||
@@ -1502,6 +1590,7 @@ namespace BlackSimPlugin
|
||||
m_dispatchErrors = 0;
|
||||
m_receiveExceptionCount = 0;
|
||||
m_sendIdTraces.clear();
|
||||
this->removeAllProbes();
|
||||
// cleared below:
|
||||
// m_simConnectObjects
|
||||
// m_simConnectObjectsPositionAndPartsTraces
|
||||
@@ -1514,6 +1603,7 @@ namespace BlackSimPlugin
|
||||
m_simConnectObjects.clear();
|
||||
m_addPendingAircraft.clear();
|
||||
m_simConnectObjectsPositionAndPartsTraces.clear();
|
||||
this->removeAllProbes();
|
||||
// m_addAgainAircraftWhenRemoved cleared below
|
||||
CSimulatorFsCommon::clearAllRemoteAircraftData();
|
||||
}
|
||||
@@ -1560,6 +1650,29 @@ namespace BlackSimPlugin
|
||||
return "";
|
||||
}
|
||||
|
||||
int CSimulatorFsxCommon::removeAllProbes()
|
||||
{
|
||||
if (m_simConnectProbes.isEmpty()) { return 0; }
|
||||
int c = 0;
|
||||
for (const CSimConnectObject &simObject : m_simConnectProbes.values())
|
||||
{
|
||||
if (!simObject.isConfirmedAdded()) { continue; }
|
||||
const SIMCONNECT_DATA_REQUEST_ID requestId = this->obtainRequestIdForProbe();
|
||||
const HRESULT result = SimConnect_AIRemoveObject(m_hSimConnect, static_cast<SIMCONNECT_OBJECT_ID>(simObject.getObjectId()), requestId);
|
||||
if (result == S_OK)
|
||||
{
|
||||
c++;
|
||||
}
|
||||
else
|
||||
{
|
||||
CLogMessage(this).warning("Removing probe '%1' from simulator failed") << simObject.getObjectId();
|
||||
}
|
||||
}
|
||||
m_simConnectProbes.clear();
|
||||
m_pendingProbeRequests.clear();
|
||||
return c;
|
||||
}
|
||||
|
||||
CSimConnectObject CSimulatorFsxCommon::insertNewSimConnectObject(const CSimulatedAircraft &aircraft, DWORD requestId)
|
||||
{
|
||||
if (m_simConnectObjects.contains(aircraft.getCallsign()))
|
||||
|
||||
@@ -283,18 +283,27 @@ namespace BlackSimPlugin
|
||||
//! Remote aircraft data sent from simulator
|
||||
void updateRemoteAircraftFromSimulator(const CSimConnectObject &simObject, const DataDefinitionRemoteAircraftSimData &remoteAircraftData);
|
||||
|
||||
//! Probe data sent from simulator
|
||||
void updatProbeFromSimulator(const BlackMisc::Aviation::CCallsign &callsign, const DataDefinitionRemoteAircraftSimData &remoteAircraftData);
|
||||
|
||||
//! Update from SB client area
|
||||
void updateOwnAircraftFromSimulator(const DataDefinitionClientAreaSb &sbDataArea);
|
||||
|
||||
//! An AI aircraft was added in the simulator
|
||||
bool simulatorReportedObjectAdded(DWORD objectId);
|
||||
|
||||
//! An AI probe was added in the simulator
|
||||
bool simulatorReportedProbeAdded(DWORD objectId);
|
||||
|
||||
//! Simulator reported that AI aircraft was removed
|
||||
bool simulatorReportedObjectRemoved(DWORD objectID);
|
||||
|
||||
//! Set ID of a SimConnect object, so far we only have an request id in the object
|
||||
bool setSimConnectObjectId(DWORD requestId, DWORD objectId);
|
||||
|
||||
//! Set ID of a SimConnect object, so far we only have an request id in the object
|
||||
bool setSimConnectProbeId(DWORD requestId, DWORD objectId);
|
||||
|
||||
//! Remember current lights
|
||||
bool setCurrentLights(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftLights &lights);
|
||||
|
||||
@@ -307,6 +316,9 @@ namespace BlackSimPlugin
|
||||
//! The simconnect related objects
|
||||
const CSimConnectObjects &getSimConnectObjects() const { return m_simConnectObjects; }
|
||||
|
||||
//! The simconnect related probes
|
||||
const CSimConnectObjects &getSimConnectProbes() const { return m_simConnectProbes; }
|
||||
|
||||
//! Format conversion
|
||||
SIMCONNECT_DATA_INITPOSITION aircraftSituationToFsxPosition(const BlackMisc::Aviation::CAircraftSituation &situation);
|
||||
|
||||
@@ -319,6 +331,9 @@ namespace BlackSimPlugin
|
||||
//! Request data for a CSimConnectObject (aka remote aircraft)
|
||||
bool requestPositionDataForSimObject(const CSimConnectObject &simObject, SIMCONNECT_PERIOD period = SIMCONNECT_PERIOD_SECOND);
|
||||
|
||||
//! Request data for the terrain probe
|
||||
bool requestTerrainProbeData(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
//! Request lights for a CSimConnectObject
|
||||
bool requestLightsForSimObject(const CSimConnectObject &simObject);
|
||||
|
||||
@@ -340,6 +355,9 @@ namespace BlackSimPlugin
|
||||
//! Get the trace details, otherwise empty string
|
||||
QString getSendIdTraceDetails(DWORD sendId) const;
|
||||
|
||||
//! Remove all probes
|
||||
int removeAllProbes();
|
||||
|
||||
//! Insert an new SimConnect object
|
||||
CSimConnectObject insertNewSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, DWORD requestId);
|
||||
|
||||
@@ -375,9 +393,10 @@ namespace BlackSimPlugin
|
||||
int m_receiveExceptionCount = 0; //!< exceptions
|
||||
QList<TraceFsxSendId> m_sendIdTraces; //!< Send id traces for debugging
|
||||
CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids
|
||||
CSimConnectObjects m_simConnectProbes; //!< AI terrain probes
|
||||
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>(RequestIdSimDataStart); //!< request id, use obtainRequestIdForSimData() to get id
|
||||
SIMCONNECT_DATA_REQUEST_ID m_requestIdProbe = static_cast<SIMCONNECT_DATA_REQUEST_ID>(RequestIdTerrainProbeStart); //!< request id, use obtainRequestIdForProbe() to get id
|
||||
SIMCONNECT_DATA_REQUEST_ID m_requestIdProbe = static_cast<SIMCONNECT_DATA_REQUEST_ID>(RequestIdTerrainProbeStart); //!< request id, use obtainRequestIdForSimData() to get id
|
||||
BlackMisc::Simulation::CSimulatedAircraftList m_addPendingAircraft; //!< aircraft awaiting to be added
|
||||
QTimer m_addPendingSimObjTimer; //!< updating of sim objects awaiting to be added
|
||||
};
|
||||
|
||||
@@ -59,6 +59,7 @@ namespace BlackSimPlugin
|
||||
{
|
||||
case SIMCONNECT_EXCEPTION_OPERATION_INVALID_FOR_OBJECT_TYPE: break;
|
||||
case SIMCONNECT_EXCEPTION_UNRECOGNIZED_ID: break;
|
||||
case SIMCONNECT_EXCEPTION_CREATE_OBJECT_FAILED: break;
|
||||
default: break;
|
||||
}
|
||||
QString ex;
|
||||
@@ -120,17 +121,30 @@ namespace BlackSimPlugin
|
||||
|
||||
// such an object is not necessarily one of ours
|
||||
// for instance, I always see object "5" when I start the simulator
|
||||
if (!simulatorFsxP3D->getSimConnectObjects().isKnownSimObjectId(objectId)) { break; }
|
||||
switch (event->uEventID)
|
||||
if (simulatorFsxP3D->getSimConnectObjects().isKnownSimObjectId(objectId))
|
||||
{
|
||||
case SystemEventObjectAdded:
|
||||
// added in SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
|
||||
break;
|
||||
case SystemEventObjectRemoved:
|
||||
simulatorFsxP3D->simulatorReportedObjectRemoved(objectId);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
switch (event->uEventID)
|
||||
{
|
||||
case SystemEventObjectRemoved:
|
||||
simulatorFsxP3D->simulatorReportedObjectRemoved(objectId);
|
||||
break;
|
||||
case SystemEventObjectAdded: // added in SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (simulatorFsxP3D->getSimConnectProbes().isKnownSimObjectId(objectId))
|
||||
{
|
||||
switch (event->uEventID)
|
||||
{
|
||||
case SystemEventObjectRemoved:
|
||||
CLogMessage(simulatorFsxP3D).info("Removed probe id: %2") << objectId;
|
||||
simulatorFsxP3D->m_simConnectProbes.removeByObjectId(objectId);
|
||||
break;
|
||||
case SystemEventObjectAdded: // added in SIMCONNECT_RECV_ID_ASSIGNED_OBJECT_ID
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -153,16 +167,36 @@ namespace BlackSimPlugin
|
||||
const SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *event = static_cast<SIMCONNECT_RECV_ASSIGNED_OBJECT_ID *>(pData);
|
||||
const DWORD requestId = event->dwRequestID;
|
||||
const DWORD objectId = event->dwObjectID;
|
||||
bool success = simulatorFsxP3D->setSimConnectObjectId(requestId, objectId);
|
||||
if (!success) { break; } // not an request ID of ours
|
||||
|
||||
success = simulatorFsxP3D->simulatorReportedObjectAdded(objectId); // trigger follow up actions
|
||||
if (!success)
|
||||
bool success = false;
|
||||
if (CSimulatorFsxCommon::isRequestForProbe(requestId))
|
||||
{
|
||||
const CSimulatedAircraft remoteAircraft(simulatorFsxP3D->getSimConnectObjects().getSimObjectForObjectId(objectId).getAircraft());
|
||||
const CStatusMessage msg = CStatusMessage(simulatorFsxP3D).error("Cannot add object %1, cs: '%2' model: '%3'") << objectId << remoteAircraft.getCallsignAsString() << remoteAircraft.getModelString();
|
||||
CLogMessage::preformatted(msg);
|
||||
emit simulatorFsxP3D->physicallyAddingRemoteModelFailed(remoteAircraft, msg);
|
||||
success = simulatorFsxP3D->setSimConnectProbeId(requestId, objectId);
|
||||
if (!success) { break; } // not an request ID of ours
|
||||
success = simulatorFsxP3D->simulatorReportedProbeAdded(objectId);
|
||||
const CSimConnectObject simObject = simulatorFsxP3D->getSimConnectProbes().getSimObjectForObjectId(objectId);
|
||||
if (success)
|
||||
{
|
||||
CLogMessage(simulatorFsxP3D).info("Added probe '%1' id: %2") << simObject.getCallsign() << objectId;
|
||||
}
|
||||
else
|
||||
{
|
||||
CLogMessage(simulatorFsxP3D).error("Cannot add probe '%1' id: %2") << simObject.getCallsign() << objectId;
|
||||
}
|
||||
}
|
||||
else if (CSimulatorFsxCommon::isRequestForSimData(requestId))
|
||||
{
|
||||
success = simulatorFsxP3D->setSimConnectObjectId(requestId, objectId);
|
||||
if (!success) { break; } // not an request ID of ours
|
||||
success = simulatorFsxP3D->simulatorReportedObjectAdded(objectId); // trigger follow up actions
|
||||
if (!success)
|
||||
{
|
||||
const CSimConnectObject simObj = simulatorFsxP3D->getSimConnectObjects().getSimObjectForObjectId(objectId);
|
||||
const CSimulatedAircraft remoteAircraft(simObj.getAircraft());
|
||||
const CStatusMessage msg = CStatusMessage(simulatorFsxP3D).error("Cannot add object %1, cs: '%2' model: '%3'") << objectId << remoteAircraft.getCallsignAsString() << remoteAircraft.getModelString();
|
||||
CLogMessage::preformatted(msg);
|
||||
emit simulatorFsxP3D->physicallyAddingRemoteModelFailed(remoteAircraft, msg);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -215,7 +249,7 @@ namespace BlackSimPlugin
|
||||
{
|
||||
static_assert(sizeof(DataDefinitionRemoteAircraftSimData) == 5 * sizeof(double), "DataDefinitionRemoteAircraftSimData has an incorrect size.");
|
||||
const CSimConnectObject simObj = simulatorFsxP3D->getSimConnectObjects().getSimObjectForObjectId(objectId);
|
||||
if (!simObj.hasValidRequestAndObjectId()) break;
|
||||
if (!simObj.hasValidRequestAndObjectId()) { break; }
|
||||
const DataDefinitionRemoteAircraftSimData *remoteAircraftSimData = (DataDefinitionRemoteAircraftSimData *)&pObjData->dwData;
|
||||
// extra check, but ids should be the same
|
||||
if (objectId == simObj.getObjectId())
|
||||
@@ -223,6 +257,20 @@ namespace BlackSimPlugin
|
||||
simulatorFsxP3D->updateRemoteAircraftFromSimulator(simObj, *remoteAircraftSimData);
|
||||
}
|
||||
}
|
||||
else if (CSimulatorFsxCommon::isRequestForProbe(requestId))
|
||||
{
|
||||
static_assert(sizeof(DataDefinitionRemoteAircraftSimData) == 5 * sizeof(double), "DataDefinitionRemoteAircraftSimData has an incorrect size.");
|
||||
const CSimConnectObject probeObj = simulatorFsxP3D->getSimConnectProbes().getSimObjectForObjectId(objectId);
|
||||
if (!probeObj.hasValidRequestAndObjectId()) { break; }
|
||||
const DataDefinitionRemoteAircraftSimData *probeSimData = (DataDefinitionRemoteAircraftSimData *)&pObjData->dwData;
|
||||
// extra check, but ids should be the same
|
||||
if (objectId == probeObj.getObjectId())
|
||||
{
|
||||
const CCallsign cs = simulatorFsxP3D->m_pendingProbeRequests.value(requestId);
|
||||
if (cs.isEmpty()) { break; }
|
||||
simulatorFsxP3D->updatProbeFromSimulator(cs, *probeSimData);
|
||||
}
|
||||
}
|
||||
else if (CSimulatorFsxCommon::isRequestForLights(requestId))
|
||||
{
|
||||
static_assert(sizeof(DataDefinitionRemoteAircraftLights) == 8 * sizeof(double), "DataDefinitionRemoteAircraftLights has an incorrect size.");
|
||||
|
||||
Reference in New Issue
Block a user