mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-15 01:05:35 +08:00
Add methods to add and remove remote aircrafts/situations
Extend gear to 100 % by default. Aircraft is default B737 refs #186
This commit is contained in:
@@ -20,7 +20,8 @@ namespace BlackCore
|
|||||||
ISimulator(parent),
|
ISimulator(parent),
|
||||||
m_isConnected(false),
|
m_isConnected(false),
|
||||||
m_simRunning(false),
|
m_simRunning(false),
|
||||||
m_hSimConnect(nullptr)
|
m_hSimConnect(nullptr),
|
||||||
|
m_nextObjID(1)
|
||||||
{
|
{
|
||||||
QTimer::singleShot(5000, this, SLOT(checkConnection()));
|
QTimer::singleShot(5000, this, SLOT(checkConnection()));
|
||||||
}
|
}
|
||||||
@@ -30,6 +31,50 @@ namespace BlackCore
|
|||||||
return m_isConnected;
|
return m_isConnected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSimulatorFSX::addRemoteAircraft(const CCallsign &callsign, const QString &type, const CAircraftSituation &initialSituation)
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
Q_UNUSED(type);
|
||||||
|
|
||||||
|
SIMCONNECT_DATA_INITPOSITION initialPosition;
|
||||||
|
initialPosition.Latitude = initialSituation.latitude().value();
|
||||||
|
initialPosition.Longitude = initialSituation.longitude().value();
|
||||||
|
initialPosition.Altitude = initialSituation.getAltitude().value();
|
||||||
|
initialPosition.Pitch = initialSituation.getPitch().value();
|
||||||
|
initialPosition.Bank = initialSituation.getBank().value();
|
||||||
|
initialPosition.Heading = initialSituation.getHeading().value();
|
||||||
|
initialPosition.Airspeed = 0;
|
||||||
|
initialPosition.OnGround = 0;
|
||||||
|
|
||||||
|
SimConnectObject simObj;
|
||||||
|
simObj.m_callsign = callsign;
|
||||||
|
simObj.m_requestId = m_nextObjID;
|
||||||
|
simObj.m_objectId = 0;
|
||||||
|
simObj.m_interpolator.addAircraftSituation(initialSituation);
|
||||||
|
m_simConnectObjects.insert(callsign, simObj);
|
||||||
|
++m_nextObjID;
|
||||||
|
|
||||||
|
hr = SimConnect_AICreateNonATCAircraft(m_hSimConnect, "Boeing 737-800 Paint1", callsign.toQString().left(12).toLatin1().constData(), initialPosition, simObj.m_requestId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimulatorFSX::addAircraftSituation(const CCallsign &callsign, const CAircraftSituation & situation)
|
||||||
|
{
|
||||||
|
if (!m_simConnectObjects.contains(callsign))
|
||||||
|
{
|
||||||
|
addRemoteAircraft(callsign, "Boeing 737-800 Paint1", situation);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SimConnectObject simObj = m_simConnectObjects.value(callsign);
|
||||||
|
simObj.m_interpolator.addAircraftSituation(situation);
|
||||||
|
m_simConnectObjects.insert(callsign, simObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimulatorFSX::removeRemoteAircraft(const CCallsign &callsign)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
void CALLBACK CSimulatorFSX::SimConnectProc(SIMCONNECT_RECV* pData, DWORD /* cbData */, void *pContext)
|
void CALLBACK CSimulatorFSX::SimConnectProc(SIMCONNECT_RECV* pData, DWORD /* cbData */, void *pContext)
|
||||||
{
|
{
|
||||||
CSimulatorFSX *simulatorFsx = static_cast<CSimulatorFSX*>(pContext);
|
CSimulatorFSX *simulatorFsx = static_cast<CSimulatorFSX*>(pContext);
|
||||||
@@ -94,8 +139,8 @@ namespace BlackCore
|
|||||||
switch(pObjData->dwRequestID)
|
switch(pObjData->dwRequestID)
|
||||||
{
|
{
|
||||||
case CSimConnectDataDefinition::RequestOwnAircraft:
|
case CSimConnectDataDefinition::RequestOwnAircraft:
|
||||||
OwnAircraft *ownAircaft;
|
DataDefinitionOwnAircraft *ownAircaft;
|
||||||
ownAircaft = (OwnAircraft*)&pObjData->dwData;
|
ownAircaft = (DataDefinitionOwnAircraft*)&pObjData->dwData;
|
||||||
simulatorFsx->setOwnAircraft(*ownAircaft);
|
simulatorFsx->setOwnAircraft(*ownAircaft);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -127,7 +172,7 @@ namespace BlackCore
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSimulatorFSX::setOwnAircraft(OwnAircraft aircraft)
|
void CSimulatorFSX::setOwnAircraft(DataDefinitionOwnAircraft aircraft)
|
||||||
{
|
{
|
||||||
BlackMisc::Geo::CCoordinateGeodetic position;
|
BlackMisc::Geo::CCoordinateGeodetic position;
|
||||||
position.setLatitude(CLatitude(aircraft.latitude, CAngleUnit::deg()));
|
position.setLatitude(CLatitude(aircraft.latitude, CAngleUnit::deg()));
|
||||||
@@ -157,14 +202,41 @@ namespace BlackCore
|
|||||||
m_ownAircraft.setTransponder(transponder);
|
m_ownAircraft.setTransponder(transponder);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSimulatorFSX::setSimconnectObjectID(DWORD /* requestID */, DWORD /* objectID */)
|
void CSimulatorFSX::setSimconnectObjectID(DWORD requestID, DWORD objectID)
|
||||||
{
|
{
|
||||||
|
SimConnect_AIReleaseControl(m_hSimConnect, objectID, requestID);
|
||||||
|
SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EVENT_FREEZELAT, 1,
|
||||||
|
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
|
||||||
|
SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EVENT_FREEZEALT, 1,
|
||||||
|
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
|
||||||
|
SimConnect_TransmitClientEvent(m_hSimConnect, objectID, EVENT_FREEZEATT, 1,
|
||||||
|
SIMCONNECT_GROUP_PRIORITY_HIGHEST, SIMCONNECT_EVENT_FLAG_GROUPID_IS_PRIORITY);
|
||||||
|
|
||||||
|
DataDefinitionAircraftConfiguration configuration;
|
||||||
|
configuration.gearCenter = 100.0;
|
||||||
|
configuration.gearLeft = 100.0;
|
||||||
|
configuration.gearRight = 100.0;
|
||||||
|
configuration.gearTail = 100.0;
|
||||||
|
configuration.gearAux = 100.0;
|
||||||
|
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataAircraftConfiguration, simObj.m_objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(DataDefinitionAircraftConfiguration), &configuration);
|
||||||
|
|
||||||
|
SimConnectObject simObject;
|
||||||
|
foreach (simObject, m_simConnectObjects)
|
||||||
|
{
|
||||||
|
if (simObject.m_requestId == requestID)
|
||||||
|
{
|
||||||
|
simObject.m_objectId = objectID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_simConnectObjects.insert(simObject.m_callsign, simObject);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSimulatorFSX::timerEvent(QTimerEvent* /* event */)
|
void CSimulatorFSX::timerEvent(QTimerEvent* /* event */)
|
||||||
{
|
{
|
||||||
dispatch();
|
dispatch();
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSimulatorFSX::checkConnection()
|
void CSimulatorFSX::checkConnection()
|
||||||
@@ -195,6 +267,9 @@ namespace BlackCore
|
|||||||
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EVENT_SIM_STATUS, "Sim");
|
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EVENT_SIM_STATUS, "Sim");
|
||||||
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EVENT_OBJECT_ADDED, "ObjectAdded");
|
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EVENT_OBJECT_ADDED, "ObjectAdded");
|
||||||
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EVENT_OBJECT_REMOVED, "ObjectRemoved");
|
hr += SimConnect_SubscribeToSystemEvent(m_hSimConnect, EVENT_OBJECT_REMOVED, "ObjectRemoved");
|
||||||
|
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EVENT_FREEZELAT, "FREEZE_LATITUDE_LONGITUDE_SET");
|
||||||
|
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EVENT_FREEZEALT, "FREEZE_ALTITUDE_SET");
|
||||||
|
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EVENT_FREEZEATT, "FREEZE_ATTITUDE_SET");
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
@@ -203,5 +278,36 @@ namespace BlackCore
|
|||||||
{
|
{
|
||||||
return CSimConnectDataDefinition::initDataDefinitions(m_hSimConnect);
|
return CSimConnectDataDefinition::initDataDefinitions(m_hSimConnect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSimulatorFSX::update()
|
||||||
|
{
|
||||||
|
foreach (SimConnectObject simObj, m_simConnectObjects)
|
||||||
|
{
|
||||||
|
if (simObj.m_interpolator.hasEnoughAircraftSituations())
|
||||||
|
{
|
||||||
|
DataDefinitionAircraftPosition position;
|
||||||
|
CAircraftSituation situation = simObj.m_interpolator.getCurrentSituation();
|
||||||
|
position.latitude = situation.latitude().value();
|
||||||
|
position.longitude = situation.longitude().value();
|
||||||
|
position.altitude = situation.getAltitude().value(CLengthUnit::ft());
|
||||||
|
position.pitch = situation.getPitch().value();
|
||||||
|
position.bank = situation.getBank().value();
|
||||||
|
position.trueHeading = situation.getHeading().value(CAngleUnit::deg());
|
||||||
|
|
||||||
|
DataDefinitionAircraftConfiguration configuration;
|
||||||
|
configuration.gearCenter = 100.0;
|
||||||
|
configuration.gearLeft = 100.0;
|
||||||
|
configuration.gearRight = 100.0;
|
||||||
|
configuration.gearTail = 100.0;
|
||||||
|
configuration.gearAux = 100.0;
|
||||||
|
|
||||||
|
if (simObj.m_objectId != 0)
|
||||||
|
{
|
||||||
|
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataAircraftPosition, simObj.m_objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(DataDefinitionAircraftPosition), &position);
|
||||||
|
SimConnect_SetDataOnSimObject(m_hSimConnect, CSimConnectDataDefinition::DataAircraftConfiguration, simObj.m_objectId, SIMCONNECT_DATA_SET_FLAG_DEFAULT, 0, sizeof(DataDefinitionAircraftConfiguration), &configuration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,11 +6,17 @@
|
|||||||
#ifndef BLACKCORE_SIMULATOR_FSX_H
|
#ifndef BLACKCORE_SIMULATOR_FSX_H
|
||||||
#define BLACKCORE_SIMULATOR_FSX_H
|
#define BLACKCORE_SIMULATOR_FSX_H
|
||||||
|
|
||||||
#include <blackcore/simulator.h>
|
#define NOMINMAX
|
||||||
|
|
||||||
#include "simconnect_datadefinition.h"
|
#include "simconnect_datadefinition.h"
|
||||||
|
|
||||||
|
#include "blackcore/simulator.h"
|
||||||
|
#include "blackcore/interpolator_linear.h"
|
||||||
#include "blackmisc/avaircraft.h"
|
#include "blackmisc/avaircraft.h"
|
||||||
|
#include <simconnect/SimConnect.h>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include "simconnect/SimConnect.h"
|
#include <QHash>
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
namespace BlackCore
|
namespace BlackCore
|
||||||
@@ -43,6 +49,15 @@ namespace BlackCore
|
|||||||
//! \copydoc ISimulator::getOwnAircraft()
|
//! \copydoc ISimulator::getOwnAircraft()
|
||||||
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override { return m_ownAircraft; }
|
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override { return m_ownAircraft; }
|
||||||
|
|
||||||
|
//! \copydoc ISimulator::addRemoteAircraft()
|
||||||
|
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;
|
||||||
|
|
||||||
|
//! \copydoc ISimulator::addAircraftSituation()
|
||||||
|
virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;
|
||||||
|
|
||||||
|
//! \copydoc ISimulator::removeRemoteAircraft()
|
||||||
|
virtual void removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief SimConnect Callback
|
* \brief SimConnect Callback
|
||||||
* \param pData
|
* \param pData
|
||||||
@@ -64,7 +79,7 @@ namespace BlackCore
|
|||||||
* \brief Called when data about our own aircraft is received
|
* \brief Called when data about our own aircraft is received
|
||||||
* \param aircraft
|
* \param aircraft
|
||||||
*/
|
*/
|
||||||
void setOwnAircraft(OwnAircraft aircraft);
|
void setOwnAircraft(DataDefinitionOwnAircraft aircraft);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Set ID of a SimConnect object
|
* \brief Set ID of a SimConnect object
|
||||||
@@ -89,6 +104,14 @@ namespace BlackCore
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
struct SimConnectObject
|
||||||
|
{
|
||||||
|
BlackMisc::Aviation::CCallsign m_callsign;
|
||||||
|
BlackCore::CInterpolatorLinear m_interpolator;
|
||||||
|
int m_requestId;
|
||||||
|
int m_objectId;
|
||||||
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Initialize SimConnect system events
|
* \brief Initialize SimConnect system events
|
||||||
* \return
|
* \return
|
||||||
@@ -101,12 +124,17 @@ namespace BlackCore
|
|||||||
*/
|
*/
|
||||||
HRESULT initDataDefinitions();
|
HRESULT initDataDefinitions();
|
||||||
|
|
||||||
|
void update();
|
||||||
|
|
||||||
bool m_isConnected; //!< Is sim connected
|
bool m_isConnected; //!< Is sim connected
|
||||||
bool m_simRunning; //!< Sim running.
|
bool m_simRunning; //!< Sim running.
|
||||||
HANDLE m_hSimConnect; //!< Handle to SimConnect object
|
HANDLE m_hSimConnect; //!< Handle to SimConnect object
|
||||||
|
uint m_nextObjID;
|
||||||
|
|
||||||
BlackMisc::Aviation::CAircraft m_ownAircraft; //!< Object representing our own aircraft from simulator
|
BlackMisc::Aviation::CAircraft m_ownAircraft; //!< Object representing our own aircraft from simulator
|
||||||
|
|
||||||
|
QHash<BlackMisc::Aviation::CCallsign, SimConnectObject> m_simConnectObjects;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,27 @@ namespace BlackCore
|
|||||||
*/
|
*/
|
||||||
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0;
|
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Add new remote aircraft to the simulator
|
||||||
|
* \param callsign
|
||||||
|
* \param type
|
||||||
|
* \param initialSituation
|
||||||
|
*/
|
||||||
|
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, const BlackMisc::Aviation::CAircraftSituation &initialSituation) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Add new aircraft situation
|
||||||
|
* \param callsign
|
||||||
|
* \param initialSituation
|
||||||
|
*/
|
||||||
|
virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Remove remote aircraft from simulator
|
||||||
|
* \param callsign
|
||||||
|
*/
|
||||||
|
virtual void removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
//! \brief Emitted when the connection status has changed
|
//! \brief Emitted when the connection status has changed
|
||||||
void connectionChanged(bool value);
|
void connectionChanged(bool value);
|
||||||
|
|||||||
Reference in New Issue
Block a user