mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-03 15:45:46 +08:00
refs #369, adjusted contexts to use own aircraft provider
* removed unused functions / signals * removed no longer used members / update timers * Pass provider to contructors * no direct access to monitor in other contexts
This commit is contained in:
@@ -26,8 +26,8 @@ using namespace BlackMisc::PhysicalQuantities;
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
CAirspaceMonitor::CAirspaceMonitor(QObject *parent, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile)
|
||||
: QObject(parent), m_network(network), m_vatsimBookingReader(bookings), m_vatsimDataFileReader(dataFile),
|
||||
CAirspaceMonitor::CAirspaceMonitor(QObject *parent, const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraft, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile)
|
||||
: QObject(parent), COwnAircraftProviderSupportReadOnly(ownAircraft), m_network(network), m_vatsimBookingReader(bookings), m_vatsimDataFileReader(dataFile),
|
||||
m_atcWatchdog(this), m_aircraftWatchdog(this)
|
||||
{
|
||||
this->connect(this->m_network, &INetwork::atcPositionUpdate, this, &CAirspaceMonitor::ps_atcPositionUpdate);
|
||||
@@ -52,7 +52,7 @@ namespace BlackCore
|
||||
|
||||
// Watchdog
|
||||
// ATC stations send updates every 25 s. Configure timeout after 50 s.
|
||||
m_atcWatchdog.setTimeout(CTime(50, CTimeUnit::s()));
|
||||
this->m_atcWatchdog.setTimeout(CTime(50, CTimeUnit::s()));
|
||||
this->connect(&this->m_aircraftWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_pilotDisconnected);
|
||||
this->connect(&this->m_atcWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_atcControllerDisconnected);
|
||||
}
|
||||
@@ -108,11 +108,10 @@ namespace BlackCore
|
||||
CCallsignList searchList(callsigns);
|
||||
|
||||
// myself, which is not in the lists below
|
||||
CAircraft ownAircraft = this->m_ownAircraft;
|
||||
if (!ownAircraft.getCallsign().isEmpty() && searchList.contains(ownAircraft.getCallsign()))
|
||||
if (!ownAircraft().getCallsign().isEmpty() && searchList.contains(ownAircraft().getCallsign()))
|
||||
{
|
||||
searchList.remove(ownAircraft.getCallsign());
|
||||
users.push_back(ownAircraft.getPilot());
|
||||
searchList.remove(ownAircraft().getCallsign());
|
||||
users.push_back(ownAircraft().getPilot());
|
||||
}
|
||||
|
||||
// do aircraft first, this will handle most callsigns
|
||||
@@ -209,6 +208,12 @@ namespace BlackCore
|
||||
return station;
|
||||
}
|
||||
|
||||
CAircraftSituationList CAirspaceMonitor::getAircraftSituations(const CCallsign &callsign) const
|
||||
{
|
||||
if (callsign.isEmpty()) { return this->m_aircraftSituations; }
|
||||
return this->m_aircraftSituations.findByCallsign(callsign);
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::requestDataUpdates()
|
||||
{
|
||||
if (!this->m_network->isConnected()) return;
|
||||
@@ -354,18 +359,16 @@ namespace BlackCore
|
||||
|
||||
void CAirspaceMonitor::sendFsipiCustomPacket(const CCallsign &recipientCallsign) const
|
||||
{
|
||||
CAircraft me = this->m_ownAircraft;
|
||||
CAircraftIcao icao = me.getIcaoInfo();
|
||||
QString modelString = this->m_ownAircraftModel.getModelString();
|
||||
CAircraftIcao icao = ownAircraft().getIcaoInfo();
|
||||
QString modelString = ownAircraft().getModel().getModelString();
|
||||
if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); }
|
||||
this->m_network->sendFsipiCustomPacket(recipientCallsign, icao.getAirlineDesignator(), icao.getAircraftDesignator(), icao.getAircraftCombinedType(), modelString);
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::sendFsipirCustomPacket(const CCallsign &recipientCallsign) const
|
||||
{
|
||||
CAircraft me = this->m_ownAircraft;
|
||||
CAircraftIcao icao = me.getIcaoInfo();
|
||||
QString modelString = this->m_ownAircraftModel.getModelString();
|
||||
CAircraftIcao icao = ownAircraft().getIcaoInfo();
|
||||
QString modelString = ownAircraft().getModel().getModelString();
|
||||
if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); }
|
||||
this->m_network->sendFsipirCustomPacket(recipientCallsign, icao.getAirlineDesignator(), icao.getAircraftDesignator(), icao.getAircraftCombinedType(), modelString);
|
||||
}
|
||||
@@ -394,6 +397,7 @@ namespace BlackCore
|
||||
{
|
||||
emit removedAircraft(aircraft.getCallsign());
|
||||
}
|
||||
m_aircraftSituations.clear();
|
||||
m_aircraftInRange.clear();
|
||||
m_flightPlanCache.clear();
|
||||
m_icaoCodeCache.clear();
|
||||
@@ -488,7 +492,7 @@ namespace BlackCore
|
||||
station.setFrequency(frequency);
|
||||
station.setPosition(position);
|
||||
station.setOnline(true);
|
||||
station.calculcateDistanceAndBearingToOwnAircraft(this->m_ownAircraft.getPosition());
|
||||
station.calculcateDistanceAndBearingToOwnAircraft(ownAircraft().getPosition());
|
||||
this->m_vatsimDataFileReader->getAtcStations().updateFromVatsimDataFileStation(station); // prefill
|
||||
this->m_atcStationsOnline.push_back(station);
|
||||
|
||||
@@ -612,6 +616,7 @@ namespace BlackCore
|
||||
vm = CPropertyIndexVariantMap(CAircraft::IndexIcao, icaoDataFromDataFile.toCVariant());
|
||||
}
|
||||
// ICAO code received when aircraft is already removed or not yet ready
|
||||
// We add it to cache and use it when aircraft is created
|
||||
if (!this->m_aircraftInRange.containsCallsign(callsign))
|
||||
{
|
||||
this->m_icaoCodeCache.insert(callsign, icaoData);
|
||||
@@ -620,12 +625,19 @@ namespace BlackCore
|
||||
|
||||
// update
|
||||
int c = this->m_aircraftInRange.applyIfCallsign(callsign, vm);
|
||||
if (c > 0) {ps_sendReadyForModelMatching(callsign, 1); }
|
||||
if (c > 0) { ps_sendReadyForModelMatching(callsign, 1); }
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_aircraftUpdateReceived(const CCallsign &callsign, const CAircraftSituation &situation, const CTransponder &transponder)
|
||||
{
|
||||
Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this));
|
||||
|
||||
// store situation history
|
||||
CAircraftSituation situationWithCallsign(situation);
|
||||
situationWithCallsign.setCallsign(callsign);
|
||||
this->m_aircraftSituations.insert(situationWithCallsign);
|
||||
this->m_aircraftSituations.removeOlderThanNowMinusOffset(30000);
|
||||
|
||||
bool exists = this->m_aircraftInRange.containsCallsign(callsign);
|
||||
if (!exists)
|
||||
{
|
||||
@@ -634,7 +646,7 @@ namespace BlackCore
|
||||
aircraft.setCallsign(callsign);
|
||||
aircraft.setSituation(situation);
|
||||
aircraft.setTransponder(transponder);
|
||||
aircraft.calculcateDistanceAndBearingToOwnAircraft(this->m_ownAircraft.getPosition()); // distance from myself
|
||||
aircraft.calculcateDistanceAndBearingToOwnAircraft(ownAircraft().getPosition()); // distance from myself
|
||||
|
||||
// ICAO from cache if avialable
|
||||
bool setIcao = false;
|
||||
@@ -647,6 +659,8 @@ namespace BlackCore
|
||||
}
|
||||
|
||||
this->m_vatsimDataFileReader->updateWithVatsimDataFileData(aircraft);
|
||||
|
||||
// only place where aircraft is added
|
||||
this->m_aircraftInRange.push_back(aircraft);
|
||||
|
||||
// new client, there is a chance it has been already created by custom packet
|
||||
@@ -683,7 +697,7 @@ namespace BlackCore
|
||||
else // not exists yet
|
||||
{
|
||||
// update
|
||||
CLength distance = this->m_ownAircraft.calculateGreatCircleDistance(situation.getPosition());
|
||||
CLength distance = ownAircraft().calculateGreatCircleDistance(situation.getPosition());
|
||||
distance.switchUnit(CLengthUnit::NM());
|
||||
CPropertyIndexVariantMap vm;
|
||||
vm.addValue(CAircraft::IndexTransponder, transponder);
|
||||
|
||||
@@ -15,10 +15,12 @@
|
||||
#include "blackmisc/simulation/simulatedaircraft.h"
|
||||
#include "blackmisc/avatcstationlist.h"
|
||||
#include "blackmisc/avaircraftlist.h"
|
||||
#include "blackmisc/avaircraftsituationlist.h"
|
||||
#include "blackmisc/nwclientlist.h"
|
||||
#include "blackmisc/avflightplan.h"
|
||||
#include "blackmisc/nwuserlist.h"
|
||||
#include "blackmisc/avcallsignlist.h"
|
||||
#include "blackmisc/simulation/simdirectaccessownaircraft.h"
|
||||
#include "network.h"
|
||||
#include "vatsimbookingreader.h"
|
||||
#include "vatsimdatafilereader.h"
|
||||
@@ -30,13 +32,13 @@ namespace BlackCore
|
||||
/*!
|
||||
* Keeps track of other entities in the airspace: aircraft, ATC stations, etc.
|
||||
*/
|
||||
class CAirspaceMonitor : public QObject
|
||||
class CAirspaceMonitor : public QObject, BlackMisc::Simulation::COwnAircraftProviderSupportReadOnly
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//! Constructor
|
||||
CAirspaceMonitor(QObject *parent, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile);
|
||||
CAirspaceMonitor(QObject *parent, const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraft, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile);
|
||||
|
||||
//! Returns the list of users we know about
|
||||
BlackMisc::Network::CUserList getUsers() const;
|
||||
@@ -69,6 +71,9 @@ namespace BlackCore
|
||||
//! Returns the closest ATC station operating on the given frequency, if any
|
||||
BlackMisc::Aviation::CAtcStation getAtcStationForComUnit(const BlackMisc::Aviation::CComSystem &comSystem);
|
||||
|
||||
//! Aircraft situations, empty callsign means all
|
||||
BlackMisc::Aviation::CAircraftSituationList getAircraftSituations(const BlackMisc::Aviation::CCallsign &callsign = {}) const;
|
||||
|
||||
//! Request to update other clients' data from the network
|
||||
void requestDataUpdates();
|
||||
|
||||
@@ -103,13 +108,6 @@ namespace BlackCore
|
||||
//! Read for model matching
|
||||
void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft);
|
||||
|
||||
public slots:
|
||||
//! Own aircraft updated
|
||||
void setOwnAircraft(const BlackMisc::Aviation::CAircraft &ownAircraft) { m_ownAircraft = ownAircraft; }
|
||||
|
||||
//! Own aircraft model updated
|
||||
void setOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model) { m_ownAircraftModel = model; }
|
||||
|
||||
public:
|
||||
//! Clear the contents
|
||||
void clear();
|
||||
@@ -118,21 +116,21 @@ namespace BlackCore
|
||||
BlackMisc::Aviation::CAtcStationList m_atcStationsOnline;
|
||||
BlackMisc::Aviation::CAtcStationList m_atcStationsBooked;
|
||||
BlackMisc::Aviation::CAircraftList m_aircraftInRange;
|
||||
BlackMisc::Aviation::CAircraftSituationList m_aircraftSituations;
|
||||
BlackMisc::Network::CClientList m_otherClients;
|
||||
|
||||
|
||||
QMap<BlackMisc::Aviation::CAirportIcao, BlackMisc::Aviation::CInformationMessage> m_metarCache;
|
||||
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CFlightPlan> m_flightPlanCache;
|
||||
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CAircraftIcao> m_icaoCodeCache;
|
||||
|
||||
BlackMisc::Aviation::CAircraft m_ownAircraft;
|
||||
BlackMisc::Simulation::CAircraftModel m_ownAircraftModel;
|
||||
|
||||
INetwork *m_network = nullptr;
|
||||
INetwork *m_network = nullptr;
|
||||
CVatsimBookingReader *m_vatsimBookingReader = nullptr;
|
||||
CVatsimDataFileReader *m_vatsimDataFileReader = nullptr;
|
||||
CAirspaceWatchdog m_atcWatchdog;
|
||||
CAirspaceWatchdog m_aircraftWatchdog;
|
||||
|
||||
// FIXME (MS) should be in INetwork
|
||||
// TODO FIXME (MS) should be in INetwork
|
||||
void sendFsipiCustomPacket(const BlackMisc::Aviation::CCallsign &recipientCallsign) const;
|
||||
void sendFsipirCustomPacket(const BlackMisc::Aviation::CCallsign &recipientCallsign) const;
|
||||
QStringList createFsipiCustomPacketData() const;
|
||||
|
||||
@@ -68,6 +68,12 @@ namespace BlackCore
|
||||
virtual ~IContextNetwork() {}
|
||||
|
||||
signals:
|
||||
//! An aircraft disappeared
|
||||
void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
//! Read for model matching
|
||||
void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft);
|
||||
|
||||
//! ATC station (online) list has been changed
|
||||
void changedAtcStationsOnline();
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "blackmisc/avatcstationlist.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "blackmisc/simplecommandparser.h"
|
||||
#include "blackmisc/simulation/simdirectaccessownaircraft.h"
|
||||
|
||||
#include <QtXml/QDomElement>
|
||||
#include <QNetworkReply>
|
||||
@@ -31,6 +32,7 @@ using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Simulation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
@@ -42,10 +44,12 @@ namespace BlackCore
|
||||
IContextNetwork(mode, runtime)
|
||||
{
|
||||
Q_ASSERT(this->getRuntime());
|
||||
Q_ASSERT(this->getRuntime()->getIContextSettings());
|
||||
Q_ASSERT(this->getIContextSettings());
|
||||
Q_ASSERT(this->getIContextOwnAircraft());
|
||||
Q_ASSERT(this->getIContextOwnAircraft()->isUsingImplementingObject());
|
||||
|
||||
// 1. Init by "network driver"
|
||||
this->m_network = new CNetworkVatlib(this);
|
||||
this->m_network = new CNetworkVatlib(this->getRuntime()->getCContextOwnAircraft(), this);
|
||||
connect(this->m_network, &INetwork::connectionStatusChanged, this, &CContextNetwork::ps_fsdConnectionStatusChanged);
|
||||
connect(this->m_network, &INetwork::textMessagesReceived, this, &CContextNetwork::ps_fsdTextMessageReceived);
|
||||
|
||||
@@ -70,16 +74,19 @@ namespace BlackCore
|
||||
this->m_dataUpdateTimer->start(30 * 1000);
|
||||
|
||||
// 5. Airspace contents
|
||||
this->m_airspace = new CAirspaceMonitor(this, this->m_network, this->m_vatsimBookingReader, this->m_vatsimDataFileReader);
|
||||
const IOwnAircraftProviderReadOnly *ownAircraft = runtime->getCContextOwnAircraft();
|
||||
this->m_airspace = new CAirspaceMonitor(this, ownAircraft, this->m_network, this->m_vatsimBookingReader, this->m_vatsimDataFileReader);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationsOnline, this, &CContextNetwork::changedAtcStationsOnline);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationsBooked, this, &CContextNetwork::changedAtcStationsBooked);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationOnlineConnectionStatus, this, &CContextNetwork::changedAtcStationOnlineConnectionStatus);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAircraftInRange, this, &CContextNetwork::changedAircraftInRange);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextNetwork::changedAircraftSituation);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::removedAircraft, this, &CContextNetwork::removedAircraft);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::readyForModelMatching, this, &CContextNetwork::readyForModelMatching);
|
||||
|
||||
//! \todo Should be set in runtime, but this would require airspace to be a context
|
||||
connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraft, this->m_airspace, &CAirspaceMonitor::setOwnAircraft);
|
||||
connect(this->getIContextSimulator(), &IContextSimulator::ownAircraftModelChanged, this->m_airspace, &CAirspaceMonitor::setOwnAircraftModel);
|
||||
// connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraft, this->m_airspace, &CAirspaceMonitor::setOwnAircraft);
|
||||
// connect(this->getIContextSimulator(), &IContextSimulator::ownAircraftModelChanged, this->m_airspace, &CAirspaceMonitor::setOwnAircraftModel);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -131,13 +138,12 @@ namespace BlackCore
|
||||
{
|
||||
this->m_currentStatus = INetwork::Connecting; // as semaphore we are going to connect
|
||||
INetwork::LoginMode mode = static_cast<INetwork::LoginMode>(loginMode);
|
||||
this->getIContextOwnAircraft()->updatePilot(server.getUser(), this->getPathAndContextId());
|
||||
this->getIContextOwnAircraft()->updatePilot(server.getUser());
|
||||
const CAircraft ownAircraft = this->ownAircraft();
|
||||
this->m_network->presetServer(server);
|
||||
this->m_network->presetLoginMode(mode);
|
||||
this->m_network->presetCallsign(ownAircraft.getCallsign());
|
||||
this->m_network->presetIcaoCodes(ownAircraft.getIcaoInfo());
|
||||
this->m_network->setOwnAircraft(ownAircraft);
|
||||
this->m_network->initiateConnection();
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Connection pending " + server.getAddress() + " " + QString::number(server.getPort()));
|
||||
}
|
||||
@@ -349,13 +355,6 @@ namespace BlackCore
|
||||
return this->getRuntime()->getCContextOwnAircraft()->ownAircraft();
|
||||
}
|
||||
|
||||
void CContextNetwork::ps_changedOwnAircraft(const CAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
Q_ASSERT(this->m_network);
|
||||
Q_UNUSED(originator);
|
||||
this->m_network->setOwnAircraft(aircraft);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reload bookings
|
||||
*/
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "blackmisc/nwclientlist.h"
|
||||
#include "blackmisc/digestsignal.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "blackmisc/avaircraftsituationlist.h"
|
||||
|
||||
#include <QMap>
|
||||
|
||||
@@ -45,9 +46,6 @@ namespace BlackCore
|
||||
//! Destructor
|
||||
virtual ~CContextNetwork();
|
||||
|
||||
//! Airspace monitor accessible to other contexts
|
||||
CAirspaceMonitor *getAirspaceMonitor() const { return m_airspace; }
|
||||
|
||||
public slots:
|
||||
|
||||
//! \copydoc IContextNetwork::readAtcBookingsFromSource()
|
||||
@@ -182,9 +180,6 @@ namespace BlackCore
|
||||
const BlackMisc::Aviation::CAircraft &ownAircraft() const;
|
||||
|
||||
private slots:
|
||||
//! Own aircraft was updated
|
||||
void ps_changedOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! ATC bookings received
|
||||
void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations);
|
||||
|
||||
|
||||
@@ -64,18 +64,6 @@ namespace BlackCore
|
||||
virtual ~IContextOwnAircraft() {}
|
||||
|
||||
signals:
|
||||
//! Aircraft changed
|
||||
//! \remarks local only
|
||||
void changedAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Aircraft situation update
|
||||
//! \remarks local only
|
||||
void changedAircraftSituation(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Aircraft position update
|
||||
//! \remarks local only
|
||||
void changedAircraftPosition(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Aircraft cockpit update
|
||||
//! \remarks DBus and local
|
||||
void changedAircraftCockpit(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
@@ -89,38 +77,23 @@ namespace BlackCore
|
||||
//! Get own aircraft
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0;
|
||||
|
||||
//! Own aircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0;
|
||||
|
||||
//! Own aircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0;
|
||||
|
||||
//! Own position, be aware height is terrain height
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) = 0;
|
||||
|
||||
//! Complete situation update
|
||||
virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) = 0;
|
||||
//! Update position
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0;
|
||||
|
||||
//! Update own cockpit
|
||||
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0;
|
||||
|
||||
//! Tune in a com frequency
|
||||
virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) = 0;
|
||||
|
||||
//! Update model
|
||||
virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) = 0;
|
||||
|
||||
//! Update client
|
||||
virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) = 0;
|
||||
virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) = 0;
|
||||
|
||||
//! Set current pilot
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot, const QString &originator) = 0;
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot) = 0;
|
||||
|
||||
//! Set ICAO data
|
||||
virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData, const QString &originator) = 0;
|
||||
virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) = 0;
|
||||
|
||||
//! Set callsign
|
||||
virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign, const QString &originator) = 0;
|
||||
virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0;
|
||||
|
||||
//! Own SELCAL code
|
||||
virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) = 0;
|
||||
|
||||
@@ -96,92 +96,12 @@ namespace BlackCore
|
||||
this->getIContextAudio()->setComVoiceRooms(rooms);
|
||||
}
|
||||
|
||||
/*
|
||||
* Own Aircraft
|
||||
*/
|
||||
bool CContextOwnAircraft::updateAircraft(const CSimulatedAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << ownAircraft() << originator;
|
||||
|
||||
bool changedAircraft = this->updateAircraft(static_cast<CAircraft>(aircraft), originator);
|
||||
|
||||
bool changedModel = this->updateModel(aircraft.getModel(), originator);
|
||||
bool changedClient = this->updateClient(aircraft.getClient(), originator);
|
||||
if (changedModel || changedClient)
|
||||
{
|
||||
if (!changedAircraft)
|
||||
{
|
||||
// no signal so far
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
}
|
||||
}
|
||||
|
||||
bool changed = changedModel || changedClient || changedAircraft;
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Own Aircraft
|
||||
*/
|
||||
bool CContextOwnAircraft::updateAircraft(const CAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << ownAircraft() << originator;
|
||||
|
||||
// trigger the correct signals
|
||||
bool changedCockpit = this->updateCockpit(aircraft.getCom1System(), aircraft.getCom2System(), aircraft.getTransponder(), originator);
|
||||
bool changedPosition = this->updatePosition(aircraft.getPosition(), aircraft.getAltitude() , originator);
|
||||
bool changedSituation = this->updateSituation(aircraft.getSituation(), originator);
|
||||
bool changed = changedCockpit || changedPosition || changedSituation;
|
||||
|
||||
// new voice rooms, cockpit has changed
|
||||
if (changedCockpit) { this->resolveVoiceRooms(); }
|
||||
|
||||
// any change triggers a global updated aircraft signal
|
||||
// comparison is not to avoid setting the value, but avoid wrong signals
|
||||
if (changed || this->getAviationAircraft() != aircraft)
|
||||
{
|
||||
emit this->changedAircraft(aircraft, originator);
|
||||
|
||||
// now set value
|
||||
this->m_ownAircraft.setAircraft(aircraft);
|
||||
changed = true;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Client
|
||||
*/
|
||||
bool CContextOwnAircraft::updateClient(const CClient &client, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << client << originator;
|
||||
|
||||
bool changed = this->m_ownAircraft.getClient() != client;
|
||||
if (!changed) { return false; }
|
||||
this->m_ownAircraft.setClient(client);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Model
|
||||
*/
|
||||
bool CContextOwnAircraft::updateModel(const CAircraftModel &model, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << model << originator;
|
||||
|
||||
bool changed = this->m_ownAircraft.getModel() != model;
|
||||
if (!changed) { return false; }
|
||||
this->m_ownAircraft.setModel(model);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Own position
|
||||
*/
|
||||
bool CContextOwnAircraft::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator)
|
||||
bool CContextOwnAircraft::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude << originator;
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude;
|
||||
bool changed = (this->m_ownAircraft.getPosition() != position);
|
||||
if (changed) { this->m_ownAircraft.setPosition(position); }
|
||||
|
||||
@@ -190,30 +110,6 @@ namespace BlackCore
|
||||
changed = true;
|
||||
this->m_ownAircraft.setAltitude(altitude);
|
||||
}
|
||||
|
||||
if (changed)
|
||||
{
|
||||
emit this->changedAircraftPosition(this->m_ownAircraft, originator);
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Update own situation
|
||||
*/
|
||||
bool CContextOwnAircraft::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << situation;
|
||||
bool changed = this->m_ownAircraft.getSituation() != situation;
|
||||
if (!changed) return changed;
|
||||
|
||||
if (changed)
|
||||
{
|
||||
this->m_ownAircraft.setSituation(situation);
|
||||
emit this->changedAircraftSituation(this->m_ownAircraft, originator);
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
@@ -228,7 +124,6 @@ namespace BlackCore
|
||||
{
|
||||
this->m_ownAircraft.setCockpit(com1, com2, transponder);
|
||||
emit this->changedAircraftCockpit(this->m_ownAircraft, originator);
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
this->resolveVoiceRooms();
|
||||
}
|
||||
return changed;
|
||||
@@ -237,7 +132,7 @@ namespace BlackCore
|
||||
/*
|
||||
* COM frequency
|
||||
*/
|
||||
bool CContextOwnAircraft::updateComFrequency(const CFrequency &frequency, int comUnit, const QString &originator)
|
||||
bool CContextOwnAircraft::updateActiveComFrequency(const CFrequency &frequency, int comUnit, const QString &originator)
|
||||
{
|
||||
CComSystem::ComUnit unit = static_cast<CComSystem::ComUnit>(comUnit);
|
||||
if (unit != CComSystem::Com1 && unit != CComSystem::Com2) { return false; }
|
||||
@@ -259,27 +154,24 @@ namespace BlackCore
|
||||
/*
|
||||
* Pilot
|
||||
*/
|
||||
bool CContextOwnAircraft::updatePilot(const CUser &pilot, const QString &originator)
|
||||
bool CContextOwnAircraft::updatePilot(const CUser &pilot)
|
||||
{
|
||||
if (this->m_ownAircraft.getPilot() == pilot) { return false; }
|
||||
this->m_ownAircraft.setPilot(pilot);
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CContextOwnAircraft::updateCallsign(const CCallsign &callsign, const QString &originator)
|
||||
bool CContextOwnAircraft::updateCallsign(const CCallsign &callsign)
|
||||
{
|
||||
if (this->m_ownAircraft.getCallsign() == callsign) { return false; }
|
||||
this->m_ownAircraft.setCallsign(callsign);
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CContextOwnAircraft::updateIcaoData(const CAircraftIcao &icaoData, const QString &originator)
|
||||
bool CContextOwnAircraft::updateIcaoData(const CAircraftIcao &icaoData)
|
||||
{
|
||||
if (this->m_ownAircraft.getIcaoInfo() == icaoData) { return false; }
|
||||
this->m_ownAircraft.setIcaoInfo(icaoData);
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -359,11 +251,11 @@ namespace BlackCore
|
||||
".com1", ".com2", // com1, com2 frequencies
|
||||
".selcal"
|
||||
});
|
||||
if (commandLine.isEmpty()) return false;
|
||||
if (commandLine.isEmpty()) { return false; }
|
||||
parser.parse(commandLine);
|
||||
if (!parser.isKnownCommand()) return false;
|
||||
if (!parser.isKnownCommand()) { return false; }
|
||||
|
||||
CAircraft ownAircraft = this->getOwnAircraft();
|
||||
CAircraft ownAircraft = this->ownAircraft();
|
||||
if (parser.matchesCommand(".x", ".xpdr") && parser.countParts() > 1)
|
||||
{
|
||||
CTransponder transponder = ownAircraft.getTransponder();
|
||||
|
||||
@@ -17,12 +17,15 @@
|
||||
#include "blackcore/context_runtime.h"
|
||||
#include "blackcore/dbus_server.h"
|
||||
#include "blackmisc/avatcstation.h"
|
||||
#include "blackmisc/simulation/simdirectaccessownaircraft.h"
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
//! Network context implementation
|
||||
class CContextOwnAircraft : public IContextOwnAircraft
|
||||
//! Own aircraft context implementation
|
||||
class CContextOwnAircraft :
|
||||
public IContextOwnAircraft,
|
||||
public BlackMisc::Simulation::IOwnAircraftProvider
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", BLACKCORE_CONTEXTOWNAIRCRAFT_INTERFACENAME)
|
||||
@@ -34,48 +37,33 @@ namespace BlackCore
|
||||
virtual ~CContextOwnAircraft();
|
||||
|
||||
//! Own aircraft
|
||||
const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const { return this->m_ownAircraft; }
|
||||
virtual const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const override { return this->m_ownAircraft; }
|
||||
|
||||
//! Own aircraft
|
||||
BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() { return this->m_ownAircraft; }
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() override { return this->m_ownAircraft; }
|
||||
|
||||
public slots: // IContextOwnAircraft overrides
|
||||
|
||||
//! \copydoc IContextOwnAircraft::getOwnAircraft()
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateModel
|
||||
virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateClient
|
||||
virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updatePosition
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateSituation
|
||||
virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override;
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateCockpit
|
||||
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateComFrequency
|
||||
virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override;
|
||||
virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updatePilot
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot, const QString &originator) override;
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateCallsign
|
||||
virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign, const QString &originator) override;
|
||||
virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateIcaoData
|
||||
virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData, const QString &originator) override;
|
||||
virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateSelcal
|
||||
virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) override;
|
||||
|
||||
@@ -45,34 +45,9 @@ namespace BlackCore
|
||||
return this->m_dBusInterface->callDBusRet<BlackMisc::Simulation::CSimulatedAircraft>(QLatin1Literal("getOwnAircraft"));
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateAircraft"), aircraft, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateAircraft"), aircraft, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateModel(const Simulation::CAircraftModel &model, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateModel"), model, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateClient(const Network::CClient &client, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateClient"), client, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updatePosition"), position, altitude, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateSituation"), situation, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updatePosition"), position, altitude);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator)
|
||||
@@ -80,14 +55,14 @@ namespace BlackCore
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateCockpit"), com1, com2, transponder, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateComFrequency(const PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateActiveComFrequency(const PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateComFrequency"), frequency, comUnit, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateActiveComFrequency"), frequency, comUnit, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updatePilot(const BlackMisc::Network::CUser &pilot, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updatePilot(const BlackMisc::Network::CUser &pilot)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updatePilot"), pilot, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updatePilot"), pilot);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateSelcal(const CSelcal &selcal, const QString &originator)
|
||||
@@ -95,14 +70,14 @@ namespace BlackCore
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateSelcal"), selcal, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateCallsign(const CCallsign &callsign, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateCallsign(const CCallsign &callsign)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateCallsign"), callsign, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateCallsign"), callsign);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateIcaoData(const CAircraftIcao &icaoData, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateIcaoData(const CAircraftIcao &icaoData)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateIcaoData"), icaoData, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateIcaoData"), icaoData);
|
||||
}
|
||||
|
||||
void CContextOwnAircraftProxy::setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2)
|
||||
|
||||
@@ -37,41 +37,26 @@ namespace BlackCore
|
||||
//! \copydoc IContextOwnAircraft::getOwnAircraft()
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateModel
|
||||
virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateClient
|
||||
virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updatePosition
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateSituation
|
||||
virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override;
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateCockpit
|
||||
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateComFrequency
|
||||
virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override;
|
||||
virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updatePilot
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot, const QString &originator) override;
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateSelcal
|
||||
virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateCallsign
|
||||
virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign, const QString &originator) override;
|
||||
virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateIcaoData
|
||||
virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData, const QString &originator) override;
|
||||
virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::setAudioOutputVolumes
|
||||
virtual void setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) override;
|
||||
|
||||
@@ -206,11 +206,6 @@ namespace BlackCore
|
||||
c = this->connect(this->m_contextNetwork, &IContextNetwork::changedAtcStationOnlineConnectionStatus,
|
||||
this->getCContextOwnAircraft(), &CContextOwnAircraft::ps_changedAtcStationOnlineConnectionStatus);
|
||||
Q_ASSERT(c);
|
||||
|
||||
// inject updated own aircraft to network
|
||||
c = this->connect(this->m_contextOwnAircraft, &IContextOwnAircraft::changedAircraft,
|
||||
this->getCContextNetwork(), &CContextNetwork::ps_changedOwnAircraft);
|
||||
Q_ASSERT(c);
|
||||
times.insert("Post setup, connects network", time.restart());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
|
||||
#include "blackcore/context_runtime_config.h"
|
||||
#include "blackmisc/statusmessagelist.h"
|
||||
#include "blackmisc/simulation/simdirectaccessownaircraft.h"
|
||||
|
||||
#include <QDBusConnection>
|
||||
#include <QObject>
|
||||
#include <QMultiMap>
|
||||
|
||||
@@ -121,9 +121,6 @@ namespace BlackCore
|
||||
//! Airports in range
|
||||
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0;
|
||||
|
||||
//! Aircraft model
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const = 0;
|
||||
|
||||
//! Installed models in simulator eco system
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const = 0;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
*/
|
||||
|
||||
#include "context_simulator_impl.h"
|
||||
#include "context_ownaircraft_impl.h"
|
||||
#include "context_ownaircraft.h"
|
||||
#include "context_settings.h"
|
||||
#include "context_application.h"
|
||||
@@ -32,9 +33,7 @@ namespace BlackCore
|
||||
{
|
||||
CContextSimulator::CContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextSimulator(mode, runtime)
|
||||
{
|
||||
m_updateTimer = new QTimer(this);
|
||||
findSimulatorPlugins();
|
||||
connect(m_updateTimer, &QTimer::timeout, this, &CContextSimulator::ps_updateOwnAircraftContext);
|
||||
|
||||
// do not load plugin here, as it depends on settings
|
||||
// it has to be guaranteed the settings are alredy loaded
|
||||
@@ -99,15 +98,6 @@ namespace BlackCore
|
||||
return m_simulator->getSimulatorInfo();
|
||||
}
|
||||
|
||||
Simulation::CAircraftModel CContextSimulator::getOwnAircraftModel() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
// If no ISimulator object is available, return a dummy.
|
||||
if (!m_simulator) { return Simulation::CAircraftModel(); }
|
||||
|
||||
return this->m_simulator->getOwnAircraftModel();
|
||||
}
|
||||
|
||||
CAirportList CContextSimulator::getAirportsInRange() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
@@ -198,22 +188,28 @@ namespace BlackCore
|
||||
return false;
|
||||
}
|
||||
|
||||
auto iterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory * factory)
|
||||
auto factoryIterator = std::find_if(m_simulatorFactories.begin(), m_simulatorFactories.end(), [ = ](const ISimulatorFactory * factory)
|
||||
{
|
||||
return factory->getSimulatorInfo() == simulatorInfo;
|
||||
});
|
||||
|
||||
// no plugin found
|
||||
if (iterator == m_simulatorFactories.end())
|
||||
if (factoryIterator == m_simulatorFactories.end())
|
||||
{
|
||||
CLogMessage(this).error("Plugin not found: '%1'") << simulatorInfo.toQString(true);
|
||||
return false;
|
||||
}
|
||||
|
||||
ISimulatorFactory *factory = *iterator;
|
||||
|
||||
// Factory for driver
|
||||
ISimulatorFactory *factory = *factoryIterator;
|
||||
Q_ASSERT(factory);
|
||||
|
||||
ISimulator *newSimulator = factory->create(this);
|
||||
// We assume we run in the same process as the own aircraft context
|
||||
// Hence we pass in memory refernce to own aircraft object
|
||||
Q_ASSERT(this->getIContextOwnAircraft()->isUsingImplementingObject());
|
||||
IOwnAircraftProvider *ownAircraft = this->getRuntime()->getCContextOwnAircraft();
|
||||
ISimulator *newSimulator = factory->create(ownAircraft, this);
|
||||
Q_ASSERT(newSimulator);
|
||||
|
||||
this->unloadSimulatorPlugin(); // old plugin unloaded
|
||||
@@ -230,17 +226,21 @@ namespace BlackCore
|
||||
connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, m_simulator, &ISimulator::displayStatusMessage);
|
||||
|
||||
// connect with network
|
||||
//! \todo using airspace monitor directly is maybe wrong (KB: I think it is). It assumes simulator and network
|
||||
//! context reside in the same process, which is not guranteed IMHO
|
||||
CAirspaceMonitor *airspace = this->getRuntime()->getCContextNetwork()->getAirspaceMonitor();
|
||||
IContextNetwork *networkContext = this->getIContextNetwork();
|
||||
Q_ASSERT(networkContext);
|
||||
Q_ASSERT(networkContext->isLocalObject());
|
||||
|
||||
// use readyForModelMatching instead of CAirspaceMonitor::addedAircraft, as it contains client information
|
||||
connect(airspace, &CAirspaceMonitor::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft);
|
||||
connect(airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextSimulator::ps_addAircraftSituation);
|
||||
connect(airspace, &CAirspaceMonitor::removedAircraft, this, &CContextSimulator::ps_removeRemoteAircraft);
|
||||
for (const auto &aircraft : airspace->getAircraftInRange())
|
||||
bool c = connect(networkContext, &IContextNetwork::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft);
|
||||
Q_ASSERT(c);
|
||||
c = connect(networkContext, &IContextNetwork::changedAircraftSituation, this, &CContextSimulator::ps_addAircraftSituation);
|
||||
Q_ASSERT(c);
|
||||
c = connect(networkContext, &IContextNetwork::removedAircraft, this, &CContextSimulator::ps_removeRemoteAircraft);
|
||||
Q_ASSERT(c);
|
||||
for (const auto &aircraft : networkContext->getAircraftInRange())
|
||||
{
|
||||
Q_ASSERT(!aircraft.getCallsign().isEmpty());
|
||||
CClient client = airspace->getOtherClients().findFirstByCallsign(aircraft.getCallsign());
|
||||
CClient client = networkContext->getOtherClients().findFirstByCallsign(aircraft.getCallsign());
|
||||
CSimulatedAircraft simAircraft(aircraft);
|
||||
simAircraft.setClient(client);
|
||||
m_simulator->addRemoteAircraft(simAircraft);
|
||||
@@ -288,43 +288,18 @@ namespace BlackCore
|
||||
|
||||
void CContextSimulator::unloadSimulatorPlugin()
|
||||
{
|
||||
if (m_simulator)
|
||||
if (this->m_simulator)
|
||||
{
|
||||
// depending on shutdown order, network might already have been deleted
|
||||
//! \todo link with airspace monitor to be reviewed when airspace monitor becomes context
|
||||
if (this->getRuntime()->getIContextNetwork()->isUsingImplementingObject())
|
||||
{
|
||||
CContextNetwork *network = this->getRuntime()->getCContextNetwork();
|
||||
network->getAirspaceMonitor()->QObject::disconnect(this);
|
||||
}
|
||||
|
||||
this->QObject::disconnect(m_simulator); // disconnect as receiver straight away
|
||||
m_simulator->disconnectFrom(); // disconnect from simulator
|
||||
m_simulator->deleteLater();
|
||||
}
|
||||
m_simulator = nullptr;
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_updateOwnAircraftContext()
|
||||
{
|
||||
Q_ASSERT(this->getIContextOwnAircraft());
|
||||
Q_ASSERT(this->m_simulator);
|
||||
|
||||
// we make sure not to override values we do not have
|
||||
CAircraft contextAircraft = this->getIContextOwnAircraft()->getOwnAircraft(); // own aircraft from context
|
||||
CAircraft simulatorAircraft = this->m_simulator->getOwnAircraft(); // own aircraft from simulator
|
||||
|
||||
// update from simulator to context
|
||||
contextAircraft.setSituation(simulatorAircraft.getSituation());
|
||||
contextAircraft.setCockpit(simulatorAircraft.getCom1System(), simulatorAircraft.getCom2System(), simulatorAircraft.getTransponderCode(), simulatorAircraft.getTransponderMode());
|
||||
|
||||
Q_ASSERT(this->getIContextOwnAircraft()); // paranoia against context having been deleted from another thread - redmine issue #270
|
||||
if (this->getIContextOwnAircraft())
|
||||
{
|
||||
// the method will check, if an update is really required
|
||||
// these are local (non DBus) calls
|
||||
this->getIContextOwnAircraft()->updateAircraft(contextAircraft, this->getPathAndContextId());
|
||||
IContextNetwork *networkContext = this->getIContextNetwork();
|
||||
Q_ASSERT(networkContext);
|
||||
Q_ASSERT(networkContext->isLocalObject());
|
||||
this->m_simulator->disconnect(); // disconnect all simulator signals
|
||||
QObject::disconnect(this, nullptr, this->m_simulator, nullptr); // disconnect receiver simulator
|
||||
this->m_simulator->disconnectFrom(); // disconnect from simulator
|
||||
this->m_simulator->deleteLater();
|
||||
}
|
||||
this->m_simulator = nullptr;
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_addRemoteAircraft(const CSimulatedAircraft &remoteAircraft)
|
||||
@@ -349,43 +324,48 @@ namespace BlackCore
|
||||
this->m_simulator->removeRemoteAircraft(callsign);
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_updateSimulatorCockpitFromContext(const CAircraft &ownAircraft, const QString &originator)
|
||||
{
|
||||
Q_ASSERT(this->m_simulator);
|
||||
if (!this->m_simulator) { return; }
|
||||
|
||||
// avoid loops
|
||||
if (originator.isEmpty() || originator == IContextSimulator::InterfaceName()) return;
|
||||
|
||||
// update
|
||||
this->m_simulator->updateOwnSimulatorCockpit(ownAircraft);
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status)
|
||||
{
|
||||
bool connected;
|
||||
if (status == ISimulator::Connected)
|
||||
{
|
||||
connected = true;
|
||||
m_updateTimer->start(100);
|
||||
}
|
||||
else
|
||||
{
|
||||
connected = false;
|
||||
m_updateTimer->stop();
|
||||
}
|
||||
emit connectionChanged(connected);
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_textMessagesReceived(const Network::CTextMessageList &textMessages)
|
||||
{
|
||||
if (!this->m_simulator) return;
|
||||
if (!this->m_simulator) { return; }
|
||||
foreach(CTextMessage tm, textMessages)
|
||||
{
|
||||
this->m_simulator->displayTextMessage(tm);
|
||||
}
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_cockitChangedFromSim(const CSimulatedAircraft &ownAircraft)
|
||||
{
|
||||
Q_ASSERT(this->getIContextOwnAircraft());
|
||||
if (!this->getIContextOwnAircraft()) { return; }
|
||||
this->getIContextOwnAircraft()->changedAircraftCockpit(ownAircraft, IContextSimulator::InterfaceName());
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_updateSimulatorCockpitFromContext(const CAircraft &ownAircraft, const QString &originator)
|
||||
{
|
||||
Q_ASSERT(this->m_simulator);
|
||||
if (!this->m_simulator) { return; }
|
||||
|
||||
// avoid loops
|
||||
if (originator.isEmpty() || originator == IContextSimulator::InterfaceName()) { return; }
|
||||
|
||||
// update
|
||||
this->m_simulator->updateOwnSimulatorCockpit(ownAircraft, originator);
|
||||
}
|
||||
|
||||
void CContextSimulator::settingsChanged(uint type)
|
||||
{
|
||||
Q_ASSERT(this->getIContextSettings());
|
||||
|
||||
@@ -68,9 +68,6 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::getSimulatorInfo()
|
||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAircraftModel()
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAirportsInRange
|
||||
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||
|
||||
@@ -126,9 +123,6 @@ namespace BlackCore
|
||||
}
|
||||
|
||||
private slots:
|
||||
//! Update own aircraft context, because simulator has changed something
|
||||
void ps_updateOwnAircraftContext();
|
||||
|
||||
//! \copydoc ISimulator::addRemoteAircraft
|
||||
void ps_addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft);
|
||||
|
||||
@@ -138,22 +132,24 @@ namespace BlackCore
|
||||
//! \copydoc ISimulator::removeRemoteAircraft
|
||||
void ps_removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
//! Update simulator cockpit from context, because someone else has changed cockpit (e.g. GUI, 3rd party)
|
||||
//! \remarks set by runtime, only to be used locally (not via DBus)
|
||||
void ps_updateSimulatorCockpitFromContext(const BlackMisc::Aviation::CAircraft &ownAircraft, const QString &originator);
|
||||
|
||||
//! Handle new connection status
|
||||
void ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status);
|
||||
|
||||
//! Text message received
|
||||
void ps_textMessagesReceived(const BlackMisc::Network::CTextMessageList &textMessages);
|
||||
|
||||
//! Simulator has changed cockpit
|
||||
void ps_cockitChangedFromSim(const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft);
|
||||
|
||||
//! Update simulator cockpit from context, because someone else has changed cockpit (e.g. GUI, 3rd party)
|
||||
//! \remarks set by runtime, only to be used locally (not via DBus)
|
||||
void ps_updateSimulatorCockpitFromContext(const BlackMisc::Aviation::CAircraft &ownAircraft, const QString &originator);
|
||||
|
||||
private:
|
||||
//! \brief find and catalog all simulator plugins
|
||||
void findSimulatorPlugins();
|
||||
|
||||
BlackCore::ISimulator *m_simulator = nullptr; //!< simulator plugin
|
||||
QTimer *m_updateTimer = nullptr;
|
||||
QDir m_pluginsDir;
|
||||
QSet<ISimulatorFactory *> m_simulatorFactories;
|
||||
QFuture<bool> m_canConnectResult;
|
||||
|
||||
@@ -87,11 +87,6 @@ namespace BlackCore
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("disconnectFromSimulator"));
|
||||
}
|
||||
|
||||
BlackMisc::Simulation::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Simulation::CAircraftModel>(QLatin1Literal("getOwnAircraftModel"));
|
||||
}
|
||||
|
||||
CAirportList CContextSimulatorProxy::getAirportsInRange() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Aviation::CAirportList>(QLatin1Literal("getAirportsInRange"));
|
||||
|
||||
@@ -68,9 +68,6 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::isPaused
|
||||
virtual bool isPaused() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAircraftModel()
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAirportsInRange()
|
||||
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||
|
||||
|
||||
@@ -328,31 +328,6 @@ namespace BlackCore
|
||||
*/
|
||||
virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
|
||||
|
||||
/*!
|
||||
* Set our own aircraft data.
|
||||
* \param aircraft Only the situation and avionics parts are used. Callsign, user, and ICAO code parts are ignored.
|
||||
*/
|
||||
virtual void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) = 0;
|
||||
|
||||
/*!
|
||||
* Set the position and altitude of our own aircraft.
|
||||
* \deprecated No longer needed with own aircraft context, only used in client sample
|
||||
*/
|
||||
virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0;
|
||||
|
||||
/*!
|
||||
* Set the position, altitude, orientation, and miscellaneous state of our own aircraft.
|
||||
* \deprecated No longer needed with own aircraft context, only used in client sample
|
||||
*/
|
||||
virtual void setOwnAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0;
|
||||
|
||||
/*!
|
||||
* Set the COM frequencies and transponder code and mode of our own aircraft.
|
||||
* \deprecated No longer needed with own aircraft context, only used in client sample
|
||||
*/
|
||||
virtual void setOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2,
|
||||
const BlackMisc::Aviation::CTransponder &transponder) = 0;
|
||||
|
||||
//! @}
|
||||
////////////////////////////////////////////////////////////////
|
||||
//! \name Weather slots
|
||||
|
||||
@@ -21,22 +21,23 @@ static_assert(! std::is_abstract<BlackCore::CNetworkVatlib>::value, "Must implem
|
||||
#define CLIENT_PUBLIC_ID 0xb9ba
|
||||
#define CLIENT_PRIVATE_KEY "727d1efd5cb9f8d2c28372469d922bb4"
|
||||
|
||||
using namespace BlackMisc::PhysicalQuantities;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc::Simulation;
|
||||
using namespace BlackMisc;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
using namespace BlackMisc::PhysicalQuantities;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc;
|
||||
|
||||
void exceptionDispatcher(const char *caller);
|
||||
|
||||
CNetworkVatlib::CNetworkVatlib(QObject *parent)
|
||||
: INetwork(parent),
|
||||
m_loginMode(LoginNormal),
|
||||
m_status(vatStatusIdle),
|
||||
m_fsdTextCodec(QTextCodec::codecForName("latin1"))
|
||||
CNetworkVatlib::CNetworkVatlib(Simulation::IOwnAircraftProvider *ownAircraft, QObject *parent)
|
||||
: INetwork(parent), COwnAircraftProviderSupport(ownAircraft),
|
||||
m_loginMode(LoginNormal),
|
||||
m_status(vatStatusIdle),
|
||||
m_fsdTextCodec(QTextCodec::codecForName("latin1"))
|
||||
{
|
||||
connect(this, &CNetworkVatlib::terminate, this, &INetwork::terminateConnection, Qt::QueuedConnection);
|
||||
connect(this, &INetwork::customPacketReceived, this, &CNetworkVatlib::customPacketDispatcher);
|
||||
@@ -93,7 +94,7 @@ namespace BlackCore
|
||||
|
||||
CNetworkVatlib::~CNetworkVatlib()
|
||||
{
|
||||
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "CNetworkVatlib destoyed while still connected.");
|
||||
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "CNetworkVatlib destroyed while still connected.");
|
||||
}
|
||||
|
||||
void CNetworkVatlib::process()
|
||||
@@ -114,8 +115,8 @@ namespace BlackCore
|
||||
VatAtcPosition pos;
|
||||
pos.facility = vatFacilityTypeUnknown;
|
||||
pos.visibleRange = 10; // NM
|
||||
pos.latitude = m_ownAircraft.latitude().value(CAngleUnit::deg());
|
||||
pos.longitude = m_ownAircraft.longitude().value(CAngleUnit::deg());
|
||||
pos.latitude = ownAircraft().latitude().value(CAngleUnit::deg());
|
||||
pos.longitude = ownAircraft().longitude().value(CAngleUnit::deg());
|
||||
pos.elevation = 0;
|
||||
pos.rating = vatAtcRatingObserver;
|
||||
pos.frequency = 199998;
|
||||
@@ -126,17 +127,17 @@ namespace BlackCore
|
||||
// Normal / Stealth mode
|
||||
VatPilotPosition pos;
|
||||
pos.altitudeAdjust = 0; // TODO: this needs to be calculated
|
||||
pos.altitudeTrue = m_ownAircraft.getAltitude().value(CLengthUnit::ft());
|
||||
pos.heading = m_ownAircraft.getHeading().value(CAngleUnit::deg());
|
||||
pos.pitch = m_ownAircraft.getPitch().value(CAngleUnit::deg());
|
||||
pos.bank = m_ownAircraft.getBank().value(CAngleUnit::deg());
|
||||
pos.latitude = m_ownAircraft.latitude().value(CAngleUnit::deg());
|
||||
pos.longitude = m_ownAircraft.longitude().value(CAngleUnit::deg());
|
||||
pos.groundSpeed = m_ownAircraft.getGroundSpeed().value(CSpeedUnit::kts());
|
||||
pos.altitudeTrue = ownAircraft().getAltitude().value(CLengthUnit::ft());
|
||||
pos.heading = ownAircraft().getHeading().value(CAngleUnit::deg());
|
||||
pos.pitch = ownAircraft().getPitch().value(CAngleUnit::deg());
|
||||
pos.bank = ownAircraft().getBank().value(CAngleUnit::deg());
|
||||
pos.latitude = ownAircraft().latitude().value(CAngleUnit::deg());
|
||||
pos.longitude = ownAircraft().longitude().value(CAngleUnit::deg());
|
||||
pos.groundSpeed = ownAircraft().getGroundSpeed().value(CSpeedUnit::kts());
|
||||
pos.rating = vatPilotRatingUnknown;
|
||||
pos.transponderCode = static_cast<qint16>(m_ownAircraft.getTransponderCode());
|
||||
pos.transponderCode = static_cast<qint16>(ownAircraft().getTransponderCode());
|
||||
pos.transponderMode = vatTransponderModeStandby;
|
||||
switch (m_ownAircraft.getTransponderMode())
|
||||
switch (ownAircraft().getTransponderMode())
|
||||
{
|
||||
case CTransponder::ModeC: pos.transponderMode = vatTransponderModeCharlie; break;
|
||||
case CTransponder::StateIdent: pos.transponderMode = vatTransponderModeIdent; break;
|
||||
@@ -241,19 +242,20 @@ namespace BlackCore
|
||||
{
|
||||
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change callsign while still connected");
|
||||
m_callsign = callsign;
|
||||
ownAircraft().setCallsign(callsign);
|
||||
}
|
||||
|
||||
void CNetworkVatlib::presetIcaoCodes(const BlackMisc::Aviation::CAircraftIcao &icao)
|
||||
{
|
||||
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change ICAO codes while still connected");
|
||||
m_icaoCode = icao;
|
||||
ownAircraft().setIcaoInfo(icao);
|
||||
}
|
||||
|
||||
void CNetworkVatlib::presetLoginMode(LoginMode mode)
|
||||
{
|
||||
Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change login mode while still connected");
|
||||
m_loginMode = mode;
|
||||
|
||||
m_net.reset(nullptr);
|
||||
}
|
||||
|
||||
@@ -315,44 +317,20 @@ namespace BlackCore
|
||||
}
|
||||
}
|
||||
|
||||
void CNetworkVatlib::setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft)
|
||||
{
|
||||
m_ownAircraft = aircraft;
|
||||
}
|
||||
|
||||
void CNetworkVatlib::setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude)
|
||||
{
|
||||
m_ownAircraft.setPosition(position);
|
||||
m_ownAircraft.setAltitude(altitude);
|
||||
}
|
||||
|
||||
void CNetworkVatlib::setOwnAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation)
|
||||
{
|
||||
m_ownAircraft.setSituation(situation);
|
||||
}
|
||||
|
||||
void CNetworkVatlib::setOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2,
|
||||
const BlackMisc::Aviation::CTransponder &xpdr)
|
||||
{
|
||||
m_ownAircraft.setCom1System(com1);
|
||||
m_ownAircraft.setCom1System(com2);
|
||||
m_ownAircraft.setTransponder(xpdr);
|
||||
}
|
||||
|
||||
void CNetworkVatlib::sendTextMessages(const BlackMisc::Network::CTextMessageList &messages)
|
||||
{
|
||||
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
|
||||
|
||||
if (messages.isEmpty()) return;
|
||||
CTextMessageList privateMessages = messages.getPrivateMessages();
|
||||
for(const auto &message : privateMessages)
|
||||
for (const auto &message : privateMessages)
|
||||
{
|
||||
if (message.getRecipientCallsign().isEmpty()) continue;
|
||||
Vat_SendTextMessage(m_net.data(), toFSD(message.getRecipientCallsign()), toFSD(message.getMessage()));
|
||||
}
|
||||
CTextMessageList radioMessages = messages.getRadioMessages();
|
||||
if (radioMessages.isEmpty()) return;
|
||||
for(const auto &message : radioMessages)
|
||||
for (const auto &message : radioMessages)
|
||||
{
|
||||
// I could send the same message to n frequencies in one step
|
||||
// if this is really required, I need to group by message
|
||||
@@ -442,7 +420,7 @@ namespace BlackCore
|
||||
case CFlightPlan::IFR: vatlibFP.flightType = vatFlightTypeIFR; break;
|
||||
case CFlightPlan::VFR: vatlibFP.flightType = vatFlightTypeVFR; break;
|
||||
case CFlightPlan::SVFR: vatlibFP.flightType = vatFlightTypeSVFR; break;
|
||||
case CFlightPlan::DVFR: vatlibFP.flightType = vatFlightTypeDVFR; break;
|
||||
case CFlightPlan::DVFR: vatlibFP.flightType = vatFlightTypeDVFR; break;
|
||||
}
|
||||
Vat_SendFlightPlan(m_net.data(), &vatlibFP);
|
||||
}
|
||||
@@ -468,12 +446,12 @@ namespace BlackCore
|
||||
void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) // private
|
||||
{
|
||||
Vat_SendInformation(m_net.data(), vatInfoQueryTypeFreq, toFSD(callsign),
|
||||
toFSD(QString::number(m_ownAircraft.getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3)));
|
||||
toFSD(QString::number(ownAircraft().getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3)));
|
||||
}
|
||||
|
||||
void CNetworkVatlib::replyToNameQuery(const BlackMisc::Aviation::CCallsign &callsign) // private
|
||||
{
|
||||
Vat_SendInformation(m_net.data(), vatInfoQueryTypeName, toFSD(callsign),toFSD(m_server.getUser().getRealName()));
|
||||
Vat_SendInformation(m_net.data(), vatInfoQueryTypeName, toFSD(callsign), toFSD(m_server.getUser().getRealName()));
|
||||
}
|
||||
|
||||
void CNetworkVatlib::sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign)
|
||||
@@ -511,14 +489,14 @@ namespace BlackCore
|
||||
}
|
||||
|
||||
void CNetworkVatlib::sendFsipiCustomPacket(const BlackMisc::Aviation::CCallsign &callsign,
|
||||
const QString &airlineIcao, const QString &aircraftIcao, const QString &combinedType, const QString &modelString)
|
||||
const QString &airlineIcao, const QString &aircraftIcao, const QString &combinedType, const QString &modelString)
|
||||
{
|
||||
QStringList data { { "0" }, airlineIcao, aircraftIcao, { "" }, { "" }, { "" }, { "" }, combinedType, modelString };
|
||||
sendCustomPacket(callsign, "FSIPI", data);
|
||||
}
|
||||
|
||||
void CNetworkVatlib::sendFsipirCustomPacket(const BlackMisc::Aviation::CCallsign &callsign,
|
||||
const QString &airlineIcao, const QString &aircraftIcao, const QString &combinedType, const QString &modelString)
|
||||
const QString &airlineIcao, const QString &aircraftIcao, const QString &combinedType, const QString &modelString)
|
||||
{
|
||||
QStringList data { { "0" }, airlineIcao, aircraftIcao, { "" }, { "" }, { "" }, { "" }, combinedType, modelString };
|
||||
sendCustomPacket(callsign, "FSIPIR", data);
|
||||
@@ -832,7 +810,7 @@ namespace BlackCore
|
||||
//TODO
|
||||
}
|
||||
|
||||
void CNetworkVatlib::onCloudDataReceived(VatSessionID,const VatCloudLayer /** layers **/ [2], VatThunderStormLayer /** storm **/, float /** vis **/, void * /** cbvar **/)
|
||||
void CNetworkVatlib::onCloudDataReceived(VatSessionID, const VatCloudLayer /** layers **/ [2], VatThunderStormLayer /** storm **/, float /** vis **/, void * /** cbvar **/)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
@@ -858,7 +836,7 @@ namespace BlackCore
|
||||
|
||||
void CNetworkVatlib::networkErrorHandler(const char *message)
|
||||
{
|
||||
CLogMessage(static_cast<CNetworkVatlib*>(nullptr)).error(message);
|
||||
CLogMessage(static_cast<CNetworkVatlib *>(nullptr)).error(message);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#define BLACKCORE_NETWORK_VATLIB_H
|
||||
|
||||
#include "network.h"
|
||||
#include "blackmisc/simulation/simdirectaccessownaircraft.h"
|
||||
#include <vatlib/vatlib2.h>
|
||||
#include <QScopedPointer>
|
||||
#include <QTimer>
|
||||
@@ -25,13 +26,13 @@ namespace BlackCore
|
||||
/*!
|
||||
* Implementation of INetwork using the vatlib shim
|
||||
*/
|
||||
class CNetworkVatlib : public INetwork
|
||||
class CNetworkVatlib : public INetwork, public BlackMisc::Simulation::COwnAircraftProviderSupport
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//! Constructor
|
||||
CNetworkVatlib(QObject *parent = nullptr);
|
||||
CNetworkVatlib(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraft, QObject *parent = nullptr);
|
||||
|
||||
//! Destructor
|
||||
virtual ~CNetworkVatlib();
|
||||
@@ -74,12 +75,6 @@ namespace BlackCore
|
||||
virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
|
||||
virtual void setOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft) override;
|
||||
virtual void setOwnAircraftPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override;
|
||||
virtual void setOwnAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override;
|
||||
virtual void setOwnCockpit(const BlackMisc::Aviation::CComSystem &com1,
|
||||
const BlackMisc::Aviation::CComSystem &com2,
|
||||
const BlackMisc::Aviation::CTransponder &xpdr) override;
|
||||
|
||||
// Weather slots
|
||||
virtual void sendMetarQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) override;
|
||||
@@ -147,12 +142,11 @@ namespace BlackCore
|
||||
|
||||
private:
|
||||
QScopedPointer<PCSBClient, VatlibQScopedPointerDeleter> m_net;
|
||||
LoginMode m_loginMode;
|
||||
VatConnectionStatus m_status;
|
||||
BlackMisc::Network::CServer m_server;
|
||||
BlackMisc::Aviation::CCallsign m_callsign;
|
||||
BlackMisc::Aviation::CAircraftIcao m_icaoCode;
|
||||
BlackMisc::Aviation::CAircraft m_ownAircraft; // not using callsign, user, or icao parts of this member because they can't be changed when connected
|
||||
LoginMode m_loginMode;
|
||||
VatConnectionStatus m_status;
|
||||
BlackMisc::Network::CServer m_server;
|
||||
BlackMisc::Aviation::CCallsign m_callsign; //!< "buffered callsign", as this must not change when connected
|
||||
BlackMisc::Aviation::CAircraftIcao m_icaoCode; //!< "buffered icao", as this must not change when connected
|
||||
|
||||
QTimer m_processingTimer;
|
||||
QTimer m_updateTimer;
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "blackmisc/nwtextmessage.h"
|
||||
#include "blackmisc/nwclient.h"
|
||||
#include "blackmisc/pixmap.h"
|
||||
#include "blackmisc/simulation/simdirectaccessownaircraft.h"
|
||||
#include <QObject>
|
||||
|
||||
namespace BlackCore
|
||||
@@ -60,6 +61,15 @@ namespace BlackCore
|
||||
//! Simulator running?
|
||||
virtual bool isSimulating() const = 0;
|
||||
|
||||
//! Originator
|
||||
const QString &simulatorOriginator()
|
||||
{
|
||||
// string is generated once, the timestamp allows to use multiple
|
||||
// components (as long as they are not generated at the same ms)
|
||||
static const QString o = QString("SIMULATOR:").append(QString::number(QDateTime::currentMSecsSinceEpoch()));
|
||||
return o;
|
||||
}
|
||||
|
||||
public slots:
|
||||
|
||||
//! Connect to simulator
|
||||
@@ -71,9 +81,6 @@ namespace BlackCore
|
||||
//! Disconnect from simulator
|
||||
virtual bool disconnectFrom() = 0;
|
||||
|
||||
//! Return user aircraft object
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0;
|
||||
|
||||
//! Add new remote aircraft to the simulator
|
||||
virtual void addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) = 0;
|
||||
|
||||
@@ -90,7 +97,7 @@ namespace BlackCore
|
||||
virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &toChangeAircraft, const BlackMisc::CPropertyIndexVariantMap &changeValues) = 0;
|
||||
|
||||
//! Update own aircraft cockpit (usually from context)
|
||||
virtual bool updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft) = 0;
|
||||
virtual bool updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0;
|
||||
|
||||
//! Simulator info
|
||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0;
|
||||
@@ -101,9 +108,6 @@ namespace BlackCore
|
||||
//! Display a text message
|
||||
virtual void displayTextMessage(const BlackMisc::Network::CTextMessage &message) const = 0;
|
||||
|
||||
//! Own aircraft Model
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const = 0;
|
||||
|
||||
//! Aircraft models for available remote aircrafts
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const = 0;
|
||||
|
||||
@@ -142,6 +146,7 @@ namespace BlackCore
|
||||
//! Installed aircraft models ready or changed
|
||||
void installedAircraftModelsChanged();
|
||||
|
||||
|
||||
protected:
|
||||
//! Emit the combined status
|
||||
//! \sa simulatorStatusChanged;
|
||||
@@ -158,7 +163,7 @@ namespace BlackCore
|
||||
virtual ~ISimulatorFactory() {}
|
||||
|
||||
//! Create a new instance
|
||||
virtual ISimulator *create(QObject *parent = nullptr) = 0;
|
||||
virtual ISimulator *create(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraft, QObject *parent = nullptr) = 0;
|
||||
|
||||
//! Simulator info
|
||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0;
|
||||
|
||||
Reference in New Issue
Block a user