mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-27 19:25:49 +08:00
* changed to CSimulatedAircraft / Simulation::CAircraftModel * added new functions such as icons for model * improved ICAO code handling in airspace * removed implicit logging from network context
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Simulation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::PhysicalQuantities;
|
||||
@@ -61,7 +62,7 @@ namespace BlackCore
|
||||
CFlightPlan plan;
|
||||
|
||||
// use cache, but not for own callsign (always reload)
|
||||
if (this->m_flightPlanCache.contains(callsign)) plan = this->m_flightPlanCache[callsign];
|
||||
if (this->m_flightPlanCache.contains(callsign)) { plan = this->m_flightPlanCache[callsign]; }
|
||||
if (!plan.wasSentOrLoaded() || plan.timeDiffSentOrLoadedMs() > 30 * 1000)
|
||||
{
|
||||
// outdated, or not in cache at all
|
||||
@@ -103,7 +104,7 @@ namespace BlackCore
|
||||
CUserList CAirspaceMonitor::getUsersForCallsigns(const CCallsignList &callsigns) const
|
||||
{
|
||||
CUserList users;
|
||||
if (callsigns.isEmpty()) return users;
|
||||
if (callsigns.isEmpty()) { return users; }
|
||||
CCallsignList searchList(callsigns);
|
||||
|
||||
// myself, which is not in the lists below
|
||||
@@ -214,8 +215,15 @@ namespace BlackCore
|
||||
|
||||
foreach(CAircraft aircraft, this->m_aircraftInRange)
|
||||
{
|
||||
this->m_network->sendFrequencyQuery(aircraft.getCallsign());
|
||||
this->m_network->sendIcaoCodesQuery(aircraft.getCallsign());
|
||||
const CCallsign cs(aircraft.getCallsign());
|
||||
this->m_network->sendFrequencyQuery(cs);
|
||||
|
||||
// we only query ICAO if we have none yet
|
||||
// it happens sometimes with some FSD servers (e.g our testserver) a first query is skipped
|
||||
if (!aircraft.hasValidAircraftDesignator())
|
||||
{
|
||||
this->m_network->sendIcaoCodesQuery(cs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,6 +246,17 @@ namespace BlackCore
|
||||
emit this->changedAtcStationsOnline();
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::clear()
|
||||
{
|
||||
m_metarCache.clear();
|
||||
m_flightPlanCache.clear();
|
||||
m_icaoCodeCache.clear();
|
||||
|
||||
removeAllOnlineAtcStations();
|
||||
removeAllAircraft();
|
||||
removeAllOtherClients();
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname)
|
||||
{
|
||||
if (realname.isEmpty()) return;
|
||||
@@ -251,24 +270,26 @@ namespace BlackCore
|
||||
// Client
|
||||
vm = CPropertyIndexVariantMap({CClient::IndexUser, CUser::IndexRealName}, realname);
|
||||
this->addVoiceCapabilitiesFromDataFile(vm, callsign);
|
||||
if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); }
|
||||
this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm);
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags)
|
||||
{
|
||||
if (callsign.isEmpty()) return;
|
||||
if (callsign.isEmpty()) { return; }
|
||||
CPropertyIndexVariantMap capabilities;
|
||||
capabilities.addValue(CClient::FsdAtisCanBeReceived, (flags & INetwork::AcceptsAtisResponses));
|
||||
capabilities.addValue(CClient::FsdWithInterimPositions, (flags & INetwork::SupportsInterimPosUpdates));
|
||||
capabilities.addValue(CClient::FsdWithModelDescription, (flags & INetwork::SupportsModelDescriptions));
|
||||
CPropertyIndexVariantMap vm(CClient::IndexCapabilities, capabilities.toCVariant());
|
||||
this->addVoiceCapabilitiesFromDataFile(vm, callsign);
|
||||
if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); }
|
||||
this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm);
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_fsipirCustomPacketReceived(const CCallsign &callsign, const QString &, const QString &, const QString &, const QString &model)
|
||||
void CAirspaceMonitor::ps_fsipirCustomPacketReceived(const CCallsign &callsign, const QString &airlineIcao, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &model)
|
||||
{
|
||||
if (callsign.isEmpty() || model.isEmpty()) return;
|
||||
if (callsign.isEmpty() || model.isEmpty()) { return; }
|
||||
|
||||
// Request of other client, I can get the other's model from that
|
||||
CPropertyIndexVariantMap vm({ CClient::IndexModel, CAircraftModel::IndexModelString }, model);
|
||||
@@ -276,16 +297,33 @@ namespace BlackCore
|
||||
if (!this->m_otherClients.contains(&CClient::getCallsign, callsign))
|
||||
{
|
||||
// with custom packets it can happen,
|
||||
//the packet is received before any other packet
|
||||
// the packet is received before any other packet
|
||||
this->m_otherClients.push_back(CClient(callsign));
|
||||
}
|
||||
this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm);
|
||||
this->sendFsipiCustomPacket(callsign); // response
|
||||
|
||||
// ICAO response from custom data
|
||||
if (!aircraftDesignator.isEmpty())
|
||||
{
|
||||
CAircraftIcao icao(aircraftDesignator, combinedAircraftType, airlineIcao, "", ""); // from custom packet
|
||||
if (this->m_aircraftInRange.containsCallsign(callsign))
|
||||
{
|
||||
// we have that aircraft, set straight away
|
||||
this->ps_icaoCodesReceived(callsign, icao);
|
||||
}
|
||||
else
|
||||
{
|
||||
// store in cache
|
||||
this->m_icaoCodeCache.insert(callsign, icao);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_serverReplyReceived(const CCallsign &callsign, const QString &server)
|
||||
{
|
||||
if (callsign.isEmpty() || server.isEmpty()) return;
|
||||
if (callsign.isEmpty() || server.isEmpty()) { return; }
|
||||
if (!this->m_otherClients.contains(&CClient::getCallsign, callsign)) { this->m_otherClients.push_back(CClient(callsign)); }
|
||||
CPropertyIndexVariantMap vm(CClient::IndexServer, server);
|
||||
this->m_otherClients.applyIf(&CClient::getCallsign, callsign, vm);
|
||||
}
|
||||
@@ -319,7 +357,7 @@ namespace BlackCore
|
||||
CAircraft me = this->m_ownAircraft;
|
||||
CAircraftIcao icao = me.getIcaoInfo();
|
||||
QString modelString = this->m_ownAircraftModel.getModelString();
|
||||
if (modelString.isEmpty()) modelString = CProject::systemNameAndVersion();
|
||||
if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); }
|
||||
this->m_network->sendFsipiCustomPacket(recipientCallsign, icao.getAirlineDesignator(), icao.getAircraftDesignator(), icao.getAircraftCombinedType(), modelString);
|
||||
}
|
||||
|
||||
@@ -328,7 +366,7 @@ namespace BlackCore
|
||||
CAircraft me = this->m_ownAircraft;
|
||||
CAircraftIcao icao = me.getIcaoInfo();
|
||||
QString modelString = this->m_ownAircraftModel.getModelString();
|
||||
if (modelString.isEmpty()) modelString = CProject::systemNameAndVersion();
|
||||
if (modelString.isEmpty()) { modelString = CProject::systemNameAndVersion(); }
|
||||
this->m_network->sendFsipirCustomPacket(recipientCallsign, icao.getAirlineDesignator(), icao.getAircraftDesignator(), icao.getAircraftCombinedType(), modelString);
|
||||
}
|
||||
|
||||
@@ -343,7 +381,7 @@ namespace BlackCore
|
||||
}
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::removeAllAtcStations()
|
||||
void CAirspaceMonitor::removeAllOnlineAtcStations()
|
||||
{
|
||||
m_atcWatchdog.removeAll();
|
||||
m_atcStationsOnline.clear();
|
||||
@@ -357,6 +395,8 @@ namespace BlackCore
|
||||
emit removedAircraft(aircraft.getCallsign());
|
||||
}
|
||||
m_aircraftInRange.clear();
|
||||
m_flightPlanCache.clear();
|
||||
m_icaoCodeCache.clear();
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::removeAllOtherClients()
|
||||
@@ -364,6 +404,21 @@ namespace BlackCore
|
||||
m_otherClients.clear();
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::removeFromAircraftCaches(const CCallsign &callsign)
|
||||
{
|
||||
if (callsign.isEmpty()) { return; }
|
||||
this->m_icaoCodeCache.remove(callsign);
|
||||
this->m_flightPlanCache.remove(callsign);
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::fireDelayedReadyForModelMatching(const CCallsign &callsign, int trial, int delayMs)
|
||||
{
|
||||
BlackMisc::singleShot(delayMs, QThread::currentThread(), [ = ]()
|
||||
{
|
||||
this->ps_sendReadyForModelMatching(callsign, trial + 1);
|
||||
});
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_receivedBookings(const CAtcStationList &bookedStations)
|
||||
{
|
||||
Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this));
|
||||
@@ -394,11 +449,30 @@ namespace BlackCore
|
||||
}
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign)
|
||||
void CAirspaceMonitor::ps_sendReadyForModelMatching(const CCallsign &callsign, int trial)
|
||||
{
|
||||
CAircraft remoteAircraft = this->m_aircraftInRange.findFirstByCallsign(callsign);
|
||||
// some checks for special conditions, e.g. logout -> empty list, but still signals pending
|
||||
if (this->m_aircraftInRange.isEmpty()) { return; }
|
||||
if (!this->m_aircraftInRange.containsCallsign(callsign)) { return; }
|
||||
|
||||
// build simulated aircraft and crosscheck if all data are available
|
||||
CSimulatedAircraft remoteAircraft(this->m_aircraftInRange.findFirstByCallsign(callsign));
|
||||
Q_ASSERT(remoteAircraft.hasValidCallsign());
|
||||
CClient remoteClient = this->m_otherClients.findFirstByCallsign(callsign);
|
||||
emit readyForModelMatching(remoteAircraft, remoteClient);
|
||||
remoteAircraft.setClient(remoteClient);
|
||||
remoteAircraft.setModel(remoteClient.getAircraftModel());
|
||||
|
||||
bool dataComplete = remoteAircraft.hasValidAircraftDesignator() && remoteAircraft.hasValidRealName();
|
||||
if (trial < 3 && !dataComplete)
|
||||
{
|
||||
// allow another period for the client data to arrive, otherwise go ahead
|
||||
this->fireDelayedReadyForModelMatching(callsign, trial + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
Q_ASSERT(remoteAircraft.hasValidAircraftDesignator());
|
||||
Q_ASSERT(remoteAircraft.hasValidRealName());
|
||||
emit this->readyForModelMatching(remoteAircraft);
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_atcPositionUpdate(const CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency, const CCoordinateGeodetic &position, const BlackMisc::PhysicalQuantities::CLength &range)
|
||||
@@ -525,43 +599,35 @@ namespace BlackCore
|
||||
void CAirspaceMonitor::ps_icaoCodesReceived(const CCallsign &callsign, const CAircraftIcao &icaoData)
|
||||
{
|
||||
Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this));
|
||||
Q_ASSERT(!callsign.isEmpty());
|
||||
|
||||
// update
|
||||
CPropertyIndexVariantMap vm(CAircraft::IndexIcao, icaoData.toCVariant());
|
||||
if (!icaoData.hasAircraftDesignator())
|
||||
{
|
||||
// empty so far, try to fetch from data file
|
||||
CLogMessage(this).debug() << "Empty ICAO info for %1 %2" << callsign << icaoData;
|
||||
CAircraftIcao icaoDataDataFile = this->m_vatsimDataFileReader->getIcaoInfo(callsign);
|
||||
if (!icaoDataDataFile.hasAircraftDesignator()) return; // give up!
|
||||
vm = CPropertyIndexVariantMap(CAircraft::IndexIcao, icaoData.toCVariant());
|
||||
CLogMessage(this).warning("Empty ICAO info for %1 %2") << callsign.toQString() << icaoData.toQString();
|
||||
CAircraftIcao icaoDataFromDataFile = this->m_vatsimDataFileReader->getIcaoInfo(callsign);
|
||||
if (!icaoDataFromDataFile.hasAircraftDesignator()) { return; } // give up!
|
||||
vm = CPropertyIndexVariantMap(CAircraft::IndexIcao, icaoDataFromDataFile.toCVariant());
|
||||
}
|
||||
// ICAO code received when aircraft is already removed or not yet ready
|
||||
if (!this->m_aircraftInRange.containsCallsign(callsign))
|
||||
{
|
||||
this->m_icaoCodeCache.insert(callsign, icaoData);
|
||||
return;
|
||||
}
|
||||
int changed = this->m_aircraftInRange.applyIf(&CAircraft::getCallsign, callsign, vm, true);
|
||||
if (changed > 0) { emit this->changedAircraftInRange(); }
|
||||
|
||||
// we have most important data for model matching
|
||||
// but do we already have the client
|
||||
if (this->m_otherClients.contains(&CClient::getCallsign, callsign))
|
||||
{
|
||||
// yes, client with possible model string is there
|
||||
ps_sendReadyForModelMatching(callsign);
|
||||
}
|
||||
else
|
||||
{
|
||||
// allow another period for the client data to arrive, otherwise go ahead
|
||||
BlackMisc::singleShot(5000, QThread::currentThread(), [ = ]()
|
||||
{
|
||||
ps_sendReadyForModelMatching(callsign);
|
||||
});
|
||||
}
|
||||
// update
|
||||
int c = this->m_aircraftInRange.applyIfCallsign(callsign, vm);
|
||||
if (c > 0) {ps_sendReadyForModelMatching(callsign, 1); }
|
||||
}
|
||||
|
||||
void CAirspaceMonitor::ps_aircraftUpdateReceived(const CCallsign &callsign, const CAircraftSituation &situation, const CTransponder &transponder)
|
||||
{
|
||||
Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this));
|
||||
|
||||
CAircraftList list = this->m_aircraftInRange.findByCallsign(callsign);
|
||||
if (list.isEmpty())
|
||||
bool exists = this->m_aircraftInRange.containsCallsign(callsign);
|
||||
if (!exists)
|
||||
{
|
||||
// new aircraft
|
||||
CAircraft aircraft;
|
||||
@@ -569,11 +635,21 @@ namespace BlackCore
|
||||
aircraft.setSituation(situation);
|
||||
aircraft.setTransponder(transponder);
|
||||
aircraft.setCalculcatedDistanceToPosition(this->m_ownAircraft.getPosition()); // distance from myself
|
||||
|
||||
// ICAO from cache if avialable
|
||||
bool setIcao = false;
|
||||
if (this->m_icaoCodeCache.contains(callsign))
|
||||
{
|
||||
CAircraftIcao icao = this->m_icaoCodeCache.value(callsign);
|
||||
this->m_icaoCodeCache.remove(callsign);
|
||||
aircraft.setIcaoInfo(icao);
|
||||
setIcao = true;
|
||||
}
|
||||
|
||||
this->m_vatsimDataFileReader->updateWithVatsimDataFileData(aircraft);
|
||||
this->m_aircraftInRange.push_back(aircraft);
|
||||
|
||||
// and new client, there is a chance it has been created by
|
||||
// custom packet first
|
||||
// new client, there is a chance it has been already created by custom packet
|
||||
if (!this->m_otherClients.contains(&CClient::getCallsign, callsign))
|
||||
{
|
||||
CClient c(callsign);
|
||||
@@ -583,18 +659,28 @@ namespace BlackCore
|
||||
if (this->m_network->isConnected())
|
||||
{
|
||||
// only if still connected
|
||||
// the order here makes some sense, as we hope to receive ICAO codes last, and everthing else already in place
|
||||
this->sendFsipirCustomPacket(callsign); // own aircraft model
|
||||
this->m_network->sendFrequencyQuery(callsign);
|
||||
this->m_network->sendRealNameQuery(callsign);
|
||||
this->m_network->sendIcaoCodesQuery(callsign);
|
||||
this->m_network->sendCapabilitiesQuery(callsign);
|
||||
this->m_network->sendServerQuery(callsign);
|
||||
this->sendFsipirCustomPacket(callsign); // own aircraft model
|
||||
}
|
||||
|
||||
this->m_aircraftWatchdog.addCallsign(callsign);
|
||||
emit this->addedAircraft(callsign, situation);
|
||||
// keep as last
|
||||
if (setIcao)
|
||||
{
|
||||
this->fireDelayedReadyForModelMatching(callsign);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->m_network->sendIcaoCodesQuery(callsign);
|
||||
}
|
||||
|
||||
this->m_aircraftWatchdog.addCallsign(callsign);
|
||||
emit this->addedAircraft(callsign, situation);
|
||||
} // connected
|
||||
}
|
||||
else
|
||||
else // not exists yet
|
||||
{
|
||||
// update
|
||||
CLength distance = this->m_ownAircraft.calculcateDistanceToPosition(situation.getPosition());
|
||||
@@ -605,7 +691,7 @@ namespace BlackCore
|
||||
vm.addValue(CAircraft::IndexDistance, distance);
|
||||
|
||||
// here I expect always a changed value
|
||||
this->m_aircraftInRange.applyIf(&CAircraft::getCallsign, callsign, vm, false);
|
||||
this->m_aircraftInRange.applyIfCallsign(callsign, vm);
|
||||
this->m_aircraftWatchdog.resetCallsign(callsign);
|
||||
emit this->changedAircraftSituation(callsign, situation);
|
||||
}
|
||||
@@ -622,6 +708,7 @@ namespace BlackCore
|
||||
{
|
||||
this->m_aircraftInRange.removeIf(&CAircraft::getCallsign, callsign);
|
||||
this->m_otherClients.removeIf(&CClient::getCallsign, callsign);
|
||||
this->removeFromAircraftCaches(callsign);
|
||||
emit this->removedAircraft(callsign);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#ifndef BLACKCORE_AIRSPACE_MONITOR_H
|
||||
#define BLACKCORE_AIRSPACE_MONITOR_H
|
||||
|
||||
#include "blackmisc/simulation/simulatedaircraft.h"
|
||||
#include "blackmisc/avatcstationlist.h"
|
||||
#include "blackmisc/avaircraftlist.h"
|
||||
#include "blackmisc/nwclientlist.h"
|
||||
@@ -44,6 +45,7 @@ namespace BlackCore
|
||||
BlackMisc::Network::CUserList getUsersForCallsigns(const BlackMisc::Aviation::CCallsignList &callsigns) const;
|
||||
|
||||
//! Returns the flightplan for the given callsign
|
||||
//! \remarks pseudo synchronous, call the async functions and waits for result
|
||||
BlackMisc::Aviation::CFlightPlan loadFlightPlanFromNetwork(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
//! Returns this list of other clients we know about
|
||||
@@ -99,25 +101,18 @@ namespace BlackCore
|
||||
void removedAircraft(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
//! Read for model matching
|
||||
void readyForModelMatching(const BlackMisc::Aviation::CAircraft &remoteAircraft, const BlackMisc::Network::CClient &remoteClient);
|
||||
void readyForModelMatching(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft);
|
||||
|
||||
public slots:
|
||||
//! Own aircraft updated
|
||||
void setOwnAircraft(const BlackMisc::Aviation::CAircraft &ownAircraft) { m_ownAircraft = ownAircraft; }
|
||||
|
||||
//! Own aircraft model updated
|
||||
void setOwnAircraftModel(const BlackMisc::Network::CAircraftModel &model) { m_ownAircraftModel = model; }
|
||||
void setOwnAircraftModel(const BlackMisc::Simulation::CAircraftModel &model) { m_ownAircraftModel = model; }
|
||||
|
||||
public:
|
||||
//! Clear the contents
|
||||
void clear()
|
||||
{
|
||||
removeAllAtcStations();
|
||||
removeAllAircraft();
|
||||
removeAllOtherClients();
|
||||
m_metarCache.clear();
|
||||
m_flightPlanCache.clear();
|
||||
}
|
||||
void clear();
|
||||
|
||||
private:
|
||||
BlackMisc::Aviation::CAtcStationList m_atcStationsOnline;
|
||||
@@ -125,14 +120,15 @@ namespace BlackCore
|
||||
BlackMisc::Aviation::CAircraftList m_aircraftInRange;
|
||||
BlackMisc::Network::CClientList m_otherClients;
|
||||
QMap<BlackMisc::Aviation::CAirportIcao, BlackMisc::Aviation::CInformationMessage> m_metarCache;
|
||||
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CFlightPlan> m_flightPlanCache;
|
||||
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CFlightPlan> m_flightPlanCache;
|
||||
QMap<BlackMisc::Aviation::CCallsign, BlackMisc::Aviation::CAircraftIcao> m_icaoCodeCache;
|
||||
|
||||
BlackMisc::Aviation::CAircraft m_ownAircraft;
|
||||
BlackMisc::Network::CAircraftModel m_ownAircraftModel;
|
||||
BlackMisc::Aviation::CAircraft m_ownAircraft;
|
||||
BlackMisc::Simulation::CAircraftModel m_ownAircraftModel;
|
||||
|
||||
INetwork *m_network = nullptr;
|
||||
CVatsimBookingReader *m_vatsimBookingReader;
|
||||
CVatsimDataFileReader *m_vatsimDataFileReader;
|
||||
CVatsimBookingReader *m_vatsimBookingReader = nullptr;
|
||||
CVatsimDataFileReader *m_vatsimDataFileReader = nullptr;
|
||||
CAirspaceWatchdog m_atcWatchdog;
|
||||
CAirspaceWatchdog m_aircraftWatchdog;
|
||||
|
||||
@@ -144,14 +140,28 @@ namespace BlackCore
|
||||
//! Helper method, add voice capabilites if available
|
||||
void addVoiceCapabilitiesFromDataFile(BlackMisc::CPropertyIndexVariantMap &vm, const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
void removeAllAtcStations();
|
||||
//! Remove ATC online stations
|
||||
void removeAllOnlineAtcStations();
|
||||
|
||||
//! Remove all aircraft in range
|
||||
void removeAllAircraft();
|
||||
|
||||
//! Remove all clients
|
||||
void removeAllOtherClients();
|
||||
|
||||
//! Remove data from caches
|
||||
void removeFromAircraftCaches(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
|
||||
//! Schedule a ready for model matching
|
||||
void fireDelayedReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial = 1, int delayMs = 2500);
|
||||
|
||||
private slots:
|
||||
//! Create aircraft in range, this is the only place where a new aircraft should be added
|
||||
void ps_aircraftUpdateReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder);
|
||||
|
||||
void ps_realNameReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &realname);
|
||||
void ps_capabilitiesReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, quint32 flags);
|
||||
void ps_fsipirCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &, const QString &, const QString &, const QString &model);
|
||||
void ps_fsipirCustomPacketReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &p1, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &model);
|
||||
void ps_serverReplyReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &server);
|
||||
void ps_metarReceived(const QString &metarMessage);
|
||||
void ps_flightPlanReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CFlightPlan &flightPlan);
|
||||
@@ -161,14 +171,13 @@ namespace BlackCore
|
||||
void ps_atisVoiceRoomReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &url);
|
||||
void ps_atisLogoffTimeReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &zuluTime);
|
||||
void ps_icaoCodesReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftIcao &icaoData);
|
||||
void ps_aircraftUpdateReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CTransponder &transponder);
|
||||
void ps_pilotDisconnected(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
void ps_frequencyReceived(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CFrequency &frequency);
|
||||
void ps_receivedBookings(const BlackMisc::Aviation::CAtcStationList &bookedStations);
|
||||
void ps_receivedDataFile();
|
||||
|
||||
// non network related slots
|
||||
void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign);
|
||||
//! Send the information if aircraft and(!) client are vailable
|
||||
void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial);
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -108,7 +108,7 @@ namespace BlackCore
|
||||
void CContextApplication::processHotkeyFuncEvent(const BlackMisc::Event::CEventHotkeyFunction &event)
|
||||
{
|
||||
CInputManager::getInstance()->callFunctionsBy(event.getFunction(), event.getFunctionArgument());
|
||||
qDebug() << "Calling function from origin" << event.getEventOriginator().toQString();
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << "Calling function from origin" << event.getEventOriginator().toQString();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -76,6 +76,8 @@ namespace BlackCore
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAtcStationOnlineConnectionStatus, this, &CContextNetwork::changedAtcStationOnlineConnectionStatus);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAircraftInRange, this, &CContextNetwork::changedAircraftInRange);
|
||||
connect(this->m_airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextNetwork::changedAircraftSituation);
|
||||
|
||||
//! \todo Should be set in runtime, but this would require airspace to be a context
|
||||
connect(this->getIContextOwnAircraft(), &IContextOwnAircraft::changedAircraft, this->m_airspace, &CAirspaceMonitor::setOwnAircraft);
|
||||
connect(this->getIContextSimulator(), &IContextSimulator::ownAircraftModelChanged, this->m_airspace, &CAirspaceMonitor::setOwnAircraftModel);
|
||||
}
|
||||
@@ -107,23 +109,23 @@ namespace BlackCore
|
||||
QString msg;
|
||||
if (!server.getUser().isValid())
|
||||
{
|
||||
return CLogMessage(this).error("Invalid user credentials");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Invalid user credentials");
|
||||
}
|
||||
else if (!this->ownAircraft().getIcaoInfo().hasAircraftAndAirlineDesignator())
|
||||
{
|
||||
return CLogMessage(this).error("Invalid ICAO data for own aircraft");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Invalid ICAO data for own aircraft");
|
||||
}
|
||||
else if (!CNetworkUtils::canConnect(server, msg, 2000))
|
||||
{
|
||||
return CLogMessage(this).error(msg);
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, msg);
|
||||
}
|
||||
else if (this->m_network->isConnected())
|
||||
{
|
||||
return CLogMessage(this).error("Already connected");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Already connected");
|
||||
}
|
||||
else if (this->isPendingConnection())
|
||||
{
|
||||
return CLogMessage(this).error("Pending connection, please wait");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityError, "Pending connection, please wait");
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -137,7 +139,7 @@ namespace BlackCore
|
||||
this->m_network->presetIcaoCodes(ownAircraft.getIcaoInfo());
|
||||
this->m_network->setOwnAircraft(ownAircraft);
|
||||
this->m_network->initiateConnection();
|
||||
return CLogMessage(this).info("Connection pending %1 %2") << server.getAddress() << server.getPort();
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Connection pending " + server.getAddress() + " " + QString::number(server.getPort()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,15 +154,15 @@ namespace BlackCore
|
||||
this->m_currentStatus = INetwork::Disconnecting; // as semaphore we are going to disconnect
|
||||
this->m_network->terminateConnection();
|
||||
this->m_airspace->clear();
|
||||
return CLogMessage(this).info("Connection terminating");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Connection terminating");
|
||||
}
|
||||
else if (this->isPendingConnection())
|
||||
{
|
||||
return CLogMessage(this).warning("Pending connection, please wait");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityInfo, "Pending connection, please wait");
|
||||
}
|
||||
else
|
||||
{
|
||||
return CLogMessage(this).warning("Already disconnected");
|
||||
return CStatusMessage({ CLogCategory::validation() }, CStatusMessage::SeverityWarning, "Already disconnected");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
#define BLACKCORE_CONTEXTOWNAIRCRAFT_H
|
||||
|
||||
#include "blackcore/context.h"
|
||||
#include "blackmisc/avaircraft.h"
|
||||
#include "blackmisc/avatcstation.h"
|
||||
#include "blackmisc/simulation/simulatedaircraft.h"
|
||||
#include "blackmisc/avaircrafticao.h"
|
||||
#include "blackmisc/voiceroomlist.h"
|
||||
#include "blackmisc/avselcal.h"
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
//! \brief Own context proxy
|
||||
//! Own context proxy
|
||||
//! \ingroup dbus
|
||||
class IContextOwnAircraft : public CContext
|
||||
{
|
||||
@@ -66,19 +66,19 @@ namespace BlackCore
|
||||
signals:
|
||||
//! Aircraft changed
|
||||
//! \remarks local only
|
||||
void changedAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator);
|
||||
void changedAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Aircraft situation update
|
||||
//! \remarks local only
|
||||
void changedAircraftSituation(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator);
|
||||
void changedAircraftSituation(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Aircraft position update
|
||||
//! \remarks local only
|
||||
void changedAircraftPosition(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator);
|
||||
void changedAircraftPosition(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Aircraft cockpit update
|
||||
//! \remarks DBus and local
|
||||
void changedAircraftCockpit(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator);
|
||||
void changedAircraftCockpit(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator);
|
||||
|
||||
//! Changed SELCAL code
|
||||
//! \remarks DBus and local
|
||||
@@ -87,27 +87,32 @@ namespace BlackCore
|
||||
public slots:
|
||||
|
||||
//! Get own aircraft
|
||||
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0;
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const = 0;
|
||||
|
||||
//! Own aircraft
|
||||
//! \todo remove "own", left over from past
|
||||
virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0;
|
||||
virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) = 0;
|
||||
|
||||
//! Own aircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) = 0;
|
||||
|
||||
//! Own position, be aware height is terrain height
|
||||
//! \todo remove "own", left over from past
|
||||
virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) = 0;
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) = 0;
|
||||
|
||||
//! Complete situation update
|
||||
//! \todo remove "own", left over from past
|
||||
virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) = 0;
|
||||
virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) = 0;
|
||||
|
||||
//! Update own cockpit
|
||||
//! \todo remove "own", left over from past
|
||||
virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0;
|
||||
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) = 0;
|
||||
|
||||
//! Tune in a com frequency
|
||||
virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) = 0;
|
||||
|
||||
//! Update model
|
||||
virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) = 0;
|
||||
|
||||
//! Update client
|
||||
virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) = 0;
|
||||
|
||||
//! Set current pilot
|
||||
virtual bool updatePilot(const BlackMisc::Network::CUser &pilot, const QString &originator) = 0;
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@ using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::Audio;
|
||||
using namespace BlackMisc::Simulation;
|
||||
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
@@ -97,34 +99,87 @@ namespace BlackCore
|
||||
/*
|
||||
* Own Aircraft
|
||||
*/
|
||||
void CContextOwnAircraft::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator)
|
||||
bool CContextOwnAircraft::updateAircraft(const CSimulatedAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << ownAircraft() << originator;
|
||||
|
||||
bool changedAircraft = this->updateAircraft(static_cast<CAircraft>(aircraft), originator);
|
||||
|
||||
bool changedModel = this->updateModel(aircraft.getModel(), originator);
|
||||
bool changedClient = this->updateClient(aircraft.getClient(), originator);
|
||||
if (changedModel || changedClient)
|
||||
{
|
||||
if (!changedAircraft)
|
||||
{
|
||||
// no signal so far
|
||||
emit this->changedAircraft(this->m_ownAircraft, originator);
|
||||
}
|
||||
}
|
||||
|
||||
bool changed = changedModel || changedClient || changedAircraft;
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Own Aircraft
|
||||
*/
|
||||
bool CContextOwnAircraft::updateAircraft(const CAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << ownAircraft() << originator;
|
||||
|
||||
// trigger the correct signals
|
||||
bool changedCockpit = this->updateOwnCockpit(aircraft.getCom1System(), aircraft.getCom2System(), aircraft.getTransponder(), originator);
|
||||
bool changedPosition = this->updateOwnPosition(aircraft.getPosition(), aircraft.getAltitude() , originator);
|
||||
bool changedSituation = this->updateOwnSituation(aircraft.getSituation(), originator);
|
||||
bool changedCockpit = this->updateCockpit(aircraft.getCom1System(), aircraft.getCom2System(), aircraft.getTransponder(), originator);
|
||||
bool changedPosition = this->updatePosition(aircraft.getPosition(), aircraft.getAltitude() , originator);
|
||||
bool changedSituation = this->updateSituation(aircraft.getSituation(), originator);
|
||||
bool changed = changedCockpit || changedPosition || changedSituation;
|
||||
|
||||
// new voice rooms, cockpit has changed
|
||||
if (changedCockpit) this->resolveVoiceRooms();
|
||||
if (changedCockpit) { this->resolveVoiceRooms(); }
|
||||
|
||||
// any change triggers a global updated aircraft signal
|
||||
// comparison is not to avoid setting the value, but avoid wrong signals
|
||||
if (changed || this->m_ownAircraft != aircraft)
|
||||
if (changed || this->getAviationAircraft() != aircraft)
|
||||
{
|
||||
emit this->changedAircraft(aircraft, originator);
|
||||
|
||||
// now set value
|
||||
this->m_ownAircraft = aircraft;
|
||||
this->m_ownAircraft.update(aircraft);
|
||||
changed = true;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Client
|
||||
*/
|
||||
bool CContextOwnAircraft::updateClient(const CClient &client, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << client << originator;
|
||||
|
||||
bool changed = this->m_ownAircraft.getClient() != client;
|
||||
if (!changed) { return false; }
|
||||
this->m_ownAircraft.setClient(client);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Model
|
||||
*/
|
||||
bool CContextOwnAircraft::updateModel(const CAircraftModel &model, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << model << originator;
|
||||
|
||||
bool changed = this->m_ownAircraft.getModel() != model;
|
||||
if (!changed) { return false; }
|
||||
this->m_ownAircraft.setModel(model);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Own position
|
||||
*/
|
||||
bool CContextOwnAircraft::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator)
|
||||
bool CContextOwnAircraft::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << position << altitude << originator;
|
||||
bool changed = (this->m_ownAircraft.getPosition() != position);
|
||||
@@ -147,7 +202,7 @@ namespace BlackCore
|
||||
/*
|
||||
* Update own situation
|
||||
*/
|
||||
bool CContextOwnAircraft::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator)
|
||||
bool CContextOwnAircraft::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << situation;
|
||||
bool changed = this->m_ownAircraft.getSituation() != situation;
|
||||
@@ -165,7 +220,7 @@ namespace BlackCore
|
||||
/*
|
||||
* Own cockpit data
|
||||
*/
|
||||
bool CContextOwnAircraft::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator)
|
||||
bool CContextOwnAircraft::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << com1 << com2 << transponder;
|
||||
bool changed = this->m_ownAircraft.hasChangedCockpitData(com1, com2, transponder);
|
||||
@@ -198,7 +253,7 @@ namespace BlackCore
|
||||
{
|
||||
com2.setFrequencyActive(frequency);
|
||||
}
|
||||
return updateOwnCockpit(com1, com2, xpdr, originator);
|
||||
return updateCockpit(com1, com2, xpdr, originator);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -287,7 +342,7 @@ namespace BlackCore
|
||||
/*
|
||||
* Own aircraft
|
||||
*/
|
||||
CAircraft CContextOwnAircraft::getOwnAircraft() const
|
||||
CSimulatedAircraft CContextOwnAircraft::getOwnAircraft() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << this->m_ownAircraft;
|
||||
return this->m_ownAircraft;
|
||||
@@ -316,14 +371,14 @@ namespace BlackCore
|
||||
if (CTransponder::isValidTransponderCode(xprCode))
|
||||
{
|
||||
transponder.setTransponderCode(xprCode);
|
||||
this->updateOwnCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline");
|
||||
this->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
CTransponder::TransponderMode mode = CTransponder::modeFromString(parser.part(1));
|
||||
transponder.setTransponderMode(mode);
|
||||
this->updateOwnCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline");
|
||||
this->updateCockpit(ownAircraft.getCom1System(), ownAircraft.getCom2System(), transponder, "commandline");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -346,7 +401,7 @@ namespace BlackCore
|
||||
{
|
||||
return false;
|
||||
}
|
||||
this->updateOwnCockpit(com1, com2, ownAircraft.getTransponder(), "commandline");
|
||||
this->updateCockpit(com1, com2, ownAircraft.getTransponder(), "commandline");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -361,4 +416,12 @@ namespace BlackCore
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper
|
||||
*/
|
||||
const CAircraft &CContextOwnAircraft::getAviationAircraft() const
|
||||
{
|
||||
return static_cast<CAircraft const &>(this->m_ownAircraft);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "blackcore/context_settings.h"
|
||||
#include "blackcore/context_runtime.h"
|
||||
#include "blackcore/dbus_server.h"
|
||||
#include "blackmisc/avatcstation.h"
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
@@ -33,27 +34,36 @@ namespace BlackCore
|
||||
virtual ~CContextOwnAircraft();
|
||||
|
||||
//! Own aircraft
|
||||
const BlackMisc::Aviation::CAircraft &ownAircraft() const { return this->m_ownAircraft; }
|
||||
const BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() const { return this->m_ownAircraft; }
|
||||
|
||||
//! Own aircraft
|
||||
BlackMisc::Aviation::CAircraft &ownAircraft() { return this->m_ownAircraft; }
|
||||
BlackMisc::Simulation::CSimulatedAircraft &ownAircraft() { return this->m_ownAircraft; }
|
||||
|
||||
public slots: // IContextOwnAircraft overrides
|
||||
|
||||
//! \copydoc IContextOwnAircraft::getOwnAircraft()
|
||||
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override;
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::setOwnAircraft
|
||||
virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateOwnPosition
|
||||
virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateOwnSituation
|
||||
virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateModel
|
||||
virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateOwnCockpit
|
||||
virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateClient
|
||||
virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updatePosition
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateSituation
|
||||
virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateCockpit
|
||||
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateComFrequency
|
||||
virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override;
|
||||
@@ -108,7 +118,7 @@ namespace BlackCore
|
||||
void ps_changedAtcStationOnlineConnectionStatus(const BlackMisc::Aviation::CAtcStation &atcStation, bool connected);
|
||||
|
||||
private:
|
||||
BlackMisc::Aviation::CAircraft m_ownAircraft; //!< my aircraft
|
||||
BlackMisc::Simulation::CSimulatedAircraft m_ownAircraft; //!< my aircraft
|
||||
bool m_automaticVoiceRoomResolution = true; //!< automatic voice room resolution, or disable for override
|
||||
QString m_voiceRoom1UrlOverride; //!< overridden voice room url
|
||||
QString m_voiceRoom2UrlOverride; //!< overridden voice room url
|
||||
@@ -119,6 +129,9 @@ namespace BlackCore
|
||||
//! Resolve voice rooms
|
||||
void resolveVoiceRooms();
|
||||
|
||||
//! Own aircraft
|
||||
const BlackMisc::Aviation::CAircraft &getAviationAircraft() const;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
using namespace BlackMisc;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Simulation;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
@@ -31,7 +32,7 @@ namespace BlackCore
|
||||
void CContextOwnAircraftProxy::relaySignals(const QString &serviceName, QDBusConnection &connection)
|
||||
{
|
||||
bool s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(),
|
||||
"changedAircraftCockpit", this, SIGNAL(changedAircraftCockpit(BlackMisc::Aviation::CAircraft, QString)));
|
||||
"changedAircraftCockpit", this, SIGNAL(changedAircraftCockpit(BlackMisc::Simulation::CSimulatedAircraft, QString)));
|
||||
Q_ASSERT(s);
|
||||
s = connection.connect(serviceName, IContextOwnAircraft::ObjectPath(), IContextOwnAircraft::InterfaceName(),
|
||||
"changedSelcal", this, SIGNAL(changedSelcal(BlackMisc::Aviation::CSelcal, QString)));
|
||||
@@ -39,29 +40,44 @@ namespace BlackCore
|
||||
Q_UNUSED(s);
|
||||
}
|
||||
|
||||
BlackMisc::Aviation::CAircraft CContextOwnAircraftProxy::getOwnAircraft() const
|
||||
BlackMisc::Simulation::CSimulatedAircraft CContextOwnAircraftProxy::getOwnAircraft() const
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<BlackMisc::Aviation::CAircraft>(QLatin1Literal("getOwnAircraft"));
|
||||
return this->m_dBusInterface->callDBusRet<BlackMisc::Simulation::CSimulatedAircraft>(QLatin1Literal("getOwnAircraft"));
|
||||
}
|
||||
|
||||
void CContextOwnAircraftProxy::updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnAircraft"), aircraft, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateAircraft"), aircraft, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateOwnPosition"), position, altitude, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateAircraft"), aircraft, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateModel(const Simulation::CAircraftModel &model, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateOwnSituation"), situation, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateModel"), model, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator)
|
||||
bool CContextOwnAircraftProxy::updateClient(const Network::CClient &client, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateOwnCockpit"), com1, com2, transponder, originator);
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateClient"), client, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updatePosition"), position, altitude, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateSituation"), situation, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator)
|
||||
{
|
||||
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateCockpit"), com1, com2, transponder, originator);
|
||||
}
|
||||
|
||||
bool CContextOwnAircraftProxy::updateComFrequency(const PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator)
|
||||
@@ -91,7 +107,7 @@ namespace BlackCore
|
||||
|
||||
void CContextOwnAircraftProxy::setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2)
|
||||
{
|
||||
this->m_dBusInterface->callDBus(QLatin1Literal("updateOwnCockpitOutputVolumes"), outputVolumeCom1, outputVolumeCom2);
|
||||
this->m_dBusInterface->callDBus(QLatin1Literal("updateCockpitOutputVolumes"), outputVolumeCom1, outputVolumeCom2);
|
||||
}
|
||||
|
||||
void CContextOwnAircraftProxy::setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url)
|
||||
|
||||
@@ -14,12 +14,13 @@
|
||||
|
||||
#include "blackcore/context_ownaircraft.h"
|
||||
#include "blackmisc/genericdbusinterface.h"
|
||||
#include "blackmisc/avallclasses.h"
|
||||
#include "blackmisc/avaircrafticao.h"
|
||||
#include "blackmisc/simulation/simulatedaircraft.h"
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
|
||||
//! \brief Own aircraft context proxy
|
||||
//! Own aircraft context proxy
|
||||
//! \ingroup dbus
|
||||
class CContextOwnAircraftProxy : public IContextOwnAircraft
|
||||
{
|
||||
@@ -31,35 +32,31 @@ namespace BlackCore
|
||||
//! Destructor
|
||||
virtual ~CContextOwnAircraftProxy() {}
|
||||
|
||||
private:
|
||||
BlackMisc::CGenericDBusInterface *m_dBusInterface; /*!< DBus interface */
|
||||
|
||||
//! \brief Relay connection signals to local signals.
|
||||
void relaySignals(const QString &serviceName, QDBusConnection &connection);
|
||||
|
||||
protected:
|
||||
//! \brief Constructor
|
||||
CContextOwnAircraftProxy(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextOwnAircraft(mode, runtime), m_dBusInterface(nullptr) {}
|
||||
|
||||
//! \brief DBus version constructor
|
||||
CContextOwnAircraftProxy(const QString &serviceName, QDBusConnection &connection, CRuntimeConfig::ContextMode mode, CRuntime *runtime);
|
||||
|
||||
public slots: // IContextOwnAircraft overrides
|
||||
|
||||
//! \copydoc IContextOwnAircraft::getOwnAircraft()
|
||||
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override;
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraft getOwnAircraft() const override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::setOwnAircraft()
|
||||
virtual void updateOwnAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Aviation::CAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateOwnPosition
|
||||
virtual bool updateOwnPosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateAircraft
|
||||
virtual bool updateAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateOwnSituation
|
||||
virtual bool updateOwnSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateModel
|
||||
virtual bool updateModel(const BlackMisc::Simulation::CAircraftModel &model, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateOwnCockpit
|
||||
virtual bool updateOwnCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;
|
||||
//! \copydoc IContextOwnAircraft::updateClient
|
||||
virtual bool updateClient(const BlackMisc::Network::CClient &client, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updatePosition
|
||||
virtual bool updatePosition(const BlackMisc::Geo::CCoordinateGeodetic &position, const BlackMisc::Aviation::CAltitude &altitude, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateSituation
|
||||
virtual bool updateSituation(const BlackMisc::Aviation::CAircraftSituation &situation, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateCockpit
|
||||
virtual bool updateCockpit(const BlackMisc::Aviation::CComSystem &com1, const BlackMisc::Aviation::CComSystem &com2, const BlackMisc::Aviation::CTransponder &transponder, const QString &originator) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::updateComFrequency
|
||||
virtual bool updateComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, int comUnit, const QString &originator) override;
|
||||
@@ -80,7 +77,7 @@ namespace BlackCore
|
||||
virtual void setAudioOutputVolumes(int outputVolumeCom1, int outputVolumeCom2) override;
|
||||
|
||||
//! \copydoc IContextOwnAircraft::setAudioVoiceRoomOverrideUrls
|
||||
virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url,const QString &voiceRoom2Url);
|
||||
virtual void setAudioVoiceRoomOverrideUrls(const QString &voiceRoom1Url, const QString &voiceRoom2Url);
|
||||
|
||||
//! \copydoc IContextOwnAircraft::enableAutomaticVoiceRoomResolution
|
||||
virtual void enableAutomaticVoiceRoomResolution(bool enable);
|
||||
@@ -88,6 +85,20 @@ namespace BlackCore
|
||||
//! \copydoc IContextOwnAircraft::parseCommandLine
|
||||
virtual bool parseCommandLine(const QString &commandLine) override;
|
||||
|
||||
protected:
|
||||
//! \brief Constructor
|
||||
CContextOwnAircraftProxy(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : IContextOwnAircraft(mode, runtime), m_dBusInterface(nullptr) {}
|
||||
|
||||
//! \brief DBus version constructor
|
||||
CContextOwnAircraftProxy(const QString &serviceName, QDBusConnection &connection, CRuntimeConfig::ContextMode mode, CRuntime *runtime);
|
||||
|
||||
private:
|
||||
BlackMisc::CGenericDBusInterface *m_dBusInterface; //!< DBus interface */
|
||||
|
||||
//! \brief Relay connection signals to local signals.
|
||||
void relaySignals(const QString &serviceName, QDBusConnection &connection);
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -26,12 +26,14 @@
|
||||
#include "context.h"
|
||||
#include "blackcore/dbus_server.h"
|
||||
#include "blackcore/context_runtime.h"
|
||||
#include "blackmisc/simulation/aircraftmodellist.h"
|
||||
#include "blacksim/simulatorinfo.h"
|
||||
#include "blacksim/simulatorinfolist.h"
|
||||
#include "blackmisc/nwaircraftmodellist.h"
|
||||
#include "blackmisc/avaircraft.h"
|
||||
#include "blackmisc/simulation/simulatedaircraftlist.h"
|
||||
#include "blackmisc/avairportlist.h"
|
||||
#include "blackmisc/project.h"
|
||||
#include "blackmisc/pixmap.h"
|
||||
#include <QObject>
|
||||
|
||||
namespace BlackCore
|
||||
@@ -79,19 +81,23 @@ namespace BlackCore
|
||||
//! Installed aircraft models ready or changed
|
||||
void installedAircraftModelsChanged();
|
||||
|
||||
//! A single model has been matched
|
||||
void modelMatchingCompleted(BlackMisc::Network::CAircraftModel model);
|
||||
//! A single model has been matched for given Aircraft
|
||||
void modelMatchingCompleted(BlackMisc::Simulation::CSimulatedAircraft aircraft);
|
||||
|
||||
//! A remote aircraft got changed
|
||||
void remoteAircraftChanged(BlackMisc::Simulation::CSimulatedAircraft aircraft);
|
||||
|
||||
//! Emitted when own aircraft model changes
|
||||
//! \todo move to own aircraft context?
|
||||
void ownAircraftModelChanged(BlackMisc::Network::CAircraftModel model);
|
||||
void ownAircraftModelChanged(BlackMisc::Simulation::CSimulatedAircraft aircraft);
|
||||
|
||||
public slots:
|
||||
|
||||
//! Return list of available simulator plugins
|
||||
virtual BlackSim::CSimulatorInfoList getAvailableSimulatorPlugins() const = 0;
|
||||
|
||||
//! Returns true when simulator is connected and available
|
||||
//! Returns true when simulator is connected
|
||||
//! \sa isSimulating
|
||||
virtual bool isConnected() const = 0;
|
||||
|
||||
//! Can we connect?
|
||||
@@ -106,8 +112,8 @@ namespace BlackCore
|
||||
//! Disconnect from simulator
|
||||
virtual bool disconnectFrom() = 0;
|
||||
|
||||
//! Returns true when simulator is running
|
||||
virtual bool isRunning() const = 0;
|
||||
//! Returns true when simulator is running / simulating
|
||||
virtual bool isSimulating() const = 0;
|
||||
|
||||
//! Simulator info
|
||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const = 0;
|
||||
@@ -116,13 +122,17 @@ namespace BlackCore
|
||||
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const = 0;
|
||||
|
||||
//! Aircraft model
|
||||
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const = 0;
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const = 0;
|
||||
|
||||
//! Installed models in simulator eco system
|
||||
virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const = 0;
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const = 0;
|
||||
|
||||
//! Remote aircraft in range having a valid model matching (which should be all aircraft in range)
|
||||
virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const = 0;
|
||||
//! Simulated other aircraft in range
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraftList getRemoteAircraft() const = 0;
|
||||
|
||||
//! Changed remote aircraft (e.g. by disabling aircraft)
|
||||
//! \todo tbd No add/remove remote aircraft function as those are added implicitly by accessing airspace monitor
|
||||
virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &changedAircraft, const BlackMisc::CPropertyIndexVariantMap &changeValues) = 0;
|
||||
|
||||
//! Set time synchronization between simulator and user's computer time
|
||||
//! \remarks not all drivers implement this, e.g. if it is an intrinsic simulator feature
|
||||
@@ -131,6 +141,12 @@ namespace BlackCore
|
||||
//! Is time synchronization on?
|
||||
virtual bool isTimeSynchronized() const = 0;
|
||||
|
||||
//! Max. number of remote aircraft rendered
|
||||
virtual int getMaxRenderedRemoteAircraft() const = 0;
|
||||
|
||||
//! Max. number of remote aircraft rendered
|
||||
virtual void setMaxRenderedRemoteAircraft(int number) = 0;
|
||||
|
||||
//! Time synchronization offset
|
||||
virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const = 0;
|
||||
|
||||
@@ -143,7 +159,7 @@ namespace BlackCore
|
||||
//! Unload simulator plugin
|
||||
virtual void unloadSimulatorPlugin() = 0;
|
||||
|
||||
//! Simulator avialable?
|
||||
//! Simulator avialable (driver available)?
|
||||
bool isSimulatorAvailable() const { return BlackMisc::CProject::isCompiledWithFlightSimulatorSupport() && !getSimulatorInfo().isUnspecified(); }
|
||||
|
||||
//! Simulator paused?
|
||||
@@ -152,6 +168,9 @@ namespace BlackCore
|
||||
//! Settings have been changed
|
||||
virtual void settingsChanged(uint type) = 0;
|
||||
|
||||
//! Icon representing the model
|
||||
virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const = 0;
|
||||
|
||||
protected:
|
||||
//! Constructor
|
||||
IContextSimulator(CRuntimeConfig::ContextMode mode, CRuntime *runtime) : CContext(mode, runtime) {}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "context_application.h"
|
||||
#include "context_network_impl.h"
|
||||
#include "context_runtime.h"
|
||||
#include "blackmisc/propertyindexvariantmap.h"
|
||||
#include "blackmisc/logmessage.h"
|
||||
#include "blackmisc/loghandler.h"
|
||||
#include <QPluginLoader>
|
||||
@@ -22,6 +23,7 @@ using namespace BlackMisc;
|
||||
using namespace BlackMisc::PhysicalQuantities;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc::Simulation;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackSim;
|
||||
using namespace BlackSim::Settings;
|
||||
@@ -97,11 +99,11 @@ namespace BlackCore
|
||||
return m_simulator->getSimulatorInfo();
|
||||
}
|
||||
|
||||
Network::CAircraftModel CContextSimulator::getOwnAircraftModel() const
|
||||
Simulation::CAircraftModel CContextSimulator::getOwnAircraftModel() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
// If no ISimulator object is available, return a dummy.
|
||||
if (!m_simulator) { return Network::CAircraftModel(); }
|
||||
if (!m_simulator) { return Simulation::CAircraftModel(); }
|
||||
|
||||
return this->m_simulator->getOwnAircraftModel();
|
||||
}
|
||||
@@ -124,13 +126,26 @@ namespace BlackCore
|
||||
return this->m_simulator->getInstalledModels();
|
||||
}
|
||||
|
||||
CAircraftModelList CContextSimulator::getCurrentlyMatchedModels() const
|
||||
CSimulatedAircraftList CContextSimulator::getRemoteAircraft() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
// If no ISimulator object is available, return a dummy.
|
||||
if (!m_simulator) { return CAircraftModelList(); }
|
||||
if (!m_simulator) { return CSimulatedAircraftList(); }
|
||||
|
||||
return this->m_simulator->getCurrentlyMatchedModels();
|
||||
return this->m_simulator->getRemoteAircraft();
|
||||
}
|
||||
|
||||
int CContextSimulator::changeRemoteAircraft(const CSimulatedAircraft &changedAircraft, const CPropertyIndexVariantMap &changedValues)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
if (!m_simulator) { return 0; }
|
||||
int c = this->m_simulator->changeRemoteAircraft(changedAircraft, changedValues);
|
||||
if (c > 0)
|
||||
{
|
||||
// really changed something
|
||||
emit this->remoteAircraftChanged(changedAircraft);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
void CContextSimulator::setTimeSynchronization(bool enable, CTime offset)
|
||||
@@ -147,6 +162,20 @@ namespace BlackCore
|
||||
return this->m_simulator->isTimeSynchronized();
|
||||
}
|
||||
|
||||
int CContextSimulator::getMaxRenderedRemoteAircraft() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
if (!m_simulator) return 0;
|
||||
return 13;
|
||||
}
|
||||
|
||||
void CContextSimulator::setMaxRenderedRemoteAircraft(int number)
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
//! \todo implement
|
||||
Q_UNUSED(number);
|
||||
}
|
||||
|
||||
CTime CContextSimulator::getTimeSynchronizationOffset() const
|
||||
{
|
||||
CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO;
|
||||
@@ -194,14 +223,17 @@ namespace BlackCore
|
||||
connect(m_simulator, &ISimulator::simulatorStatusChanged, this, &CContextSimulator::simulatorStatusChanged);
|
||||
connect(m_simulator, &ISimulator::ownAircraftModelChanged, this, &IContextSimulator::ownAircraftModelChanged);
|
||||
connect(m_simulator, &ISimulator::modelMatchingCompleted, this, &IContextSimulator::modelMatchingCompleted);
|
||||
connect(m_simulator, &ISimulator::installedAircraftModelsChanged, this, &IContextSimulator::installedAircraftModelsChanged);
|
||||
|
||||
// log
|
||||
// log from context to simulator
|
||||
connect(CLogHandler::instance(), &CLogHandler::localMessageLogged, m_simulator, &ISimulator::displayStatusMessage);
|
||||
connect(CLogHandler::instance(), &CLogHandler::remoteMessageLogged, m_simulator, &ISimulator::displayStatusMessage);
|
||||
|
||||
// connect with network
|
||||
//! \todo using airspace monitor directly is maybe wrong (KB: I think it is). It assumes simulator and network
|
||||
//! context reside in the same process, which is not guranteed IMHO
|
||||
CAirspaceMonitor *airspace = this->getRuntime()->getCContextNetwork()->getAirspaceMonitor();
|
||||
// connect(airspace, &CAirspaceMonitor::addedAircraft, this, &CContextSimulator::ps_addRemoteAircraft);
|
||||
// use readyForModelMatching instead of CAirspaceMonitor::addedAircraft, as it contains client information
|
||||
connect(airspace, &CAirspaceMonitor::readyForModelMatching, this, &CContextSimulator::ps_addRemoteAircraft);
|
||||
connect(airspace, &CAirspaceMonitor::changedAircraftSituation, this, &CContextSimulator::ps_addAircraftSituation);
|
||||
connect(airspace, &CAirspaceMonitor::removedAircraft, this, &CContextSimulator::ps_removeRemoteAircraft);
|
||||
@@ -209,7 +241,9 @@ namespace BlackCore
|
||||
{
|
||||
Q_ASSERT(!aircraft.getCallsign().isEmpty());
|
||||
CClient client = airspace->getOtherClients().findFirstByCallsign(aircraft.getCallsign());
|
||||
m_simulator->addRemoteAircraft(aircraft, client);
|
||||
CSimulatedAircraft simAircraft(aircraft);
|
||||
simAircraft.setClient(client);
|
||||
m_simulator->addRemoteAircraft(simAircraft);
|
||||
}
|
||||
|
||||
// apply latest settings
|
||||
@@ -257,6 +291,7 @@ namespace BlackCore
|
||||
if (m_simulator)
|
||||
{
|
||||
// depending on shutdown order, network might already have been deleted
|
||||
//! \todo why do we need to disconnet context when we unload driver?
|
||||
if (this->getRuntime()->getIContextNetwork()->isUsingImplementingObject())
|
||||
{
|
||||
CContextNetwork *network = this->getRuntime()->getCContextNetwork();
|
||||
@@ -288,16 +323,16 @@ namespace BlackCore
|
||||
{
|
||||
// the method will check, if an update is really required
|
||||
// these are local (non DBus) calls
|
||||
this->getIContextOwnAircraft()->updateOwnAircraft(contextAircraft, this->getPathAndContextId());
|
||||
this->getIContextOwnAircraft()->updateAircraft(contextAircraft, this->getPathAndContextId());
|
||||
}
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_addRemoteAircraft(const CAircraft &remoteAircraft, const CClient &remoteClient)
|
||||
void CContextSimulator::ps_addRemoteAircraft(const CSimulatedAircraft &remoteAircraft)
|
||||
{
|
||||
Q_ASSERT(this->m_simulator);
|
||||
Q_ASSERT(!remoteAircraft.getCallsign().isEmpty());
|
||||
if (!this->m_simulator) { return; }
|
||||
this->m_simulator->addRemoteAircraft(remoteAircraft, remoteClient);
|
||||
this->m_simulator->addRemoteAircraft(remoteAircraft);
|
||||
}
|
||||
|
||||
void CContextSimulator::ps_addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation)
|
||||
@@ -380,13 +415,19 @@ namespace BlackCore
|
||||
this->m_simulator->setTimeSynchronization(timeSync, syncOffset);
|
||||
}
|
||||
|
||||
CPixmap CContextSimulator::iconForModel(const QString &modelString) const
|
||||
{
|
||||
if (!this->m_simulator) { return CPixmap(); }
|
||||
return this->m_simulator->iconForModel(modelString);
|
||||
}
|
||||
|
||||
bool CContextSimulator::isPaused() const
|
||||
{
|
||||
if (!this->m_simulator) return false;
|
||||
return this->m_simulator->isPaused();
|
||||
}
|
||||
|
||||
bool CContextSimulator::isRunning() const
|
||||
bool CContextSimulator::isSimulating() const
|
||||
{
|
||||
if (!this->m_simulator) return false;
|
||||
return this->m_simulator->isSimulating();
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
#include "blackcore/context_simulator.h"
|
||||
#include "blackcore/context_network.h"
|
||||
#include "blackcore/simulator.h"
|
||||
|
||||
#include "blacksim/simulatorinfo.h"
|
||||
#include "blacksim/simulatorinfolist.h"
|
||||
|
||||
#include "blackmisc/pixmap.h"
|
||||
#include "blackmisc/simulation/simulatedaircraftlist.h"
|
||||
#include <QTimer>
|
||||
#include <QDir>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
@@ -62,23 +62,26 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::isPaused
|
||||
virtual bool isPaused() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::isRunning
|
||||
virtual bool isRunning() const override;
|
||||
//! \copydoc IContextSimulator::isSimulating
|
||||
virtual bool isSimulating() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getSimulatorInfo()
|
||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAircraftModel()
|
||||
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override;
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAirportsInRange()
|
||||
//! \copydoc IContextSimulator::getAirportsInRange
|
||||
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getInstalledModels()
|
||||
virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const override;
|
||||
//! \copydoc IContextSimulator::getInstalledModels
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getCurrentlyMatchedModels()
|
||||
virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const override;
|
||||
//! \copydoc IContextSimulator::getRemoteAircraft
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraftList getRemoteAircraft() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::changeRemoteAircraft
|
||||
virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &changedAircraft, const BlackMisc::CPropertyIndexVariantMap &changedValues) override;
|
||||
|
||||
//! \copydoc IContextSimulator::setTimeSynchronization
|
||||
virtual void setTimeSynchronization(bool enable, BlackMisc::PhysicalQuantities::CTime offset) override;
|
||||
@@ -86,6 +89,12 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::isTimeSynchronized
|
||||
virtual bool isTimeSynchronized() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getMaxRenderedRemoteAircraft
|
||||
virtual int getMaxRenderedRemoteAircraft() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::setMaxRenderedRemoteAircraft
|
||||
virtual void setMaxRenderedRemoteAircraft(int number) override;
|
||||
|
||||
//! \copydoc IContextSimulator::getTimeSynchronizationOffset
|
||||
virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override;
|
||||
|
||||
@@ -101,6 +110,9 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::settingsChanged
|
||||
virtual void settingsChanged(uint type) override;
|
||||
|
||||
//! \copydoc IContextSimulator::iconForModel
|
||||
virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override;
|
||||
|
||||
protected:
|
||||
//! \brief Constructor
|
||||
CContextSimulator(CRuntimeConfig::ContextMode, CRuntime *runtime);
|
||||
@@ -118,8 +130,7 @@ namespace BlackCore
|
||||
void ps_updateOwnAircraftContext();
|
||||
|
||||
//! \copydoc ISimulator::addRemoteAircraft
|
||||
// void ps_addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation);
|
||||
void ps_addRemoteAircraft(const BlackMisc::Aviation::CAircraft &remoteAircraft, const BlackMisc::Network::CClient &remoteClient);
|
||||
void ps_addRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &remoteAircraft);
|
||||
|
||||
//! \copydoc ISimulator::addAircraftSituation
|
||||
void ps_addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation);
|
||||
|
||||
@@ -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_simulator_proxy.h"
|
||||
#include <QObject>
|
||||
@@ -13,6 +17,7 @@ using namespace BlackMisc::PhysicalQuantities;
|
||||
using namespace BlackMisc::Aviation;
|
||||
using namespace BlackMisc::Network;
|
||||
using namespace BlackMisc::Geo;
|
||||
using namespace BlackMisc::Simulation;
|
||||
using namespace BlackSim;
|
||||
|
||||
namespace BlackCore
|
||||
@@ -38,11 +43,16 @@ namespace BlackCore
|
||||
"simulatorStatusChanged", this, SIGNAL(simulatorStatusChanged(bool, bool, bool)));
|
||||
Q_ASSERT(s);
|
||||
s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
|
||||
"ownAircraftModelChanged", this, SIGNAL(ownAircraftModelChanged(BlackMisc::Network::CAircraftModel)));
|
||||
"installedAircraftModelsChanged", this, SIGNAL(installedAircraftModelsChanged()));
|
||||
Q_ASSERT(s);
|
||||
|
||||
s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
|
||||
"modelMatchingCompleted", this, SIGNAL(modelMatchingCompleted(BlackMisc::Network::CAircraftModel)));
|
||||
"ownAircraftModelChanged", this, SIGNAL(ownAircraftModelChanged(BlackMisc::Simulation::CSimulatedAircraft)));
|
||||
Q_ASSERT(s);
|
||||
s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
|
||||
"modelMatchingCompleted", this, SIGNAL(modelMatchingCompleted(BlackMisc::Simulation::CSimulatedAircraft)));
|
||||
Q_ASSERT(s);
|
||||
s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
|
||||
"remoteAircraftChanged", this, SIGNAL(remoteAircraftChanged(BlackMisc::Simulation::CSimulatedAircraft)));
|
||||
Q_ASSERT(s);
|
||||
Q_UNUSED(s);
|
||||
}
|
||||
@@ -77,9 +87,9 @@ namespace BlackCore
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("disconnectFrom"));
|
||||
}
|
||||
|
||||
BlackMisc::Network::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const
|
||||
BlackMisc::Simulation::CAircraftModel CContextSimulatorProxy::getOwnAircraftModel() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Network::CAircraftModel>(QLatin1Literal("getOwnAircraftModel"));
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Simulation::CAircraftModel>(QLatin1Literal("getOwnAircraftModel"));
|
||||
}
|
||||
|
||||
CAirportList CContextSimulatorProxy::getAirportsInRange() const
|
||||
@@ -89,12 +99,17 @@ namespace BlackCore
|
||||
|
||||
CAircraftModelList CContextSimulatorProxy::getInstalledModels() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Network::CAircraftModelList>(QLatin1Literal("getInstalledModels"));
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Simulation::CAircraftModelList>(QLatin1Literal("getInstalledModels"));
|
||||
}
|
||||
|
||||
CAircraftModelList CContextSimulatorProxy::getCurrentlyMatchedModels() const
|
||||
CSimulatedAircraftList CContextSimulatorProxy::getRemoteAircraft() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Network::CAircraftModelList>(QLatin1Literal("getCurrentlyMatchedModels"));
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::Simulation::CSimulatedAircraftList>(QLatin1Literal("getRemoteAircraft"));
|
||||
}
|
||||
|
||||
int CContextSimulatorProxy::changeRemoteAircraft(const CSimulatedAircraft &changedAircraft, const CPropertyIndexVariantMap &changedValues)
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<int>(QLatin1Literal("changeRemoteAircraft"), changedAircraft, changedValues);
|
||||
}
|
||||
|
||||
BlackSim::CSimulatorInfo CContextSimulatorProxy::getSimulatorInfo() const
|
||||
@@ -112,6 +127,16 @@ namespace BlackCore
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("isTimeSynchronized"));
|
||||
}
|
||||
|
||||
void CContextSimulatorProxy::setMaxRenderedRemoteAircraft(int number)
|
||||
{
|
||||
m_dBusInterface->callDBus(QLatin1Literal("setMaxRenderedRemoteAircraft"), number);
|
||||
}
|
||||
|
||||
int CContextSimulatorProxy::getMaxRenderedRemoteAircraft() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<int>(QLatin1Literal("getMaxRenderedRemoteAircraft"));
|
||||
}
|
||||
|
||||
CTime CContextSimulatorProxy::getTimeSynchronizationOffset() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<BlackMisc::PhysicalQuantities::CTime>(QLatin1Literal("getTimeSynchronizationOffset"));
|
||||
@@ -137,14 +162,19 @@ namespace BlackCore
|
||||
m_dBusInterface->callDBus(QLatin1Literal("settingsChanged"), type);
|
||||
}
|
||||
|
||||
CPixmap CContextSimulatorProxy::iconForModel(const QString &modelString) const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<CPixmap>(QLatin1Literal("iconForModel"), modelString);
|
||||
}
|
||||
|
||||
bool CContextSimulatorProxy::isPaused() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("isPaused"));
|
||||
}
|
||||
|
||||
bool CContextSimulatorProxy::isRunning() const
|
||||
bool CContextSimulatorProxy::isSimulating() const
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1Literal("isRunning"));
|
||||
}
|
||||
|
||||
} // namespace BlackCore
|
||||
} // namespace
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "blackcore/context_simulator.h"
|
||||
#include "blackmisc/genericdbusinterface.h"
|
||||
#include "blackmisc/pixmap.h"
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
@@ -61,23 +62,26 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::disconnectFrom
|
||||
virtual bool disconnectFrom() override;
|
||||
|
||||
//! \copydoc IContextSimulator::isRunning
|
||||
virtual bool isRunning() const override;
|
||||
//! \copydoc IContextSimulator::isSimulating
|
||||
virtual bool isSimulating() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::isPaused
|
||||
virtual bool isPaused() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAircraftModel()
|
||||
virtual BlackMisc::Network::CAircraftModel getOwnAircraftModel() const override;
|
||||
virtual BlackMisc::Simulation::CAircraftModel getOwnAircraftModel() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getAirportsInRange()
|
||||
virtual BlackMisc::Aviation::CAirportList getAirportsInRange() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getInstalledModels()
|
||||
virtual BlackMisc::Network::CAircraftModelList getInstalledModels() const override;
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getInstalledModels() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getCurrentlyMatchedModels()
|
||||
virtual BlackMisc::Network::CAircraftModelList getCurrentlyMatchedModels() const override;
|
||||
//! \copydoc IContextSimulator::getRemoteAircraft
|
||||
virtual BlackMisc::Simulation::CSimulatedAircraftList getRemoteAircraft() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::changeRemoteAircraft
|
||||
virtual int changeRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &changedAircraft, const BlackMisc::CPropertyIndexVariantMap &changedValues) override;
|
||||
|
||||
//! \copydoc IContextSimulator::getSimulatorInfo
|
||||
virtual BlackSim::CSimulatorInfo getSimulatorInfo() const override;
|
||||
@@ -88,6 +92,12 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::isTimeSynchronized
|
||||
virtual bool isTimeSynchronized() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::getMaxRenderedRemoteAircraft
|
||||
virtual int getMaxRenderedRemoteAircraft() const override;
|
||||
|
||||
//! \copydoc IContextSimulator::setMaxRenderedRemoteAircraft
|
||||
virtual void setMaxRenderedRemoteAircraft(int number) override;
|
||||
|
||||
//! \copydoc IContextSimulator::getTimeSynchronizationOffset
|
||||
virtual BlackMisc::PhysicalQuantities::CTime getTimeSynchronizationOffset() const override;
|
||||
|
||||
@@ -103,6 +113,9 @@ namespace BlackCore
|
||||
//! \copydoc IContextSimulator::settingsChanged
|
||||
virtual void settingsChanged(uint type) override;
|
||||
|
||||
//! \copydoc IContextSimulator::iconForModel
|
||||
virtual BlackMisc::CPixmap iconForModel(const QString &modelString) const override;
|
||||
|
||||
};
|
||||
|
||||
} // namespace BlackCore
|
||||
|
||||
Reference in New Issue
Block a user