From 5ed95aee3df8df0440586f3613c4622cef66e41a Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 7 Mar 2015 03:34:17 +0100 Subject: [PATCH] refs #391, allow to send aircraft parts from GUI * GUI component for aircraft parts * remote aircraft selector component * Adjusted GUI for internals component * Enable / disable debug messages from GUI * Allow to init engines directly * Removed unused async sort in sequence In same step fixed found issues in interpolator * allow to set max rendered aircraft --- src/blackcore/airspace_monitor.cpp | 57 +- src/blackcore/airspace_monitor.h | 5 +- src/blackcore/context.cpp | 10 + src/blackcore/context.h | 8 + src/blackcore/context_network.h | 6 + src/blackcore/context_network_empty.h | 8 + src/blackcore/context_network_impl.cpp | 61 +- src/blackcore/context_network_impl.h | 3 + src/blackcore/context_network_proxy.cpp | 12 +- src/blackcore/context_network_proxy.h | 3 + src/blackcore/context_ownaircraft.cpp | 12 +- src/blackcore/context_ownaircraft_proxy.cpp | 12 +- src/blackcore/context_simulator.h | 7 +- src/blackcore/context_simulator_impl.cpp | 14 +- src/blackcore/context_simulator_impl.h | 5 +- src/blackcore/context_simulator_proxy.cpp | 9 +- src/blackcore/context_simulator_proxy.h | 5 +- src/blackcore/interpolator.cpp | 13 +- src/blackcore/interpolator.h | 2 +- src/blackcore/simulator.cpp | 9 +- src/blackcore/simulator.h | 21 +- .../components/internalscomponent.cpp | 225 ++++++++ src/blackgui/components/internalscomponent.h | 79 +++ src/blackgui/components/internalscomponent.ui | 523 ++++++++++++++++++ src/blackgui/components/mappingcomponent.cpp | 9 +- src/blackgui/components/mappingcomponent.h | 2 +- .../components/remoteaircraftselector.cpp | 112 ++++ .../components/remoteaircraftselector.h | 69 +++ .../components/remoteaircraftselector.ui | 58 ++ src/blackgui/qss/mainwindow.qss | 26 +- src/blackmisc/avaircraft.cpp | 7 + src/blackmisc/avaircraft.h | 14 +- src/blackmisc/avaircrafticao.cpp | 23 + src/blackmisc/avaircrafticao.h | 6 +- src/blackmisc/avaircraftlist.h | 2 +- src/blackmisc/avatcstationlist.cpp | 4 +- src/blackmisc/avcallsign.cpp | 9 + src/blackmisc/avcallsign.h | 3 + src/blackmisc/avcallsignobjectlist.cpp | 36 +- src/blackmisc/avcallsignobjectlist.h | 8 +- src/blackmisc/aviation/aircraftengine.cpp | 14 +- src/blackmisc/aviation/aircraftengine.h | 6 +- src/blackmisc/aviation/aircraftenginelist.cpp | 47 ++ src/blackmisc/aviation/aircraftenginelist.h | 37 +- src/blackmisc/aviation/aircraftparts.cpp | 4 +- src/blackmisc/aviation/aircraftparts.h | 2 +- src/blackmisc/blackmisc.pro | 4 +- src/blackmisc/coordinategeodetic.h | 2 +- src/blackmisc/geoobjectlist.cpp | 9 +- src/blackmisc/geoobjectlist.h | 5 +- src/blackmisc/sequence.h | 16 - .../simulation/simulatedaircraftlist.h | 2 +- src/blackmisc/timestampobjectlist.cpp | 2 +- src/blackmisc/timestampobjectlist.h | 2 +- .../simulator/fscommon/simulator_fscommon.cpp | 19 +- .../simulator/fscommon/simulator_fscommon.h | 11 +- src/plugins/simulator/fsx/simulator_fsx.cpp | 2 +- src/plugins/simulator/fsx/simulator_fsx.h | 1 - src/swiftgui_standard/swiftguistd.h | 3 +- src/swiftgui_standard/swiftguistd.ui | 37 +- src/swiftgui_standard/swiftguistd_init.cpp | 1 + src/swiftgui_standard/swiftguistd_menus.cpp | 13 + tests/blackcore/testinterpolator.cpp | 4 +- 63 files changed, 1575 insertions(+), 165 deletions(-) create mode 100644 src/blackgui/components/internalscomponent.cpp create mode 100644 src/blackgui/components/internalscomponent.h create mode 100644 src/blackgui/components/internalscomponent.ui create mode 100644 src/blackgui/components/remoteaircraftselector.cpp create mode 100644 src/blackgui/components/remoteaircraftselector.h create mode 100644 src/blackgui/components/remoteaircraftselector.ui diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index a507c5bd6..303198877 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -54,7 +54,7 @@ namespace BlackCore this->connect(this->m_vatsimDataFileReader, &CVatsimDataFileReader::dataRead, this, &CAirspaceMonitor::ps_receivedDataFile); // Watchdog - // ATC stations send updates every 25 s. Configure timeout after 50 s. + // ATC stations send updates every 25s. Configure timeout after 50s. this->m_atcWatchdog.setTimeout(CTime(50, CTimeUnit::s())); this->connect(&this->m_aircraftWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_pilotDisconnected); this->connect(&this->m_atcWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_atcControllerDisconnected); @@ -338,13 +338,18 @@ namespace BlackCore void CAirspaceMonitor::testCreateDummyOnlineAtcStations(int number) { - if (number < 1) return; + if (number < 1) { return; } this->m_atcStationsOnline.push_back( BlackMisc::Aviation::CTesting::createAtcStations(number) ); emit this->changedAtcStationsOnline(); } + void CAirspaceMonitor::testAddAircraftParts(const CAircraftParts &parts, bool incremental) + { + this->ps_aircraftConfigReceived(parts.getCallsign(), parts.toJson(), !incremental); + } + void CAirspaceMonitor::clear() { m_metarCache.clear(); @@ -573,7 +578,7 @@ namespace BlackCore // build simulated aircraft and crosscheck if all data are available CSimulatedAircraft remoteAircraft(this->m_aircraftInRange.findFirstByCallsign(callsign)); - Q_ASSERT(remoteAircraft.hasValidCallsign()); + Q_ASSERT_X(remoteAircraft.hasValidCallsign(), "ps_sendReadyForModelMatching", "Inavlid callsign"); CClient remoteClient = this->m_otherClients.findFirstByCallsign(callsign); remoteAircraft.setClient(remoteClient); remoteAircraft.setModel(remoteClient.getAircraftModel()); @@ -753,15 +758,20 @@ namespace BlackCore void CAirspaceMonitor::ps_aircraftUpdateReceived(const CAircraftSituation &situation, const CTransponder &transponder) { - Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); + Q_ASSERT_X(BlackCore::isCurrentThreadCreatingThread(this), "ps_aircraftUpdateReceived", "Called in different thread"); if (!this->m_connected) { return; } CCallsign callsign(situation.getCallsign()); - Q_ASSERT(!callsign.isEmpty()); + Q_ASSERT_X(!callsign.isEmpty(), "ps_aircraftUpdateReceived", "Empty callsign"); + + if (callsign.isObserverCallsign()) + { + return; // just ignore + } // store situation history - // this->m_aircraftSituations.insert_front(situation); - // this->m_aircraftSituations.removeOlderThanNowMinusOffset(AircraftSituationsRemovedOffsetMs); + this->m_aircraftSituations.push_front(situation); + this->m_aircraftSituations.removeOlderThanNowMinusOffset(AircraftSituationsRemovedOffsetMs); emit this->addedRemoteAircraftSituation(situation); bool exists = this->m_aircraftInRange.containsCallsign(callsign); @@ -846,6 +856,8 @@ namespace BlackCore // if with contains false remove here, in case of inconsistencies this->m_aircraftWatchdog.removeCallsign(callsign); this->m_otherClients.removeByCallsign(callsign); + this->m_aircraftSituations.removeByCallsign(callsign); + this->m_aircraftParts.removeByCallsign(callsign); this->removeFromAircraftCaches(callsign); if (contains) @@ -865,29 +877,38 @@ namespace BlackCore if (changed > 0) { emit this->changedAircraftInRange(); } } - void CAirspaceMonitor::ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &incremental, bool isFull) + void CAirspaceMonitor::ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull) { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); CSimulatedAircraftList list = this->m_aircraftInRange.findByCallsign(callsign); // Skip unknown callsigns - if (list.isEmpty()) return; + if (list.isEmpty()) { return; } CSimulatedAircraft simAircraft = list.front(); // If we are not yet synchronized, we throw away any incremental packet - if (!simAircraft.isPartsSynchronized() && !isFull) return; + if (!simAircraft.isPartsSynchronized() && !isFull) { return; } - CAircraftParts parts = m_aircraftParts.findBackByCallsign(callsign); + CAircraftParts parts; + if (isFull) + { + parts.convertFromJson(jsonObject); + } + else + { + // incremental update + parts = m_aircraftParts.findFirstByCallsign(callsign); + QJsonObject config = applyIncrementalObject(parts.toJson(), jsonObject); + parts.convertFromJson(config); + } + + // make sure in any case right time / callsign parts.setCurrentUtcTime(); - parts.setCallsign(callsign); // for default values - - // update - QJsonObject config = applyIncrementalObject(parts.toJson(), incremental); - parts.convertFromJson(config); + parts.setCallsign(callsign); // store part history - // this->m_aircraftParts.insert_front(parts); - // this->m_aircraftParts.removeOlderThanNowMinusOffset(AircraftPartsRemoveOffsetMs); + this->m_aircraftParts.push_front(parts); + this->m_aircraftParts.removeOlderThanNowMinusOffset(AircraftPartsRemoveOffsetMs); emit this->addedRemoteAircraftParts(parts); CPropertyIndexVariantMap vm; diff --git a/src/blackcore/airspace_monitor.h b/src/blackcore/airspace_monitor.h index ffdfeb190..0aa722c7c 100644 --- a/src/blackcore/airspace_monitor.h +++ b/src/blackcore/airspace_monitor.h @@ -111,6 +111,9 @@ namespace BlackCore //! Create dummy entries for performance tests void testCreateDummyOnlineAtcStations(int number); + //! Test injected aircraft parts + void testAddAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts, bool incremental); + //! Aircraft situations virtual BlackMisc::Aviation::CAircraftSituationList getRenderedAircraftSituations() const; @@ -219,7 +222,7 @@ namespace BlackCore void ps_frequencyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency); void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations); void ps_receivedDataFile(); - void ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &incremental, bool isFull); + void ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull); //! Send the information if aircraft and(!) client are vailable void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial); diff --git a/src/blackcore/context.cpp b/src/blackcore/context.cpp index 66f72aab6..28616eec8 100644 --- a/src/blackcore/context.cpp +++ b/src/blackcore/context.cpp @@ -70,6 +70,16 @@ namespace BlackCore return this->getRuntime()->getIContextSimulator(); } + void CContext::setDebugEnabled(bool debug) + { + this->m_debugEnabled = debug; + } + + bool CContext::isDebugEnabled() const + { + return this->m_debugEnabled; + } + const IContextSimulator *CContext::getIContextSimulator() const { return this->getRuntime()->getIContextSimulator(); diff --git a/src/blackcore/context.h b/src/blackcore/context.h index 692ab51e8..3803a0620 100644 --- a/src/blackcore/context.h +++ b/src/blackcore/context.h @@ -112,6 +112,12 @@ namespace BlackCore //! Simulator IContextSimulator *getIContextSimulator(); + //! Set debug flag + void setDebugEnabled(bool debug); + + //! Debug enabled? + bool isDebugEnabled() const; + //! Id and path name for round trip protection virtual QString getPathAndContextId() const = 0; @@ -136,6 +142,8 @@ namespace BlackCore BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).warning("Empty context called, details: %1") << functionName; } + bool m_debugEnabled = false; //!< debug messages enabled + //! Standard message when status message is returned in empty context static const BlackMisc::CStatusMessage &statusMessageEmptyContext(); }; diff --git a/src/blackcore/context_network.h b/src/blackcore/context_network.h index 7f16f8eca..2ea1ce9de 100644 --- a/src/blackcore/context_network.h +++ b/src/blackcore/context_network.h @@ -71,6 +71,9 @@ namespace BlackCore //! An aircraft disappeared void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign); + //! A new aircraft appeared + void addedAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft); + //! Read for model matching void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &renderedAircraft); @@ -218,6 +221,9 @@ namespace BlackCore //! Create dummy ATC stations for performance tests etc. virtual void testCreateDummyOnlineAtcStations(int number) = 0; + //! Inject aircraft parts for testing + virtual void testAddAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts, bool incremental) = 0; + protected: //! Constructor IContextNetwork(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : CContext(mode, runtime) {} diff --git a/src/blackcore/context_network_empty.h b/src/blackcore/context_network_empty.h index fc083771c..f3e97f620 100644 --- a/src/blackcore/context_network_empty.h +++ b/src/blackcore/context_network_empty.h @@ -190,6 +190,14 @@ namespace BlackCore logEmptyContextWarning(Q_FUNC_INFO); } + //! \copydoc IContextNetwork::testAddAircraftParts + virtual void testAddAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts, bool incremental) override + { + Q_UNUSED(parts); + Q_UNUSED(incremental); + logEmptyContextWarning(Q_FUNC_INFO); + } + //! \copydoc IContextNetwork::parseCommandLine virtual bool parseCommandLine(const QString &commandLine) override { diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index f0fe299c4..05925943d 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -81,6 +81,7 @@ namespace BlackCore connect(this->m_airspace, &CAirspaceMonitor::readyForModelMatching, this, &CContextNetwork::readyForModelMatching); connect(this->m_airspace, &CAirspaceMonitor::addedRemoteAircraftParts, this, &CContextNetwork::addedRemoteAircraftParts); connect(this->m_airspace, &CAirspaceMonitor::addedRemoteAircraftSituation, this, &CContextNetwork::addedRemoteAircraftSituation); + connect(this->m_airspace, &CAirspaceMonitor::addedAircraft, this, &CContextNetwork::addedAircraft); } CContextNetwork::~CContextNetwork() @@ -142,7 +143,7 @@ namespace BlackCore CStatusMessage CContextNetwork::connectToNetwork(const CServer &server, uint loginMode) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) {CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } QString msg; if (!server.getUser().isValid()) { @@ -182,7 +183,7 @@ namespace BlackCore CStatusMessage CContextNetwork::disconnectFromNetwork() { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } if (this->m_network->isConnected()) { this->m_currentStatus = INetwork::Disconnecting; // as semaphore we are going to disconnect @@ -202,7 +203,7 @@ namespace BlackCore bool CContextNetwork::isConnected() const { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return this->m_network->isConnected(); } @@ -223,30 +224,32 @@ namespace BlackCore void CContextNetwork::sendTextMessages(const CTextMessageList &textMessages) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << textMessages; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << textMessages; } this->m_network->sendTextMessages(textMessages); } void CContextNetwork::sendFlightPlan(const CFlightPlan &flightPlan) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << flightPlan; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << flightPlan; } this->m_network->sendFlightPlan(flightPlan); this->m_network->sendFlightPlanQuery(this->ownAircraft().getCallsign()); } CFlightPlan CContextNetwork::loadFlightPlanFromNetwork(const BlackMisc::Aviation::CCallsign &callsign) const { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return this->m_airspace->loadFlightPlanFromNetwork(callsign); } CUserList CContextNetwork::getUsers() const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return this->m_airspace->getUsers(); } CUserList CContextNetwork::getUsersForCallsigns(const CCallsignList &callsigns) const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CUserList users; if (callsigns.isEmpty()) return users; return this->m_airspace->getUsersForCallsigns(callsigns); @@ -254,6 +257,7 @@ namespace BlackCore CUser CContextNetwork::getUserForCallsign(const CCallsign &callsign) const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CCallsignList callsigns; callsigns.push_back(callsign); CUserList users = this->getUsersForCallsigns(callsigns); @@ -263,23 +267,28 @@ namespace BlackCore CClientList CContextNetwork::getOtherClients() const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return this->m_airspace->getOtherClients(); } CClientList CContextNetwork::getOtherClientsForCallsigns(const CCallsignList &callsigns) const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return this->m_airspace->getOtherClientsForCallsigns(callsigns); } CServerList CContextNetwork::getVatsimFsdServers() const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } Q_ASSERT(this->m_vatsimDataFileReader); + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; return this->m_vatsimDataFileReader->getFsdServers(); } CServerList CContextNetwork::getVatsimVoiceServers() const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } Q_ASSERT(this->m_vatsimDataFileReader); CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; return this->m_vatsimDataFileReader->getVoiceServers(); @@ -287,7 +296,7 @@ namespace BlackCore void CContextNetwork::ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << from << to; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << from << to; } auto fromOld = this->m_currentStatus; // own status cached this->m_currentStatus = to; @@ -327,14 +336,14 @@ namespace BlackCore void CContextNetwork::ps_dataFileRead() { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CLogMessage(this).info("Read VATSIM data file"); emit vatsimDataFileRead(); } void CContextNetwork::ps_fsdTextMessageReceived(const CTextMessageList &messages) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << messages; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << messages; } this->textMessagesReceived(messages); // relay } @@ -354,31 +363,31 @@ namespace BlackCore CAtcStationList CContextNetwork::getAtcStationsOnline() const { - BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, 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; + if (this->isDebugEnabled()) { CLogMessage(this, 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; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } return this->m_airspace->remoteAircraft(); } CSimulatedAircraft CContextNetwork::getAircraftForCallsign(const CCallsign &callsign) const { - BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; + if (this->isDebugEnabled()) { BlackMisc::CLogMessage(this, BlackMisc::CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign; } return this->m_airspace->remoteAircraft().findFirstByCallsign(callsign); } void CContextNetwork::ps_receivedBookings(const CAtcStationList &) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CLogMessage(this).info("Read bookings from network"); emit vatsimBookingsRead(); } @@ -386,7 +395,7 @@ namespace BlackCore void CContextNetwork::requestDataUpdates() { Q_ASSERT(this->m_network); - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } if (!this->isConnected()) { return; } this->requestAtisUpdates(); @@ -396,7 +405,7 @@ namespace BlackCore void CContextNetwork::requestAtisUpdates() { Q_ASSERT(this->m_network); - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } if (!this->isConnected()) { return; } this->m_airspace->requestAtisUpdates(); @@ -404,7 +413,7 @@ namespace BlackCore bool CContextNetwork::updateAircraftEnabled(const CCallsign &callsign, bool enabledForRedering, const QString &originator) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << enabledForRedering << originator; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << enabledForRedering << originator; } bool c = this->m_airspace->updateAircraftEnabled(callsign, enabledForRedering, originator); if (c) { @@ -415,7 +424,7 @@ namespace BlackCore bool CContextNetwork::updateAircraftModel(const CCallsign &callsign, const CAircraftModel &model, const QString &originator) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << model << originator; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsign << model << originator; } bool c = this->m_airspace->updateAircraftModel(callsign, model, originator); if (c) { @@ -426,32 +435,39 @@ namespace BlackCore bool CContextNetwork::isInterimPositionSendingEnabled() const { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } Q_ASSERT(this->m_network); return m_network->isInterimPositionSendingEnabled(); } void CContextNetwork::enableInterimPositionSending(bool enable) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << enable; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << enable; } Q_ASSERT(this->m_network); m_network->enableInterimPositionSending(enable); } void CContextNetwork::testCreateDummyOnlineAtcStations(int number) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << number; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << number; } this->m_airspace->testCreateDummyOnlineAtcStations(number); } + void CContextNetwork::testAddAircraftParts(const CAircraftParts &parts, bool incremental) + { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << parts << incremental; } + this->m_airspace->testAddAircraftParts(parts, incremental); + } + BlackMisc::Aviation::CInformationMessage CContextNetwork::getMetar(const BlackMisc::Aviation::CAirportIcao &airportIcaoCode) { - CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << airportIcaoCode; + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << airportIcaoCode; } return m_airspace->getMetar(airportIcaoCode); } CAtcStationList CContextNetwork::getSelectedAtcStations() const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CAtcStation com1Station = this->m_airspace->getAtcStationForComUnit(this->ownAircraft().getCom1System()); CAtcStation com2Station = this->m_airspace->getAtcStationForComUnit(this->ownAircraft().getCom2System()); @@ -463,6 +479,7 @@ namespace BlackCore CVoiceRoomList CContextNetwork::getSelectedVoiceRooms() const { + if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } CAtcStationList stations = this->getSelectedAtcStations(); Q_ASSERT(stations.size() == 2); CVoiceRoomList rooms; diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index bc5dbdb2c..0882ec1b7 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -184,6 +184,9 @@ namespace BlackCore //! \copydoc IContextNetwork::testCreateDummyOnlineAtcStations virtual void testCreateDummyOnlineAtcStations(int number) override; + //! \copydoc IContextNetwork::testAddAircraftParts + virtual void testAddAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts, bool incremental) override; + //! Gracefully shut down, e.g. for thread safety void gracefulShutdown(); diff --git a/src/blackcore/context_network_proxy.cpp b/src/blackcore/context_network_proxy.cpp index 43c7995fc..ce93f7ed6 100644 --- a/src/blackcore/context_network_proxy.cpp +++ b/src/blackcore/context_network_proxy.cpp @@ -78,7 +78,12 @@ namespace BlackCore s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(), "changedAircraftEnabled", this, SIGNAL(changedAircraftEnabled(BlackMisc::Simulation::CSimulatedAircraft, QString))); Q_ASSERT(s); - Q_UNUSED(s); + s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(), + "addedAircraft", this, SIGNAL(addedAircraft(BlackMisc::Simulation::CSimulatedAircraft))); + Q_ASSERT(s); + s = connection.connect(serviceName, IContextNetwork::ObjectPath(), IContextNetwork::InterfaceName(), + "removedAircraft", this, SIGNAL(removedAircraft(BlackMisc::Aviation::CCallsign))); + Q_ASSERT(s); } void CContextNetworkProxy::readAtcBookingsFromSource() const @@ -186,6 +191,11 @@ namespace BlackCore this->m_dBusInterface->callDBus(QLatin1Literal("testCreateDummyOnlineAtcStations"), number); } + void CContextNetworkProxy::testAddAircraftParts(const CAircraftParts &parts, bool incremental) + { + this->m_dBusInterface->callDBus(QLatin1Literal("testAddAircraftParts"), parts, incremental); + } + CStatusMessage CContextNetworkProxy::connectToNetwork(const CServer &server, uint loginMode) { return this->m_dBusInterface->callDBusRet(QLatin1Literal("connectToNetwork"), server, loginMode); diff --git a/src/blackcore/context_network_proxy.h b/src/blackcore/context_network_proxy.h index 250d15239..14a0793de 100644 --- a/src/blackcore/context_network_proxy.h +++ b/src/blackcore/context_network_proxy.h @@ -140,6 +140,9 @@ namespace BlackCore //! \copydoc IContextNetwork::testCreateDummyOnlineAtcStations virtual void testCreateDummyOnlineAtcStations(int number) override; + //! \copydoc IContextNetwork::testAddAircraftParts + virtual void testAddAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts, bool incremental) override; + }; } diff --git a/src/blackcore/context_ownaircraft.cpp b/src/blackcore/context_ownaircraft.cpp index e9caca3f1..ecceada50 100644 --- a/src/blackcore/context_ownaircraft.cpp +++ b/src/blackcore/context_ownaircraft.cpp @@ -1,7 +1,11 @@ -/* Copyright (C) 2013 VATSIM Community / contributors - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +/* Copyright (C) 2013 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ #include "context_ownaircraft.h" #include "context_ownaircraft_impl.h" diff --git a/src/blackcore/context_ownaircraft_proxy.cpp b/src/blackcore/context_ownaircraft_proxy.cpp index 239915aab..76fc08ff5 100644 --- a/src/blackcore/context_ownaircraft_proxy.cpp +++ b/src/blackcore/context_ownaircraft_proxy.cpp @@ -1,7 +1,11 @@ -/* Copyright (C) 2013 VATSIM Community / authors - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +/* Copyright (C) 2013 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ #include "blackcore/context_ownaircraft_proxy.h" #include diff --git a/src/blackcore/context_simulator.h b/src/blackcore/context_simulator.h index 9a267fb4b..9b883dd7e 100644 --- a/src/blackcore/context_simulator.h +++ b/src/blackcore/context_simulator.h @@ -137,8 +137,8 @@ namespace BlackCore //! Max. number of remote aircraft rendered virtual int getMaxRenderedAircraft() const = 0; - //! Max. number of remote aircraft rendered - virtual void setMaxRenderedAircraft(int number) = 0; + //! Max. number of remote aircraft rendered and provide optional selection which aircraft this are + virtual void setMaxRenderedAircraft(int number, const BlackMisc::Aviation::CCallsignList &renderedAircraft) = 0; //! Time synchronization offset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const = 0; @@ -164,6 +164,9 @@ namespace BlackCore //! Icon representing the model virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const = 0; + //! Enable debugging + virtual void enableDebugMessages(bool driver, bool interpolator) = 0; + protected: //! Constructor IContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : CContext(mode, runtime) {} diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 64fe27117..84700bb32 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -158,13 +158,13 @@ namespace BlackCore { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; if (!m_simulator) return 0; - return 13; + return m_simulator->getMaxRenderedAircraft(); } - void CContextSimulator::setMaxRenderedAircraft(int number) + void CContextSimulator::setMaxRenderedAircraft(int number, const CCallsignList &renderedAircraft) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; - if (m_simulator) { this->m_simulator->setMaxRenderedAircraft(number); } + if (m_simulator) { this->m_simulator->setMaxRenderedAircraft(number, renderedAircraft); } } CTime CContextSimulator::getTimeSynchronizationOffset() const @@ -263,7 +263,7 @@ namespace BlackCore bool CContextSimulator::loadSimulatorPluginFromSettings() { Q_ASSERT(this->getIContextSettings()); - if (!this->getIContextSettings()) return false; + if (!this->getIContextSettings()) { return false; } // TODO warnings if we didn't load the plugin which the settings asked for @@ -398,6 +398,12 @@ namespace BlackCore return this->m_simulator->iconForModel(modelString); } + void CContextSimulator::enableDebugMessages(bool driver, bool interpolator) + { + if (!this->m_simulator) { return; } + return this->m_simulator->enableDebugMessages(driver, interpolator); + } + bool CContextSimulator::isPaused() const { if (!this->m_simulator) return false; diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index b30536524..a1ed487a1 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -90,7 +90,7 @@ namespace BlackCore virtual int getMaxRenderedAircraft() const override; //! \copydoc IContextSimulator::setMaxRenderedAircraft - virtual void setMaxRenderedAircraft(int number) override; + virtual void setMaxRenderedAircraft(int number, const BlackMisc::Aviation::CCallsignList &renderedAircraft) override; //! \copydoc IContextSimulator::getTimeSynchronizationOffset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override; @@ -110,6 +110,9 @@ namespace BlackCore //! \copydoc IContextSimulator::iconForModel virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override; + //! \copydoc ISimulator::enableDebuggingMessages + virtual void enableDebugMessages(bool driver, bool interpolator) override; + protected: //! \brief Constructor CContextSimulator(CRuntimeConfig::ContextMode, CRuntime *runtime); diff --git a/src/blackcore/context_simulator_proxy.cpp b/src/blackcore/context_simulator_proxy.cpp index 1fadce665..05e796449 100644 --- a/src/blackcore/context_simulator_proxy.cpp +++ b/src/blackcore/context_simulator_proxy.cpp @@ -119,9 +119,9 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("isTimeSynchronized")); } - void CContextSimulatorProxy::setMaxRenderedAircraft(int number) + void CContextSimulatorProxy::setMaxRenderedAircraft(int number, const CCallsignList &renderedAircraft) { - m_dBusInterface->callDBus(QLatin1Literal("setMaxRenderedRemoteAircraft"), number); + m_dBusInterface->callDBus(QLatin1Literal("setMaxRenderedRemoteAircraft"), number, renderedAircraft); } int CContextSimulatorProxy::getMaxRenderedAircraft() const @@ -159,6 +159,11 @@ namespace BlackCore return m_dBusInterface->callDBusRet(QLatin1Literal("iconForModel"), modelString); } + void CContextSimulatorProxy::enableDebugMessages(bool driver, bool interpolator) + { + m_dBusInterface->callDBus(QLatin1Literal("enableDebugMessages"), driver, interpolator); + } + bool CContextSimulatorProxy::isPaused() const { return m_dBusInterface->callDBusRet(QLatin1Literal("isPaused")); diff --git a/src/blackcore/context_simulator_proxy.h b/src/blackcore/context_simulator_proxy.h index c7508b625..6c1ce0992 100644 --- a/src/blackcore/context_simulator_proxy.h +++ b/src/blackcore/context_simulator_proxy.h @@ -93,7 +93,7 @@ namespace BlackCore virtual int getMaxRenderedAircraft() const override; //! \copydoc IContextSimulator::setMaxRenderedRemoteAircraft - virtual void setMaxRenderedAircraft(int number) override; + virtual void setMaxRenderedAircraft(int number, const BlackMisc::Aviation::CCallsignList &renderedAircraft) override; //! \copydoc IContextSimulator::getTimeSynchronizationOffset virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override; @@ -113,6 +113,9 @@ namespace BlackCore //! \copydoc IContextSimulator::iconForModel virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override; + //! \copydoc ISimulator::enableDebuggingMessages + virtual void enableDebugMessages(bool driver, bool interpolator) override; + }; } // namespace BlackCore diff --git a/src/blackcore/interpolator.cpp b/src/blackcore/interpolator.cpp index e7ef8033e..d50dd5b3b 100644 --- a/src/blackcore/interpolator.cpp +++ b/src/blackcore/interpolator.cpp @@ -69,6 +69,7 @@ namespace BlackCore CAircraftPartsList IInterpolator::getAndRemovePartsBeforeTime(const CCallsign &callsign, qint64 cutoffTime, BlackCore::IInterpolator::PartsStatus &partsStatus) { static const CAircraftPartsList empty; + Q_ASSERT_X(!callsign.isEmpty(), "getAndRemovePartsBeforeTime", "empty callsign"); partsStatus.reset(); QWriteLocker l(&m_lockParts); if (this->m_partsByCallsign.contains(callsign)) @@ -108,7 +109,12 @@ namespace BlackCore return m_partsByCallsign[callsign]; } - void IInterpolator::forceSorting(bool sort) + void IInterpolator::enableDebugMessages(bool enabled) + { + this->m_withDebugMsg = enabled; + } + + void IInterpolator::forceSortingOfAddedValues(bool sort) { this->m_forceSortWhenAddingValues = sort; } @@ -117,7 +123,7 @@ namespace BlackCore { QWriteLocker lock(&m_lockSituations); const CCallsign callsign(situation.getCallsign()); - Q_ASSERT(!callsign.isEmpty()); + Q_ASSERT_X(!callsign.isEmpty(), "ps_onAddedAircraftSituation", "empty callsign"); if (callsign.isEmpty()) { return; } if (this->m_withDebugMsg) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << situation.getCallsign() << situation.getMSecsSinceEpoch(); } @@ -134,7 +140,7 @@ namespace BlackCore { QWriteLocker lock(&m_lockParts); const CCallsign callsign(parts.getCallsign()); - Q_ASSERT(!callsign.isEmpty()); + Q_ASSERT_X(!callsign.isEmpty(), "ps_onAddedAircraftParts", "empty callsign"); if (callsign.isEmpty()) { return; } if (this->m_withDebugMsg) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << parts.getCallsign() << parts.getMSecsSinceEpoch(); } @@ -148,7 +154,6 @@ namespace BlackCore // check sort order Q_ASSERT(l.size() < 2 || l[0].getMSecsSinceEpoch() >= l[1].getMSecsSinceEpoch()); - } void IInterpolator::ps_onRemovedAircraft(const CCallsign &callsign) diff --git a/src/blackcore/interpolator.h b/src/blackcore/interpolator.h index 794fb5fb7..cf2559780 100644 --- a/src/blackcore/interpolator.h +++ b/src/blackcore/interpolator.h @@ -103,7 +103,7 @@ namespace BlackCore void enableDebugMessages(bool enabled); //! Force sorting (latest first), not required if order can be guaranteed - void forceSorting(bool sort); + void forceSortingOfAddedValues(bool sort); static const qint64 TimeOffsetMs = 6000; //!< offset for interpolation static const int MaxSituationsPerCallsign = 6; //!< How many situations per callsign diff --git a/src/blackcore/simulator.cpp b/src/blackcore/simulator.cpp index 282c931f8..ddc31b278 100644 --- a/src/blackcore/simulator.cpp +++ b/src/blackcore/simulator.cpp @@ -28,9 +28,10 @@ namespace BlackCore return m_maxRenderedAircraft; } - void CSimulatorCommon::setMaxRenderedAircraft(int maxRenderedAircraft) + void CSimulatorCommon::setMaxRenderedAircraft(int maxRenderedAircraft, const BlackMisc::Aviation::CCallsignList &callsigns) { m_maxRenderedAircraft = maxRenderedAircraft; + m_callsignsToBeRendered = callsigns; } CSimulatorInfo CSimulatorCommon::getSimulatorInfo() const @@ -38,4 +39,10 @@ namespace BlackCore return m_simulatorInfo; } + void CSimulatorCommon::enableDebugMessages(bool driver, bool interpolator) + { + this->m_debugMessages = driver; + Q_UNUSED(interpolator); + } + } // namespace diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index cb80df079..0311bf893 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -126,7 +126,10 @@ namespace BlackCore virtual int getMaxRenderedAircraft() const = 0; //! Max. rendered aircraft - virtual void setMaxRenderedAircraft(int maxRenderedAircraft) = 0; + virtual void setMaxRenderedAircraft(int maxRenderedAircraft, const BlackMisc::Aviation::CCallsignList &callsigns) = 0; + + //! Enable debugging messages + virtual void enableDebugMessages(bool driver, bool interpolator) = 0; signals: //! Emitted when the connection status has changed @@ -187,20 +190,26 @@ namespace BlackCore //! Common base class with providers, interface and some base functionality class CSimulatorCommon : public BlackCore::ISimulator, - public BlackMisc::Simulation::COwnAircraftProviderSupport, // gain access to in memor own aircraft data + public BlackMisc::Simulation::COwnAircraftProviderSupport, // gain access to in memor own aircraft data public BlackMisc::Simulation::CRemoteAircraftProviderSupport // gain access to in memory rendered aircraft data { - public: + Q_OBJECT + + public slots: + //! \copydoc ISimulator::getMaxRenderedAircraft - int getMaxRenderedAircraft() const override; + virtual int getMaxRenderedAircraft() const override; //! \copydoc ISimulator::setMaxRenderedAircraft - void setMaxRenderedAircraft(int maxRenderedAircraft) override; + virtual void setMaxRenderedAircraft(int maxRenderedAircraft, const BlackMisc::Aviation::CCallsignList &callsigns) override; //! \copydoc ISimulator::getSimulatorInfo virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override; + //! \copydoc ISimulator::enableDebuggingMessages + virtual void enableDebugMessages(bool driver, bool interpolator) override; + protected: //! Constructor CSimulatorCommon( @@ -211,6 +220,8 @@ namespace BlackCore BlackSim::CSimulatorInfo m_simulatorInfo; //!< about the simulator int m_maxRenderedAircraft = 99; //!< max. rendered aircraft + bool m_debugMessages = false; //!< Display debug messages + BlackMisc::Aviation::CCallsignList m_callsignsToBeRendered; //!< all other aircraft are to be ignored }; } // namespace diff --git a/src/blackgui/components/internalscomponent.cpp b/src/blackgui/components/internalscomponent.cpp new file mode 100644 index 000000000..d468959b8 --- /dev/null +++ b/src/blackgui/components/internalscomponent.cpp @@ -0,0 +1,225 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "internalscomponent.h" +#include "ui_internalscomponent.h" +#include "blackcore/context_all_interfaces.h" + +using namespace BlackMisc; +using namespace BlackMisc::Aviation; +using namespace BlackCore; + +namespace BlackGui +{ + namespace Components + { + CInternalsComponent::CInternalsComponent(QWidget *parent) : + QWidget(parent), + CEnableForRuntime(nullptr, false), + ui(new Ui::CInternalsComponent) + { + ui->setupUi(this); + connect(ui->pb_SendAircraftPartsGui, &QPushButton::pressed, this, &CInternalsComponent::ps_sendAircraftParts); + connect(ui->pb_SendAircraftPartsJson, &QPushButton::pressed, this, &CInternalsComponent::ps_sendAircraftParts); + connect(ui->pb_AircraftPartsLightsOn, &QPushButton::pressed, this, &CInternalsComponent::ps_setAllLights); + connect(ui->pb_AircraftPartsLightsOff, &QPushButton::pressed, this, &CInternalsComponent::ps_setAllLights); + connect(ui->pb_AircraftPartsEnginesOn, &QPushButton::pressed, this, &CInternalsComponent::ps_setAllEngines); + connect(ui->pb_AircraftPartsEnginesOff, &QPushButton::pressed, this, &CInternalsComponent::ps_setAllEngines); + connect(ui->pb_AircraftPartsUiToJson, &QPushButton::pressed, this, &CInternalsComponent::ps_guiToJson); + + connect(ui->cb_DebugContextAudio, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + connect(ui->cb_DebugContextApplication, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + connect(ui->cb_DebugContextNetwork, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + connect(ui->cb_DebugContextOwnAircraft, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + connect(ui->cb_DebugContextSimulator, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + connect(ui->cb_DebugDriver, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + connect(ui->cb_DebugInterpolator, &QCheckBox::stateChanged, this, &CInternalsComponent::ps_enableDebug); + } + + CInternalsComponent::~CInternalsComponent() { } + + void CInternalsComponent::runtimeHasBeenSet() + { + contextFlagsToGui(); + } + + void CInternalsComponent::showEvent(QShowEvent *event) + { + // force new data when visible + this->contextFlagsToGui(); + QWidget::showEvent(event); + } + + void CInternalsComponent::ps_sendAircraftParts() + { + Q_ASSERT(this->getIContextNetwork()); + if (!this->getIContextNetwork()->isConnected()) + { + CLogMessage(this).validationError("Cannot send aircraft parts, network not connected"); + return; + } + CCallsign callsign(this->ui->comp_RemoteAircraftSelector->getSelectedCallsign()); + if (callsign.isEmpty()) + { + CLogMessage(this).validationError("No valid callsign selected"); + return; + } + + CAircraftParts parts; + bool json = (QObject::sender() == ui->pb_SendAircraftPartsJson); + + if (json) + { + QString jsonParts = this->ui->te_AircraftPartsJson->toPlainText().trimmed(); + if (jsonParts.isEmpty()) + { + CLogMessage(this).validationError("No JSON content"); + return; + } + QJsonParseError jsonError; + QJsonDocument json(QJsonDocument::fromJson(jsonParts.toUtf8(), &jsonError)); + if (jsonError.error != QJsonParseError::NoError) + { + CLogMessage(this).validationError("Parse error: %1") << jsonError.errorString(); + return; + } + parts.convertFromJson(json.object()); + partsToGui(parts); + } + else + { + parts = CAircraftParts(guiToAircraftParts()); + this->ps_guiToJson(); + } + + parts.setCallsign(callsign); + this->getIContextNetwork()->testAddAircraftParts(parts, this->ui->cb_AircraftPartsIncremental->isChecked()); + CLogMessage(this).info("Added parts for %1") << callsign.toQString(); + } + + void CInternalsComponent::ps_setAllLights() + { + bool on = QObject::sender() == ui->pb_AircraftPartsLightsOn ? true : false; + this->ui->cb_AircraftPartsLightsStrobe->setChecked(on); + this->ui->cb_AircraftPartsLightsLanding->setChecked(on); + this->ui->cb_AircraftPartsLightsTaxi->setChecked(on); + this->ui->cb_AircraftPartsLightsBeacon->setChecked(on); + this->ui->cb_AircraftPartsLightsNav->setChecked(on); + this->ui->cb_AircraftPartsLightsLogo->setChecked(on); + } + + void CInternalsComponent::ps_setAllEngines() + { + bool on = QObject::sender() == ui->pb_AircraftPartsEnginesOn ? true : false; + this->ui->cb_AircraftPartsEngine1->setChecked(on); + this->ui->cb_AircraftPartsEngine2->setChecked(on); + this->ui->cb_AircraftPartsEngine3->setChecked(on); + this->ui->cb_AircraftPartsEngine4->setChecked(on); + this->ui->cb_AircraftPartsEngine5->setChecked(on); + this->ui->cb_AircraftPartsEngine6->setChecked(on); + } + + void CInternalsComponent::ps_guiToJson() + { + QJsonDocument json(guiToAircraftParts().toJson()); + QString j(json.toJson(QJsonDocument::Indented)); + this->ui->te_AircraftPartsJson->setText(j); + } + + void CInternalsComponent::ps_enableDebug(int state) + { + Q_ASSERT(this->getIContextApplication()); + Q_ASSERT(this->getIContextAudio()); + Q_ASSERT(this->getIContextNetwork()); + Q_ASSERT(this->getIContextOwnAircraft()); + Q_ASSERT(this->getIContextSimulator()); + + Qt::CheckState checkState = static_cast(state); + bool debug = (checkState == Qt::Checked); + QObject *sender = QObject::sender(); + + if (sender == ui->cb_DebugContextApplication) { getIContextApplication()->setDebugEnabled(debug); } + else if (sender == ui->cb_DebugContextAudio) { getIContextAudio()->setDebugEnabled(debug); } + else if (sender == ui->cb_DebugContextNetwork) { getIContextNetwork()->setDebugEnabled(debug);} + else if (sender == ui->cb_DebugContextOwnAircraft) { getIContextOwnAircraft()->setDebugEnabled(debug); } + else if (sender == ui->cb_DebugContextSimulator) { getIContextSimulator()->setDebugEnabled(debug);} + else if (sender == ui->cb_DebugDriver || sender == ui->cb_DebugInterpolator) + { + this->getIContextSimulator()->enableDebugMessages( + this->ui->cb_DebugDriver->isChecked(), + this->ui->cb_DebugInterpolator->isChecked() + ); + } + } + + CAircraftParts CInternalsComponent::guiToAircraftParts() const + { + CAircraftLights lights( + this->ui->cb_AircraftPartsLightsStrobe->isChecked(), + this->ui->cb_AircraftPartsLightsLanding->isChecked(), + this->ui->cb_AircraftPartsLightsTaxi->isChecked(), + this->ui->cb_AircraftPartsLightsBeacon->isChecked(), + this->ui->cb_AircraftPartsLightsNav->isChecked(), + this->ui->cb_AircraftPartsLightsLogo->isChecked() + ); + CAircraftEngineList engines( + { + this->ui->cb_AircraftPartsEngine1->isChecked(), + this->ui->cb_AircraftPartsEngine2->isChecked(), + this->ui->cb_AircraftPartsEngine3->isChecked(), + this->ui->cb_AircraftPartsEngine4->isChecked(), + this->ui->cb_AircraftPartsEngine5->isChecked(), + this->ui->cb_AircraftPartsEngine6->isChecked() + } + ); + CAircraftParts parts(lights, + this->ui->cb_AircraftPartsGearDown->isChecked(), + this->ui->sb_AircraftPartsFlapsPercentage->value(), + this->ui->cb_AircraftPartsSpoilers->isChecked(), + engines, + this->ui->cb_AircraftPartsIsOnGround->isChecked() + ); + return parts; + } + + void CInternalsComponent::partsToGui(const CAircraftParts &parts) + { + this->ui->cb_AircraftPartsGearDown->setChecked(parts.isGearDown()); + this->ui->cb_AircraftPartsIsOnGround->setChecked(parts.isOnGround()); + this->ui->cb_AircraftPartsSpoilers->setChecked(parts.isSpoilersOut()); + this->ui->sb_AircraftPartsFlapsPercentage->setValue(parts.getFlapsPercent()); + + CAircraftLights lights = parts.getLights(); + this->ui->cb_AircraftPartsLightsBeacon->setChecked(lights.isBeaconOn()); + this->ui->cb_AircraftPartsLightsLanding->setChecked(lights.isLandingOn()); + this->ui->cb_AircraftPartsLightsLogo->setChecked(lights.isLogoOn()); + this->ui->cb_AircraftPartsLightsNav->setChecked(lights.isNavOn()); + this->ui->cb_AircraftPartsLightsStrobe->setChecked(lights.isStrobeOn()); + this->ui->cb_AircraftPartsLightsTaxi->setChecked(lights.isTaxiOn()); + + CAircraftEngineList engines = parts.getEngines(); + this->ui->cb_AircraftPartsEngine1->setChecked(engines.isEngineOn(1)); + this->ui->cb_AircraftPartsEngine2->setChecked(engines.isEngineOn(2)); + this->ui->cb_AircraftPartsEngine3->setChecked(engines.isEngineOn(3)); + this->ui->cb_AircraftPartsEngine4->setChecked(engines.isEngineOn(4)); + this->ui->cb_AircraftPartsEngine5->setChecked(engines.isEngineOn(5)); + this->ui->cb_AircraftPartsEngine6->setChecked(engines.isEngineOn(6)); + + } + + void CInternalsComponent::contextFlagsToGui() + { + ui->cb_DebugContextApplication->setChecked(getIContextApplication()->isDebugEnabled()); + ui->cb_DebugContextNetwork->setChecked(getIContextNetwork()->isDebugEnabled()); + ui->cb_DebugContextOwnAircraft->setChecked(getIContextOwnAircraft()->isDebugEnabled()); + ui->cb_DebugContextSimulator->setChecked(getIContextSimulator()->isDebugEnabled()); + } + + } // namespace +} // namespace diff --git a/src/blackgui/components/internalscomponent.h b/src/blackgui/components/internalscomponent.h new file mode 100644 index 000000000..ea76ee02f --- /dev/null +++ b/src/blackgui/components/internalscomponent.h @@ -0,0 +1,79 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_INTERNALSCOMPONENT_H +#define BLACKGUI_INTERNALSCOMPONENT_H + +#include "enableforruntime.h" +#include +#include + +namespace Ui { class CInternalsComponent; } + +namespace BlackGui +{ + namespace Components + { + + //! Internals for debugging, statistics + class CInternalsComponent : + public QWidget, + public CEnableForRuntime + { + Q_OBJECT + + public: + //! Constructor + explicit CInternalsComponent(QWidget *parent = nullptr); + + //! Destructor + ~CInternalsComponent(); + + protected: + //! \copydoc CEnableForRuntime::runtimeHasBeenSet + virtual void runtimeHasBeenSet() override; + + //! \copydoc QWidget::showEvent + virtual void showEvent(QShowEvent *event) override; + + private slots: + //! Send aircraft parts + void ps_sendAircraftParts(); + + //! Set all lights + void ps_setAllLights(); + + //! Set all engines + void ps_setAllEngines(); + + //! GUI to Json + void ps_guiToJson(); + + //! Enable / disable debugging + void ps_enableDebug(int state); + + private: + QScopedPointer ui; + + //! Get parts object + BlackMisc::Aviation::CAircraftParts guiToAircraftParts() const; + + //! GUI set by parts + void partsToGui(const BlackMisc::Aviation::CAircraftParts &parts); + + //! Set the context flags + void contextFlagsToGui(); + }; + + } // namespace +} // namespace + +#endif // guard diff --git a/src/blackgui/components/internalscomponent.ui b/src/blackgui/components/internalscomponent.ui new file mode 100644 index 000000000..7fcaffc69 --- /dev/null +++ b/src/blackgui/components/internalscomponent.ui @@ -0,0 +1,523 @@ + + + CInternalsComponent + + + + 0 + 0 + 277 + 450 + + + + Form + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + 2 + + + + Debug + + + + 0 + + + 3 + + + 0 + + + 0 + + + + + Contexts + + + + + + Audio + + + + + + + Network + + + + + + + Own aircraftt + + + + + + + Simulator + + + + + + + Application + + + + + + + + + + Driver plugin and interpolator + + + + + + Driver + + + + + + + Interpolator + + + + + + + + + + WORK IN PROGRES!!!!! + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Statistics + + + + + 80 + 60 + 267 + 13 + + + + WORK IN PROGRES!!!!! + + + + + + Aircraft parts + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Aircraft + + + + 2 + + + 4 + + + 6 + + + 4 + + + 2 + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + + 0 + 0 + + + + Parts + + + + 6 + + + 4 + + + 6 + + + 4 + + + 2 + + + + + 6 + + + + + Landing + + + + + + + Strobe + + + + + + + Gear down + + + + + + + 2 + + + + + + + Engines: + + + + + + + 1 + + + + + + + Flaps %: + + + + + + + 4 + + + + + + + 3 + + + + + + + Spoilers + + + + + + + Beacon + + + + + + + Nav + + + + + + + Lights: + + + + + + + Taxi + + + + + + + Logo + + + + + + + 5 + + + + + + + 100 + + + 5 + + + + + + + all on + + + + + + + all on + + + + + + + on ground + + + + + + + 6 + + + + + + + all off + + + + + + + all off + + + + + + + to JSON + + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Incremental + + + + + + + Send JSON + + + + + + + Send GUI + + + + + + + + + + + + + + + BlackGui::Components::CRemoteAircraftSelector + QFrame +
blackgui/components/remoteaircraftselector.h
+ 1 +
+
+ + +
diff --git a/src/blackgui/components/mappingcomponent.cpp b/src/blackgui/components/mappingcomponent.cpp index e4e1f4395..e59c58858 100644 --- a/src/blackgui/components/mappingcomponent.cpp +++ b/src/blackgui/components/mappingcomponent.cpp @@ -200,8 +200,15 @@ namespace BlackGui void CMappingComponent::ps_onApplyNewMaxRemoteAircraft() { Q_ASSERT(getIContextSimulator()); + Q_ASSERT(getIContextNetwork()); + + // get initial aircraft to render int noRequested = this->ui->hs_MaxAircraft->value(); - this->getIContextSimulator()->setMaxRenderedAircraft(noRequested); + CSimulatedAircraftList inRange(this->getIContextNetwork()->getAircraftInRange()); + inRange.truncate(noRequested); + inRange.sortByDistanceToOwnAircraft(); + CCallsignList initialCallsigns(inRange.getCallsigns()); + this->getIContextSimulator()->setMaxRenderedAircraft(noRequested, initialCallsigns); // real value int noRendered = this->getIContextSimulator()->getMaxRenderedAircraft(); diff --git a/src/blackgui/components/mappingcomponent.h b/src/blackgui/components/mappingcomponent.h index 6cb6a21a1..67ad53e7c 100644 --- a/src/blackgui/components/mappingcomponent.h +++ b/src/blackgui/components/mappingcomponent.h @@ -53,7 +53,7 @@ namespace BlackGui protected: //! \copydoc CRuntimeBasedComponent::runtimeHasBeenSet - void runtimeHasBeenSet() override; + virtual void runtimeHasBeenSet() override; private slots: //! Aircraft models available diff --git a/src/blackgui/components/remoteaircraftselector.cpp b/src/blackgui/components/remoteaircraftselector.cpp new file mode 100644 index 000000000..36201e6b0 --- /dev/null +++ b/src/blackgui/components/remoteaircraftselector.cpp @@ -0,0 +1,112 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "remoteaircraftselector.h" +#include "ui_remoteaircraftselector.h" +#include "blackcore/context_network.h" + +using namespace BlackMisc; +using namespace BlackMisc::Aviation; +using namespace BlackMisc::Simulation; +using namespace BlackCore; + +namespace BlackGui +{ + namespace Components + { + + CRemoteAircraftSelector::CRemoteAircraftSelector(QWidget *parent) : + QFrame(parent), + CEnableForRuntime(nullptr, false), + ui(new Ui::CRemoteAircraftSelector) + { + ui->setupUi(this); + } + + CRemoteAircraftSelector::~CRemoteAircraftSelector() { } + + BlackMisc::Aviation::CCallsign CRemoteAircraftSelector::getSelectedCallsign() const + { + const CCallsign empty; + int index = ui->cb_RemoteAircraftSelector->currentIndex(); + if (index < 0 || index > this->m_aircraft.size()) { return empty; } + return m_aircraft[index].getCallsign(); + } + + void CRemoteAircraftSelector::runtimeHasBeenSet() + { + Q_ASSERT(getIContextNetwork()); + bool s = connect(getIContextNetwork(), &IContextNetwork::removedAircraft, this, &CRemoteAircraftSelector::ps_onRemovedAircraft); + Q_ASSERT(s); + s = connect(getIContextNetwork(), &IContextNetwork::addedAircraft, this, &CRemoteAircraftSelector::ps_onAddedAircraft); + Q_ASSERT(s); + Q_UNUSED(s); + } + + void CRemoteAircraftSelector::showEvent(QShowEvent *event) + { + // force new combobox when visible + this->fillComboBox(); + QWidget::showEvent(event); + } + + void CRemoteAircraftSelector::ps_onAddedAircraft(const CSimulatedAircraft &aircraft) + { + Q_UNUSED(aircraft); + this->fillComboBox(); + } + + void CRemoteAircraftSelector::ps_onRemovedAircraft(const CCallsign &callsign) + { + Q_UNUSED(callsign); + this->fillComboBox(); + } + + void CRemoteAircraftSelector::fillComboBox() + { + if (!this->isVisible()) { return; } // for performance reasons + Q_ASSERT(getIContextNetwork()); + m_aircraft = getIContextNetwork()->getAircraftInRange(); + this->ui->cb_RemoteAircraftSelector->clear(); + if (m_aircraft.isEmpty()) { return; } + + CCallsign currentSelection(this->getSelectedCallsign()); + QStringList items; + for (const CSimulatedAircraft &aircraft : m_aircraft) + { + if (aircraft.getCallsign().isEmpty()) { continue; } + QString i(aircraft.getCallsign().toQString()); + if (aircraft.hasValidAircraftDesignator()) + { + i += " ("; + i += aircraft.getIcaoInfo().toQString(false); + i += ")"; + } + if (aircraft.hasValidRealName()) + { + i += " - "; + i += aircraft.getPilotRealname(); + } + items.append(i); + } + + // new combobox + this->ui->cb_RemoteAircraftSelector->addItems(items); + + // set old selection if possible + if (currentSelection.isEmpty()) { return; } + int index = m_aircraft.firstIndexOfCallsign(currentSelection); + if (index >= 0 && index < this->ui->cb_RemoteAircraftSelector->count()) + { + this->ui->cb_RemoteAircraftSelector->setCurrentIndex(index); + } + } + + } // namespace +} // namespace diff --git a/src/blackgui/components/remoteaircraftselector.h b/src/blackgui/components/remoteaircraftselector.h new file mode 100644 index 000000000..407498e4f --- /dev/null +++ b/src/blackgui/components/remoteaircraftselector.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2015 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_REMOTEAIRCRAFTSELECTOR_H +#define BLACKGUI_REMOTEAIRCRAFTSELECTOR_H + +#include "enableforruntime.h" +#include "blackmisc/avcallsign.h" +#include "blackmisc/simulation/simulatedaircraftlist.h" + + +#include +#include + +namespace Ui { class CRemoteAircraftSelector; } + +namespace BlackGui +{ + namespace Components + { + //! Select a remote aircraft + class CRemoteAircraftSelector : public QFrame, public CEnableForRuntime + { + Q_OBJECT + + public: + //! Constructor + explicit CRemoteAircraftSelector(QWidget *parent = nullptr); + + //! Destructor + ~CRemoteAircraftSelector(); + + //! Selected callsign + BlackMisc::Aviation::CCallsign getSelectedCallsign() const; + + protected: + //! \copydoc CEnableForRuntime::runtimeHasBeenSet + virtual void runtimeHasBeenSet() override; + + //! \copydoc QWidget::showEvent + virtual void showEvent(QShowEvent *event) override; + + private slots: + //! Change content of combobox + void ps_onAddedAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft); + + //! IContextNetwork::removedAircraft + void ps_onRemovedAircraft(const BlackMisc::Aviation::CCallsign &callsign); + + private: + QScopedPointer ui; + BlackMisc::Simulation::CSimulatedAircraftList m_aircraft; + + //! Set combobox items + void fillComboBox(); + }; + + } // namespace +} // namespace + +#endif // guard diff --git a/src/blackgui/components/remoteaircraftselector.ui b/src/blackgui/components/remoteaircraftselector.ui new file mode 100644 index 000000000..5b6be20ee --- /dev/null +++ b/src/blackgui/components/remoteaircraftselector.ui @@ -0,0 +1,58 @@ + + + CRemoteAircraftSelector + + + + 0 + 0 + 102 + 22 + + + + + 0 + 0 + + + + Frame + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 100 + 0 + + + + + + + + + diff --git a/src/blackgui/qss/mainwindow.qss b/src/blackgui/qss/mainwindow.qss index 7da802ab2..654159276 100644 --- a/src/blackgui/qss/mainwindow.qss +++ b/src/blackgui/qss/mainwindow.qss @@ -221,6 +221,27 @@ QTabBar QToolButton { /* the scroll buttons are tool buttons */ border: 1px solid green; } +QSplitter::handle { + background-color: rgba(0, 0, 255, 200); + margin-top: 1px; + margin-bottom: 1px; + height: 1px; +} + +QSplitter::handle:pressed { + background-color: rgba(0, 255, 255, 255); +} + +/** +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} +**/ + QLabel { background: transparent; } @@ -258,13 +279,14 @@ QPlainTextEdit { QGroupBox { border: 1px solid green; - margin-top: 2ex; /* leave space at the top for the title */ + margin-top: 2.5ex; /* leave space at the top for the title */ + border-radius: 5px; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: middle center; /* position at the top center */ - padding: 0 3px; + padding: 0 5px; } QToolBox::tab { diff --git a/src/blackmisc/avaircraft.cpp b/src/blackmisc/avaircraft.cpp index 26e737df8..b426f01b9 100644 --- a/src/blackmisc/avaircraft.cpp +++ b/src/blackmisc/avaircraft.cpp @@ -156,6 +156,11 @@ namespace BlackMisc m_parts.setCallsign(this->getCallsign()); } + bool CAircraft::isVtol() const + { + return m_icao.isVtol(); + } + CVariant CAircraft::propertyByIndex(const BlackMisc::CPropertyIndex &index) const { if (index.isMyself()) { return this->toCVariant(); } @@ -180,6 +185,8 @@ namespace BlackMisc return this->m_icao.propertyByIndex(index.copyFrontRemoved()); case IndexParts: return this->m_parts.propertyByIndex(index.copyFrontRemoved()); + case IndexIsVtol: + return CVariant::fromValue(this->isVtol()); default: return (ICoordinateGeodetic::canHandleIndex(index)) ? ICoordinateGeodetic::propertyByIndex(index) : diff --git a/src/blackmisc/avaircraft.h b/src/blackmisc/avaircraft.h index 146ff0613..a1e2be503 100644 --- a/src/blackmisc/avaircraft.h +++ b/src/blackmisc/avaircraft.h @@ -30,7 +30,9 @@ namespace BlackMisc namespace Aviation { //! Value object encapsulating information of an aircraft - class CAircraft : public CValueObjectStdTuple, public BlackMisc::Geo::ICoordinateWithRelativePosition + class CAircraft : + public CValueObjectStdTuple, + public BlackMisc::Geo::ICoordinateWithRelativePosition { public: //! Properties by index @@ -44,7 +46,8 @@ namespace BlackMisc IndexTransponder, IndexSituation, IndexIcao, - IndexParts + IndexParts, + IndexIsVtol }; //! Default constructor. @@ -75,7 +78,7 @@ namespace BlackMisc const BlackMisc::Network::CUser &getPilot() const { return m_pilot; } //! Get user's real name - QString getPilotRealname() { return m_pilot.getRealName(); } + QString getPilotRealname() const { return m_pilot.getRealName(); } //! Get user's real id QString getPilotId() { return m_pilot.getId(); } @@ -247,6 +250,9 @@ namespace BlackMisc //! Set aircraft parts void setParts(const BlackMisc::Aviation::CAircraftParts &parts); + //! VTOL aircraft? + bool isVtol() const; + //! \copydoc CValueObject::propertyByIndex virtual CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const override; @@ -282,7 +288,7 @@ BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Aviation::CAircraft, ( o.m_parts, o.m_icao, o.m_distanceToOwnAircraft, - o.m_bearingToOwnAircraft)) + o.m_bearingToOwnAircraft)) Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraft) diff --git a/src/blackmisc/avaircrafticao.cpp b/src/blackmisc/avaircrafticao.cpp index 565a01b63..1f8a3ace2 100644 --- a/src/blackmisc/avaircrafticao.cpp +++ b/src/blackmisc/avaircrafticao.cpp @@ -77,6 +77,27 @@ namespace BlackMisc return true; } + bool CAircraftIcao::isVtol() const + { + // special designators + if ( + this->m_aircraftDesignator == "BALL" || + this->m_aircraftDesignator == "SHIP" || + this->m_aircraftDesignator == "GYRO" || + this->m_aircraftDesignator == "UHEL" + ) { return true; } + + if (!m_aircraftCombinedType.isEmpty()) + { + if ( + this->m_aircraftCombinedType.startsWith('G') || // gyrocopter + this->m_aircraftCombinedType.startsWith('H') || // helicopter + this->m_aircraftCombinedType.startsWith('T') // tilt wing + ) { return true; } + } + return false; + } + CVariant CAircraftIcao::propertyByIndex(const BlackMisc::CPropertyIndex &index) const { if (index.isMyself()) { return this->toCVariant(); } @@ -93,6 +114,8 @@ namespace BlackMisc return CVariant::fromValue(this->m_aircraftColor); case IndexAsString: return CVariant::fromValue(this->asString()); + case IndexIsVtol: + return CVariant::fromValue(this->isVtol()); default: return CValueObject::propertyByIndex(index); } diff --git a/src/blackmisc/avaircrafticao.h b/src/blackmisc/avaircrafticao.h index a82e08ce2..d98b142bd 100644 --- a/src/blackmisc/avaircrafticao.h +++ b/src/blackmisc/avaircrafticao.h @@ -32,7 +32,8 @@ namespace BlackMisc IndexCombinedAircraftType, IndexAirlineDesignator, IndexAircraftColor, - IndexAsString + IndexAsString, + IndexIsVtol }; //! Default constructor. @@ -135,6 +136,9 @@ namespace BlackMisc //! Matches wildcard icao object bool matchesWildcardIcao(const CAircraftIcao &otherIcao) const; + //! Is VTOL aircraft + bool isVtol() const; + //! \copydoc CValueObject::propertyByIndex virtual CVariant propertyByIndex(const BlackMisc::CPropertyIndex &index) const override; diff --git a/src/blackmisc/avaircraftlist.h b/src/blackmisc/avaircraftlist.h index a6ab3055b..05d6dddaf 100644 --- a/src/blackmisc/avaircraftlist.h +++ b/src/blackmisc/avaircraftlist.h @@ -31,7 +31,7 @@ namespace BlackMisc class CAircraftList : public CSequence, public ICallsignObjectList, - public BlackMisc::Geo::IGeoObjectList + public BlackMisc::Geo::IGeoObjectWithRelativePositionList { public: //! Default constructor. diff --git a/src/blackmisc/avatcstationlist.cpp b/src/blackmisc/avatcstationlist.cpp index 19cd55fc1..220bed374 100644 --- a/src/blackmisc/avatcstationlist.cpp +++ b/src/blackmisc/avatcstationlist.cpp @@ -118,12 +118,12 @@ namespace BlackMisc if (onlineAtcStation.hasValidDistance()) { bookedAtcStation.setDistanceToOwnAircraft(onlineAtcStation.getDistanceToOwnAircraft()); - bookedAtcStation.setBearingToOwnAircraft(onlineAtcStation.getBearingToOwnAIrcraft()); + bookedAtcStation.setBearingToOwnAircraft(onlineAtcStation.getBearingToOwnAircraft()); } else if (bookedAtcStation.hasValidDistance()) { onlineAtcStation.setDistanceToOwnAircraft(bookedAtcStation.getDistanceToOwnAircraft()); - onlineAtcStation.setBearingToOwnAircraft(bookedAtcStation.getBearingToOwnAIrcraft()); + onlineAtcStation.setBearingToOwnAircraft(bookedAtcStation.getBearingToOwnAircraft()); } // update diff --git a/src/blackmisc/avcallsign.cpp b/src/blackmisc/avcallsign.cpp index e36e129ad..4c55380ab 100644 --- a/src/blackmisc/avcallsign.cpp +++ b/src/blackmisc/avcallsign.cpp @@ -85,6 +85,15 @@ namespace BlackMisc return atcAlikeCallsignSuffixes().contains(this->getSuffix(), Qt::CaseInsensitive); } + + /* + * OBS callsign? + */ + bool CCallsign::isObserverCallsign() const + { + return m_callsignAsSet.endsWith("_OBS", Qt::CaseInsensitive); + } + /* * Callsign as Observer */ diff --git a/src/blackmisc/avcallsign.h b/src/blackmisc/avcallsign.h index 9200d591c..733129e40 100644 --- a/src/blackmisc/avcallsign.h +++ b/src/blackmisc/avcallsign.h @@ -57,6 +57,9 @@ namespace BlackMisc //! \sa atcAlikeCallsignSuffixes() bool isAtcAlikeCallsign() const; + //! Observer callsign? + bool isObserverCallsign() const; + //! Get callsign. const QString &asString() const { return this->m_callsign; } diff --git a/src/blackmisc/avcallsignobjectlist.cpp b/src/blackmisc/avcallsignobjectlist.cpp index 15effcadd..6dfc2a03c 100644 --- a/src/blackmisc/avcallsignobjectlist.cpp +++ b/src/blackmisc/avcallsignobjectlist.cpp @@ -36,6 +36,17 @@ namespace BlackMisc return this->container().applyIf(&OBJ::getCallsign, callsign, variantMap); } + template + CCallsignList ICallsignObjectList::getCallsigns() const + { + CCallsignList cs; + for (const OBJ &obj : this->container()) + { + cs.push_back(obj.getCallsign()); + } + return cs; + } + template CONTAINER ICallsignObjectList::findByCallsign(const CCallsign &callsign) const { @@ -51,13 +62,22 @@ namespace BlackMisc template OBJ ICallsignObjectList::findFirstByCallsign(const CCallsign &callsign, const OBJ &ifNotFound) const { - return this->findByCallsign(callsign).frontOrDefault(ifNotFound); + for (const OBJ &callsignObj : this->container()) + { + if (callsignObj.getCallsign() == callsign) { return callsignObj; } + } + return ifNotFound; } template - OBJ ICallsignObjectList::findBackByCallsign(const CCallsign &callsign, const OBJ &ifNotFound) const + OBJ ICallsignObjectList::findLastByCallsign(const CCallsign &callsign, const OBJ &ifNotFound) const { - return this->findByCallsign(callsign).backOrDefault(ifNotFound); + for (auto current = container().end(); current != container().begin() ; /* Do nothing */) + { + --current; + if (current->getCallsign() == callsign) { return *current; } + } + return ifNotFound; } template @@ -73,6 +93,16 @@ namespace BlackMisc return r; } + template + int ICallsignObjectList::firstIndexOfCallsign(const CCallsign &callsign) + { + for (int i = 0; i < this->container().size(); i++) + { + if (this->container()[i].getCallsign() == callsign) { return i; } + } + return -1; + } + template int ICallsignObjectList::removeByCallsign(const CCallsign &callsign) { diff --git a/src/blackmisc/avcallsignobjectlist.h b/src/blackmisc/avcallsignobjectlist.h index 04dbfa4bc..ad65b23e9 100644 --- a/src/blackmisc/avcallsignobjectlist.h +++ b/src/blackmisc/avcallsignobjectlist.h @@ -36,6 +36,9 @@ namespace BlackMisc //! Apply for given callsign int applyIfCallsign(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::CPropertyIndexVariantMap &variantMap); + //! All callsigns + BlackMisc::Aviation::CCallsignList getCallsigns() const; + //! Find 0..n stations by callsign CONTAINER findByCallsign(const CCallsign &callsign) const; @@ -46,11 +49,14 @@ namespace BlackMisc OBJ findFirstByCallsign(const CCallsign &callsign, const OBJ &ifNotFound = {}) const; //! Find the back object by callsign, if none return given one - OBJ findBackByCallsign(const CCallsign &callsign, const OBJ &ifNotFound = {}) const; + OBJ findLastByCallsign(const CCallsign &callsign, const OBJ &ifNotFound = {}) const; //! All with given suffix, empty suffixes ignored CONTAINER findBySuffix(const QString &suffix) const; + //! First found index of callsign, otherwise -1 + int firstIndexOfCallsign(const BlackMisc::Aviation::CCallsign &callsign); + //! Remove all objects with callsign int removeByCallsign(const CCallsign &callsign); diff --git a/src/blackmisc/aviation/aircraftengine.cpp b/src/blackmisc/aviation/aircraftengine.cpp index b944d4927..5e1fbd186 100644 --- a/src/blackmisc/aviation/aircraftengine.cpp +++ b/src/blackmisc/aviation/aircraftengine.cpp @@ -13,8 +13,20 @@ namespace BlackMisc { namespace Aviation { - QString CAircraftEngine::convertToQString(bool /** i18n */) const + CAircraftEngine::CAircraftEngine(int number, bool on) : m_number(number), m_on(on) { + Q_ASSERT_X(number > 0, "CAircraftEngine", "Engine number have to be > 1"); + } + + void CAircraftEngine::setNumber(int number) + { + Q_ASSERT_X(number > 0, "setNumber", "Engine number have to be > 1"); + m_number = number; + } + + QString CAircraftEngine::convertToQString(bool i18n) const + { + Q_UNUSED(i18n); QString s(m_number); s += m_on; return s; diff --git a/src/blackmisc/aviation/aircraftengine.h b/src/blackmisc/aviation/aircraftengine.h index d8e9fc526..bef928438 100644 --- a/src/blackmisc/aviation/aircraftengine.h +++ b/src/blackmisc/aviation/aircraftengine.h @@ -27,13 +27,13 @@ namespace BlackMisc CAircraftEngine() = default; //! Constructor - CAircraftEngine(int number, bool on) : m_number(number), m_on(on) {} + CAircraftEngine(int number, bool on); //! Get engine number int getNumber() const { return m_number; } //! Set engine number - void setNumber (int number) { m_number = number; } + void setNumber (int number); //! Is on/off? bool isOn() const { return m_on; } @@ -61,4 +61,4 @@ BLACK_DECLARE_TUPLE_CONVERSION(BlackMisc::Aviation::CAircraftEngine, ( Q_DECLARE_METATYPE(BlackMisc::Aviation::CAircraftEngine) -#endif // BLACKMISC_AIRCRAFTENGINES_H +#endif // guard diff --git a/src/blackmisc/aviation/aircraftenginelist.cpp b/src/blackmisc/aviation/aircraftenginelist.cpp index 09cdd4d78..735d7e375 100644 --- a/src/blackmisc/aviation/aircraftenginelist.cpp +++ b/src/blackmisc/aviation/aircraftenginelist.cpp @@ -13,10 +13,57 @@ namespace BlackMisc { namespace Aviation { + CAircraftEngineList::CAircraftEngineList(std::initializer_list enginesOnOff) + { + int no = 1; // engines 1 based + for (auto it = enginesOnOff.begin(); it != enginesOnOff.end(); ++it) + { + CAircraftEngine engine(no++, *it); + this->push_back(engine); + } + } + CAircraftEngineList::CAircraftEngineList(const CSequence &other) : CSequence(other) { } + CAircraftEngine CAircraftEngineList::getEngine(int engineNumber) const + { + Q_ASSERT(engineNumber >= 0); + return this->findBy(&CAircraftEngine::getNumber, engineNumber).frontOrDefault(); + } + + bool CAircraftEngineList::isEngineOn(int engineNumber) const + { + return getEngine(engineNumber).isOn(); + } + + QJsonObject CAircraftEngineList::toJson() const + { + QJsonObject map; + + for (const auto &e : *this) + { + QJsonObject value = e.toJson(); + map.insert(QString::number(e.getNumber()), value); + } + return map; + } + + void CAircraftEngineList::convertFromJson(const QJsonObject &json) + { + clear(); + for (const auto &e : json.keys()) + { + + CAircraftEngine engine; + int number = e.toInt(); + engine.convertFromJson(json.value(e).toObject()); + engine.setNumber(number); + push_back(engine); + } + } + void CAircraftEngineList::registerMetadata() { qRegisterMetaType>(); diff --git a/src/blackmisc/aviation/aircraftenginelist.h b/src/blackmisc/aviation/aircraftenginelist.h index dd713083c..6e00d021e 100644 --- a/src/blackmisc/aviation/aircraftenginelist.h +++ b/src/blackmisc/aviation/aircraftenginelist.h @@ -15,6 +15,7 @@ #include "aircraftengine.h" #include "blackmisc/collection.h" #include "blackmisc/sequence.h" +#include namespace BlackMisc { @@ -27,41 +28,29 @@ namespace BlackMisc //! Default constructor. CAircraftEngineList() = default; + //! Construct by bool values for engines 1,2 ... + CAircraftEngineList(std::initializer_list enginesOnOff); + //! Construct from a base class object. CAircraftEngineList(const CSequence &other); + //! Get engine 1..n + CAircraftEngine getEngine(int engineNumber) const; + + //! Engine number 1..x on? + bool isEngineOn(int engineNumber) const; + //! \copydoc CValueObject::toQVariant virtual QVariant toQVariant() const override { return QVariant::fromValue(*this); } //! \copydoc CValueObject::convertFromQVariant virtual void convertFromQVariant(const QVariant &variant) override { BlackMisc::setFromQVariant(this, variant); } - virtual QJsonObject toJson() const override - { - QJsonObject map; - - for (const auto &e : *this) - { - QJsonObject value = e.toJson(); - map.insert(QString::number(e.getNumber()), value); - } - return map; - } + //! \copydoc CValueObject::toJson + virtual QJsonObject toJson() const override; //! \copydoc CValueObject::convertFromJson - virtual void convertFromJson(const QJsonObject &json) override - { - clear(); - for (const auto &e : json.keys()) - { - - CAircraftEngine engine; - int number = e.toInt(); - engine.convertFromJson(json.value(e).toObject()); - engine.setNumber(number); - push_back(engine); - } - } + virtual void convertFromJson(const QJsonObject &json) override; //! Register metadata static void registerMetadata(); diff --git a/src/blackmisc/aviation/aircraftparts.cpp b/src/blackmisc/aviation/aircraftparts.cpp index c54d65d68..395f1b197 100644 --- a/src/blackmisc/aviation/aircraftparts.cpp +++ b/src/blackmisc/aviation/aircraftparts.cpp @@ -100,12 +100,12 @@ namespace BlackMisc CAircraftEngine CAircraftParts::getEngine(int number) const { - return this->m_engines.findBy(&CAircraftEngine::getNumber, number).frontOrDefault(); + return this->m_engines.getEngine(number); } bool CAircraftParts::isEngineOn(int number) const { - return this->getEngine(number).isOn(); + return this->m_engines.isEngineOn(number); } } // namespace diff --git a/src/blackmisc/aviation/aircraftparts.h b/src/blackmisc/aviation/aircraftparts.h index 32c747b09..5ad63fe22 100644 --- a/src/blackmisc/aviation/aircraftparts.h +++ b/src/blackmisc/aviation/aircraftparts.h @@ -94,7 +94,7 @@ namespace BlackMisc //! Engine with number CAircraftEngine getEngine(int number) const; - //! Is engine with number on? + //! Is engine with number 1..n on? bool isEngineOn(int number) const; //! Set engines diff --git a/src/blackmisc/blackmisc.pro b/src/blackmisc/blackmisc.pro index 9c98db800..9bdcbc483 100644 --- a/src/blackmisc/blackmisc.pro +++ b/src/blackmisc/blackmisc.pro @@ -25,11 +25,11 @@ TRANSLATIONS += translations/blackmisc_i18n_de.ts \ HEADERS += *.h \ $$PWD/simulation/*.h \ - $$PWD/aviation/*.h \ + $$PWD/aviation/*.h SOURCES += *.cpp \ $$PWD/simulation/*.cpp \ - $$PWD/aviation/*.cpp \ + $$PWD/aviation/*.cpp DESTDIR = ../../lib OTHER_FILES += $$TRANSLATIONS readme.txt diff --git a/src/blackmisc/coordinategeodetic.h b/src/blackmisc/coordinategeodetic.h index 7dc35bb78..49b2342f9 100644 --- a/src/blackmisc/coordinategeodetic.h +++ b/src/blackmisc/coordinategeodetic.h @@ -100,7 +100,7 @@ namespace BlackMisc void setDistanceToOwnAircraft(const BlackMisc::PhysicalQuantities::CLength &distance) { this->m_distanceToOwnAircraft = distance; } //! Get the bearing to own plane - const BlackMisc::PhysicalQuantities::CAngle &getBearingToOwnAIrcraft() const { return m_bearingToOwnAircraft; } + const BlackMisc::PhysicalQuantities::CAngle &getBearingToOwnAircraft() const { return m_bearingToOwnAircraft; } //! Set bearing to own plane void setBearingToOwnAircraft(const BlackMisc::PhysicalQuantities::CAngle &angle) { this->m_bearingToOwnAircraft = angle; } diff --git a/src/blackmisc/geoobjectlist.cpp b/src/blackmisc/geoobjectlist.cpp index c97aa4bcf..ba4b0baa1 100644 --- a/src/blackmisc/geoobjectlist.cpp +++ b/src/blackmisc/geoobjectlist.cpp @@ -38,7 +38,7 @@ namespace BlackMisc } template - void IGeoObjectWithRelativePositionList::calculcateDistanceAndBearingToPlane(const ICoordinateGeodetic &position) + void IGeoObjectWithRelativePositionList::calculcateDistanceAndBearingToPosition(const ICoordinateGeodetic &position) { for (OBJ &geoObj : this->container()) { @@ -60,11 +60,16 @@ namespace BlackMisc { if (updateValues) { - this->calculcateDistanceAndBearingToPlane(position); + this->calculcateDistanceAndBearingToPosition(position); } this->container().sort([ & ](const OBJ & a, const OBJ & b) { return a.getDistanceToOwnAircraft() < b.getDistanceToOwnAircraft(); }); } + template + void IGeoObjectWithRelativePositionList::sortByDistanceToOwnAircraft() + { + this->container().sort([ & ](const OBJ & a, const OBJ & b) { return a.getDistanceToOwnAircraft() < b.getDistanceToOwnAircraft(); }); + } // see here for the reason of thess forward instantiations // http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html diff --git a/src/blackmisc/geoobjectlist.h b/src/blackmisc/geoobjectlist.h index 0fbc4453c..e21d6f2e5 100644 --- a/src/blackmisc/geoobjectlist.h +++ b/src/blackmisc/geoobjectlist.h @@ -53,11 +53,14 @@ namespace BlackMisc //! Calculate distances, then sort by range void sortByRange(const BlackMisc::Geo::ICoordinateGeodetic &position, bool updateValues); + //! If distance is already set, just sort + void sortByDistanceToOwnAircraft(); + //! Calculate distances, remove if outside range void removeIfOutsideRange(const BlackMisc::Geo::ICoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &maxDistance, bool updateValues); //! Calculate distances - void calculcateDistanceAndBearingToPlane(const BlackMisc::Geo::ICoordinateGeodetic &position); + void calculcateDistanceAndBearingToPosition(const BlackMisc::Geo::ICoordinateGeodetic &position); protected: //! Constructor diff --git a/src/blackmisc/sequence.h b/src/blackmisc/sequence.h index e4a9e7654..75532f737 100644 --- a/src/blackmisc/sequence.h +++ b/src/blackmisc/sequence.h @@ -503,22 +503,6 @@ namespace BlackMisc return result; } - /*! - * \brief Return a copy as derived container sorted by a given comparator predicate. - * \remarks Sorts in background. - */ - template - QFuture sortedAsync(Predicate p) const - { - TargetContainer result = *this; - QFuture f = QtConcurrent::run([ = ]() - { - result.sort(p); - return result; - }); - return f; - } - /*! * \brief Return a copy sorted by some particular key(s). * \param key1 A pointer to a member function of T. diff --git a/src/blackmisc/simulation/simulatedaircraftlist.h b/src/blackmisc/simulation/simulatedaircraftlist.h index df097089d..85fd009df 100644 --- a/src/blackmisc/simulation/simulatedaircraftlist.h +++ b/src/blackmisc/simulation/simulatedaircraftlist.h @@ -31,7 +31,7 @@ namespace BlackMisc class CSimulatedAircraftList : public BlackMisc::CSequence, public BlackMisc::Aviation::ICallsignObjectList, - public BlackMisc::Geo::IGeoObjectList + public BlackMisc::Geo::IGeoObjectWithRelativePositionList { public: //! Default constructor. diff --git a/src/blackmisc/timestampobjectlist.cpp b/src/blackmisc/timestampobjectlist.cpp index 631d83ee8..98b392bbb 100644 --- a/src/blackmisc/timestampobjectlist.cpp +++ b/src/blackmisc/timestampobjectlist.cpp @@ -119,7 +119,7 @@ namespace BlackMisc } template - void ITimestampObjectList::removeOlderThanNowMinusOffset(int offsetMs) + void ITimestampObjectList::removeOlderThanNowMinusOffset(qint64 offsetMs) { const qint64 epoch = QDateTime::currentMSecsSinceEpoch() - offsetMs; this->container().removeIf([&](const OBJ & obj) diff --git a/src/blackmisc/timestampobjectlist.h b/src/blackmisc/timestampobjectlist.h index f2dfd6869..3da695b9f 100644 --- a/src/blackmisc/timestampobjectlist.h +++ b/src/blackmisc/timestampobjectlist.h @@ -61,7 +61,7 @@ namespace BlackMisc void removeBefore(qint64 msSinceEpoch); //! Remove objects older than seconds - void removeOlderThanNowMinusOffset(int offsetMs); + void removeOlderThanNowMinusOffset(qint64 offsetMs); //! Sort by timestamp void sortLatestFirst(); diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.cpp b/src/plugins/simulator/fscommon/simulator_fscommon.cpp index 7fccd1d52..098671d6f 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.cpp +++ b/src/plugins/simulator/fscommon/simulator_fscommon.cpp @@ -242,16 +242,6 @@ namespace BlackSimPlugin return empty; } - int CSimulatorFsCommon::getMaxRenderedAircraft() const - { - return this->m_maxRenderedAircraft; - } - - void CSimulatorFsCommon::setMaxRenderedAircraft(int maxRenderedAircraft) - { - this->m_maxRenderedAircraft = maxRenderedAircraft; - } - bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft, const QString &originator) { if (originator == simulatorOriginator()) { return false; } @@ -275,5 +265,14 @@ namespace BlackSimPlugin return true; } + void CSimulatorFsCommon::enableDebugMessages(bool driver, bool interpolator) + { + if (this->m_interpolator) + { + this->m_interpolator->enableDebugMessages(interpolator); + } + CSimulatorCommon::enableDebugMessages(driver, interpolator); + } + } // namespace } // namespace diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.h b/src/plugins/simulator/fscommon/simulator_fscommon.h index e45498e6f..937c16661 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.h +++ b/src/plugins/simulator/fscommon/simulator_fscommon.h @@ -13,6 +13,7 @@ #define BLACKSIMPLUGIN_SIMULATOR_COMMON_H #include "blackcore/simulator.h" +#include "blackcore/interpolator.h" #include "blacksim/fscommon/aircraftmapper.h" #include "fsuipc.h" @@ -67,18 +68,15 @@ namespace BlackSimPlugin //! \copydoc IContextSimulator::iconForModel virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override; - //! \copydoc ISimulator::getMaxRenderedAircraft - virtual int getMaxRenderedAircraft() const override; - - //! \copydoc ISimulator::setMaxRenderedAircraft - virtual void setMaxRenderedAircraft(int maxRenderedAircraft) override; - //! \copydoc ISimulator::changeRenderedAircraftModel virtual bool changeRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override; //! \copydoc ISimulator::changeAircraftEnabled virtual bool changeAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override; + //! \copydoc ISimulator::enableDebuggingMessages + virtual void enableDebugMessages(bool driver, bool interpolator) override; + protected: //! Constructor CSimulatorFsCommon( @@ -94,6 +92,7 @@ namespace BlackSimPlugin bool m_simTimeSynced = false; //!< Time synchronized? BlackMisc::PhysicalQuantities::CTime m_syncTimeOffset; //!< time offset BlackMisc::Aviation::CAirportList m_airportsInRange; //!< aiports in range of own aircraft + BlackCore::IInterpolator *m_interpolator = nullptr; //!< interpolator instance // cockpit as set in SIM BlackMisc::Aviation::CComSystem m_simCom1; //!< cockpit COM1 state in simulator diff --git a/src/plugins/simulator/fsx/simulator_fsx.cpp b/src/plugins/simulator/fsx/simulator_fsx.cpp index 96269079a..a8e85e437 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.cpp +++ b/src/plugins/simulator/fsx/simulator_fsx.cpp @@ -660,7 +660,7 @@ namespace BlackSimPlugin if (interpolatorStatus.interpolationSucceeded) { // aircraft parts - // inside interpolator if, as no parts can be sent without position + // inside "interpolator if", as no parts can be sent without position updateRemoteAircraftParts(simObj, parts, partsStatus, interpolatedSituation, isOnGround); // update and retrieve parts in the same step } diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 7411894d4..1a9282970 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -191,7 +191,6 @@ namespace BlackSimPlugin HANDLE m_hSimConnect = nullptr; //!< Handle to SimConnect object uint m_nextObjID = 1; //!< object ID TODO: also used as request id, where to we place other request ids as for facilities BlackMisc::PhysicalQuantities::CTime m_syncTimeOffset; //!< Time offset (if synchronized) - BlackCore::IInterpolator *m_interpolator = nullptr; //!< interpolator instance QHash m_simConnectObjects; QFutureWatcher m_watcherConnect; diff --git a/src/swiftgui_standard/swiftguistd.h b/src/swiftgui_standard/swiftguistd.h index 37507b736..207ced72d 100644 --- a/src/swiftgui_standard/swiftguistd.h +++ b/src/swiftgui_standard/swiftguistd.h @@ -58,7 +58,8 @@ public: enum MainPageIndex { MainPageInfoArea = 0, - MainPageLogin = 1 + MainPageLogin = 1, + MainPageInternals = 2 }; //! Constructor diff --git a/src/swiftgui_standard/swiftguistd.ui b/src/swiftgui_standard/swiftguistd.ui index 564a30759..b6d3f6ab8 100644 --- a/src/swiftgui_standard/swiftguistd.ui +++ b/src/swiftgui_standard/swiftguistd.ui @@ -125,7 +125,7 @@ QFrame::NoFrame - 1 + 2 @@ -171,6 +171,28 @@ + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + @@ -250,6 +272,8 @@ + + @@ -375,6 +399,11 @@ Position LOWW (Vienna, AUT) + + + Internals + + @@ -408,6 +437,12 @@
blackgui/components/logincomponent.h
1 + + BlackGui::Components::CInternalsComponent + QWidget +
blackgui/components/internalscomponent.h
+ 1 +
diff --git a/src/swiftgui_standard/swiftguistd_init.cpp b/src/swiftgui_standard/swiftguistd_init.cpp index d9a7ca360..3043e3ec0 100644 --- a/src/swiftgui_standard/swiftguistd_init.cpp +++ b/src/swiftgui_standard/swiftguistd_init.cpp @@ -152,6 +152,7 @@ void SwiftGuiStd::initGuiSignals() connect(this->ui->menu_TestLocationsEDDM, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); connect(this->ui->menu_TestLocationsEDNX, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); connect(this->ui->menu_TestLocationsEDRY, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); + connect(this->ui->menu_TestInternals, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); connect(this->ui->menu_FileClose, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); connect(this->ui->menu_FileSettingsDirectory, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); connect(this->ui->menu_FileResetSettings, &QAction::triggered, this, &SwiftGuiStd::ps_onMenuClicked); diff --git a/src/swiftgui_standard/swiftguistd_menus.cpp b/src/swiftgui_standard/swiftguistd_menus.cpp index e04b8ec13..823e3f3bd 100644 --- a/src/swiftgui_standard/swiftguistd_menus.cpp +++ b/src/swiftgui_standard/swiftguistd_menus.cpp @@ -1,3 +1,12 @@ +/* Copyright (C) 2013 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + #include "swiftguistd.h" #include "ui_swiftguistd.h" #include "blackgui/stylesheetutility.h" @@ -46,6 +55,10 @@ void SwiftGuiStd::ps_onMenuClicked() this->ui->comp_MainInfoArea->getSettingsComponent()->reloadSettings(); CLogMessage(this).info("Settings reloaded"); } + else if (sender == this->ui->menu_TestInternals) + { + this->ui->sw_MainMiddle->setCurrentIndex(MainPageInternals); + } else if (sender == this->ui->menu_FileReloadStyleSheets) { CStyleSheetUtility::instance().read(); diff --git a/tests/blackcore/testinterpolator.cpp b/tests/blackcore/testinterpolator.cpp index ce1082b25..b97274535 100644 --- a/tests/blackcore/testinterpolator.cpp +++ b/tests/blackcore/testinterpolator.cpp @@ -25,7 +25,7 @@ namespace BlackCoreTest { QScopedPointer provider(new CRemoteAircraftProviderDummy()); CInterpolatorLinear interpolator(provider.data()); - interpolator.forceSorting(true); + interpolator.forceSortingOfAddedValues(true); const qint64 ts = 1425000000000; // QDateTime::currentMSecsSinceEpoch(); const qint64 deltaT = 5000; // ms CCallsign cs("SWIFT"); @@ -219,7 +219,7 @@ namespace BlackCoreTest CAircraftParts CTestInterpolator::getTestParts(const CCallsign &callsign, int number, qint64 ts, qint64 deltaT) { CAircraftLights l(true, false, true, false, true, false); - CAircraftEngineList e({ CAircraftEngine(0, true), CAircraftEngine(1, false), CAircraftEngine(2, true) }); + CAircraftEngineList e({ CAircraftEngine(1, true), CAircraftEngine(2, false), CAircraftEngine(3, true) }); CAircraftParts p(callsign, l, true, 20, true, e, false); p.setMSecsSinceEpoch(ts - deltaT * number); // values in past return p;