diff --git a/src/blackcore/airspace_monitor.cpp b/src/blackcore/airspace_monitor.cpp index 36da8afbe..7dd956eb3 100644 --- a/src/blackcore/airspace_monitor.cpp +++ b/src/blackcore/airspace_monitor.cpp @@ -122,7 +122,7 @@ namespace BlackCore { bool s1 = connect(this, &CAirspaceMonitor::addedRemoteAircraftSituation, situationSlot); bool s2 = connect(this, &CAirspaceMonitor::addedRemoteAircraftParts, partsSlot); - bool s3 = connect(this, &CAirspaceMonitor::removedAircraft, removedAircraftSlot); + bool s3 = connect(this, &CAirspaceMonitor::removedRemoteAircraft, removedAircraftSlot); return s1 && s2 && s3; } @@ -487,10 +487,11 @@ namespace BlackCore void CAirspaceMonitor::removeAllAircraft() { - m_aircraftWatchdog.removeAll(); + m_aircraftWatchdog.removeAll(); // upfront for (CAircraft aircraft : m_aircraftInRange) { - emit removedAircraft(aircraft.getCallsign()); + const CCallsign cs(aircraft.getCallsign()); + emit removedRemoteAircraft(cs); } m_aircraftSituations.clear(); m_aircraftParts.clear(); @@ -562,7 +563,11 @@ namespace BlackCore remoteAircraft.setClient(remoteClient); remoteAircraft.setModel(remoteClient.getAircraftModel()); - bool dataComplete = remoteAircraft.hasValidAircraftDesignator() && remoteAircraft.hasValidRealName(); + // check if the name and ICAO query went properly through + bool dataComplete = + remoteAircraft.hasValidAircraftDesignator() && + (!m_serverSupportsNameQuery || remoteAircraft.hasValidRealName()); + if (trial < 3 && !dataComplete) { // allow another period for the client data to arrive, otherwise go ahead @@ -571,7 +576,7 @@ namespace BlackCore } Q_ASSERT(remoteAircraft.hasValidAircraftDesignator()); - Q_ASSERT(remoteAircraft.hasValidRealName()); + Q_ASSERT(!m_serverSupportsNameQuery || remoteAircraft.hasValidRealName()); emit this->readyForModelMatching(remoteAircraft); } @@ -816,13 +821,16 @@ namespace BlackCore { Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this)); bool contains = this->m_aircraftInRange.containsCallsign(callsign); + + // if with contains false remove here, in case of inconsistencies this->m_aircraftWatchdog.removeCallsign(callsign); this->m_otherClients.removeByCallsign(callsign); + this->removeFromAircraftCaches(callsign); + if (contains) { this->m_aircraftInRange.removeByCallsign(callsign); - this->removeFromAircraftCaches(callsign); - emit this->removedAircraft(callsign); + emit this->removedRemoteAircraft(callsign); } } diff --git a/src/blackcore/airspace_watchdog.cpp b/src/blackcore/airspace_watchdog.cpp index fbc01adaa..ff6ef67e8 100644 --- a/src/blackcore/airspace_watchdog.cpp +++ b/src/blackcore/airspace_watchdog.cpp @@ -36,8 +36,16 @@ namespace BlackCore void CAirspaceWatchdog::resetCallsign(const CCallsign &callsign) { - Q_ASSERT(m_callsignTimestamps.contains(callsign)); - m_callsignTimestamps[callsign] = QDateTime::currentDateTimeUtc(); + if (m_callsignTimestamps.contains(callsign)) + { + m_callsignTimestamps[callsign] = QDateTime::currentDateTimeUtc(); + } + else + { + // that should rarely happen + CLogMessage(this).warning("Watchdog reset for non-existing callsign: %1") << callsign; + this->addCallsign(callsign); + } } void CAirspaceWatchdog::removeCallsign(const CCallsign &callsign) diff --git a/src/blackcore/context_network_impl.cpp b/src/blackcore/context_network_impl.cpp index 30893a62f..7c2322c5f 100644 --- a/src/blackcore/context_network_impl.cpp +++ b/src/blackcore/context_network_impl.cpp @@ -76,7 +76,8 @@ namespace BlackCore connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationsBooked, this, &CContextNetwork::changedAtcStationsBooked); connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationOnlineConnectionStatus, this, &CContextNetwork::changedAtcStationOnlineConnectionStatus); connect(this->m_airspace, &CAirspaceMonitor::changedAircraftInRange, this, &CContextNetwork::changedAircraftInRange); - connect(this->m_airspace, &CAirspaceMonitor::removedAircraft, this, &CContextNetwork::removedAircraft); + connect(this->m_airspace, &CAirspaceMonitor::removedRemoteAircraft, this, &IContextNetwork::removedAircraft); + connect(this->m_airspace, &CAirspaceMonitor::removedRemoteAircraft, this, &CContextNetwork::removedRemoteAircraft); 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); @@ -124,9 +125,9 @@ namespace BlackCore } bool CContextNetwork::connectRemoteAircraftProviderSignals( - std::function situationSlot, - std::function partsSlot, - std::function removedAircraftSlot) + std::function situationSlot, + std::function partsSlot, + std::function removedAircraftSlot) { Q_ASSERT(this->m_airspace); return this->m_airspace->connectRemoteAircraftProviderSignals(situationSlot, partsSlot, removedAircraftSlot); @@ -286,7 +287,7 @@ namespace BlackCore void CContextNetwork::ps_fsdConnectionStatusChanged(INetwork::ConnectionStatus from, INetwork::ConnectionStatus to) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << from << to; - auto fromOld = this->m_currentStatus; + auto fromOld = this->m_currentStatus; // own status cached this->m_currentStatus = to; if (fromOld == INetwork::Disconnecting) @@ -296,6 +297,13 @@ namespace BlackCore from = INetwork::Disconnecting; } + if (to == INetwork::Disconnected) + { + // make sure airspace is really cleaned up + Q_ASSERT(m_airspace); + m_airspace->clear(); + } + // send 1st position if (to == INetwork::Connected) { diff --git a/src/blackcore/context_network_impl.h b/src/blackcore/context_network_impl.h index 8f8cecbaa..bc5dbdb2c 100644 --- a/src/blackcore/context_network_impl.h +++ b/src/blackcore/context_network_impl.h @@ -80,13 +80,14 @@ namespace BlackCore // must not prefixed virtual (though they are) -> warning //! \copydoc IRemoteAircraftProviderReadOnly::addedRemoteAircraftSituation - void addedRemoteAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation) override; + void addedRemoteAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation); //! \copydoc IRemoteAircraftProviderReadOnly::addedRemoteAircraftPart - void addedRemoteAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts) override; + void addedRemoteAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts); //! \copydoc IRemoteAircraftProviderReadOnly::removedAircraft - void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; + //! \sa IContextNetwork::removedAircraft() which is the equivalent when using IContextNetwork + void removedRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign); public slots: //! \copydoc IContextNetwork::readAtcBookingsFromSource() diff --git a/src/blackcore/context_simulator_impl.cpp b/src/blackcore/context_simulator_impl.cpp index 09a8abfd6..64fe27117 100644 --- a/src/blackcore/context_simulator_impl.cpp +++ b/src/blackcore/context_simulator_impl.cpp @@ -235,9 +235,9 @@ namespace BlackCore // use readyForModelMatching instead of CAirspaceMonitor::addedAircraft, as it contains client information bool c = connect(networkContext, &IContextNetwork::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft); Q_ASSERT(c); - c = connect(networkContext, &IContextNetwork::removedAircraft, this, &CContextSimulator::ps_removeRemoteAircraft); + c = connect(networkContext, &IContextNetwork::removedAircraft, this, &CContextSimulator::ps_removedRemoteAircraft); Q_ASSERT(c); - c = connect(networkContext, &IContextNetwork::changedRenderedAircraftModel, this->m_simulator, &ISimulator::changeRenderedAircraftModel); + c = connect(networkContext, &IContextNetwork::changedRenderedAircraftModel, this->m_simulator, &ISimulator::changeRemoteAircraftModel); Q_ASSERT(c); c = connect(networkContext, &IContextNetwork::changedAircraftEnabled, this->m_simulator, &ISimulator::changeAircraftEnabled); Q_ASSERT(c); @@ -314,11 +314,11 @@ namespace BlackCore this->m_simulator->addRemoteAircraft(remoteAircraft); } - void CContextSimulator::ps_removeRemoteAircraft(const CCallsign &callsign) + void CContextSimulator::ps_removedRemoteAircraft(const CCallsign &callsign) { Q_ASSERT(this->m_simulator); - if (!this->m_simulator) return; - this->m_simulator->removeRenderedAircraft(callsign); + if (!this->m_simulator) { return; } + this->m_simulator->removeRemoteAircraft(callsign); } void CContextSimulator::ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status) diff --git a/src/blackcore/context_simulator_impl.h b/src/blackcore/context_simulator_impl.h index b97578022..b30536524 100644 --- a/src/blackcore/context_simulator_impl.h +++ b/src/blackcore/context_simulator_impl.h @@ -127,7 +127,7 @@ namespace BlackCore void ps_addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft); //! \copydoc ISimulator::removeRemoteAircraft - void ps_removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign); + void ps_removedRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign); //! Handle new connection status void ps_onConnectionStatusChanged(ISimulator::ConnectionStatus status); diff --git a/src/blackcore/simulator.h b/src/blackcore/simulator.h index 2f8be5716..cb80df079 100644 --- a/src/blackcore/simulator.h +++ b/src/blackcore/simulator.h @@ -83,10 +83,10 @@ namespace BlackCore virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft) = 0; //! Remove remote aircraft from simulator - virtual bool removeRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0; + virtual bool removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0; //! Change remote aircraft per property - virtual bool changeRenderedAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0; + virtual bool changeRemoteAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0; //! Aircraft got enabled / disabled virtual bool changeAircraftEnabled(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0; diff --git a/src/blackmisc/avaircraftlist.h b/src/blackmisc/avaircraftlist.h index 6733d31ae..a6ab3055b 100644 --- a/src/blackmisc/avaircraftlist.h +++ b/src/blackmisc/avaircraftlist.h @@ -58,10 +58,10 @@ namespace BlackMisc protected: //! Myself - virtual const CAircraftList &getContainer() const { return *this; } + virtual const CAircraftList &container() const { return *this; } //! Myself - virtual CAircraftList &getContainer() { return *this; } + virtual CAircraftList &container() { return *this; } }; diff --git a/src/blackmisc/avaircraftsituation.cpp b/src/blackmisc/avaircraftsituation.cpp index acb739dcc..7230ea038 100644 --- a/src/blackmisc/avaircraftsituation.cpp +++ b/src/blackmisc/avaircraftsituation.cpp @@ -106,5 +106,38 @@ namespace BlackMisc } } + bool CAircraftSituation::isOnGroundGuessed() const + { + CLength heightAboveGround(this->getHeightAboveGround()); + if (!heightAboveGround.isNull()) + { + return heightAboveGround.value(CLengthUnit::m()) < 2.0; + } + + // we guess on pitch an bank + if (qAbs(this->getPitch().value(CAngleUnit::deg())) > 10) { return false; } + if (qAbs(this->getBank().value(CAngleUnit::deg())) > 10) { return false; } + + if (this->getGroundSpeed().value(CSpeedUnit::km_h()) > 80) { return false; } + + // not sure, but his is a guess + return true; + } + + CLength CAircraftSituation::getHeightAboveGround() const + { + static const CLength notAvialable(0, CLengthUnit::nullUnit()); + if (this->m_altitude.getReferenceDatum() == CAltitude::AboveGround) + { + // we have a sure value + return this->getAltitude(); + } + if (!m_position.geodeticHeight().isNull() && !m_altitude.isNull()) + { + return m_altitude - m_position.geodeticHeight(); + } + return notAvialable; + } + } // namespace } // namespace diff --git a/src/blackmisc/avaircraftsituation.h b/src/blackmisc/avaircraftsituation.h index a64ff0a9e..ff01ee7e3 100644 --- a/src/blackmisc/avaircraftsituation.h +++ b/src/blackmisc/avaircraftsituation.h @@ -89,6 +89,9 @@ namespace BlackMisc //! \copydoc ICoordinateGeodetic::longitude() virtual const BlackMisc::Geo::CLongitude &longitude() const override { return this->m_position.longitude(); } + //! Guess if aircraft is "on ground" + virtual bool isOnGroundGuessed() const; + //! \copydoc ICoordinateGeodetic::geodeticHeight //! \remarks this should be used for elevation as depicted here: http://en.wikipedia.org/wiki/Altitude#mediaviewer/File:Vertical_distances.svg const BlackMisc::PhysicalQuantities::CLength &geodeticHeight() const override { return this->m_position.geodeticHeight(); } @@ -101,6 +104,10 @@ namespace BlackMisc //! \sa setGeodeticHeight void setElevation(const BlackMisc::PhysicalQuantities::CLength &elevation) { return this->m_position.setGeodeticHeight(elevation); } + //! Height above ground. + //! Do not confuse with elevation (=geodeticHeight) as in \sa geodeticHeight() / \sa getElevation() + BlackMisc::PhysicalQuantities::CLength getHeightAboveGround() const; + //! Get heading const BlackMisc::Aviation::CHeading &getHeading() const { return this->m_heading; } diff --git a/src/blackmisc/avaircraftsituationlist.h b/src/blackmisc/avaircraftsituationlist.h index a5b5520de..435b8beed 100644 --- a/src/blackmisc/avaircraftsituationlist.h +++ b/src/blackmisc/avaircraftsituationlist.h @@ -45,10 +45,10 @@ namespace BlackMisc protected: //! Myself - virtual const CAircraftSituationList &getContainer() const { return *this; } + virtual const CAircraftSituationList &container() const { return *this; } //! Myself - virtual CAircraftSituationList &getContainer() { return *this; } + virtual CAircraftSituationList &container() { return *this; } }; } // namespace diff --git a/src/blackmisc/avairportlist.h b/src/blackmisc/avairportlist.h index 92f721cf7..32213bcb9 100644 --- a/src/blackmisc/avairportlist.h +++ b/src/blackmisc/avairportlist.h @@ -59,10 +59,10 @@ namespace BlackMisc protected: //! Myself - virtual const CAirportList &getContainer() const override { return *this; } + virtual const CAirportList &container() const override { return *this; } //! Myself - virtual CAirportList &getContainer() override { return *this; } + virtual CAirportList &container() override { return *this; } }; } //namespace diff --git a/src/blackmisc/avatcstationlist.h b/src/blackmisc/avatcstationlist.h index c987b64d6..c02007fc9 100644 --- a/src/blackmisc/avatcstationlist.h +++ b/src/blackmisc/avatcstationlist.h @@ -69,10 +69,10 @@ namespace BlackMisc protected: //! Myself - virtual const CAtcStationList &getContainer() const { return *this; } + virtual const CAtcStationList &container() const { return *this; } //! Myself - virtual CAtcStationList &getContainer() { return *this; } + virtual CAtcStationList &container() { return *this; } }; diff --git a/src/blackmisc/avcallsignobjectlist.cpp b/src/blackmisc/avcallsignobjectlist.cpp index 0bf54747b..15effcadd 100644 --- a/src/blackmisc/avcallsignobjectlist.cpp +++ b/src/blackmisc/avcallsignobjectlist.cpp @@ -27,25 +27,25 @@ namespace BlackMisc template bool ICallsignObjectList::containsCallsign(const CCallsign &callsign) const { - return this->getContainer().contains(&OBJ::getCallsign, callsign); + return this->container().contains(&OBJ::getCallsign, callsign); } template int ICallsignObjectList::applyIfCallsign(const CCallsign &callsign, const CPropertyIndexVariantMap &variantMap) { - return this->getContainer().applyIf(&OBJ::getCallsign, callsign, variantMap); + return this->container().applyIf(&OBJ::getCallsign, callsign, variantMap); } template CONTAINER ICallsignObjectList::findByCallsign(const CCallsign &callsign) const { - return this->getContainer().findBy(&OBJ::getCallsign, callsign); + return this->container().findBy(&OBJ::getCallsign, callsign); } template CONTAINER ICallsignObjectList::findByCallsigns(const CCallsignList &callsigns) const { - return this->getContainer().findBy(Predicates::MemberIsAnyOf(&OBJ::getCallsign, callsigns)); + return this->container().findBy(Predicates::MemberIsAnyOf(&OBJ::getCallsign, callsigns)); } template @@ -66,7 +66,7 @@ namespace BlackMisc CONTAINER r; if (suffix.isEmpty()) { return r; } QString sfxUpper(suffix.trimmed().toUpper()); - r = this->getContainer().findBy([ = ](const OBJ & csObj) -> bool + r = this->container().findBy([ = ](const OBJ & csObj) -> bool { return (csObj.getCallsign().getSuffix() == sfxUpper); }); @@ -76,14 +76,14 @@ namespace BlackMisc template int ICallsignObjectList::removeByCallsign(const CCallsign &callsign) { - return this->getContainer().removeIf(&OBJ::getCallsign, callsign); + return this->container().removeIf(&OBJ::getCallsign, callsign); } template QMap ICallsignObjectList::getSuffixes() const { QMap r; - for (const OBJ &csObj : this->getContainer()) + for (const OBJ &csObj : this->container()) { const QString s = csObj.getCallsign().getSuffix(); if (s.isEmpty()) { continue; } @@ -102,7 +102,7 @@ namespace BlackMisc template QHash ICallsignObjectList::splitPerCallsign() const { - CONTAINER copyContainer(getContainer()); + CONTAINER copyContainer(container()); copyContainer.sortByCallsign(); QHash result; CCallsign cs; @@ -130,7 +130,7 @@ namespace BlackMisc template void ICallsignObjectList::sortByCallsign() { - getContainer().sortBy(&OBJ::getCallsign); + container().sortBy(&OBJ::getCallsign); } template @@ -141,20 +141,20 @@ namespace BlackMisc if (this->containsCallsign(cs)) { if (changedValues.isEmpty()) { return 0; } - c = this->getContainer().applyIf(&OBJ::getCallsign, cs, changedValues); + c = this->container().applyIf(&OBJ::getCallsign, cs, changedValues); } else { c = 1; if (changedValues.isEmpty()) { - this->getContainer().push_back(objectBeforeChanges); + this->container().push_back(objectBeforeChanges); } else { OBJ objectAdded(objectBeforeChanges); objectAdded.apply(changedValues); - this->getContainer().push_back(objectAdded); + this->container().push_back(objectAdded); } } return c; diff --git a/src/blackmisc/avcallsignobjectlist.h b/src/blackmisc/avcallsignobjectlist.h index 96eb27dd8..04dbfa4bc 100644 --- a/src/blackmisc/avcallsignobjectlist.h +++ b/src/blackmisc/avcallsignobjectlist.h @@ -71,10 +71,10 @@ namespace BlackMisc ICallsignObjectList(); //! Container - virtual const CONTAINER &getContainer() const = 0; + virtual const CONTAINER &container() const = 0; //! Container - virtual CONTAINER &getContainer() = 0; + virtual CONTAINER &container() = 0; }; } //namespace diff --git a/src/blackmisc/aviation/aircraftparts.cpp b/src/blackmisc/aviation/aircraftparts.cpp index f85a88f5d..c54d65d68 100644 --- a/src/blackmisc/aviation/aircraftparts.cpp +++ b/src/blackmisc/aviation/aircraftparts.cpp @@ -98,5 +98,15 @@ namespace BlackMisc } } + CAircraftEngine CAircraftParts::getEngine(int number) const + { + return this->m_engines.findBy(&CAircraftEngine::getNumber, number).frontOrDefault(); + } + + bool CAircraftParts::isEngineOn(int number) const + { + return this->getEngine(number).isOn(); + } + } // namespace } // namespace diff --git a/src/blackmisc/aviation/aircraftpartslist.h b/src/blackmisc/aviation/aircraftpartslist.h index d30cab2fb..90879d6df 100644 --- a/src/blackmisc/aviation/aircraftpartslist.h +++ b/src/blackmisc/aviation/aircraftpartslist.h @@ -45,10 +45,10 @@ namespace BlackMisc protected: //! Myself - virtual const CAircraftPartsList &getContainer() const { return *this; } + virtual const CAircraftPartsList &container() const { return *this; } //! Myself - virtual CAircraftPartsList &getContainer() { return *this; } + virtual CAircraftPartsList &container() { return *this; } }; diff --git a/src/blackmisc/geoobjectlist.cpp b/src/blackmisc/geoobjectlist.cpp index f04d824e8..c97aa4bcf 100644 --- a/src/blackmisc/geoobjectlist.cpp +++ b/src/blackmisc/geoobjectlist.cpp @@ -31,7 +31,7 @@ namespace BlackMisc template CONTAINER IGeoObjectList::findWithinRange(const ICoordinateGeodetic &coordinate, const PhysicalQuantities::CLength &range) const { - return this->getContainer().findBy([&](const OBJ & geoObj) + return this->container().findBy([&](const OBJ & geoObj) { return calculateGreatCircleDistance(geoObj, coordinate) <= range; }); @@ -40,7 +40,7 @@ namespace BlackMisc template void IGeoObjectWithRelativePositionList::calculcateDistanceAndBearingToPlane(const ICoordinateGeodetic &position) { - for (OBJ &geoObj : this->getContainer()) + for (OBJ &geoObj : this->container()) { geoObj.calculcateDistanceAndBearingToOwnAircraft(position); } @@ -49,7 +49,7 @@ namespace BlackMisc template void IGeoObjectWithRelativePositionList::removeIfOutsideRange(const Geo::ICoordinateGeodetic &position, const CLength &maxDistance, bool updateValues) { - this->getContainer().removeIf([ & ](OBJ & geoObj) + this->container().removeIf([ & ](OBJ & geoObj) { return geoObj.calculcateDistanceAndBearingToOwnAircraft(position, updateValues) > maxDistance; }); @@ -62,7 +62,7 @@ namespace BlackMisc { this->calculcateDistanceAndBearingToPlane(position); } - this->getContainer().sort([ & ](const OBJ & a, const OBJ & b) { return a.getDistanceToOwnAircraft() < b.getDistanceToOwnAircraft(); }); + this->container().sort([ & ](const OBJ & a, const OBJ & b) { return a.getDistanceToOwnAircraft() < b.getDistanceToOwnAircraft(); }); } diff --git a/src/blackmisc/geoobjectlist.h b/src/blackmisc/geoobjectlist.h index 917da6073..0fbc4453c 100644 --- a/src/blackmisc/geoobjectlist.h +++ b/src/blackmisc/geoobjectlist.h @@ -39,10 +39,10 @@ namespace BlackMisc IGeoObjectList(); //! Container - virtual const CONTAINER &getContainer() const = 0; + virtual const CONTAINER &container() const = 0; //! Container - virtual CONTAINER &getContainer() = 0; + virtual CONTAINER &container() = 0; }; //! List of objects with geo coordinates. diff --git a/src/blackmisc/nwclientlist.h b/src/blackmisc/nwclientlist.h index f68bdba47..da39617b0 100644 --- a/src/blackmisc/nwclientlist.h +++ b/src/blackmisc/nwclientlist.h @@ -46,10 +46,10 @@ namespace BlackMisc protected: //! Myself - virtual const CClientList &getContainer() const { return *this; } + virtual const CClientList &container() const { return *this; } //! Myself - virtual CClientList &getContainer() { return *this; } + virtual CClientList &container() { return *this; } }; } //namespace diff --git a/src/blackmisc/sequence.h b/src/blackmisc/sequence.h index ebebe4f76..6afcda90d 100644 --- a/src/blackmisc/sequence.h +++ b/src/blackmisc/sequence.h @@ -272,6 +272,12 @@ namespace BlackMisc */ void insert(T &&value) { push_back(std::move(value)); } + /*! + * \brief Insert as first element. + * \pre The sequence must be initialized. + */ + void insert_front(const T &value) { insert(begin(), value); } + /*! * \brief Synonym for push_back. * \pre The sequence must be initialized. diff --git a/src/blackmisc/simulation/simdirectaccessremoteaircraftdummy.cpp b/src/blackmisc/simulation/simdirectaccessremoteaircraftdummy.cpp new file mode 100644 index 000000000..6f436d14b --- /dev/null +++ b/src/blackmisc/simulation/simdirectaccessremoteaircraftdummy.cpp @@ -0,0 +1,83 @@ +/* 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 "simdirectaccessremoteaircraftdummy.h" + +using namespace BlackMisc::Aviation; + +namespace BlackMisc +{ + namespace Simulation + { + + CRemoteAircraftProviderDummy::CRemoteAircraftProviderDummy(QObject *parent) : QObject(parent) + { } + + const CSimulatedAircraftList &CRemoteAircraftProviderDummy::remoteAircraft() const + { + return m_aircraft; + } + + CSimulatedAircraftList &CRemoteAircraftProviderDummy::remoteAircraft() + { + return m_aircraft; + } + + const CAircraftPartsList &CRemoteAircraftProviderDummy::remoteAircraftParts() const + { + return m_parts; + } + + CAircraftPartsList &CRemoteAircraftProviderDummy::remoteAircraftParts() + { + return m_parts; + } + + const CAircraftSituationList &CRemoteAircraftProviderDummy::remoteAircraftSituations() const + { + return m_situations; + } + + CAircraftSituationList &CRemoteAircraftProviderDummy::remoteAircraftSituations() + { + return m_situations; + } + + bool CRemoteAircraftProviderDummy::connectRemoteAircraftProviderSignals(std::function situationSlot, std::function partsSlot, std::function removedAircraftSlot) + { + bool s1 = connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftSituation, situationSlot); + bool s2 = connect(this, &CRemoteAircraftProviderDummy::addedRemoteAircraftParts, partsSlot); + bool s3 = connect(this, &CRemoteAircraftProviderDummy::removedRemoteAircraft, removedAircraftSlot); + return s1 && s2 && s3; + } + + bool CRemoteAircraftProviderDummy::updateAircraftEnabled(const CCallsign &callsign, bool enabledForRendering, const QString &originator) + { + Q_UNUSED(originator); + CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexEnabled, CVariant::fromValue(enabledForRendering)); + int n = this->m_aircraft.applyIfCallsign(callsign, vm); + return n > 0; + } + + bool CRemoteAircraftProviderDummy::updateAircraftModel(const CCallsign &callsign, const CAircraftModel &model, const QString &originator) + { + Q_UNUSED(originator); + CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexModel, model.toCVariant()); + int n = this->m_aircraft.applyIfCallsign(callsign, vm); + return n > 0; + } + + void CRemoteAircraftProviderDummy::insertNewSituation(const CAircraftSituation &situation) + { + this->m_situations.insertTimestampObject(situation, 20); + emit addedRemoteAircraftSituation(situation); + } + + } // namespace +} // namespace diff --git a/src/blackmisc/simulation/simdirectaccessremoteaircraftdummy.h b/src/blackmisc/simulation/simdirectaccessremoteaircraftdummy.h new file mode 100644 index 000000000..9f6826b49 --- /dev/null +++ b/src/blackmisc/simulation/simdirectaccessremoteaircraftdummy.h @@ -0,0 +1,87 @@ +/* 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 BLACKMISC_SIMDIRECTACCESSREMOTEAIRCRAFTDUMMY_H +#define BLACKMISC_SIMDIRECTACCESSREMOTEAIRCRAFTDUMMY_H + +#include "blackmisc/simulation/simdirectaccessremoteaircraft.h" + +namespace BlackMisc +{ + namespace Simulation + { + + //! Dummy implementation for testing purpose + class CRemoteAircraftProviderDummy : + public QObject, + public IRemoteAircraftProvider + { + Q_OBJECT + Q_INTERFACES(BlackMisc::Simulation::IRemoteAircraftProvider) + + public: + //! Constructor + CRemoteAircraftProviderDummy(QObject *parent = nullptr); + + //! IRemoteAircraftProviderReadOnly::remoteAircraft + virtual const CSimulatedAircraftList &remoteAircraft() const; + + //! IRemoteAircraftProvider::remoteAircraft + virtual CSimulatedAircraftList &remoteAircraft(); + + //! \copydoc IRemoteAircraftProviderReadOnly::remoteAircraftParts + virtual const BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts() const override; + + //! \copydoc IRemoteAircraftProvider::remoteAircraftParts + virtual BlackMisc::Aviation::CAircraftPartsList &remoteAircraftParts() override; + + //! \copydoc IRemoteAircraftProviderReadOnly::remoteAircraftSituations + virtual const BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations() const override; + + //! \copydoc IRemoteAircraftProvider::remoteAircraftSituations + virtual BlackMisc::Aviation::CAircraftSituationList &remoteAircraftSituations() override; + + //! \copydoc IRemoteAircraftProviderReadOnly::connectRemoteAircraftProviderSignals + virtual bool connectRemoteAircraftProviderSignals( + std::function situationSlot, + std::function partsSlot, + std::function removedAircraftSlot + ) override; + + //! \copydoc IRemoteAircraftProvider::updateAircraftEnabled + virtual bool updateAircraftEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enabledForRendering, const QString &originator) override; + + //! \copydoc IRemoteAircraftProvider::updateAircraftModel + virtual bool updateAircraftModel(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override; + + //! For testing, add new situation and fire signals + void insertNewSituation(const BlackMisc::Aviation::CAircraftSituation &situation); + + signals: + //! \copydoc IRemoteAircraftProviderReadOnly::addedRemoteAircraftSituation + void addedRemoteAircraftSituation(const BlackMisc::Aviation::CAircraftSituation &situation); + + //! \copydoc IRemoteAircraftProviderReadOnly::addedRemoteAircraftParts + void addedRemoteAircraftParts(const BlackMisc::Aviation::CAircraftParts &parts); + + //! \copydoc IRemoteAircraftProviderReadOnly::removedRemoteAircraft + void removedRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign); + + private: + BlackMisc::Simulation::CSimulatedAircraftList m_aircraft; + BlackMisc::Aviation::CAircraftSituationList m_situations; + BlackMisc::Aviation::CAircraftPartsList m_parts; + }; + + } // namespace +} // namespace + +#endif // guard diff --git a/src/blackmisc/simulation/simulatedaircraftlist.h b/src/blackmisc/simulation/simulatedaircraftlist.h index e30676d4b..b1b3e35c9 100644 --- a/src/blackmisc/simulation/simulatedaircraftlist.h +++ b/src/blackmisc/simulation/simulatedaircraftlist.h @@ -57,10 +57,10 @@ namespace BlackMisc protected: //! Myself - virtual const CSimulatedAircraftList &getContainer() const { return *this; } + virtual const CSimulatedAircraftList &container() const { return *this; } //! Myself - virtual CSimulatedAircraftList &getContainer() { return *this; } + virtual CSimulatedAircraftList &container() { return *this; } }; diff --git a/src/blackmisc/statusmessage.cpp b/src/blackmisc/statusmessage.cpp index e48cd32a2..f164be350 100644 --- a/src/blackmisc/statusmessage.cpp +++ b/src/blackmisc/statusmessage.cpp @@ -108,6 +108,7 @@ namespace BlackMisc else if (cat.contains("blackcore")) { this->m_humanReadableCategory = "Core"; } else if (cat.contains("blackgui")) { this->m_humanReadableCategory = "GUI"; } else if (cat.contains("blacksound")) { this->m_humanReadableCategory = "GUI"; } + else if (cat.contains("interpolator")) { this->m_humanReadableCategory = "Interpolator"; } else if (cat.contains("xplane")) { this->m_humanReadableCategory = "XPlane"; } else if (cat.contains("fsx")) { this->m_humanReadableCategory = "FSX"; } else if (cat.contains("fs9")) { this->m_humanReadableCategory = "FS9"; } diff --git a/src/blackmisc/timestampbased.cpp b/src/blackmisc/timestampbased.cpp index 7885673d1..d7ac65b80 100644 --- a/src/blackmisc/timestampbased.cpp +++ b/src/blackmisc/timestampbased.cpp @@ -64,7 +64,7 @@ namespace BlackMisc return otherTimestampObj.m_timestampMSecsSinceEpoch - this->m_timestampMSecsSinceEpoch; } - qint64 ITimestampBased::msecsToAbs(const ITimestampBased &otherTimestampObj) const + qint64 ITimestampBased::absMsecsTo(const ITimestampBased &otherTimestampObj) const { qint64 dt = this->msecsTo(otherTimestampObj); return dt > 0 ? dt : dt * -1; diff --git a/src/blackmisc/timestampbased.h b/src/blackmisc/timestampbased.h index 5d5169923..1135511ec 100644 --- a/src/blackmisc/timestampbased.h +++ b/src/blackmisc/timestampbased.h @@ -67,7 +67,7 @@ namespace BlackMisc qint64 msecsTo(const ITimestampBased &otherTimestampObj) const; //! Time difference - qint64 msecsToAbs(const ITimestampBased &otherTimestampObj) const; + qint64 absMsecsTo(const ITimestampBased &otherTimestampObj) const; //! Set the current time as timestamp void setCurrentUtcTime(); diff --git a/src/plugins/simulator/fs9/simulator_fs9.cpp b/src/plugins/simulator/fs9/simulator_fs9.cpp index e03d7617f..91efa5251 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.cpp +++ b/src/plugins/simulator/fs9/simulator_fs9.cpp @@ -113,7 +113,7 @@ namespace BlackSimPlugin if (m_hashFs9Clients.contains(callsign)) { // already exists, remove first - this->removeRenderedAircraft(callsign); + this->removeRemoteAircraft(callsign); } CFs9Client *client = new CFs9Client(m_interpolator, this, callsign.toQString(), CTime(25, CTimeUnit::ms())); @@ -127,7 +127,7 @@ namespace BlackSimPlugin return true; } - bool CSimulatorFs9::removeRenderedAircraft(const CCallsign &callsign) + bool CSimulatorFs9::removeRemoteAircraft(const CCallsign &callsign) { if (!m_hashFs9Clients.contains(callsign)) { return false; } @@ -298,7 +298,7 @@ namespace BlackSimPlugin // Stop all FS9 client tasks for (auto fs9Client : m_hashFs9Clients.keys()) { - removeRenderedAircraft(fs9Client); + removeRemoteAircraft(fs9Client); } } } // namespace diff --git a/src/plugins/simulator/fs9/simulator_fs9.h b/src/plugins/simulator/fs9/simulator_fs9.h index eb3a8f87d..98db7f79d 100644 --- a/src/plugins/simulator/fs9/simulator_fs9.h +++ b/src/plugins/simulator/fs9/simulator_fs9.h @@ -89,7 +89,7 @@ namespace BlackSimPlugin virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &newRemoteAircraft) override; //! \copydoc ISimulator::removeRemoteAircraft() - virtual bool removeRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; + virtual bool removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; //! \copydoc ISimulator::updateOwnSimulatorCockpit() virtual bool updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &ownAircraft, const QString &originator) override; diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.cpp b/src/plugins/simulator/fscommon/simulator_fscommon.cpp index f4b6f362f..7fccd1d52 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.cpp +++ b/src/plugins/simulator/fscommon/simulator_fscommon.cpp @@ -252,8 +252,12 @@ namespace BlackSimPlugin this->m_maxRenderedAircraft = maxRenderedAircraft; } - bool CSimulatorFsCommon::changeRenderedAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) + bool CSimulatorFsCommon::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft, const QString &originator) { + if (originator == simulatorOriginator()) { return false; } + + // remove upfront, and then enable / disable again + this->removeRemoteAircraft(aircraft.getCallsign()); return this->changeAircraftEnabled(aircraft, originator); } @@ -266,7 +270,7 @@ namespace BlackSimPlugin } else { - this->removeRenderedAircraft(aircraft.getCallsign()); + this->removeRemoteAircraft(aircraft.getCallsign()); } return true; } diff --git a/src/plugins/simulator/fscommon/simulator_fscommon.h b/src/plugins/simulator/fscommon/simulator_fscommon.h index ef34c8f7e..e45498e6f 100644 --- a/src/plugins/simulator/fscommon/simulator_fscommon.h +++ b/src/plugins/simulator/fscommon/simulator_fscommon.h @@ -74,7 +74,7 @@ namespace BlackSimPlugin virtual void setMaxRenderedAircraft(int maxRenderedAircraft) override; //! \copydoc ISimulator::changeRenderedAircraftModel - virtual bool changeRenderedAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override; + 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; diff --git a/src/plugins/simulator/fsx/simulator_fsx.h b/src/plugins/simulator/fsx/simulator_fsx.h index 4bbd3e07e..32d20500f 100644 --- a/src/plugins/simulator/fsx/simulator_fsx.h +++ b/src/plugins/simulator/fsx/simulator_fsx.h @@ -106,8 +106,8 @@ namespace BlackSimPlugin //! \copydoc ISimulator::addRemoteAircraft() virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &newRemoteAircraft) override; - //! \copydoc ISimulator::removeRenderedAircraft() - virtual bool removeRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; + //! \copydoc ISimulator::remoteRenderedAircraft() + virtual bool removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; //! \copydoc ISimulator::updateOwnCockpit virtual bool updateOwnSimulatorCockpit(const BlackMisc::Aviation::CAircraft &ownAircraft, const QString &originator) override; @@ -154,7 +154,7 @@ namespace BlackSimPlugin private: //! Remove a remote aircraft - bool removeRenderedAircraft(const CSimConnectObject &simObject); + bool removeRemoteAircraft(const CSimConnectObject &simObject); //! Init when connected HRESULT initWhenConnected(); @@ -166,7 +166,7 @@ namespace BlackSimPlugin HRESULT initDataDefinitionsWhenConnected(); //! Update other aircrafts - void updateOtherAircraft(); + void updateRemoteAircraft(); //! Format conversion SIMCONNECT_DATA_INITPOSITION aircraftSituationToFsxInitPosition(const BlackMisc::Aviation::CAircraftSituation &situation); diff --git a/src/plugins/simulator/xplane/simulator_xplane.cpp b/src/plugins/simulator/xplane/simulator_xplane.cpp index 01f184abd..b43a7a787 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.cpp +++ b/src/plugins/simulator/xplane/simulator_xplane.cpp @@ -361,7 +361,7 @@ namespace BlackSimPlugin // m_traffic->setPlaneTransponder(callsign.asString(), 2000, true, false); // TODO transponder // } - bool CSimulatorXPlane::removeRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) + bool CSimulatorXPlane::removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) { if (! isConnected()) { return false; } m_traffic->removePlane(callsign.asString()); @@ -370,7 +370,7 @@ namespace BlackSimPlugin return true; } - bool CSimulatorXPlane::changeRenderedAircraftModel(const CSimulatedAircraft &aircraft, const QString &originator) + bool CSimulatorXPlane::changeRemoteAircraftModel(const CSimulatedAircraft &aircraft, const QString &originator) { return this->changeAircraftEnabled(aircraft, originator); } @@ -390,7 +390,7 @@ namespace BlackSimPlugin } else { - this->removeRenderedAircraft(aircraft.getCallsign()); + this->removeRemoteAircraft(aircraft.getCallsign()); } return true; } diff --git a/src/plugins/simulator/xplane/simulator_xplane.h b/src/plugins/simulator/xplane/simulator_xplane.h index fb250362e..7c93eaedb 100644 --- a/src/plugins/simulator/xplane/simulator_xplane.h +++ b/src/plugins/simulator/xplane/simulator_xplane.h @@ -72,10 +72,10 @@ namespace BlackSimPlugin virtual bool addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &newRemoteAircraft) override; //! \copydoc BlackCore::ISimulator::removeRemoteAircraft - virtual bool removeRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; + virtual bool removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; //! \copydoc ISimulator::changeRenderedAircraftModel - virtual bool changeRenderedAircraftModel(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override; + 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;