From fe4613a868e797b60920b3f50c5c01b5a656ca11 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 1 Feb 2015 18:37:22 +0100 Subject: [PATCH] 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 --- src/blackcore/airspace_monitor.cpp | 48 +++++--- src/blackcore/airspace_monitor.h | 26 ++-- src/blackcore/context_network.h | 6 + src/blackcore/context_network_impl.cpp | 27 ++--- src/blackcore/context_network_impl.h | 7 +- src/blackcore/context_ownaircraft.h | 39 +----- src/blackcore/context_ownaircraft_impl.cpp | 126 ++------------------ src/blackcore/context_ownaircraft_impl.h | 36 ++---- src/blackcore/context_ownaircraft_proxy.cpp | 45 ++----- src/blackcore/context_ownaircraft_proxy.h | 25 +--- src/blackcore/context_runtime.cpp | 5 - src/blackcore/context_runtime.h | 2 + src/blackcore/context_simulator.h | 3 - src/blackcore/context_simulator_impl.cpp | 124 ++++++++----------- src/blackcore/context_simulator_impl.h | 18 ++- src/blackcore/context_simulator_proxy.cpp | 5 - src/blackcore/context_simulator_proxy.h | 3 - src/blackcore/network.h | 25 ---- src/blackcore/network_vatlib.cpp | 92 ++++++-------- src/blackcore/network_vatlib.h | 22 ++-- src/blackcore/simulator.h | 21 ++-- 21 files changed, 222 insertions(+), 483 deletions(-) diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index 6e6eae1d8..c225a4b6d 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -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); diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index daf5facc9..5743b6253 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -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 m_metarCache; QMap m_flightPlanCache; QMap 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; diff --git a/src/blackcore/context_network.h b/src/blackcore/context_network.h index 22e133fc2..24c58d417 100644 --- a/src/blackcore/context_network.h +++ b/src/blackcore/context_network.h @@ -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(); diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index cf5bf3b38..687b306e6 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -21,6 +21,7 @@ #include "blackmisc/avatcstationlist.h" #include "blackmisc/logmessage.h" #include "blackmisc/simplecommandparser.h" +#include "blackmisc/simulation/simdirectaccessownaircraft.h" #include #include @@ -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(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 */ diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index 957a6aaef..ae6beffec 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -23,6 +23,7 @@ #include "blackmisc/nwclientlist.h" #include "blackmisc/digestsignal.h" #include "blackmisc/logmessage.h" +#include "blackmisc/avaircraftsituationlist.h" #include @@ -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); diff --git a/src/blackcore/context_ownaircraft.h b/src/blackcore/context_ownaircraft.h index 48d63de05..635aa8d66 100644 --- a/src/blackcore/context_ownaircraft.h +++ b/src/blackcore/context_ownaircraft.h @@ -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; diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index 7206a337b..a32ce255e 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -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(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(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(); diff --git a/src/blackcore/context_ownaircraft_impl.h b/src/blackcore/context_ownaircraft_impl.h index 9318ee561..a6ecd789b 100644 --- a/src/blackcore/context_ownaircraft_impl.h +++ b/src/blackcore/context_ownaircraft_impl.h @@ -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; diff --git a/src/blackcore/context_ownaircraft_proxy.cpp b/src/blackcore/context_ownaircraft_proxy.cpp index 0874d1f6a..8884396e5 100644 --- a/src/blackcore/context_ownaircraft_proxy.cpp +++ b/src/blackcore/context_ownaircraft_proxy.cpp @@ -45,34 +45,9 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(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(QLatin1Literal("updateAircraft"), aircraft, originator); - } - - bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) - { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateAircraft"), aircraft, originator); - } - - bool CContextOwnAircraftProxy::updateModel(const Simulation::CAircraftModel &model, const QString &originator) - { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateModel"), model, originator); - } - - bool CContextOwnAircraftProxy::updateClient(const Network::CClient &client, const QString &originator) - { - return this->m_dBusInterface->callDBusRet(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(QLatin1Literal("updatePosition"), position, altitude, originator); - } - - bool CContextOwnAircraftProxy::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) - { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateSituation"), situation, originator); + return this->m_dBusInterface->callDBusRet(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(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(QLatin1Literal("updateComFrequency"), frequency, comUnit, originator); + return this->m_dBusInterface->callDBusRet(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(QLatin1Literal("updatePilot"), pilot, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updatePilot"), pilot); } bool CContextOwnAircraftProxy::updateSelcal(const CSelcal &selcal, const QString &originator) @@ -95,14 +70,14 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateSelcal"), selcal, originator); } - bool CContextOwnAircraftProxy::updateCallsign(const CCallsign &callsign, const QString &originator) + bool CContextOwnAircraftProxy::updateCallsign(const CCallsign &callsign) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateCallsign"), callsign, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateCallsign"), callsign); } - bool CContextOwnAircraftProxy::updateIcaoData(const CAircraftIcao &icaoData, const QString &originator) + bool CContextOwnAircraftProxy::updateIcaoData(const CAircraftIcao &icaoData) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateIcaoData"), icaoData, originator); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateIcaoData"), icaoData); } void CContextOwnAircraftProxy::setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) diff --git a/src/blackcore/context_ownaircraft_proxy.h b/src/blackcore/context_ownaircraft_proxy.h index 3ce022d80..c9caa9408 100644 --- a/src/blackcore/context_ownaircraft_proxy.h +++ b/src/blackcore/context_ownaircraft_proxy.h @@ -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; diff --git a/src/blackcore/context_runtime.cpp b/src/blackcore/context_runtime.cpp index ff37989fe..3da0a18eb 100644 --- a/src/blackcore/context_runtime.cpp +++ b/src/blackcore/context_runtime.cpp @@ -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()); } } diff --git a/src/blackcore/context_runtime.h b/src/blackcore/context_runtime.h index db8bc9c38..284410cc2 100644 --- a/src/blackcore/context_runtime.h +++ b/src/blackcore/context_runtime.h @@ -14,6 +14,8 @@ #include "blackcore/context_runtime_config.h" #include "blackmisc/statusmessagelist.h" +#include "blackmisc/simulation/simdirectaccessownaircraft.h" + #include #include #include diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index c5da15496..14d527063 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -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; diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 4e33f56aa..201e0bffc 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -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()); diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index 33b244f6c..ecdb71da7 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -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 m_simulatorFactories; QFuture m_canConnectResult; diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index 8e4935368..9689c6401 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -87,11 +87,6 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("disconnectFromSimulator")); } - BlackMisc::Simulation::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const - { - return m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraftModel")); - } - CAirportList CContextSimulatorProxy::getAirportsInRange() const { return m_dBusInterface->callDBusRet(QLatin1Literal("getAirportsInRange")); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index fa99337f3..595e99b90 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -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; diff --git a/src/blackcore/network.h b/src/blackcore/network.h index db9294a8b..0bd6e2a08 100644 --- a/src/blackcore/network.h +++ b/src/blackcore/network.h @@ -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 diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index f64bbe1b9..9c47d52e2 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -21,22 +21,23 @@ static_assert(! std::is_abstract::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(m_ownAircraft.getTransponderCode()); + pos.transponderCode = static_cast(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(nullptr)).error(message); + CLogMessage(static_cast(nullptr)).error(message); } } // namespace diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index 00c3f3aaf..587a09678 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -13,6 +13,7 @@ #define BLACKCORE_NETWORK_VATLIB_H #include "network.h" +#include "blackmisc/simulation/simdirectaccessownaircraft.h" #include #include #include @@ -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 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; diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 28ccff428..d6884d30c 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -20,6 +20,7 @@ #include "blackmisc/nwtextmessage.h" #include "blackmisc/nwclient.h" #include "blackmisc/pixmap.h" +#include "blackmisc/simulation/simdirectaccessownaircraft.h" #include 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;