diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index 0171449d3..77d91e914 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -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(m.size()), m.data()); + const HRESULT hr = SimConnect_Text(m_hSimConnect, type, 7.5, EventTextMessage, static_cast(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 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 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 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(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())) diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h index ecefa16ad..dcbbcee6f 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.h @@ -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 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(RequestIdSimDataStart); //!< request id, use obtainRequestIdForSimData() to get id - SIMCONNECT_DATA_REQUEST_ID m_requestIdProbe = static_cast(RequestIdTerrainProbeStart); //!< request id, use obtainRequestIdForProbe() to get id + SIMCONNECT_DATA_REQUEST_ID m_requestIdProbe = static_cast(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 }; diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp index c1f7336c8..f9150be66 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxsimconnectproc.cpp @@ -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(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.");