From 21644c9f24a0786cf4abe728dd9b4c28e48d4a99 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 26 Mar 2018 02:52:06 +0200 Subject: [PATCH] Ref T259, Ref T243 automatically update client gnd. capability by situation Rational: If we receive a gnd flag from network, the client does have this capability --- src/blackcore/airspacemonitor.cpp | 14 ++++++++------ src/blackmisc/network/clientprovider.cpp | 19 +++++++++++++++++++ src/blackmisc/network/clientprovider.h | 5 +++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/blackcore/airspacemonitor.cpp b/src/blackcore/airspacemonitor.cpp index 490237399..2905e1a99 100644 --- a/src/blackcore/airspacemonitor.cpp +++ b/src/blackcore/airspacemonitor.cpp @@ -792,9 +792,11 @@ namespace BlackCore const CCallsign callsign(situation.getCallsign()); Q_ASSERT_X(!callsign.isEmpty(), Q_FUNC_INFO, "Empty callsign"); + // update client info + this->autoAdjustCientGndCapability(situation); + // store situation history - CAircraftSituation fullSituation(situation); - this->storeAircraftSituation(fullSituation); + this->storeAircraftSituation(situation); // updates situation const bool existsInRange = this->isAircraftInRange(callsign); const bool hasFsInnPacket = m_tempFsInnPackets.contains(callsign); @@ -803,7 +805,7 @@ namespace BlackCore { CSimulatedAircraft aircraft; aircraft.setCallsign(callsign); - aircraft.setSituation(fullSituation); + aircraft.setSituation(situation); aircraft.setTransponder(transponder); this->addNewAircraftInRange(aircraft); this->sendInitialPilotQueries(callsign, true, !hasFsInnPacket); @@ -817,9 +819,9 @@ namespace BlackCore // update, aircraft already exists CPropertyIndexVariantMap vm; vm.addValue(CSimulatedAircraft::IndexTransponder, transponder); - vm.addValue(CSimulatedAircraft::IndexSituation, fullSituation); - vm.addValue(CSimulatedAircraft::IndexRelativeDistance, this->calculateDistanceToOwnAircraft(fullSituation)); - vm.addValue(CSimulatedAircraft::IndexRelativeBearing, this->calculateBearingToOwnAircraft(fullSituation)); + vm.addValue(CSimulatedAircraft::IndexSituation, situation); + vm.addValue(CSimulatedAircraft::IndexRelativeDistance, this->calculateDistanceToOwnAircraft(situation)); + vm.addValue(CSimulatedAircraft::IndexRelativeBearing, this->calculateBearingToOwnAircraft(situation)); this->updateAircraftInRange(callsign, vm); } diff --git a/src/blackmisc/network/clientprovider.cpp b/src/blackmisc/network/clientprovider.cpp index aa968292e..5f6236f56 100644 --- a/src/blackmisc/network/clientprovider.cpp +++ b/src/blackmisc/network/clientprovider.cpp @@ -8,6 +8,7 @@ */ #include "clientprovider.h" +#include "blackmisc/aviation/aircraftsituation.h" using namespace BlackMisc::Aviation; @@ -83,6 +84,24 @@ namespace BlackMisc return m_clients.removeByCallsign(callsign); } + bool IClientProvider::autoAdjustCientGndCapability(const CAircraftSituation &situation) + { + if (situation.getCallsign().isEmpty()) { return false; } // no callsign + if (!situation.isOnGround()) { return false; } // nothing to adjust + if (situation.getOnGroundDetails() != CAircraftSituation::InFromNetwork) { return false; } // not from network + + CClient client = this->getClientOrDefaultForCallsign(situation.getCallsign()); + + // need to change? + if (!client.isValid()) { return false; } // no client + if (client.hasGndFlagCapability()) { return false; } // already set + + client.addCapability(CClient::FsdWithGroundFlag); + QWriteLocker l(&m_lockClient); + m_clients.replaceOrAddObjectByCallsign(client); + return true; + } + CClientList CClientAware::getClients() const { if (this->provider()) { return this->provider()->getClients(); } diff --git a/src/blackmisc/network/clientprovider.h b/src/blackmisc/network/clientprovider.h index d1a8c0ac9..f4342d7be 100644 --- a/src/blackmisc/network/clientprovider.h +++ b/src/blackmisc/network/clientprovider.h @@ -19,6 +19,7 @@ namespace BlackMisc { + namespace Aviation { class CAircraftSituation; } namespace Network { //! Direct in memory access to client (network client) data @@ -61,6 +62,10 @@ namespace BlackMisc //! \threadsafe int removeClient(const Aviation::CCallsign &callsign); + //! Adjust gnd.flag capability from situation + //! \threadsafe + bool autoAdjustCientGndCapability(const Aviation::CAircraftSituation &situation); + private: CClientList m_clients; mutable QReadWriteLock m_lockClient; //!< lock clients: m_clients