diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index d5875d291..ddf3fe9f3 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -59,6 +59,76 @@ namespace BlackCore this->connect(&this->m_atcWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_atcControllerDisconnected); } + const CSimulatedAircraftList &CAirspaceMonitor::renderedAircraft() const + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return m_aircraftInRange; + } + + CSimulatedAircraftList &CAirspaceMonitor::renderedAircraft() + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return m_aircraftInRange; + } + + const CAircraftSituationList &CAirspaceMonitor::renderedAircraftSituations() const + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return m_aircraftSituations; + } + + CAircraftSituationList &CAirspaceMonitor::renderedAircraftSituations() + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return m_aircraftSituations; + } + + CAircraftSituationList CAirspaceMonitor::getRenderedAircraftSituations() const + { + if (this->thread() == QThread::currentThread()) { return this->m_aircraftSituations; } + CAircraftSituationList situations; + bool s = QMetaObject::invokeMethod(const_cast(this), // strip away const, invoke will not change anything, + "getRenderedAircraftSituations", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(CAircraftSituationList, situations) + ); + Q_ASSERT(s); + Q_UNUSED(s); + return situations; + } + + const CAircraftPartsList &CAirspaceMonitor::renderedAircraftParts() const + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return m_aircraftParts; + } + + CAircraftPartsList &CAirspaceMonitor::renderedAircraftParts() + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return m_aircraftParts; + } + + CAircraftPartsList CAirspaceMonitor::getRenderedAircraftParts() const + { + if (this->thread() == QThread::currentThread()) { return this->m_aircraftParts; } + CAircraftPartsList parts; + bool s = QMetaObject::invokeMethod(const_cast(this), // strip away const, invoke will not change anything + "getRenderedAircraftParts", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(CAircraftPartsList, parts) + ); + Q_ASSERT(s); + Q_UNUSED(s); + return parts; + } + bool CAirspaceMonitor::updateAircraftEnabled(const CCallsign &callsign, bool enabledForRedering, const QString &originator) { CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexEnabled, CVariant::fromValue(enabledForRedering)); diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index 2a9512cd4..2a0909a33 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -44,22 +44,22 @@ namespace BlackCore CAirspaceMonitor(QObject *parent, const BlackMisc::Simulation::IOwnAircraftProviderReadOnly *ownAircraft, INetwork *network, CVatsimBookingReader *bookings, CVatsimDataFileReader *dataFile); //! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraft - virtual const BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() const override { return m_aircraftInRange; } + virtual const BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() const override; //! \copydoc IRenderedAircraftProvider::renderedAircraft - virtual BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() override { return m_aircraftInRange; } + virtual BlackMisc::Simulation::CSimulatedAircraftList &renderedAircraft() override; //! \copydoc IRenderedAircraftProvider::renderedAircraftSituations - virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const override { return m_aircraftSituations; } + virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const override; //! \copydoc IRenderedAircraftProvider::renderedAircraftSituations - virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() override { return m_aircraftSituations; } + virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() override; //! \copydoc IRenderedAircraftProvider::renderedAircraftParts - virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const override { return m_aircraftParts; } + virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const override; //! \copydoc IRenderedAircraftProvider::renderedAircraftParts - virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() override { return m_aircraftParts; } + virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() override; //! \copydoc IRenderedAircraftProvider::renderedAircraftParts virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRedering, const QString &originator) override; @@ -95,6 +95,9 @@ namespace BlackCore //! Returns the closest ATC station operating on the given frequency, if any BlackMisc::Aviation::CAtcStation getAtcStationForComUnit(const BlackMisc::Aviation::CComSystem &comSystem); + //! Clear the contents + void clear(); + //! Request to update other clients' data from the network void requestDataUpdates(); @@ -104,6 +107,13 @@ namespace BlackCore //! Create dummy entries for performance tests void testCreateDummyOnlineAtcStations(int number); + public slots: + //! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftSituations + virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const override; + + //! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftParts + virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const override; + signals: //! Online ATC stations were changed void changedAtcStationsOnline(); @@ -126,10 +136,6 @@ namespace BlackCore //! Read for model matching void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &renderedAircraft); - public: - //! Clear the contents - void clear(); - private: BlackMisc::Aviation::CAtcStationList m_atcStationsOnline; BlackMisc::Aviation::CAtcStationList m_atcStationsBooked; diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 45b1f2945..5cc12e11b 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -103,6 +103,12 @@ namespace BlackCore return m_airspace->renderedAircraftSituations(); } + CAircraftSituationList CContextNetwork::getRenderedAircraftSituations() const + { + Q_ASSERT(this->m_airspace); + return m_airspace->getRenderedAircraftSituations(); + } + const CAircraftSituationList &CContextNetwork::renderedAircraftSituations() const { Q_ASSERT(this->m_airspace); @@ -121,6 +127,12 @@ namespace BlackCore return m_airspace->renderedAircraftParts(); } + CAircraftPartsList CContextNetwork::getRenderedAircraftParts() const + { + Q_ASSERT(this->m_airspace); + return m_airspace->getRenderedAircraftParts(); + } + void CContextNetwork::gracefulShutdown() { if (this->m_vatsimBookingReader) { this->m_vatsimBookingReader->requestStop(); this->m_vatsimBookingReader->quit(); } @@ -332,6 +344,18 @@ namespace BlackCore this->m_vatsimBookingReader->readInBackgroundThread(); } + CAtcStationList CContextNetwork::getAtcStationsOnline() const + { + BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + return this->m_airspace->getAtcStationsOnline(); + } + + CAtcStationList CContextNetwork::getAtcStationsBooked() const + { + BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + return this->m_airspace->getAtcStationsBooked(); + } + CSimulatedAircraftList CContextNetwork::getAircraftInRange() const { BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index 1ae583437..122d05f3c 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -60,7 +60,7 @@ namespace BlackCore //! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraftSituations virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() override; - //! \copydoc IRenderedAircraftProvider::renderedAircraftParts + //! \copydoc IRenderedAircraftProviderReadOnly::renderedAircraftParts virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const override; //! \copydoc IRenderedAircraftProvider::renderedAircraftParts @@ -72,18 +72,10 @@ namespace BlackCore virtual void readAtcBookingsFromSource() const override; //! \copydoc IContextNetwork::getAtcStationsOnline() - virtual BlackMisc::Aviation::CAtcStationList getAtcStationsOnline() const override - { - BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; - return this->m_airspace->getAtcStationsOnline(); - } + virtual BlackMisc::Aviation::CAtcStationList getAtcStationsOnline() const override; //! \copydoc IContextNetwork::getAtcStationsBooked() - virtual BlackMisc::Aviation::CAtcStationList getAtcStationsBooked() const override - { - BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; - return this->m_airspace->getAtcStationsBooked(); - } + virtual BlackMisc::Aviation::CAtcStationList getAtcStationsBooked() const override; //! \copydoc IContextNetwork::getAircraftInRange() virtual BlackMisc::Simulation::CSimulatedAircraftList getAircraftInRange() const override; @@ -91,6 +83,12 @@ namespace BlackCore //! \copydoc IContextNetwork::getAircraftForCallsign virtual BlackMisc::Simulation::CSimulatedAircraft getAircraftForCallsign(const BlackMisc::Aviation::CCallsign &callsign) const override; + //! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftSituations + virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const override; + + //! \copydoc IRenderedAircraftProviderReadOnly::getRenderedAircraftParts + virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const override; + //! \copydoc IContextNetwork::connectToNetwork() virtual BlackMisc::CStatusMessage connectToNetwork(const BlackMisc::Network::CServer &server, uint mode) override; diff --git a/src/blackcore/context_ownaircraft_impl.cpp b/src/blackcore/context_ownaircraft_impl.cpp index 7ce3d44b8..1b62e0503 100644 --- a/src/blackcore/context_ownaircraft_impl.cpp +++ b/src/blackcore/context_ownaircraft_impl.cpp @@ -39,9 +39,20 @@ namespace BlackCore CContextOwnAircraft::~CContextOwnAircraft() { } - /* - * Init own aircraft - */ + const CSimulatedAircraft &CContextOwnAircraft::ownAircraft() const + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return this->m_ownAircraft; + } + + CSimulatedAircraft &CContextOwnAircraft::ownAircraft() + { + // not thread safe, check + Q_ASSERT(this->thread() == QThread::currentThread()); + return this->m_ownAircraft; + } + void CContextOwnAircraft::initOwnAircraft() { Q_ASSERT(this->getRuntime()); @@ -202,7 +213,16 @@ namespace BlackCore CSimulatedAircraft CContextOwnAircraft::getOwnAircraft() const { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << this->m_ownAircraft; - return this->m_ownAircraft; + if (this->thread() == QThread::currentThread()) { return this->m_ownAircraft; } + CSimulatedAircraft aircraft; + bool s = QMetaObject::invokeMethod(const_cast(this), // strip away const, invoke will not change anything + "getOwnAircraft", + Qt::BlockingQueuedConnection, + Q_RETURN_ARG(CSimulatedAircraft, aircraft) + ); + Q_ASSERT(s); + Q_UNUSED(s); + return aircraft; } bool CContextOwnAircraft::parseCommandLine(const QString &commandLine) diff --git a/src/blackcore/context_ownaircraft_impl.h b/src/blackcore/context_ownaircraft_impl.h index 96753c895..c2318c0b8 100644 --- a/src/blackcore/context_ownaircraft_impl.h +++ b/src/blackcore/context_ownaircraft_impl.h @@ -37,14 +37,15 @@ namespace BlackCore virtual ~CContextOwnAircraft(); //! Own aircraft - virtual const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const override { return this->m_ownAircraft; } + virtual const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const override; //! Own aircraft - virtual BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() override { return this->m_ownAircraft; } + virtual BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() override; public slots: // IContextOwnAircraft overrides //! \copydoc IContextOwnAircraft::getOwnAircraft() + //! \copydoc IOwnAircraftProvider::getOwnAircraft() virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override; //! \copydoc IContextOwnAircraft::updatePosition diff --git a/src/blackmisc/simulation/simdirectaccessownaircraft.h b/src/blackmisc/simulation/simdirectaccessownaircraft.h index 23afbe889..73ec7e011 100644 --- a/src/blackmisc/simulation/simdirectaccessownaircraft.h +++ b/src/blackmisc/simulation/simdirectaccessownaircraft.h @@ -22,9 +22,14 @@ namespace BlackMisc class IOwnAircraftProviderReadOnly { public: - //! Own aircraft + //! 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() {} }; @@ -67,6 +72,9 @@ namespace BlackMisc //! \copydoc IOwnAircraftProvider::ownAircraft virtual CSimulatedAircraft &ownAircraft() { return this->m_ownAircraft; } + //! \copydoc IOwnAircraftProvider::getOwnAircraft + virtual CSimulatedAircraft getOwnAircraft() const { 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; diff --git a/src/blackmisc/simulation/simdirectaccessrenderedaircraft.h b/src/blackmisc/simulation/simdirectaccessrenderedaircraft.h index 2c7f3aa0a..487cc693b 100644 --- a/src/blackmisc/simulation/simdirectaccessrenderedaircraft.h +++ b/src/blackmisc/simulation/simdirectaccessrenderedaircraft.h @@ -30,9 +30,17 @@ namespace BlackMisc //! All situation (per callsign, time history) virtual const BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() const = 0; + //! Rendered aircraft situations (history) as copy + //! \threadsafe + virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const = 0; + //! All parts (per callsign, time history) virtual const BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() const = 0; + //! All parts (per callsign, time history) as copy + //! \threadsafe + virtual BlackMisc::Aviation::CAircraftPartsList getRenderedAircraftParts() const = 0; + //! Destructor virtual ~IRenderedAircraftProviderReadOnly() {} }; @@ -42,12 +50,14 @@ namespace BlackMisc { public: //! All rendered aircraft + //! \note in memory reference, not thread safe virtual CSimulatedAircraftList &renderedAircraft() = 0; //! Rendered aircraft situations (history) virtual BlackMisc::Aviation::CAircraftSituationList &renderedAircraftSituations() = 0; //! All parts (per callsign, time history) + //! \note in memory reference, not thread safe virtual BlackMisc::Aviation::CAircraftPartsList &renderedAircraftParts() = 0; //! Enable/disable rendering