diff --git a/samples/cli_client/client.cpp b/samples/cli_client/client.cpp index a5ccc0c7d..40f931b96 100644 --- a/samples/cli_client/client.cpp +++ b/samples/cli_client/client.cpp @@ -328,11 +328,11 @@ void Client::setOwnAircraftCmd(QTextStream &args) BlackMisc::PhysicalQuantities::CAngle(bank, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), BlackMisc::PhysicalQuantities::CSpeed(gs, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()) )); - aircraft.setCom1System(BlackMisc::Aviation::CComSystem("COM1", BlackMisc::PhysicalQuantities::CFrequency(com1, BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz()))); - aircraft.setCom2System(BlackMisc::Aviation::CComSystem("COM2", BlackMisc::PhysicalQuantities::CFrequency(com2, BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz()))); - aircraft.setTransponder(BlackMisc::Aviation::CTransponder("Transponder", xpdrCode, xpdrMode)); - - ownAircraft().setAircraft(aircraft); + updateCockpit( + BlackMisc::Aviation::CComSystem("COM1", BlackMisc::PhysicalQuantities::CFrequency(com1, BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz())), + BlackMisc::Aviation::CComSystem("COM2", BlackMisc::PhysicalQuantities::CFrequency(com2, BlackMisc::PhysicalQuantities::CFrequencyUnit::MHz())), + BlackMisc::Aviation::CTransponder("Transponder", xpdrCode, xpdrMode), + "cmdClient"); } void Client::setOwnAircraftPositionCmd(QTextStream &args) @@ -341,8 +341,10 @@ void Client::setOwnAircraftPositionCmd(QTextStream &args) double lon; double alt; args >> lat >> lon >> alt; - ownAircraft().setPosition(CCoordinateGeodetic(lat, lon, 0)); - ownAircraft().setAltitude(CAltitude(alt, CAltitude::MeanSeaLevel, CLengthUnit::ft())); + CAircraftSituation situation(getOwnAircraft().getSituation()); + situation.setPosition(CCoordinateGeodetic(lat, lon, 0)); + situation.setAltitude(CAltitude(alt, CAltitude::MeanSeaLevel, CLengthUnit::ft())); + updateOwnSituation(situation); } void Client::setOwnAircraftSituationCmd(QTextStream &args) @@ -355,14 +357,14 @@ void Client::setOwnAircraftSituationCmd(QTextStream &args) double bank; double gs; args >> lat >> lon >> alt >> hdg >> pitch >> bank >> gs; - ownAircraft().setSituation(BlackMisc::Aviation::CAircraftSituation( - BlackMisc::Geo::CCoordinateGeodetic(lat, lon, 0), - BlackMisc::Aviation::CAltitude(alt, BlackMisc::Aviation::CAltitude::MeanSeaLevel, BlackMisc::PhysicalQuantities::CLengthUnit::ft()), - BlackMisc::Aviation::CHeading(hdg, BlackMisc::Aviation::CHeading::True, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), - BlackMisc::PhysicalQuantities::CAngle(pitch, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), - BlackMisc::PhysicalQuantities::CAngle(bank, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), - BlackMisc::PhysicalQuantities::CSpeed(gs, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()) - )); + updateOwnSituation(BlackMisc::Aviation::CAircraftSituation( + BlackMisc::Geo::CCoordinateGeodetic(lat, lon, 0), + BlackMisc::Aviation::CAltitude(alt, BlackMisc::Aviation::CAltitude::MeanSeaLevel, BlackMisc::PhysicalQuantities::CLengthUnit::ft()), + BlackMisc::Aviation::CHeading(hdg, BlackMisc::Aviation::CHeading::True, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), + BlackMisc::PhysicalQuantities::CAngle(pitch, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), + BlackMisc::PhysicalQuantities::CAngle(bank, BlackMisc::PhysicalQuantities::CAngleUnit::deg()), + BlackMisc::PhysicalQuantities::CSpeed(gs, BlackMisc::PhysicalQuantities::CSpeedUnit::kts()) + )); } void Client::setOwnAircraftCockpitCmd(QTextStream &args) diff --git a/src/blackcore/airspace_analyzer.cpp b/src/blackcore/airspace_analyzer.cpp index dd371146a..8b732c6ec 100644 --- a/src/blackcore/airspace_analyzer.cpp +++ b/src/blackcore/airspace_analyzer.cpp @@ -18,9 +18,9 @@ using namespace BlackMisc::PhysicalQuantities; namespace BlackCore { - CAirspaceAnalyzer::CAirspaceAnalyzer(const IOwnAircraftProviderReadOnly *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, INetwork *network, QObject *parent) : + CAirspaceAnalyzer::CAirspaceAnalyzer(IOwnAircraftProvider *ownAircraftProvider, IRemoteAircraftProvider *remoteAircraftProvider, INetwork *network, QObject *parent) : CContinuousWorker(parent, "CAirspaceAnalyzer"), - COwnAircraftAwareReadOnly(ownAircraftProvider), + COwnAircraftAware(ownAircraftProvider), CRemoteAircraftAware(remoteAircraftProvider) { Q_ASSERT_X(network, Q_FUNC_INFO, "Network object required to connect"); diff --git a/src/blackcore/airspace_analyzer.h b/src/blackcore/airspace_analyzer.h index 551dc2c09..7741464eb 100644 --- a/src/blackcore/airspace_analyzer.h +++ b/src/blackcore/airspace_analyzer.h @@ -33,7 +33,7 @@ namespace BlackCore //! class CAirspaceAnalyzer : public BlackMisc::CContinuousWorker, - public BlackMisc::Simulation::COwnAircraftAwareReadOnly, + public BlackMisc::Simulation::COwnAircraftAware, public BlackMisc::Simulation::CRemoteAircraftAware { Q_OBJECT @@ -43,7 +43,7 @@ namespace BlackCore typedef QHash CCallsignTimestampSet; //! Constructor - CAirspaceAnalyzer(const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraftProvider, + CAirspaceAnalyzer(BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, BlackMisc::Simulation::IRemoteAircraftProvider *remoteAircraftProvider, INetwork *network, QObject *parent); diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index 9aba8935a..262fcebab 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -26,9 +26,9 @@ using namespace BlackMisc::PhysicalQuantities; namespace BlackCore { - CAirspaceMonitor::CAirspaceMonitor(QObject *parent, const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraftProvider, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile) + CAirspaceMonitor::CAirspaceMonitor(QObject *parent, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraftProvider, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile) : QObject(parent), - COwnAircraftAwareReadOnly(ownAircraftProvider), + COwnAircraftAware(ownAircraftProvider), m_network(network), m_vatsimBookingReader(bookings), m_vatsimDataFileReader(dataFile), m_analyzer(new CAirspaceAnalyzer(ownAircraftProvider, this, network, this)) { @@ -231,7 +231,7 @@ namespace BlackCore CCallsignSet searchList(callsigns); // myself, which is not in the lists below - CSimulatedAircraft myAircraft(ownAircraft()); + CSimulatedAircraft myAircraft(getOwnAircraft()); if (!myAircraft.getCallsign().isEmpty() && searchList.contains(myAircraft.getCallsign())) { searchList.remove(myAircraft.getCallsign()); @@ -654,7 +654,7 @@ namespace BlackCore station.setFrequency(frequency); station.setPosition(position); station.setOnline(true); - station.calculcateDistanceAndBearingToOwnAircraft(ownAircraft().getPosition()); + station.calculcateDistanceAndBearingToOwnAircraft(getOwnAircraftPosition()); // sync with bookings if (this->m_atcStationsBooked.containsCallsign(callsign)) @@ -826,7 +826,7 @@ namespace BlackCore aircraft.setCallsign(callsign); aircraft.setSituation(situation); aircraft.setTransponder(transponder); - aircraft.calculcateDistanceAndBearingToOwnAircraft(ownAircraft().getPosition()); // distance from myself + aircraft.calculcateDistanceAndBearingToOwnAircraft(getOwnAircraftPosition()); // distance from myself // ICAO from cache if avialable bool setIcao = false; @@ -881,7 +881,7 @@ namespace BlackCore else { // update, aircraft already exists - CLength distance = ownAircraft().calculateGreatCircleDistance(situation.getPosition()); + CLength distance = getOwnAircraft().calculateGreatCircleDistance(situation.getPosition()); distance.switchUnit(CLengthUnit::NM()); CPropertyIndexVariantMap vm; vm.addValue(CAircraft::IndexTransponder, transponder); @@ -922,7 +922,7 @@ namespace BlackCore // update aircraft //! \todo skip aircraft updates for interim positions as for performance reasons - CLength distance = ownAircraft().calculateGreatCircleDistance(iterimSituation.getPosition()); + CLength distance = getOwnAircraft().calculateGreatCircleDistance(iterimSituation.getPosition()); distance.switchUnit(CLengthUnit::NM()); // lloks nicer CPropertyIndexVariantMap vm; vm.addValue(CAircraft::IndexSituation, iterimSituation); diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index 6602abe89..ac60b2c5d 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -31,17 +31,18 @@ namespace BlackCore { //! Keeps track of other entities in the airspace: aircraft, ATC stations, etc. + //! Central instance of data for \sa IRemoteAircraftProvider. class BLACKCORE_EXPORT CAirspaceMonitor : public QObject, public BlackMisc::Simulation::IRemoteAircraftProvider, // those data will be provided from the class CAirspaceMonitor - public BlackMisc::Simulation::COwnAircraftAwareReadOnly // used to obtain in memory inofmration about own aircraft + public BlackMisc::Simulation::COwnAircraftAware // used to obtain in memory inofmration about own aircraft { Q_OBJECT Q_INTERFACES(BlackMisc::Simulation::IRemoteAircraftProvider) public: //! Constructor - CAirspaceMonitor(QObject *parent, const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraft, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile); + CAirspaceMonitor(QObject *parent, BlackMisc::Simulation::IOwnAircraftProvider *ownAircraft, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile); //! \copydoc IRemoteAircraftProvider::getAircraftInRange //! \ingroup remoteaircraftprovider diff --git a/src/blackcore/context_audio.h b/src/blackcore/context_audio.h index 38032880d..708d28f4d 100644 --- a/src/blackcore/context_audio.h +++ b/src/blackcore/context_audio.h @@ -129,16 +129,12 @@ namespace BlackCore //! Audio devices virtual BlackMisc::Audio::CAudioDeviceInfoList getAudioDevices() const = 0; - /*! - * Get current audio device - * \return input and output devices - */ + //! Get current audio device + //! \return input and output devices virtual BlackMisc::Audio::CAudioDeviceInfoList getCurrentAudioDevices() const = 0; - /*! - * Set current audio device - * \param audioDevice can be input or audio device - */ + //! Set current audio device + //! \param audioDevice can be input or audio device virtual void setCurrentAudioDevice(const BlackMisc::Audio::CAudioDeviceInfo &audioDevice) = 0; //! Set voice output volume (0..300) @@ -156,11 +152,9 @@ namespace BlackCore //! Play SELCAL tone virtual void playSelcalTone(const BlackMisc::Aviation::CSelcal &selcal) const = 0; - /*! - * Play notification sound - * \param notification CSoundGenerator::Notification - * \param considerSettings consider settings (notification on/off), false means settings ignored - */ + //! Play notification sound + //! \param notification CSoundGenerator::Notification + //! \param considerSettings consider settings (notification on/off), false means settings ignored virtual void playNotification(uint notification, bool considerSettings) const = 0; //! Enable audio loopback diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 5c0ed20dc..f6d8a1e94 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -72,8 +72,8 @@ namespace BlackCore this->m_dataUpdateTimer->start(30 * 1000); // 5. Airspace contents - const IOwnAircraftProviderReadOnly *ownAircraft = runtime->getCContextOwnAircraft(); - this->m_airspace = new CAirspaceMonitor(this, ownAircraft, this->m_network, this->m_vatsimBookingReader, this->m_vatsimDataFileReader); + Q_ASSERT_X(this->getRuntime()->getCContextOwnAircraft(), Q_FUNC_INFO, "this and own aircraft context must be local"); + this->m_airspace = new CAirspaceMonitor(this, this->getRuntime()->getCContextOwnAircraft(), 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); @@ -170,7 +170,7 @@ namespace BlackCore this->m_currentStatus = INetwork::Connecting; // as semaphore we are going to connect this->m_airspace->setConnected(true); INetwork::LoginMode mode = static_cast(loginMode); - this->getIContextOwnAircraft()->updatePilot(server.getUser()); + this->getIContextOwnAircraft()->updateOwnAircraftPilot(server.getUser()); const CAircraft ownAircraft = this->ownAircraft(); this->m_network->presetServer(server); this->m_network->presetLoginMode(mode); @@ -442,11 +442,11 @@ namespace BlackCore } } - const CAircraft &CContextNetwork::ownAircraft() const + const CSimulatedAircraft CContextNetwork::ownAircraft() const { Q_ASSERT(this->getRuntime()); Q_ASSERT(this->getRuntime()->getCContextOwnAircraft()); - return this->getRuntime()->getCContextOwnAircraft()->ownAircraft(); + return this->getRuntime()->getCContextOwnAircraft()->getOwnAircraft(); } void CContextNetwork::readAtcBookingsFromSource() const diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index cc95c7694..1fdec2c32 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -244,7 +244,7 @@ namespace BlackCore } //! Own aircraft from \sa CContextOwnAircraft - const BlackMisc::Aviation::CAircraft &ownAircraft() const; + const BlackMisc::Simulation::CSimulatedAircraft ownAircraft() const; private slots: //! ATC bookings received diff --git a/src/blackcore/context_ownaircraft.h b/src/blackcore/context_ownaircraft.h index 52088763f..8eae34d90 100644 --- a/src/blackcore/context_ownaircraft.h +++ b/src/blackcore/context_ownaircraft.h @@ -81,12 +81,12 @@ namespace BlackCore void changedPilot(const BlackMisc::Network::CUser &pilot); public slots: - //! Get own aircraft virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0; //! Update position - virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) = 0; + //! \note this is in \sa IContextOwnAircraft as we want to set test positions from the GUI / elsewhere + virtual bool updateOwnPosition(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; @@ -95,13 +95,13 @@ namespace BlackCore 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) = 0; + virtual bool updateOwnAircraftPilot(const BlackMisc::Network::CUser &pilot) = 0; //! Set ICAO data - virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) = 0; + virtual bool updateOwnIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) = 0; //! Set callsign - virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0; + virtual bool updateOwnCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0; //! Own SELCAL code virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) = 0; @@ -110,7 +110,7 @@ namespace BlackCore virtual void setAudioOutputVolume(int outputVolume) = 0; //! Set individual voice rooms (overrides voice rooms) - //! \remarks Empty string "" disables voice room override + //! \note Empty string "" disables voice room override //! \sa enableAutomaticVoiceRoomResolution virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) = 0; diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index 231339a7a..b55d3775d 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -33,48 +33,67 @@ namespace BlackCore Q_ASSERT(this->getRuntime()); Q_ASSERT(this->getRuntime()->getIContextSettings()); - // 1. Init own aircraft + // Init own aircraft this->initOwnAircraft(); } CContextOwnAircraft::~CContextOwnAircraft() { } - const CSimulatedAircraft &CContextOwnAircraft::ownAircraft() const + CSimulatedAircraft CContextOwnAircraft::getOwnAircraft() const { - // not thread safe, check - Q_ASSERT(this->thread() == QThread::currentThread()); + if (this->m_debugEnabled) {CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + QReadLocker l(&m_lockAircraft); return this->m_ownAircraft; } - CSimulatedAircraft &CContextOwnAircraft::ownAircraft() + CCoordinateGeodetic CContextOwnAircraft::getOwnAircraftPosition() const { - // not thread safe, check - Q_ASSERT(this->thread() == QThread::currentThread()); - return this->m_ownAircraft; + QReadLocker l(&m_lockAircraft); + return this->m_ownAircraft.getPosition(); + } + + CAircraftParts CContextOwnAircraft::getOwnAircraftParts() const + { + QReadLocker l(&m_lockAircraft); + return this->m_ownAircraft.getParts(); + } + + CAircraftModel CContextOwnAircraft::getOwnAircraftModel() const + { + QReadLocker l(&m_lockAircraft); + return this->m_ownAircraft.getModel(); + } + + CLength CContextOwnAircraft::getDistanceToOwnAircraft(const ICoordinateGeodetic &position) const + { + return getOwnAircraft().calculateGreatCircleDistance(position); } void CContextOwnAircraft::initOwnAircraft() { Q_ASSERT(this->getRuntime()); Q_ASSERT(this->getRuntime()->getIContextSettings()); - this->m_ownAircraft.initComSystems(); - this->m_ownAircraft.initTransponder(); - CAircraftSituation situation( - CCoordinateGeodetic( - CLatitude::fromWgs84("N 049° 18' 17"), - CLongitude::fromWgs84("E 008° 27' 05"), - CLength(0, CLengthUnit::m())), - CAltitude(312, CAltitude::MeanSeaLevel, CLengthUnit::ft()) - ); - this->m_ownAircraft.setSituation(situation); - this->m_ownAircraft.setPilot(this->getIContextSettings()->getNetworkSettings().getCurrentTrafficNetworkServer().getUser()); + { + QWriteLocker l(&m_lockAircraft); + this->m_ownAircraft.initComSystems(); + this->m_ownAircraft.initTransponder(); + CAircraftSituation situation( + CCoordinateGeodetic( + CLatitude::fromWgs84("N 049° 18' 17"), + CLongitude::fromWgs84("E 008° 27' 05"), + CLength(0, CLengthUnit::m())), + CAltitude(312, CAltitude::MeanSeaLevel, CLengthUnit::ft()) + ); + this->m_ownAircraft.setSituation(situation); + this->m_ownAircraft.setPilot(this->getIContextSettings()->getNetworkSettings().getCurrentTrafficNetworkServer().getUser()); - // from simulator, if available - this->m_ownAircraft.setCallsign(CCallsign("SWIFT")); // would come from settings + // from simulator, if available + this->m_ownAircraft.setCallsign(CCallsign("SWIFT")); // would come from settings - // TODO: This would need to come from somewhere (mappings) - // Own callsign, plane ICAO status, model used - this->m_ownAircraft.setIcaoInfo(CAircraftIcao("C172", "L1P", "GA", "GA", "0000ff")); + // TODO: This would need to come from somewhere (mappings) + // Own callsign, plane ICAO status, model used + this->m_ownAircraft.setIcaoInfo(CAircraftIcao("C172", "L1P", "GA", "GA", "0000ff")); + } // voice rooms, if network is already available if (this->getIContextNetwork()) @@ -89,8 +108,8 @@ namespace BlackCore Q_ASSERT(this->getIContextNetwork()); Q_ASSERT(this->getIContextApplication()); if (!this->getIContextNetwork() || !this->getIContextAudio() || !this->getIContextApplication()) { return; } // no chance to resolve rooms - if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } + if (this->m_voiceRoom1UrlOverride.isEmpty() && this->m_voiceRoom2UrlOverride.isEmpty() && !this->m_automaticVoiceRoomResolution) { return; } if (!this->m_automaticVoiceRoomResolution) { return; } // not responsible @@ -106,9 +125,36 @@ namespace BlackCore emit this->getIContextApplication()->fakedSetComVoiceRoom(rooms); } - bool CContextOwnAircraft::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + bool CContextOwnAircraft::updateOwnModel(const CAircraftModel &model) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude; + QWriteLocker l(&m_lockAircraft); + bool changed = (this->m_ownAircraft.getModel() != model); + if (!changed) { return false; } + this->m_ownAircraft.setModel(model); + return true; + } + + bool CContextOwnAircraft::updateOwnSituation(const CAircraftSituation &situation) + { + QWriteLocker l(&m_lockAircraft); + // there is intentionally no equal check + this->m_ownAircraft.setSituation(situation); + return true; + } + + bool CContextOwnAircraft::updateOwnParts(const CAircraftParts &parts) + { + QWriteLocker l(&m_lockAircraft); + bool changed = (this->m_ownAircraft.getParts() != parts); + if (!changed) { return false; } + this->m_ownAircraft.setParts(parts); + return true; + } + + bool CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + { + if (this->m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude; } + QWriteLocker l(&m_lockAircraft); bool changed = (this->m_ownAircraft.getPosition() != position); if (changed) { this->m_ownAircraft.setPosition(position); } @@ -122,11 +168,15 @@ namespace BlackCore bool CContextOwnAircraft::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << com1 << com2 << transponder; - bool changed = this->m_ownAircraft.hasChangedCockpitData(com1, com2, transponder); + if (this->m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << com1 << com2 << transponder; } + bool changed; + { + QWriteLocker l(&m_lockAircraft); + changed = this->m_ownAircraft.hasChangedCockpitData(com1, com2, transponder); + if (changed) { this->m_ownAircraft.setCockpit(com1, com2, transponder); } + } if (changed) { - this->m_ownAircraft.setCockpit(com1, com2, transponder); emit this->changedAircraftCockpit(this->m_ownAircraft, originator); this->resolveVoiceRooms(); } @@ -138,9 +188,14 @@ namespace BlackCore CComSystem::ComUnit unit = static_cast(comUnit); if (unit != CComSystem::Com1 && unit != CComSystem::Com2) { return false; } if (!CComSystem::isValidComFrequency(frequency)) { return false; } - CComSystem com1 = this->m_ownAircraft.getCom1System(); - CComSystem com2 = this->m_ownAircraft.getCom2System(); - CTransponder xpdr = this->m_ownAircraft.getTransponder(); + CComSystem com1, com2; + CTransponder xpdr; + { + QReadLocker l(&m_lockAircraft); + com1 = this->m_ownAircraft.getCom1System(); + com2 = this->m_ownAircraft.getCom2System(); + xpdr = this->m_ownAircraft.getTransponder(); + } if (unit == CComSystem::Com1) { com1.setFrequencyActive(frequency); @@ -152,41 +207,53 @@ namespace BlackCore return updateCockpit(com1, com2, xpdr, originator); } - bool CContextOwnAircraft::updatePilot(const CUser &pilot) + bool CContextOwnAircraft::updateOwnAircraftPilot(const CUser &pilot) { - if (this->m_ownAircraft.getPilot() == pilot) { return false; } - this->m_ownAircraft.setPilot(pilot); + { + QWriteLocker l(&m_lockAircraft); + if (this->m_ownAircraft.getPilot() == pilot) { return false; } + this->m_ownAircraft.setPilot(pilot); + } emit changedPilot(pilot); return true; } - bool CContextOwnAircraft::updateCallsign(const CCallsign &callsign) + bool CContextOwnAircraft::updateOwnCallsign(const CCallsign &callsign) { - if (this->m_ownAircraft.getCallsign() == callsign) { return false; } - this->m_ownAircraft.setCallsign(callsign); + { + QWriteLocker l(&m_lockAircraft); + if (this->m_ownAircraft.getCallsign() == callsign) { return false; } + this->m_ownAircraft.setCallsign(callsign); + } emit changedCallsign(callsign); return true; } - bool CContextOwnAircraft::updateIcaoData(const CAircraftIcao &icaoData) + bool CContextOwnAircraft::updateOwnIcaoData(const CAircraftIcao &icaoData) { - if (this->m_ownAircraft.getIcaoInfo() == icaoData) { return false; } - this->m_ownAircraft.setIcaoInfo(icaoData); + { + QWriteLocker l(&m_lockAircraft); + if (this->m_ownAircraft.getIcaoInfo() == icaoData) { return false; } + this->m_ownAircraft.setIcaoInfo(icaoData); + } emit changedIcaoData(icaoData); return true; } bool CContextOwnAircraft::updateSelcal(const CSelcal &selcal, const QString &originator) { - if (this->m_ownAircraft.getSelcal() == selcal) { return false; } - this->m_ownAircraft.setSelcal(selcal); + { + QWriteLocker l(&m_lockAircraft); + if (this->m_ownAircraft.getSelcal() == selcal) { return false; } + this->m_ownAircraft.setSelcal(selcal); + } emit this->changedSelcal(selcal, originator); return true; } void CContextOwnAircraft::setAudioOutputVolume(int outputVolume) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << outputVolume; + if (m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << outputVolume; } if (this->getIContextAudio()) this->getIContextAudio()->setVoiceOutputVolume(outputVolume); } @@ -194,25 +261,27 @@ namespace BlackCore { // any of our active frequencies? Q_UNUSED(connected); - if (atcStation.getFrequency() != this->m_ownAircraft.getCom1System().getFrequencyActive() && atcStation.getFrequency() != this->m_ownAircraft.getCom2System().getFrequencyActive()) { return; } + CSimulatedAircraft myAircraft(getOwnAircraft()); + if (atcStation.getFrequency() != myAircraft.getCom1System().getFrequencyActive() && atcStation.getFrequency() != myAircraft.getCom2System().getFrequencyActive()) { return; } this->resolveVoiceRooms(); } void CContextOwnAircraft::ps_changedSimulatorModel(const CSimulatedAircraft &ownAircraft) { + QWriteLocker l(&m_lockAircraft); this->m_ownAircraft.setModel(ownAircraft.getModel()); CAircraftIcao icao(ownAircraft.getIcaoInfo()); if (icao.hasAircraftDesignator()) { - // if the model knows it ICAO, cool - // otherwise we ignore it and take an elsewhere set + // if the model knows its ICAO, cool + // otherwise we ignore it and will use an ICAO elsewhere set this->m_ownAircraft.setIcaoInfo(icao); } } void CContextOwnAircraft::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << voiceRoom1Url << voiceRoom2Url; + if (this->m_debugEnabled) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << voiceRoom1Url << voiceRoom2Url; } this->m_voiceRoom1UrlOverride = voiceRoom1Url.trimmed(); this->m_voiceRoom2UrlOverride = voiceRoom2Url.trimmed(); this->resolveVoiceRooms(); @@ -220,17 +289,10 @@ namespace BlackCore void CContextOwnAircraft::enableAutomaticVoiceRoomResolution(bool enable) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << enable; + if (this->m_debugEnabled) {CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << enable; } this->m_automaticVoiceRoomResolution = enable; } - CSimulatedAircraft CContextOwnAircraft::getOwnAircraft() const - { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << this->m_ownAircraft; - Q_ASSERT(this->thread() == QThread::currentThread()); - return this->m_ownAircraft; - } - bool CContextOwnAircraft::parseCommandLine(const QString &commandLine, const QString &originator) { Q_UNUSED(originator); @@ -245,22 +307,22 @@ namespace BlackCore parser.parse(commandLine); if (!parser.isKnownCommand()) { return false; } - CAircraft ownAircraft = this->ownAircraft(); + CAircraft myAircraft(this->getOwnAircraft()); if (parser.matchesCommand(".x", ".xpdr") && parser.countParts() > 1) { - CTransponder transponder = ownAircraft.getTransponder(); + CTransponder transponder = myAircraft.getTransponder(); int xprCode = parser.toInt(1); if (CTransponder::isValidTransponderCode(xprCode)) { transponder.setTransponderCode(xprCode); - this->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline"); + this->updateCockpit(myAircraft.getCom1System(), myAircraft.getCom2System(), transponder, "commandline"); return true; } else { CTransponder::TransponderMode mode = CTransponder::modeFromString(parser.part(1)); transponder.setTransponderMode(mode); - this->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline"); + this->updateCockpit(myAircraft.getCom1System(), myAircraft.getCom2System(), transponder, "commandline"); return true; } } @@ -269,8 +331,8 @@ namespace BlackCore CFrequency frequency(parser.toDouble(1), CFrequencyUnit::MHz()); if (CComSystem::isValidComFrequency(frequency)) { - CComSystem com1 = ownAircraft.getCom1System(); - CComSystem com2 = ownAircraft.getCom2System(); + CComSystem com1 = myAircraft.getCom1System(); + CComSystem com2 = myAircraft.getCom2System(); if (parser.commandEndsWith("1")) { com1.setFrequencyActive(frequency); @@ -283,7 +345,7 @@ namespace BlackCore { return false; } - this->updateCockpit(com1, com2, ownAircraft.getTransponder(), "commandline"); + this->updateCockpit(com1, com2, myAircraft.getTransponder(), "commandline"); return true; } } @@ -298,9 +360,4 @@ namespace BlackCore return false; } - const CAircraft &CContextOwnAircraft::getAviationAircraft() const - { - return this->m_ownAircraft; - } - } // namespace diff --git a/src/blackcore/context_ownaircraft_impl.h b/src/blackcore/context_ownaircraft_impl.h index d8bbdb1db..da35ddf21 100644 --- a/src/blackcore/context_ownaircraft_impl.h +++ b/src/blackcore/context_ownaircraft_impl.h @@ -23,7 +23,8 @@ namespace BlackCore { - //! Own aircraft context implementation + //! Own aircraft context implementation. + //! Central instance of data for \sa IOwnAircraftProvider . class BLACKCORE_EXPORT CContextOwnAircraft : public IContextOwnAircraft, public BlackMisc::Simulation::IOwnAircraftProvider @@ -37,38 +38,62 @@ namespace BlackCore //! Destructor virtual ~CContextOwnAircraft(); - //! Own aircraft - virtual const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const override; + //! \copydoc IOwnAircraftProvider::getOwnAircraftPosition + //! \ingroup ownaircraftprovider + virtual BlackMisc::Geo::CCoordinateGeodetic getOwnAircraftPosition() const override; - //! Own aircraft - virtual BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() override; + //! \copydoc IOwnAircraftProvider::getOwnAircraftParts + //! \ingroup ownaircraftprovider + virtual BlackMisc::Aviation::CAircraftParts getOwnAircraftParts() const; - public slots: // IContextOwnAircraft overrides + //! \copydoc IOwnAircraftProvider::getOwnAircraftModel + //! \ingroup ownaircraftprovider + virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const; + + //! \copydoc IOwnAircraftProvider::getDistanceToOwnAircraft + //! \ingroup ownaircraftprovider + virtual BlackMisc::PhysicalQuantities::CLength getDistanceToOwnAircraft(const BlackMisc::Geo::ICoordinateGeodetic &position) const override; + + //! \copydoc IOwnAircraftProvider::updateOwnModel + //! \ingroup ownaircraftprovider + virtual bool updateOwnModel(const BlackMisc::Simulation::CAircraftModel &model) override; + + //! \copydoc IOwnAircraftProvider::updateOwnSituation + //! \ingroup ownaircraftprovider + virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override; + + //! \copydoc IOwnAircraftProvider::updateOwnParts + //! \ingroup ownaircraftprovider + virtual bool updateOwnParts(const BlackMisc::Aviation::CAircraftParts &parts) override; + + public slots: //! \copydoc IContextOwnAircraft::getOwnAircraft() - //! \copydoc IOwnAircraftProvider::getOwnAircraft() + //! \ingroup ownaircraftprovider virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override; + //! \copydoc IContextOwnAircraft::updateOwnCallsign + //! \ingroup ownaircraftprovider + virtual bool updateOwnCallsign(const BlackMisc::Aviation::CCallsign &callsign) override; + + //! \copydoc IContextOwnAircraft::updateOwnIcaoData + //! \ingroup ownaircraftprovider + virtual bool updateOwnIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) override; + //! \copydoc IContextOwnAircraft::updatePosition - virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override; + virtual bool updateOwnPosition(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::updateSelcal + virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) override; + //! \copydoc IContextOwnAircraft::updateComFrequency 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) override; - - //! \copydoc IContextOwnAircraft::updateCallsign - virtual bool updateCallsign(const BlackMisc::Aviation::CCallsign &callsign) override; - - //! \copydoc IContextOwnAircraft::updateIcaoData - virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) override; - - //! \copydoc IContextOwnAircraft::updateSelcal - virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) override; + virtual bool updateOwnAircraftPilot(const BlackMisc::Network::CUser &pilot) override; //! \copydoc IContextOwnAircraft::setAudioOutputVolume virtual void setAudioOutputVolume(int outputVolume) override; @@ -113,19 +138,16 @@ namespace BlackCore private: BlackMisc::Simulation::CSimulatedAircraft m_ownAircraft; //!< my aircraft - bool m_automaticVoiceRoomResolution = true; //!< automatic voice room resolution, or disable for override - QString m_voiceRoom1UrlOverride; //!< overridden voice room url - QString m_voiceRoom2UrlOverride; //!< overridden voice room url + bool m_automaticVoiceRoomResolution = true; //!< automatic voice room resolution, or disable for override + QString m_voiceRoom1UrlOverride; //!< overridden voice room url + QString m_voiceRoom2UrlOverride; //!< overridden voice room url + mutable QReadWriteLock m_lockAircraft; //!< lock aircraft //! Init my very own aircraft with some defaults, before overridden by simulator void initOwnAircraft(); //! Resolve voice rooms void resolveVoiceRooms(); - - //! Own aircraft - const BlackMisc::Aviation::CAircraft &getAviationAircraft() const; - }; } diff --git a/src/blackcore/context_ownaircraft_proxy.cpp b/src/blackcore/context_ownaircraft_proxy.cpp index 5a565b1b9..d683da7bb 100644 --- a/src/blackcore/context_ownaircraft_proxy.cpp +++ b/src/blackcore/context_ownaircraft_proxy.cpp @@ -19,9 +19,6 @@ using namespace BlackMisc::Simulation; namespace BlackCore { - /* - * Constructor for DBus - */ CContextOwnAircraftProxy::CContextOwnAircraftProxy(const QString &serviceName, QDBusConnection &connection, CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextOwnAircraft(mode, runtime), m_dBusInterface(nullptr) { this->m_dBusInterface = new BlackMisc::CGenericDBusInterface( @@ -30,17 +27,11 @@ namespace BlackCore this->relaySignals(serviceName, connection); } - /* - * Connect signal / slots - */ void CContextOwnAircraftProxy::relaySignals(const QString &serviceName, QDBusConnection &connection) { bool s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), "changedAircraftCockpit", this, SIGNAL(changedAircraftCockpit(BlackMisc::Simulation::CSimulatedAircraft, QString))); Q_ASSERT(s); - s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(), - "fakedVoiceRoomRequest", this, SIGNAL(changedSelcal(BlackMisc::Aviation::CSelcal, QString))); - Q_ASSERT(s); Q_UNUSED(s); } @@ -49,9 +40,9 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("getOwnAircraft")); } - bool CContextOwnAircraftProxy::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) + bool CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updatePosition"), position, altitude); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnPosition"), position, altitude); } bool CContextOwnAircraftProxy::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) @@ -64,7 +55,7 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateActiveComFrequency"), frequency, comUnit, originator); } - bool CContextOwnAircraftProxy::updatePilot(const BlackMisc::Network::CUser &pilot) + bool CContextOwnAircraftProxy::updateOwnAircraftPilot(const BlackMisc::Network::CUser &pilot) { return this->m_dBusInterface->callDBusRet(QLatin1Literal("updatePilot"), pilot); } @@ -74,14 +65,14 @@ namespace BlackCore return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateSelcal"), selcal, originator); } - bool CContextOwnAircraftProxy::updateCallsign(const CCallsign &callsign) + bool CContextOwnAircraftProxy::updateOwnCallsign(const CCallsign &callsign) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateCallsign"), callsign); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnCallsign"), callsign); } - bool CContextOwnAircraftProxy::updateIcaoData(const CAircraftIcao &icaoData) + bool CContextOwnAircraftProxy::updateOwnIcaoData(const CAircraftIcao &icaoData) { - return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateIcaoData"), icaoData); + return this->m_dBusInterface->callDBusRet(QLatin1Literal("updateOwnIcaoData"), icaoData); } void CContextOwnAircraftProxy::setAudioOutputVolume(int outputVolume) diff --git a/src/blackcore/context_ownaircraft_proxy.h b/src/blackcore/context_ownaircraft_proxy.h index 1c0fe6cb0..2ee649c2c 100644 --- a/src/blackcore/context_ownaircraft_proxy.h +++ b/src/blackcore/context_ownaircraft_proxy.h @@ -39,7 +39,7 @@ namespace BlackCore virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override; //! \copydoc IContextOwnAircraft::updatePosition - virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude) override; + virtual bool updateOwnPosition(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; @@ -48,16 +48,16 @@ namespace BlackCore 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) override; + virtual bool updateOwnAircraftPilot(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) override; + //! \copydoc IContextOwnAircraft::updateOwnCallsign + virtual bool updateOwnCallsign(const BlackMisc::Aviation::CCallsign &callsign) override; - //! \copydoc IContextOwnAircraft::updateIcaoData - virtual bool updateIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) override; + //! \copydoc IContextOwnAircraft::updateOwnIcaoData + virtual bool updateOwnIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) override; //! \copydoc IContextOwnAircraft::setAudioOutputVolumes virtual void setAudioOutputVolume(int outputVolume) override; diff --git a/src/blackcore/network_vatlib.cpp b/src/blackcore/network_vatlib.cpp index e48f087cc..1b0c25e59 100644 --- a/src/blackcore/network_vatlib.cpp +++ b/src/blackcore/network_vatlib.cpp @@ -119,7 +119,7 @@ namespace BlackCore if (isConnected()) { - CSimulatedAircraft myAircraft(ownAircraft()); + CSimulatedAircraft myAircraft(getOwnAircraft()); if (this->m_loginMode == LoginAsObserver) { // Observer @@ -296,14 +296,14 @@ namespace BlackCore { Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't change callsign while still connected"); m_callsign = callsign; - ownAircraft().setCallsign(callsign); + updateOwnCallsign(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); + updateOwnIcaoData(icao); } void CNetworkVatlib::presetLoginMode(LoginMode mode) @@ -316,12 +316,7 @@ namespace BlackCore void CNetworkVatlib::initiateConnection() { Q_ASSERT_X(isDisconnected(), "CNetworkVatlib", "Can't connect while still connected"); - - if (!m_net) - { - initializeSession(); - } - + if (!m_net) { initializeSession(); } QByteArray callsign = toFSD(m_loginMode == LoginAsObserver ? m_callsign.getAsObserverCallsignString() : m_callsign.asString()); @@ -427,7 +422,7 @@ namespace BlackCore { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); if (receivers.isEmpty()) { return; } - CSimulatedAircraft myAircraft(ownAircraft()); + CSimulatedAircraft myAircraft(getOwnAircraft()); if (this->m_loginMode == LoginNormal) { VatInterimPilotPosition pos; @@ -526,7 +521,7 @@ namespace BlackCore void CNetworkVatlib::replyToFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) // private { - QStringList response { QString::number(ownAircraft().getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3)}; + QStringList response { QString::number(getOwnAircraft().getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3)}; Vat_SendClientQueryResponse(m_net.data(), vatClientQueryFreq, toFSD(callsign), toFSD(response)(), response.size()); } @@ -538,7 +533,7 @@ namespace BlackCore void CNetworkVatlib::replyToConfigQuery(const CCallsign &callsign) { - QJsonObject currentConfig = ownAircraft().getParts().toJson(); + QJsonObject currentConfig(getOwnAircraftParts().toJson()); // Fixme: Use QJsonObject with std::initializer_list once 5.4 is baseline currentConfig.insert("is_full_data", true); QJsonObject packet; @@ -567,12 +562,11 @@ namespace BlackCore void CNetworkVatlib::sendIncrementalAircraftConfig() { - if (!isConnected()) return; - - CAircraftParts currentParts = ownAircraft().getParts(); + if (!isConnected()) { return; } + CAircraftParts currentParts(getOwnAircraftParts()); // If it hasn't changed, return - if (m_sentAircraftConfig == currentParts) return; + if (m_sentAircraftConfig == currentParts) { return; } if (!m_tokenBucket.tryConsume()) { @@ -612,8 +606,9 @@ namespace BlackCore void CNetworkVatlib::sendCustomFsinnQuery(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - CAircraftIcao icao = ownAircraft().getIcaoInfo(); - QString modelString = ownAircraft().getModel().getModelString(); + CSimulatedAircraft myAircraft(getOwnAircraft()); + CAircraftIcao icao = myAircraft.getIcaoInfo(); + QString modelString = myAircraft.getModel().getModelString(); if (modelString.isEmpty()) { modelString = defaultModelString(); } QStringList data { { "0" }, icao.getAirlineDesignator(), icao.getAircraftDesignator(), @@ -625,8 +620,9 @@ namespace BlackCore void CNetworkVatlib::sendCustomFsinnReponse(const BlackMisc::Aviation::CCallsign &callsign) { Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected"); - CAircraftIcao icao = ownAircraft().getIcaoInfo(); - QString modelString = ownAircraft().getModel().getModelString(); + CSimulatedAircraft myAircraft(getOwnAircraft()); + CAircraftIcao icao = myAircraft.getIcaoInfo(); + QString modelString = myAircraft.getModel().getModelString(); if (modelString.isEmpty()) { modelString = defaultModelString(); } QStringList data { { "0" }, icao.getAirlineDesignator(), icao.getAircraftDesignator(), diff --git a/src/blackcore/network_vatlib.h b/src/blackcore/network_vatlib.h index e633163a1..7504a652a 100644 --- a/src/blackcore/network_vatlib.h +++ b/src/blackcore/network_vatlib.h @@ -85,6 +85,7 @@ namespace BlackCore //! @} //! \name Weather slots + //! @{ virtual void sendMetarQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) override; virtual void sendWeatherDataQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) override; //! @} @@ -96,7 +97,9 @@ namespace BlackCore void sendAircraftInfo(const BlackMisc::Aviation::CCallsign &callsign); void sendIncrementalAircraftConfig(); - private: //shimlib callbacks + private: + //! \name Shimlib callbacks + //! @{ static void onConnectionStatusChanged(VatSessionID, VatConnectionStatus oldStatus, VatConnectionStatus newStatus, void *cbvar); static void onTextMessageReceived(VatSessionID, const char *from, const char *to, const char *msg, void *cbvar); static void onRadioMessageReceived(VatSessionID, const char *from, int freqCount, int *freqList, const char *message, void *cbvar); @@ -121,6 +124,7 @@ namespace BlackCore static void onPilotPositionUpdate(VatSessionID, const char *callsign, const VatPilotPosition *position, void *cbvar); static void onAircraftConfigReceived(VatSessionID, const char *callsign, const char *aircraftConfig, void *cbvar); static void onCustomPacketReceived(VatSessionID, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar); + //! @} private: QByteArray toFSD(QString qstr) const; diff --git a/src/blackgui/components/logincomponent.cpp b/src/blackgui/components/logincomponent.cpp index 5a9232f28..ffc35c1ba 100644 --- a/src/blackgui/components/logincomponent.cpp +++ b/src/blackgui/components/logincomponent.cpp @@ -185,8 +185,8 @@ namespace BlackGui ownAircraft.setCallsign(aircraftValues.ownCallsign); // set latest ICAO, callsign - this->getIContextOwnAircraft()->updateIcaoData(ownAircraft.getIcaoInfo()); - this->getIContextOwnAircraft()->updateCallsign(ownAircraft.getCallsign()); + this->getIContextOwnAircraft()->updateOwnIcaoData(ownAircraft.getIcaoInfo()); + this->getIContextOwnAircraft()->updateOwnCallsign(ownAircraft.getCallsign()); // Login mode INetwork::LoginMode mode = ui->gbp_LoginMode->getLoginMode(); @@ -216,7 +216,7 @@ namespace BlackGui currentServer = this->getCurrentOtherServer(); } this->ui->frp_CurrentServer->setServer(currentServer); - this->getIContextOwnAircraft()->updatePilot(currentServer.getUser()); + this->getIContextOwnAircraft()->updateOwnAircraftPilot(currentServer.getUser()); // Login msg = this->getIContextNetwork()->connectToNetwork(currentServer, static_cast(mode)); @@ -470,7 +470,7 @@ namespace BlackGui // set value in backend this->mergeGuiIcaoValues(icao); - this->getIContextOwnAircraft()->updateIcaoData(icao); + this->getIContextOwnAircraft()->updateOwnIcaoData(icao); // update GUI this->setGuiIcaoValues(icao, false); diff --git a/src/blackmisc/simulation/ownaircraftprovider.cpp b/src/blackmisc/simulation/ownaircraftprovider.cpp index 857a8ead7..a2f9d7c0b 100644 --- a/src/blackmisc/simulation/ownaircraftprovider.cpp +++ b/src/blackmisc/simulation/ownaircraftprovider.cpp @@ -18,47 +18,109 @@ namespace BlackMisc namespace Simulation { - const CSimulatedAircraft &COwnAircraftAwareReadOnly::ownAircraft() const + const CSimulatedAircraft COwnAircraftAware::getOwnAircraft() const { - Q_ASSERT_X(this->m_ownAircraftProvider, "ownAircraft", "No object available"); - return this->m_ownAircraftProvider->ownAircraft(); + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->getOwnAircraft(); } - const CSimulatedAircraft &COwnAircraftAware::ownAircraft() const + Geo::CCoordinateGeodetic COwnAircraftAware::getOwnAircraftPosition() const { - Q_ASSERT_X(this->m_ownAircraftProvider, "ownAircraft", "No object available"); - return this->m_ownAircraftProvider->ownAircraft(); + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->getOwnAircraftPosition(); } - CSimulatedAircraft &COwnAircraftAware::ownAircraft() + CAircraftParts COwnAircraftAware::getOwnAircraftParts() const { - Q_ASSERT_X(this->m_ownAircraftProvider, "ownAircraft", "No object available"); - return this->m_ownAircraftProvider->ownAircraft(); + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->getOwnAircraftParts(); } - bool COwnAircraftAware::providerUpdateCockpit(const CComSystem &com1, const CComSystem &com2, const CTransponder &transponder, const QString &originator) + CAircraftModel COwnAircraftAware::getOwnAircraftModel() const { - Q_ASSERT_X(this->m_ownAircraftProvider, "providerUpdateCockpit", "No object available"); + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->getOwnAircraftModel(); + } + + CLength COwnAircraftAware::getDistanceToOwnAircraft(const Geo::ICoordinateGeodetic &position) const + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->getDistanceToOwnAircraft(position); + } + + bool COwnAircraftAware::updateCockpit(const CComSystem &com1, const CComSystem &com2, const CTransponder &transponder, const QString &originator) + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); return this->m_ownAircraftProvider->updateCockpit(com1, com2, transponder, originator); } - bool COwnAircraftAware::providerUpdateActiveComFrequency(const CFrequency &frequency, int comUnit, const QString &originator) + bool COwnAircraftAware::updateActiveComFrequency(const CFrequency &frequency, int comUnit, const QString &originator) { - Q_ASSERT_X(this->m_ownAircraftProvider, "providerUpdateActiveComFrequency", "No object available"); + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); return this->m_ownAircraftProvider->updateActiveComFrequency(frequency, comUnit, originator); } - bool COwnAircraftAware::providerUpdateSelcal(const CSelcal &selcal, const QString &originator) + bool COwnAircraftAware::updateSelcal(const CSelcal &selcal, const QString &originator) { - Q_ASSERT_X(this->m_ownAircraftProvider, "providerUpdateSelcal", "No object available"); + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); return this->m_ownAircraftProvider->updateSelcal(selcal, originator); } + bool COwnAircraftAware::updateOwnModel(const CAircraftModel &model) + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->updateOwnModel(model); + } + + bool COwnAircraftAware::updateOwnSituation(const CAircraftSituation &situation) + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->updateOwnSituation(situation); + } + + bool COwnAircraftAware::updateOwnParts(const CAircraftParts &parts) + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->updateOwnParts(parts); + } + + bool COwnAircraftAware::updateOwnCallsign(const CCallsign &callsign) + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->updateOwnCallsign(callsign); + } + + bool COwnAircraftAware::updateOwnIcaoData(const CAircraftIcao &icaoData) + { + Q_ASSERT_X(this->m_ownAircraftProvider, Q_FUNC_INFO, "No object available"); + return this->m_ownAircraftProvider->updateOwnIcaoData(icaoData); + } + + Geo::CCoordinateGeodetic COwnAircraftProviderDummy::getOwnAircraftPosition() const + { + return m_ownAircraft.getPosition(); + } + + CAircraftParts COwnAircraftProviderDummy::getOwnAircraftParts() const + { + return m_ownAircraft.getParts(); + } + + CAircraftModel COwnAircraftProviderDummy::getOwnAircraftModel() const + { + return m_ownAircraft.getModel(); + } + + CLength COwnAircraftProviderDummy::getDistanceToOwnAircraft(const Geo::ICoordinateGeodetic &position) const + { + return m_ownAircraft.calculateGreatCircleDistance(position); + } + bool COwnAircraftProviderDummy::updateCockpit(const Aviation::CComSystem &com1, const Aviation::CComSystem &com2, const Aviation::CTransponder &transponder, const QString &originator) { - ownAircraft().setCom1System(com1); - ownAircraft().setCom2System(com2); - ownAircraft().setTransponder(transponder); + m_ownAircraft.setCom1System(com1); + m_ownAircraft.setCom2System(com2); + m_ownAircraft.setTransponder(transponder); Q_UNUSED(originator); return true; } @@ -67,20 +129,50 @@ namespace BlackMisc { if (!CComSystem::isValidComFrequency(frequency)) { return false; } CComSystem::ComUnit comUnitEnum = static_cast(comUnit); - CComSystem com = ownAircraft().getComSystem(comUnitEnum); + CComSystem com = m_ownAircraft.getComSystem(comUnitEnum); com.setFrequencyActive(frequency); - ownAircraft().setComSystem(com, comUnitEnum); + m_ownAircraft.setComSystem(com, comUnitEnum); Q_UNUSED(originator); return true; } bool COwnAircraftProviderDummy::updateSelcal(const CSelcal &selcal, const QString &originator) { - ownAircraft().setSelcal(selcal); + m_ownAircraft.setSelcal(selcal); Q_UNUSED(originator); return true; } + bool COwnAircraftProviderDummy::updateOwnModel(const CAircraftModel &model) + { + m_ownAircraft.setModel(model); + return true; + } + + bool COwnAircraftProviderDummy::updateOwnSituation(const CAircraftSituation &situation) + { + m_ownAircraft.setSituation(situation); + return true; + } + + bool COwnAircraftProviderDummy::updateOwnParts(const CAircraftParts &parts) + { + m_ownAircraft.setParts(parts); + return true; + } + + bool COwnAircraftProviderDummy::updateOwnCallsign(const CCallsign &callsign) + { + m_ownAircraft.setCallsign(callsign); + return true; + } + + bool COwnAircraftProviderDummy::updateOwnIcaoData(const CAircraftIcao &icaoData) + { + m_ownAircraft.setIcaoInfo(icaoData); + return true; + } + COwnAircraftProviderDummy *COwnAircraftProviderDummy::instance() { static COwnAircraftProviderDummy *dummy = new COwnAircraftProviderDummy(); diff --git a/src/blackmisc/simulation/ownaircraftprovider.h b/src/blackmisc/simulation/ownaircraftprovider.h index 0288606fd..6a7ecb8e1 100644 --- a/src/blackmisc/simulation/ownaircraftprovider.h +++ b/src/blackmisc/simulation/ownaircraftprovider.h @@ -19,111 +19,111 @@ namespace BlackMisc { namespace Simulation { - //! Direct in memory access to own aircraft - class BLACKMISC_EXPORT IOwnAircraftProviderReadOnly + + //! Direct threadsafe in memory access to own aircraft + class IOwnAircraftProvider { public: - //! Own aircraft as reference - //! \note in memory, not thread safe! - virtual const CSimulatedAircraft &ownAircraft() const = 0; - - //! Own aircraft as copy - //! \note not hread safe! - virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0; - - //! Destructor - virtual ~IOwnAircraftProviderReadOnly() {} - }; - - //! Direct in memory access to own aircraft - class BLACKMISC_EXPORT IOwnAircraftProvider : public IOwnAircraftProviderReadOnly - { - public: - - using IOwnAircraftProviderReadOnly::ownAircraft; //! Own aircraft - virtual CSimulatedAircraft &ownAircraft() = 0; + //! \threadsafe + virtual CSimulatedAircraft getOwnAircraft() const = 0; - // cockpit related updates, which can come from multiple sources - // and are subject of roundtrips + //! Own aircraft's position + //! \threadsafe + virtual BlackMisc::Geo::CCoordinateGeodetic getOwnAircraftPosition() const = 0; + + //! Own aircraft's parts + //! \threadsafe + virtual BlackMisc::Aviation::CAircraftParts getOwnAircraftParts() const = 0; + + //! Own aircraft model + //! \threadsafe + virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const = 0; + + //! Distance to own aircraft + //! \threadsafe + virtual BlackMisc::PhysicalQuantities::CLength getDistanceToOwnAircraft(const BlackMisc::Geo::ICoordinateGeodetic &position) const = 0; + + //! Update aircraft's callsign + //! \threadsafe + virtual bool updateOwnCallsign(const BlackMisc::Aviation::CCallsign &callsign) = 0; + + //! Update ICAO data + //! \threadsafe + virtual bool updateOwnIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData) = 0; + + //! Update model + //! \threadsafe + virtual bool updateOwnModel(const BlackMisc::Simulation::CAircraftModel &model) = 0; + + //! Update own situation + virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation) = 0; + + //! Update own parts + virtual bool updateOwnParts(const BlackMisc::Aviation::CAircraftParts &parts) = 0; + + // ------------------------------------------------------------------------ + // cockpit / aircraft related updates, which can come from multiple sources + // and are subject of roundtrips -> originator + // ------------------------------------------------------------------------ //! Update cockpit, but send signals when applicable + //! \threadsafe virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0; //! Update cockpit, but send signals when applicable + //! \threadsafe virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) = 0; //! Update cockpit, but send signals when applicable + //! \threadsafe virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) = 0; - }; - //! For testing - class BLACKMISC_EXPORT COwnAircraftProviderDummy : public QObject, public IOwnAircraftProvider - { - Q_OBJECT - - public: - //! Constructor - COwnAircraftProviderDummy() = default; - - //! Singleton - static COwnAircraftProviderDummy *instance(); - - //! \copydoc IOwnAircraftProviderReadOnly::ownAircraft - virtual const CSimulatedAircraft &ownAircraft() const override { return this->m_ownAircraft; } - - //! \copydoc IOwnAircraftProvider::ownAircraft - virtual CSimulatedAircraft &ownAircraft() override { return this->m_ownAircraft; } - - //! \copydoc IOwnAircraftProvider::getOwnAircraft - virtual CSimulatedAircraft getOwnAircraft() const override { return this->m_ownAircraft; } - - public slots: - //! \copydoc IOwnAircraftProvider::updateCockpit - virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override; - - //! \copydoc IOwnAircraftProvider::updateComFrequency - virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override; - - //! \copydoc IOwnAircraftProvider::updateSelcal - virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator) override; - - private: - BlackMisc::Simulation::CSimulatedAircraft m_ownAircraft; - }; - - //! Delegating class which can be directly used to access an \sa IOwnAircraftProviderReadOnly instance - class BLACKMISC_EXPORT COwnAircraftAwareReadOnly - { - public: - //! \copydoc IOwnAircraftProviderReadOnly::ownAircraft - virtual const CSimulatedAircraft &ownAircraft() const; - - protected: - //! Constructor - COwnAircraftAwareReadOnly(const IOwnAircraftProviderReadOnly *ownAircraftProvider) : m_ownAircraftProvider(ownAircraftProvider) {} - const IOwnAircraftProviderReadOnly *m_ownAircraftProvider = nullptr; //!< access to object }; //! Delegating class which can be directly used to access an \sa IOwnAircraftProvider instance - class BLACKMISC_EXPORT COwnAircraftAware + class COwnAircraftAware { public: - //! \copydoc IOwnAircraftProviderReadOnly::ownAircraft - virtual const CSimulatedAircraft &ownAircraft() const; + //! \copydoc IOwnAircraftProvider::getOwnAircraft + virtual const CSimulatedAircraft getOwnAircraft() const; - //! \copydoc IOwnAircraftProvider::ownAircraft - virtual CSimulatedAircraft &ownAircraft(); + //! \copydoc IOwnAircraftProvider::getOwnAircraftPosition + virtual BlackMisc::Geo::CCoordinateGeodetic getOwnAircraftPosition() const; + + //! \copydoc IOwnAircraftProvider::getOwnAircraftParts + virtual BlackMisc::Aviation::CAircraftParts getOwnAircraftParts() const; + + //! \copydoc IOwnAircraftProvider::getOwnAircraftModel + virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const; + + //! \copydoc IOwnAircraftProvider::getDistanceToOwnAircraft + virtual BlackMisc::PhysicalQuantities::CLength getDistanceToOwnAircraft(const BlackMisc::Geo::ICoordinateGeodetic &position) const; //! \copydoc IOwnAircraftProvider::updateCockpit - virtual bool providerUpdateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator); + virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator); //! \copydoc IOwnAircraftProvider::updateComFrequency - virtual bool providerUpdateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator); + virtual bool updateActiveComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator); //! \copydoc IOwnAircraftProvider::updateSelcal - virtual bool providerUpdateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator); + virtual bool updateSelcal(const BlackMisc::Aviation::CSelcal &selcal, const QString &originator); + + //! \copydoc IOwnAircraftProvider::updateOwnCallsign + virtual bool updateOwnCallsign(const BlackMisc::Aviation::CCallsign &callsign); + + //! \copydoc IOwnAircraftProvider::updateOwnIcaoData + virtual bool updateOwnIcaoData(const BlackMisc::Aviation::CAircraftIcao &icaoData); + + //! \copydoc IOwnAircraftProvider::updateOwnModel + virtual bool updateOwnModel(const BlackMisc::Simulation::CAircraftModel &model); + + //! \copydoc IOwnAircraftProvider::updateOwnSituation + virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation); + + //! \copydoc IOwnAircraftProvider::updateOwnParts + virtual bool updateOwnParts(const BlackMisc::Aviation::CAircraftParts &parts); protected: //! Constructor diff --git a/src/blackmisc/simulation/remoteaircraftproviderdummy.h b/src/blackmisc/simulation/remoteaircraftproviderdummy.h index 6c0dc9a02..57bc0dd92 100644 --- a/src/blackmisc/simulation/remoteaircraftproviderdummy.h +++ b/src/blackmisc/simulation/remoteaircraftproviderdummy.h @@ -20,7 +20,7 @@ namespace BlackMisc namespace Simulation { - //! Dummy implementation for testing purpose + //! Dummy implementation for testing purpose, not thread safe class BLACKMISC_EXPORT CRemoteAircraftProviderDummy : public QObject, public IRemoteAircraftProvider diff --git a/src/blackmisc/simulation/simulatedaircraft.cpp b/src/blackmisc/simulation/simulatedaircraft.cpp index c13bbd18d..e86452530 100644 --- a/src/blackmisc/simulation/simulatedaircraft.cpp +++ b/src/blackmisc/simulation/simulatedaircraft.cpp @@ -112,9 +112,9 @@ namespace BlackMisc void CSimulatedAircraft::setCallsign(const CCallsign &callsign) { - this->m_model.setCallsign(callsign); - this->m_client.setUserCallsign(callsign); - CAircraft::setCallsign(callsign); + CAircraft::setCallsign(callsign); // also sets correct hint + this->m_model.setCallsign(getCallsign()); + this->m_client.setUserCallsign(getCallsign()); } void CSimulatedAircraft::setIcaoInfo(const CAircraftIcao &icao) diff --git a/src/plugins/simulator/fs9/simulator_fs9.cpp b/src/plugins/simulator/fs9/simulator_fs9.cpp index ae55ffbe8..1d7989c5e 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.cpp +++ b/src/plugins/simulator/fs9/simulator_fs9.cpp @@ -215,7 +215,7 @@ namespace BlackSimPlugin { if (m_useFsuipc && m_fsuipc) { - CSimulatedAircraft fsuipcAircraft(ownAircraft()); + CSimulatedAircraft fsuipcAircraft(getOwnAircraft()); bool ok = m_fsuipc->read(fsuipcAircraft, true, true, true); if (ok) { @@ -244,7 +244,7 @@ namespace BlackSimPlugin { MPPositionVelocity mpPositionVelocity; MultiPlayerPacketParser::readMessage(message, mpPositionVelocity); - ownAircraft().setSituation(aircraftSituationfromFS9(mpPositionVelocity)); + updateOwnSituation(aircraftSituationfromFS9(mpPositionVelocity)); break; } case CFs9Sdk::MPCHAT_PACKET_ID_CHAT_TEXT_SEND: @@ -261,7 +261,7 @@ namespace BlackSimPlugin void CSimulatorFs9::updateOwnAircraftFromSimulator(const CAircraft &simDataOwnAircraft) { - this->providerUpdateCockpit( + this->updateCockpit( simDataOwnAircraft.getCom1System(), simDataOwnAircraft.getCom2System(), simDataOwnAircraft.getTransponder(), diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.cpp b/src/plugins/simulator/fscommon/simulator_fscommon.cpp index 7e0bd3dc6..71de9de04 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.cpp +++ b/src/plugins/simulator/fscommon/simulator_fscommon.cpp @@ -77,20 +77,20 @@ namespace BlackSimPlugin void CSimulatorFsCommon::setOwnAircraftModel(const QString &modelName) { - CAircraftModel model = ownAircraft().getModel(); + CAircraftModel model = getOwnAircraftModel(); model.setModelString(modelName); this->setOwnAircraftModel(model); } void CSimulatorFsCommon::setOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model) { - if (ownAircraft().getModel() != model) + if (getOwnAircraftModel() != model) { CAircraftModel newModel(model); newModel.setModelType(CAircraftModel::TypeOwnSimulatorModel); CSimulatorFsCommon::reverseLookupIcaoData(newModel); - ownAircraft().setModel(newModel); - emit ownAircraftModelChanged(ownAircraft()); + updateOwnModel(newModel); + emit ownAircraftModelChanged(getOwnAircraft()); } } diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index 866f8970e..261b6cdaf 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -358,6 +358,7 @@ namespace BlackSimPlugin void CSimulatorFsx::updateOwnAircraftFromSimulator(DataDefinitionOwnAircraft simulatorOwnAircraft) { + CSimulatedAircraft myAircraft(getOwnAircraft()); BlackMisc::Geo::CCoordinateGeodetic position; position.setLatitude(CLatitude(simulatorOwnAircraft.latitude, CAngleUnit::deg())); position.setLongitude(CLongitude(simulatorOwnAircraft.longitude, CAngleUnit::deg())); @@ -369,7 +370,6 @@ namespace BlackSimPlugin aircraftSituation.setHeading(CHeading(simulatorOwnAircraft.trueHeading, CHeading::True, CAngleUnit::deg())); aircraftSituation.setGroundspeed(CSpeed(simulatorOwnAircraft.velocity, CSpeedUnit::kts())); aircraftSituation.setAltitude(CAltitude(simulatorOwnAircraft.altitude, CAltitude::MeanSeaLevel, CLengthUnit::ft())); - ownAircraft().setSituation(aircraftSituation); CAircraftLights lights(simulatorOwnAircraft.lightStrobe, simulatorOwnAircraft.lightLanding, @@ -378,8 +378,8 @@ namespace BlackSimPlugin simulatorOwnAircraft.lightNav, simulatorOwnAircraft.lightLogo); - QList helperList { simulatorOwnAircraft.engine1Combustion != 0, simulatorOwnAircraft.engine2Combustion != 0, - simulatorOwnAircraft.engine3Combustion != 0, simulatorOwnAircraft.engine4Combustion != 0 + QList helperList {simulatorOwnAircraft.engine1Combustion != 0, simulatorOwnAircraft.engine2Combustion != 0, + simulatorOwnAircraft.engine3Combustion != 0, simulatorOwnAircraft.engine4Combustion != 0 }; CAircraftEngineList engines; @@ -394,33 +394,37 @@ namespace BlackSimPlugin engines, simulatorOwnAircraft.simOnGround); - ownAircraft().setParts(parts); - - CComSystem com1 = ownAircraft().getCom1System(); // set defaults - CComSystem com2 = ownAircraft().getCom2System(); - CTransponder transponder = ownAircraft().getTransponder(); + // set values + updateOwnSituation(aircraftSituation); + updateOwnParts(parts); // When I change cockpit values in the sim (from GUI to simulator, not originating from simulator) // it takes a little while before these values are set in the simulator. // To avoid jitters, I wait some update cylces to stabilize the values if (m_skipCockpitUpdateCycles < 1) { + // defaults + CComSystem com1(myAircraft.getCom1System()); // set defaults + CComSystem com2(myAircraft.getCom2System()); + CTransponder transponder(myAircraft.getTransponder()); + + // updates com1.setFrequencyActive(CFrequency(simulatorOwnAircraft.com1ActiveMHz, CFrequencyUnit::MHz())); com1.setFrequencyStandby(CFrequency(simulatorOwnAircraft.com1StandbyMHz, CFrequencyUnit::MHz())); - bool changedCom1 = ownAircraft().getCom1System() != com1; + bool changedCom1 = myAircraft.getCom1System() != com1; this->m_simCom1 = com1; com2.setFrequencyActive(CFrequency(simulatorOwnAircraft.com2ActiveMHz, CFrequencyUnit::MHz())); com2.setFrequencyStandby(CFrequency(simulatorOwnAircraft.com2StandbyMHz, CFrequencyUnit::MHz())); - bool changedCom2 = ownAircraft().getCom2System() != com2; + bool changedCom2 = myAircraft.getCom2System() != com2; this->m_simCom2 = com2; transponder.setTransponderCode(simulatorOwnAircraft.transponderCode); - bool changedXpr = (ownAircraft().getTransponderCode() != transponder.getTransponderCode()); + bool changedXpr = (myAircraft.getTransponderCode() != transponder.getTransponderCode()); if (changedCom1 || changedCom2 || changedXpr) { - this->providerUpdateCockpit(com1, com2, transponder, simulatorOriginator()); + this->updateCockpit(com1, com2, transponder, simulatorOriginator()); } } else @@ -440,11 +444,12 @@ namespace BlackSimPlugin { newMode = sbDataArea.isStandby() ? CTransponder::StateStandby : CTransponder::ModeC; } - bool changed = (this->ownAircraft().getTransponderMode() != newMode); + CSimulatedAircraft myAircraft(this->getOwnAircraft()); + bool changed = (myAircraft.getTransponderMode() != newMode); if (!changed) { return; } - CTransponder xpdr = this->ownAircraft().getTransponder(); + CTransponder xpdr = myAircraft.getTransponder(); xpdr.setTransponderMode(newMode); - this->providerUpdateCockpit(ownAircraft().getCom1System(), ownAircraft().getCom2System(), xpdr, this->simulatorOriginator()); + this->updateCockpit(myAircraft.getCom1System(), myAircraft.getCom2System(), xpdr, this->simulatorOriginator()); } void CSimulatorFsx::setSimConnectObjectID(DWORD requestID, DWORD objectID) @@ -476,7 +481,7 @@ namespace BlackSimPlugin SimConnect_CallDispatch(m_hSimConnect, SimConnectProc, this); if (m_useFsuipc && m_fsuipc) { - CSimulatedAircraft fsuipcAircraft(ownAircraft()); + CSimulatedAircraft fsuipcAircraft(getOwnAircraft()); //! \todo split in high / low frequency reads bool ok = m_fsuipc->read(fsuipcAircraft, true, true, true); if (ok) diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 5b6f09bc2..23c7b25e3 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -148,7 +148,7 @@ namespace BlackSimPlugin protected: //! Timer event (our SimConnect event loop), runs \sa ps_dispatch //! \sa m_simconnectTimerId - virtual void timerEvent(QTimerEvent *event); + virtual void timerEvent(QTimerEvent *event) override; private slots: //! Dispatch SimConnect messages @@ -220,8 +220,7 @@ namespace BlackSimPlugin virtual void stop() override; private: - QTimer *m_timer; - + QTimer *m_timer { nullptr }; }; } diff --git a/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp b/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp index a7d21badb..04bfcadb8 100644 --- a/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx_simconnectproc.cpp @@ -166,7 +166,7 @@ namespace BlackSimPlugin case SIMCONNECT_RECV_ID_AIRPORT_LIST: { const CLength maxDistance(200.0, CLengthUnit::NM()); - const CCoordinateGeodetic posAircraft = simulatorFsx->ownAircraft().getPosition(); + const CCoordinateGeodetic posAircraft(simulatorFsx->getOwnAircraftPosition()); SIMCONNECT_RECV_AIRPORT_LIST *pAirportList = (SIMCONNECT_RECV_AIRPORT_LIST *) pData; for (unsigned i = 0; i < pAirportList->dwArraySize; ++i) { diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index c3494fdb0..257ea0188 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -111,11 +111,16 @@ namespace BlackSimPlugin situation.setPitch({ m_xplaneData.pitch, CAngleUnit::deg() }); situation.setBank({ m_xplaneData.roll, CAngleUnit::deg() }); situation.setGroundspeed({ m_xplaneData.groundspeed, CSpeedUnit::m_s() }); - ownAircraft().setSituation(situation); - ownAircraft().setIcaoInfo(Aviation::CAircraftIcao { m_xplaneData.aircraftIcaoCode }); - ownAircraft().setCom1System(Aviation::CComSystem::getCom1System({ m_xplaneData.com1Active, CFrequencyUnit::kHz() }, { m_xplaneData.com1Standby, CFrequencyUnit::kHz() })); - ownAircraft().setCom2System(Aviation::CComSystem::getCom2System({ m_xplaneData.com2Active, CFrequencyUnit::kHz() }, { m_xplaneData.com2Standby, CFrequencyUnit::kHz() })); - ownAircraft().setTransponder(Aviation::CTransponder::getStandardTransponder(m_xplaneData.xpdrCode, xpdrMode(m_xplaneData.xpdrMode, m_xplaneData.xpdrIdent))); + + // updates + updateOwnIcaoData(Aviation::CAircraftIcao { m_xplaneData.aircraftIcaoCode }); + updateOwnSituation(situation); + updateCockpit( + Aviation::CComSystem::getCom1System({ m_xplaneData.com1Active, CFrequencyUnit::kHz() }, { m_xplaneData.com1Standby, CFrequencyUnit::kHz() }), + Aviation::CComSystem::getCom2System({ m_xplaneData.com2Active, CFrequencyUnit::kHz() }, { m_xplaneData.com2Standby, CFrequencyUnit::kHz() }), + Aviation::CTransponder::getStandardTransponder(m_xplaneData.xpdrCode, xpdrMode(m_xplaneData.xpdrMode, m_xplaneData.xpdrIdent)), + simulatorOriginator() + ); } } @@ -151,7 +156,7 @@ namespace BlackSimPlugin { m_xplaneData.gearReployRatio > 0 }, { static_cast(m_xplaneData.flapsReployRatio * 100) }, { m_xplaneData.speedBrakeRatio > 0.5 }, engines, { m_xplaneData.onGroundAll } }; - ownAircraft().setParts(parts); + updateOwnParts(parts); } } @@ -236,14 +241,16 @@ namespace BlackSimPlugin //! \todo XP, change as appropriate // try to set correct model and ICAO values here // thy show up in GUI - CAircraftModel model(ownAircraft().getModel()); + CAircraftModel model(getOwnAircraftModel()); model.setModelType(CAircraftModel::TypeOwnSimulatorModel); model.setFileName(path + "/" + filename); CAircraftIcao aircraftIcao(icao); aircraftIcao.setLivery(livery); - ownAircraft().setIcaoInfo(aircraftIcao); - ownAircraft().setModel(model); - emit ownAircraftModelChanged(ownAircraft()); + + // updates + updateOwnIcaoData(aircraftIcao); + updateOwnModel(model); + emit ownAircraftModelChanged(getOwnAircraft()); } void CSimulatorXPlane::displayStatusMessage(const BlackMisc::CStatusMessage &message) const diff --git a/src/swiftgui_standard/swiftguistd_aircraft.cpp b/src/swiftgui_standard/swiftguistd_aircraft.cpp index 43d3fbbcf..df2ef6708 100644 --- a/src/swiftgui_standard/swiftguistd_aircraft.cpp +++ b/src/swiftgui_standard/swiftguistd_aircraft.cpp @@ -52,5 +52,5 @@ void SwiftGuiStd::setTestPosition(const QString &wgsLatitude, const QString &wgs this->m_ownAircraft.setPosition(coordinate); this->m_ownAircraft.setAltitude(altitude); - this->getIContextOwnAircraft()->updatePosition(coordinate, altitude); + this->getIContextOwnAircraft()->updateOwnPosition(coordinate, altitude); }