refs #810, using DWORD instead of int to avoid possible issues (signed vs. unsigned)

Requires flags as negative flags do not indicate invalid
This commit is contained in:
Klaus Basan
2016-11-17 19:42:06 +01:00
parent 0a43ec6542
commit 26cc77ebab
4 changed files with 39 additions and 48 deletions

View File

@@ -18,20 +18,10 @@ namespace BlackSimPlugin
{ {
CSimConnectObject::CSimConnectObject() { } CSimConnectObject::CSimConnectObject() { }
CSimConnectObject::CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, int requestId) : CSimConnectObject::CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, DWORD requestId) :
m_aircraft(aircraft), m_requestId(requestId) m_aircraft(aircraft), m_requestId(requestId), m_validRequestId(true)
{ } { }
bool CSimConnectObject::hasValidRequestId() const
{
return this->m_requestId >= 0;
}
bool CSimConnectObject::hasValidobjectId() const
{
return this->m_objectId >= 0;
}
bool CSimConnectObject::isPendingAdded() const bool CSimConnectObject::isPendingAdded() const
{ {
return !this->hasValidRequestAndObjectId() || !this->m_confirmedAdded; return !this->hasValidRequestAndObjectId() || !this->m_confirmedAdded;
@@ -57,14 +47,13 @@ namespace BlackSimPlugin
bool CSimConnectObject::hasValidRequestAndObjectId() const bool CSimConnectObject::hasValidRequestAndObjectId() const
{ {
return this->hasValidRequestId() && this->hasValidobjectId(); return this->hasValidRequestId() && this->hasValidObjectId();
} }
bool CSimConnectObjects::setSimConnectObjectId(int requestID, int objectId) bool CSimConnectObjects::setSimConnectObjectIdForRequestId(DWORD requestId, DWORD objectId)
{ {
// First check, if this request id belongs to us // First check, if this request id belongs to us
const int requestIntId = static_cast<int>(requestID); auto it = std::find_if(this->begin(), this->end(), [requestId](const CSimConnectObject & obj) { return obj.getRequestId() == requestId; });
auto it = std::find_if(this->begin(), this->end(), [requestIntId](const CSimConnectObject & obj) { return obj.getRequestId() == requestIntId; });
if (it == this->end()) { return false; } if (it == this->end()) { return false; }
// belongs to us // belongs to us
@@ -72,12 +61,12 @@ namespace BlackSimPlugin
return true; return true;
} }
CCallsign CSimConnectObjects::getCallsignForObjectId(int objectId) const CCallsign CSimConnectObjects::getCallsignForObjectId(DWORD objectId) const
{ {
return getSimObjectForObjectId(objectId).getCallsign(); return getSimObjectForObjectId(objectId).getCallsign();
} }
CSimConnectObject CSimConnectObjects::getSimObjectForObjectId(int objectId) const CSimConnectObject CSimConnectObjects::getSimObjectForObjectId(DWORD objectId) const
{ {
for (const CSimConnectObject &simObject : this->values()) for (const CSimConnectObject &simObject : this->values())
{ {
@@ -86,7 +75,7 @@ namespace BlackSimPlugin
return CSimConnectObject(); return CSimConnectObject();
} }
bool CSimConnectObjects::isKnownSimObjectId(int objectId) const bool CSimConnectObjects::isKnownSimObjectId(DWORD objectId) const
{ {
const CSimConnectObject simObject(getSimObjectForObjectId(objectId)); const CSimConnectObject simObject(getSimObjectForObjectId(objectId));
return simObject.hasValidRequestAndObjectId() && objectId == simObject.getObjectId(); return simObject.hasValidRequestAndObjectId() && objectId == simObject.getObjectId();

View File

@@ -13,6 +13,7 @@
#define BLACKSIMPLUGIN_SIMCONNECT_OBJECT_H #define BLACKSIMPLUGIN_SIMCONNECT_OBJECT_H
#include "blackmisc/simulation/simulatedaircraft.h" #include "blackmisc/simulation/simulatedaircraft.h"
#include "simconnect/SimConnect.h"
#include <QSharedPointer> #include <QSharedPointer>
namespace BlackMisc { class IInterpolator; } namespace BlackMisc { class IInterpolator; }
@@ -29,7 +30,7 @@ namespace BlackSimPlugin
CSimConnectObject(); CSimConnectObject();
//! Constructor //! Constructor
CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, int requestId); CSimConnectObject(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, DWORD requestId);
//! Destructor //! Destructor
~CSimConnectObject() {} ~CSimConnectObject() {}
@@ -44,22 +45,22 @@ namespace BlackSimPlugin
const QString &getAircraftModelString() const { return m_aircraft.getModelString(); } const QString &getAircraftModelString() const { return m_aircraft.getModelString(); }
//! Set Simconnect request id //! Set Simconnect request id
void setRequestId(int id) { m_requestId = id; } void setRequestId(DWORD id) { m_requestId = id; m_validRequestId = true; }
//! Get Simconnect request id //! Get Simconnect request id
int getRequestId() const { return m_requestId; } DWORD getRequestId() const { return m_requestId; }
//! Set Simconnect object id //! Set Simconnect object id
void setObjectId(int id) { m_objectId = id; } void setObjectId(DWORD id) { m_objectId = id; m_validObjectId = true; }
//! Set Simconnect object id //! Set Simconnect object id
int getObjectId() const { return m_objectId; } DWORD getObjectId() const { return m_objectId; }
//! Valid request id? //! Valid request id?
bool hasValidRequestId() const; bool hasValidRequestId() const { return this->m_validRequestId; }
//! Valid object id? //! Valid object id?
bool hasValidobjectId() const; bool hasValidObjectId() const { return this->m_validObjectId; }
//! Object is requested, not yet added //! Object is requested, not yet added
bool isPendingAdded() const; bool isPendingAdded() const;
@@ -84,32 +85,33 @@ namespace BlackSimPlugin
private: private:
BlackMisc::Simulation::CSimulatedAircraft m_aircraft; BlackMisc::Simulation::CSimulatedAircraft m_aircraft;
int m_requestId = -1; DWORD m_requestId = 0;
int m_objectId = -1; DWORD m_objectId = 0;
bool m_validRequestId = false;
bool m_validObjectId = false;
bool m_confirmedAdded = false; bool m_confirmedAdded = false;
bool m_pendingRemoved = false; bool m_pendingRemoved = false;
}; };
//! Simulator objects (aka AI aircraft //! Simulator objects (aka AI aircraft)
class CSimConnectObjects : public QHash<BlackMisc::Aviation::CCallsign, CSimConnectObject> class CSimConnectObjects : public QHash<BlackMisc::Aviation::CCallsign, CSimConnectObject>
{ {
public: public:
//! Set ID of a SimConnect object, so far we only have an request id in the object //! Set ID of a SimConnect object, so far we only have an request id in the object
bool setSimConnectObjectId(int requestID, int objectId); bool setSimConnectObjectIdForRequestId(DWORD requestId, DWORD objectId);
//! Find which callsign belongs to the object id //! Find which callsign belongs to the object id
BlackMisc::Aviation::CCallsign getCallsignForObjectId(int objectId) const; BlackMisc::Aviation::CCallsign getCallsignForObjectId(DWORD objectId) const;
//! Find which callsign belongs to the object id //! Find which callsign belongs to the object id
CSimConnectObject getSimObjectForObjectId(int objectId) const; CSimConnectObject getSimObjectForObjectId(DWORD objectId) const;
//! Is the object id one of our AI objects? //! Is the object id one of our AI objects?
bool isKnownSimObjectId(int objectId) const; bool isKnownSimObjectId(DWORD objectId) const;
//! Pending add condition //! Pending add condition
bool containsPendingAdd() const; bool containsPendingAdd() const;
}; };
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -155,7 +155,7 @@ namespace BlackSimPlugin
// initial position if interpolator has data, otherwise do nothing // initial position if interpolator has data, otherwise do nothing
setInitialAircraftSituation(addedAircraft); // set interpolated data/parts if available setInitialAircraftSituation(addedAircraft); // set interpolated data/parts if available
const int requestId = m_requestId++; const DWORD requestId = m_requestId++;
SIMCONNECT_DATA_INITPOSITION initialPosition = aircraftSituationToFsxPosition(addedAircraft.getSituation()); SIMCONNECT_DATA_INITPOSITION initialPosition = aircraftSituationToFsxPosition(addedAircraft.getSituation());
const QString modelString(addedAircraft.getModelString()); const QString modelString(addedAircraft.getModelString());
@@ -504,23 +504,23 @@ namespace BlackSimPlugin
Q_ASSERT_X(simObject.isPendingAdded(), Q_FUNC_INFO, "already confirmed"); Q_ASSERT_X(simObject.isPendingAdded(), Q_FUNC_INFO, "already confirmed");
simObject.setConfirmedAdded(true); simObject.setConfirmedAdded(true);
DWORD objectID = static_cast<DWORD>(simObject.getObjectId()); const DWORD objectId = simObject.getObjectId();
if (m_interpolationRenderingSetup.showSimulatorDebugMessages()) if (m_interpolationRenderingSetup.showSimulatorDebugMessages())
{ {
CLogMessage(this).debug() << "Adding AI" << callsign.toQString() << "confirmed" << "id" << static_cast<int>(objectID) << "model" << simObject.getAircraftModelString(); CLogMessage(this).debug() << "Adding AI" << callsign.toQString() << "confirmed" << "id" << objectId << "model" << simObject.getAircraftModelString();
} }
// P3D also has SimConnect_AIReleaseControlEx; // P3D also has SimConnect_AIReleaseControlEx;
const int requestId = m_requestId++; DWORD requestId = m_requestId++;
HRESULT hr = SimConnect_AIReleaseControl(m_hSimConnect, objectID, static_cast<SIMCONNECT_DATA_REQUEST_ID>(requestId)); HRESULT hr = SimConnect_AIReleaseControl(m_hSimConnect, objectId, static_cast<SIMCONNECT_DATA_REQUEST_ID>(requestId));
if (hr == S_OK) if (hr == S_OK)
{ {
SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EventFreezeLat, 1, SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventFreezeLat, 1,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EventFreezeAlt, 1, SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventFreezeAlt, 1,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EventFreezeAtt, 1, SimConnect_TransmitClientEvent(m_hSimConnect, objectId, EventFreezeAtt, 1,
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY); SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
} }
else else
@@ -589,11 +589,11 @@ namespace BlackSimPlugin
if (!simObject.getAircraftModelString().isEmpty()) if (!simObject.getAircraftModelString().isEmpty())
{ {
this->m_outOfRealityBubble.push_back(simObject.getAircraft()); this->m_outOfRealityBubble.push_back(simObject.getAircraft());
CLogMessage(this).info("Aircraft '%1' '%2' '%3' out of reality bubble") << callsign.toQString() << simObject.getAircraftModelString() << static_cast<int>(objectID); CLogMessage(this).info("Aircraft '%1' '%2' '%3' out of reality bubble") << callsign.toQString() << simObject.getAircraftModelString() << objectID;
} }
else else
{ {
CLogMessage(this).warning("Removed %1 from simulator, but was not initiated by us: %1 '%2' object id %3") << callsign.toQString() << simObject.getAircraftModelString() << static_cast<int>(objectID); CLogMessage(this).warning("Removed %1 from simulator, but was not initiated by us: %1 '%2' object id %3") << callsign.toQString() << simObject.getAircraftModelString() << objectID;
} }
} }
@@ -619,7 +619,7 @@ namespace BlackSimPlugin
bool CSimulatorFsx::setSimConnectObjectId(DWORD requestID, DWORD objectID) bool CSimulatorFsx::setSimConnectObjectId(DWORD requestID, DWORD objectID)
{ {
return this->m_simConnectObjects.setSimConnectObjectId(static_cast<int>(requestID), static_cast<int>(objectID)); return this->m_simConnectObjects.setSimConnectObjectIdForRequestId(requestID, objectID);
} }
void CSimulatorFsx::timerEvent(QTimerEvent *event) void CSimulatorFsx::timerEvent(QTimerEvent *event)

View File

@@ -124,7 +124,7 @@ namespace BlackSimPlugin
const CSimConnectObjects &getSimConnectObjects() const { return m_simConnectObjects; } const CSimConnectObjects &getSimConnectObjects() const { return m_simConnectObjects; }
protected: protected:
//! \name Interface overrides //! \name Interface implementations
//! @{ //! @{
virtual bool isConnected() const override; virtual bool isConnected() const override;
virtual bool isSimulating() const override; virtual bool isSimulating() const override;
@@ -134,7 +134,7 @@ namespace BlackSimPlugin
//! @{ //! @{
virtual void reset() override; virtual void reset() override;
virtual void clearAllAircraft() override; virtual void clearAllAircraft() override;
virtual void initInternalsObject(); virtual void initInternalsObject() override;
//! @} //! @}
//! Timer event (our SimConnect event loop), runs ps_dispatch //! Timer event (our SimConnect event loop), runs ps_dispatch
@@ -216,9 +216,9 @@ namespace BlackSimPlugin
int m_skipCockpitUpdateCycles = 0; //!< Skip some update cycles to allow changes in simulator cockpit to be set int m_skipCockpitUpdateCycles = 0; //!< Skip some update cycles to allow changes in simulator cockpit to be set
int m_interpolationRequest = 0; //!< current interpolation request int m_interpolationRequest = 0; //!< current interpolation request
int m_interpolationsSkipped = 0; //!< number of skipped interpolation request int m_interpolationsSkipped = 0; //!< number of skipped interpolation request
int m_requestId = 1; //!< request id
int m_dispatchErrors = 0; //!< number of dispatched failed, \sa ps_dispatch int m_dispatchErrors = 0; //!< number of dispatched failed, \sa ps_dispatch
int m_receiveExceptionCount = 0; //!< exceptions int m_receiveExceptionCount = 0; //!< exceptions
DWORD m_requestId = 1; //!< request id
HANDLE m_hSimConnect = nullptr; //!< Handle to SimConnect object HANDLE m_hSimConnect = nullptr; //!< Handle to SimConnect object
CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids CSimConnectObjects m_simConnectObjects; //!< AI objects and their object / request ids
BlackMisc::Simulation::CSimulatedAircraftList m_outOfRealityBubble; //!< aircraft removed by FSX because they are out of reality bubble BlackMisc::Simulation::CSimulatedAircraftList m_outOfRealityBubble; //!< aircraft removed by FSX because they are out of reality bubble