mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-08 03:35:35 +08:00
refs #291, getAirportsInRange for simulator, simulator context
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#include "blacksim/simulatorinfolist.h"
|
#include "blacksim/simulatorinfolist.h"
|
||||||
#include "blackmisc/nwaircraftmodel.h"
|
#include "blackmisc/nwaircraftmodel.h"
|
||||||
#include "blackmisc/avaircraft.h"
|
#include "blackmisc/avaircraft.h"
|
||||||
|
#include "blackmisc/avairportlist.h"
|
||||||
#include "blackmisc/project.h"
|
#include "blackmisc/project.h"
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
@@ -81,6 +82,9 @@ namespace BlackCore
|
|||||||
//! Simulator info
|
//! Simulator info
|
||||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0;
|
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0;
|
||||||
|
|
||||||
|
//! Airports in range
|
||||||
|
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0;
|
||||||
|
|
||||||
//! Aircraft model
|
//! Aircraft model
|
||||||
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0;
|
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -93,12 +93,20 @@ namespace BlackCore
|
|||||||
Network::CAircraftModel CContextSimulator::getOwnAircraftModel() const
|
Network::CAircraftModel CContextSimulator::getOwnAircraftModel() const
|
||||||
{
|
{
|
||||||
// If no ISimulator object is available, return a dummy.
|
// If no ISimulator object is available, return a dummy.
|
||||||
if (!m_simulator)
|
if (!m_simulator) { return Network::CAircraftModel(); }
|
||||||
return Network::CAircraftModel();
|
|
||||||
|
|
||||||
return this->m_simulator->getAircraftModel();
|
return this->m_simulator->getAircraftModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAirportList CContextSimulator::getAirportsInRange() const
|
||||||
|
{
|
||||||
|
// If no ISimulator object is available, return a dummy.
|
||||||
|
if (!m_simulator) { return CAirportList(); }
|
||||||
|
|
||||||
|
return this->m_simulator->getAirportsInRange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo)
|
bool CContextSimulator::loadSimulatorPlugin(const CSimulatorInfo &simulatorInfo)
|
||||||
{
|
{
|
||||||
if (this->m_simulator && this->m_simulator->getSimulatorInfo() == simulatorInfo) { return true; } // already loaded
|
if (this->m_simulator && this->m_simulator->getSimulatorInfo() == simulatorInfo) { return true; } // already loaded
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ namespace BlackCore
|
|||||||
//! \copydoc IContextSimulator::getAircraftModel()
|
//! \copydoc IContextSimulator::getAircraftModel()
|
||||||
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override;
|
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override;
|
||||||
|
|
||||||
|
//! \copydoc IContextSimulator::getAirportsInRange()
|
||||||
|
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||||
|
|
||||||
//! \copydoc IContextSimulator::loadSimulatorPlugin()
|
//! \copydoc IContextSimulator::loadSimulatorPlugin()
|
||||||
virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override;
|
virtual bool loadSimulatorPlugin(const BlackSim::CSimulatorInfo &simulatorInfo) override;
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,11 @@ namespace BlackCore
|
|||||||
return m_dBusInterface->callDBusRet<BlackMisc::Network::CAircraftModel>(QLatin1Literal("getOwnAircraftModel"));
|
return m_dBusInterface->callDBusRet<BlackMisc::Network::CAircraftModel>(QLatin1Literal("getOwnAircraftModel"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAirportList CContextSimulatorProxy::getAirportsInRange() const
|
||||||
|
{
|
||||||
|
return m_dBusInterface->callDBusRet<BlackMisc::Aviation::CAirportList>(QLatin1Literal("getAirportsInRange"));
|
||||||
|
}
|
||||||
|
|
||||||
BlackSim::CSimulatorInfo CContextSimulatorProxy::getSimulatorInfo() const
|
BlackSim::CSimulatorInfo CContextSimulatorProxy::getSimulatorInfo() const
|
||||||
{
|
{
|
||||||
return m_dBusInterface->callDBusRet<BlackSim::CSimulatorInfo>(QLatin1Literal("getSimulatorInfo"));
|
return m_dBusInterface->callDBusRet<BlackSim::CSimulatorInfo>(QLatin1Literal("getSimulatorInfo"));
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ namespace BlackCore
|
|||||||
//! \copydoc IContextSimulator::getAircraftModel()
|
//! \copydoc IContextSimulator::getAircraftModel()
|
||||||
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override;
|
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override;
|
||||||
|
|
||||||
|
//! \copydoc IContextSimulator::getAirportsInRange()
|
||||||
|
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||||
|
|
||||||
//! \copydoc IContextSimulator::getSimulatorInfo
|
//! \copydoc IContextSimulator::getSimulatorInfo
|
||||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
|
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "blacksim/simulatorinfo.h"
|
#include "blacksim/simulatorinfo.h"
|
||||||
#include "blackmisc/statusmessage.h"
|
#include "blackmisc/statusmessage.h"
|
||||||
#include "blackmisc/avaircraft.h"
|
#include "blackmisc/avaircraft.h"
|
||||||
|
#include "blackmisc/avairportlist.h"
|
||||||
#include "blackmisc/nwaircraftmodel.h"
|
#include "blackmisc/nwaircraftmodel.h"
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
@@ -84,6 +85,10 @@ namespace BlackCore
|
|||||||
//! Aircraft Model
|
//! Aircraft Model
|
||||||
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const = 0;
|
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const = 0;
|
||||||
|
|
||||||
|
//! Airports in range
|
||||||
|
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0;
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
//! Emitted when the connection status has changed
|
//! Emitted when the connection status has changed
|
||||||
void statusChanged(ISimulator::Status status);
|
void statusChanged(ISimulator::Status status);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "blacksim/fsx/fsxsimulatorsetup.h"
|
#include "blacksim/fsx/fsxsimulatorsetup.h"
|
||||||
#include "blacksim/simulatorinfo.h"
|
#include "blacksim/simulatorinfo.h"
|
||||||
#include "blackmisc/project.h"
|
#include "blackmisc/project.h"
|
||||||
|
#include "blackmisc/avairportlist.h"
|
||||||
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QtConcurrent>
|
#include <QtConcurrent>
|
||||||
@@ -278,10 +279,14 @@ namespace BlackSimPlugin
|
|||||||
Q_UNUSED(hr);
|
Q_UNUSED(hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CAirportList CSimulatorFsx::getAirportsInRange() const
|
||||||
|
{
|
||||||
|
return this->m_airportsInRange;
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
switch (pData->dwID)
|
switch (pData->dwID)
|
||||||
{
|
{
|
||||||
case SIMCONNECT_RECV_ID_OPEN:
|
case SIMCONNECT_RECV_ID_OPEN:
|
||||||
@@ -370,8 +375,30 @@ namespace BlackSimPlugin
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
case SIMCONNECT_RECV_ID_AIRPORT_LIST:
|
||||||
}
|
{
|
||||||
|
SIMCONNECT_RECV_AIRPORT_LIST *pAirportList = (SIMCONNECT_RECV_AIRPORT_LIST *) pData;
|
||||||
|
for (unsigned i = 0; i < pAirportList->dwArraySize; ++i)
|
||||||
|
{
|
||||||
|
SIMCONNECT_DATA_FACILITY_AIRPORT *pFacilityAirport = pAirportList->rgData + i;
|
||||||
|
if (!pFacilityAirport) break;
|
||||||
|
const QString icao(pFacilityAirport->Icao);
|
||||||
|
if (icao.isEmpty()) continue; // airfield without ICAO code
|
||||||
|
CCoordinateGeodetic pos(pFacilityAirport->Latitude, pFacilityAirport->Longitude, pFacilityAirport->Altitude);
|
||||||
|
CAirport airport(CAirportIcao(icao), pos);
|
||||||
|
const CCoordinateGeodetic posAircraft = simulatorFsx->getOwnAircraft().getPosition();
|
||||||
|
airport.calculcateDistanceToPlane(posAircraft);
|
||||||
|
simulatorFsx->m_airportsInRange.replaceOrAddByIcao(airport);
|
||||||
|
if (simulatorFsx->m_airportsInRange.size() > 20)
|
||||||
|
{
|
||||||
|
const CLength maxDistance(200.0, CLengthUnit::NM());
|
||||||
|
simulatorFsx->m_airportsInRange.removeIfOutsideRange(posAircraft, maxDistance, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} // switch
|
||||||
|
} // method
|
||||||
|
|
||||||
void CSimulatorFsx::onSimRunning()
|
void CSimulatorFsx::onSimRunning()
|
||||||
{
|
{
|
||||||
@@ -520,6 +547,9 @@ namespace BlackSimPlugin
|
|||||||
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetCom2Active, "COM2_RADIO_SET");
|
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetCom2Active, "COM2_RADIO_SET");
|
||||||
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetCom2Standby, "COM2_STBY_RADIO_SET");
|
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetCom2Standby, "COM2_STBY_RADIO_SET");
|
||||||
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTransponderCode, "XPNDR_SET");
|
hr += SimConnect_MapClientEventToSimEvent(m_hSimConnect, EventSetTransponderCode, "XPNDR_SET");
|
||||||
|
|
||||||
|
// facility
|
||||||
|
hr = SimConnect_SubscribeToFacilities(m_hSimConnect, SIMCONNECT_FACILITY_LIST_TYPE_AIRPORT, m_nextObjID++);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "blackcore/simulator.h"
|
#include "blackcore/simulator.h"
|
||||||
#include "blackcore/interpolator_linear.h"
|
#include "blackcore/interpolator_linear.h"
|
||||||
#include "blackmisc/avaircraft.h"
|
#include "blackmisc/avaircraft.h"
|
||||||
|
#include "blackmisc/avairportlist.h"
|
||||||
#include "blackmisc/statusmessage.h"
|
#include "blackmisc/statusmessage.h"
|
||||||
#include "blackmisc/nwaircraftmodel.h"
|
#include "blackmisc/nwaircraftmodel.h"
|
||||||
#include "blacksim/simulatorinfo.h"
|
#include "blacksim/simulatorinfo.h"
|
||||||
@@ -125,6 +126,10 @@ namespace BlackSimPlugin
|
|||||||
//! \copydoc ISimulator::getAircraftModel()
|
//! \copydoc ISimulator::getAircraftModel()
|
||||||
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override { return m_aircraftModel; }
|
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override { return m_aircraftModel; }
|
||||||
|
|
||||||
|
//! \copydoc ISimulator::getAirportsInRange
|
||||||
|
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||||
|
|
||||||
|
|
||||||
//! \brief Called when sim has started
|
//! \brief Called when sim has started
|
||||||
void onSimRunning();
|
void onSimRunning();
|
||||||
|
|
||||||
@@ -180,12 +185,13 @@ namespace BlackSimPlugin
|
|||||||
bool m_isConnected; //!< Is simulator connected?
|
bool m_isConnected; //!< Is simulator connected?
|
||||||
bool m_simRunning; //!< Simulator running?
|
bool m_simRunning; //!< Simulator running?
|
||||||
HANDLE m_hSimConnect; //!< Handle to SimConnect object
|
HANDLE m_hSimConnect; //!< Handle to SimConnect object
|
||||||
uint m_nextObjID;
|
uint m_nextObjID; //!< object ID TODO: also used as request id, where to we place other request ids as for facilities
|
||||||
QString simulatorDetails;
|
QString simulatorDetails;
|
||||||
BlackSim::CSimulatorInfo m_simulatorInfo;
|
BlackSim::CSimulatorInfo m_simulatorInfo;
|
||||||
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, CSimConnectObject> m_simConnectObjects;
|
QHash<BlackMisc::Aviation::CCallsign, CSimConnectObject> m_simConnectObjects;
|
||||||
BlackMisc::Network::CAircraftModel m_aircraftModel;
|
BlackMisc::Network::CAircraftModel m_aircraftModel;
|
||||||
|
BlackMisc::Aviation::CAirportList m_airportsInRange;
|
||||||
|
|
||||||
int m_simconnectTimerId;
|
int m_simconnectTimerId;
|
||||||
int m_skipCockpitUpdateCycles; //!< Skip some update cycles to allow changes in simulator cockpit to be set
|
int m_skipCockpitUpdateCycles; //!< Skip some update cycles to allow changes in simulator cockpit to be set
|
||||||
|
|||||||
@@ -202,6 +202,13 @@ namespace BlackSimPlugin
|
|||||||
return { m_xplaneData.aircraftModelPath, true };
|
return { m_xplaneData.aircraftModelPath, true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BlackMisc::Aviation::CAirportList CSimulatorXPlane::getAirportsInRange() const
|
||||||
|
{
|
||||||
|
// TODO: Fill with airports nearby from sim
|
||||||
|
BlackMisc::Aviation::CAirportList airports;
|
||||||
|
return airports;
|
||||||
|
}
|
||||||
|
|
||||||
bool CSimulatorXPlane::updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft)
|
bool CSimulatorXPlane::updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft)
|
||||||
{
|
{
|
||||||
if (! isConnected()) { return false; }
|
if (! isConnected()) { return false; }
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ namespace BlackSimPlugin
|
|||||||
//! \copydoc BlackCore::ISimulator::getAircraftModel
|
//! \copydoc BlackCore::ISimulator::getAircraftModel
|
||||||
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override;
|
virtual BlackMisc::Network::CAircraftModel getAircraftModel() const override;
|
||||||
|
|
||||||
|
//! Airports in range
|
||||||
|
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void serviceRegistered(const QString &serviceName);
|
void serviceRegistered(const QString &serviceName);
|
||||||
void serviceUnregistered();
|
void serviceUnregistered();
|
||||||
|
|||||||
Reference in New Issue
Block a user