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:
Klaus Basan
2015-02-01 18:37:22 +01:00
parent 107e343673
commit fe4613a868
21 changed files with 222 additions and 483 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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();

View File

@@ -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
*/

View File

@@ -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);

View File

@@ -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;

View File

@@ -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();

View File

@@ -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;

View File

@@ -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)

View File

@@ -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;

View File

@@ -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());
}
}

View File

@@ -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>

View File

@@ -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;

View File

@@ -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());

View File

@@ -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;

View File

@@ -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"));

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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;