refs #283 Rationalized ISimulator slots for managing remote aircraft

This commit is contained in:
Mathew Sutcliffe
2014-08-22 21:19:56 +01:00
parent a6fd2bdeb2
commit f4b7a9c6a2
9 changed files with 51 additions and 33 deletions

View File

@@ -247,11 +247,25 @@ namespace BlackCore
} }
} }
void CContextSimulator::ps_addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &initialSituation) void CContextSimulator::ps_addRemoteAircraft(const CCallsign &callsign, const CAircraftSituation &initialSituation)
{ {
Q_ASSERT(this->m_simulator); Q_ASSERT(this->m_simulator);
if (!this->m_simulator) return; if (!this->m_simulator) return;
this->m_simulator->addAircraftSituation(callsign, initialSituation); this->m_simulator->addRemoteAircraft(callsign, initialSituation);
}
void CContextSimulator::ps_addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation)
{
Q_ASSERT(this->m_simulator);
if (!this->m_simulator) return;
this->m_simulator->addAircraftSituation(callsign, situation);
}
void CContextSimulator::ps_removeRemoteAircraft(const CCallsign &callsign)
{
Q_ASSERT(this->m_simulator);
if (!this->m_simulator) return;
this->m_simulator->removeRemoteAircraft(callsign);
} }
void CContextSimulator::ps_updateCockpitFromContext(const CAircraft &ownAircraft, const QString &originator) void CContextSimulator::ps_updateCockpitFromContext(const CAircraft &ownAircraft, const QString &originator)

View File

@@ -102,8 +102,14 @@ namespace BlackCore
//! Update own aircraft, because simulator has changed something //! Update own aircraft, because simulator has changed something
void ps_updateOwnAircraft(); void ps_updateOwnAircraft();
//! \copydoc ISimulator::addRemoteAircraft
void ps_addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation);
//! \copydoc ISimulator::addAircraftSituation //! \copydoc ISimulator::addAircraftSituation
void ps_addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation); void ps_addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation);
//! \copydoc ISimulator::removeRemoteAircraft
void ps_removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign);
//! Update cockpit from context, because someone else has changed cockpit (e.g. GUI, 3rd party) //! Update cockpit from context, because someone else has changed cockpit (e.g. GUI, 3rd party)
//! \remarks set by runtime, only to be used locally (not via DBus) //! \remarks set by runtime, only to be used locally (not via DBus)

View File

@@ -61,10 +61,11 @@ namespace BlackCore
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0; virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const = 0;
//! Add new remote aircraft to the simulator //! Add new remote aircraft to the simulator
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, const BlackMisc::Aviation::CAircraftSituation &initialSituation) = 0; //! \todo Add parameter: aircraft model
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) = 0;
//! Add new aircraft situation //! Add new aircraft situation
virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) = 0; virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation) = 0;
//! Remove remote aircraft from simulator //! Remove remote aircraft from simulator
virtual void removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0; virtual void removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) = 0;

View File

@@ -99,8 +99,16 @@ namespace BlackSimPlugin
return true; return true;
} }
void CSimulatorFs9::addRemoteAircraft(const CCallsign &callsign, const QString & /* type */, const CAircraftSituation & /*initialSituation*/ ) void CSimulatorFs9::addRemoteAircraft(const CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation)
{ {
if (m_hashFs9Clients.size() >= 20)
{
// Only add a maximum number of 20 clients.
// FIXME: We need a smart method to get the 20 nearest aircrafts. If someone logs in
// nearby we need to kick out the one with max distance.
return;
}
// Create a new client thread, set update frequency to 25 ms and start it // Create a new client thread, set update frequency to 25 ms and start it
QThread *clientThread = new QThread(this); QThread *clientThread = new QThread(this);
CFs9Client *client = new CFs9Client(callsign.toQString(), CTime(25, CTimeUnit::ms())); CFs9Client *client = new CFs9Client(callsign.toQString(), CTime(25, CTimeUnit::ms()));
@@ -112,22 +120,21 @@ namespace BlackSimPlugin
m_fs9ClientThreads.insert(client, clientThread); m_fs9ClientThreads.insert(client, clientThread);
m_hashFs9Clients.insert(callsign, client); m_hashFs9Clients.insert(callsign, client);
clientThread->start(); clientThread->start();
addAircraftSituation(callsign, initialSituation);
} }
void CSimulatorFs9::addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation) void CSimulatorFs9::addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation)
{ {
// If this is a new guy, add him to the session // FIXME: should be a Q_ASSERT
if (!m_hashFs9Clients.contains(callsign)) if (!m_hashFs9Clients.contains(callsign))
{ {
// Only add a maximum number of 20 clients. // Only add a maximum number of 20 clients.
// FIXME: We need a smart method to get the 20 nearest aircrafts. If someone logs in // FIXME: We need a smart method to get the 20 nearest aircrafts. If someone logs in
// nearby we need to kick out the one with max distance. // nearby we need to kick out the one with max distance.
return;
if (m_hashFs9Clients.size() < 20)
addRemoteAircraft(callsign, "Boeing 737-400 Paint1", situation);
} }
// otherwise just add the new position
CFs9Client *client = m_hashFs9Clients.value(callsign); CFs9Client *client = m_hashFs9Clients.value(callsign);
if (!client) if (!client)
return; return;

View File

@@ -76,7 +76,7 @@ namespace BlackSimPlugin
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override { return m_ownAircraft; } virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override { return m_ownAircraft; }
//! \copydoc ISimulator::addRemoteAircraft() //! \copydoc ISimulator::addRemoteAircraft()
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override; virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;
//! \copydoc ISimulator::addAircraftSituation() //! \copydoc ISimulator::addAircraftSituation()
virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override; virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;

View File

@@ -145,10 +145,8 @@ namespace BlackSimPlugin
return true; return true;
} }
void CSimulatorFsx::addRemoteAircraft(const CCallsign &callsign, const QString &type, const CAircraftSituation &initialSituation) void CSimulatorFsx::addRemoteAircraft(const CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation)
{ {
Q_UNUSED(type);
SIMCONNECT_DATA_INITPOSITION initialPosition; SIMCONNECT_DATA_INITPOSITION initialPosition;
initialPosition.Latitude = initialSituation.latitude().value(); initialPosition.Latitude = initialSituation.latitude().value();
initialPosition.Longitude = initialSituation.longitude().value(); initialPosition.Longitude = initialSituation.longitude().value();
@@ -163,21 +161,18 @@ namespace BlackSimPlugin
simObj.setCallsign(callsign); simObj.setCallsign(callsign);
simObj.setRequestId(m_nextObjID); simObj.setRequestId(m_nextObjID);
simObj.setObjectId(0); simObj.setObjectId(0);
simObj.getInterpolator()->addAircraftSituation(initialSituation);
m_simConnectObjects.insert(callsign, simObj); m_simConnectObjects.insert(callsign, simObj);
++m_nextObjID; ++m_nextObjID;
HRESULT hr = SimConnect_AICreateNonATCAircraft(m_hSimConnect, "Boeing 737-800 Paint1", callsign.toQString().left(12).toLatin1().constData(), initialPosition, simObj.getRequestId()); HRESULT hr = SimConnect_AICreateNonATCAircraft(m_hSimConnect, "Boeing 737-800 Paint1", qPrintable(callsign.toQString().left(12)), initialPosition, simObj.getRequestId());
Q_UNUSED(hr); Q_UNUSED(hr);
addAircraftSituation(callsign, initialSituation);
} }
void CSimulatorFsx::addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation) void CSimulatorFsx::addAircraftSituation(const CCallsign &callsign, const CAircraftSituation &situation)
{ {
if (!m_simConnectObjects.contains(callsign)) Q_ASSERT(m_simConnectObjects.contains(callsign));
{
addRemoteAircraft(callsign, "Boeing 737-800 Paint1", situation);
return;
}
CSimConnectObject simObj = m_simConnectObjects.value(callsign); CSimConnectObject simObj = m_simConnectObjects.value(callsign);
simObj.getInterpolator()->addAircraftSituation(situation); simObj.getInterpolator()->addAircraftSituation(situation);

View File

@@ -110,7 +110,7 @@ namespace BlackSimPlugin
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override { return m_ownAircraft; } virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override { return m_ownAircraft; }
//! \copydoc ISimulator::addRemoteAircraft() //! \copydoc ISimulator::addRemoteAircraft()
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override; virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;
//! \copydoc ISimulator::addAircraftSituation() //! \copydoc ISimulator::addAircraftSituation()
virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override; virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;

View File

@@ -281,21 +281,17 @@ namespace BlackSimPlugin
return false; return false;
} }
void CSimulatorXPlane::addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, void CSimulatorXPlane::addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situ)
const BlackMisc::Aviation::CAircraftSituation &initialSituation)
{ {
Q_UNUSED(initialSituation); // fixed gcc warning
if (! isConnected()) { return; } if (! isConnected()) { return; }
m_traffic->addPlane(callsign.asString(), type, "YYY", "YYY"); // TODO livery m_traffic->addPlane(callsign.asString(), "A320", "YYY", "YYY");
//addAircraftSituation(callsign, initialSituation); addAircraftSituation(callsign, situ);
m_planes.insert(callsign.asString()); // FIXME should not be needed here IMHO
} }
void CSimulatorXPlane::addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, void CSimulatorXPlane::addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign,
const BlackMisc::Aviation::CAircraftSituation &situ) const BlackMisc::Aviation::CAircraftSituation &situ)
{ {
if (! isConnected()) { return; } if (! isConnected()) { return; }
if (! m_planes.contains(callsign.asString())) { addRemoteAircraft(callsign, "A320", situ); } // FIXME should not be needed here IMHO
using namespace BlackMisc::PhysicalQuantities; using namespace BlackMisc::PhysicalQuantities;
m_traffic->setPlanePosition(callsign.asString(), m_traffic->setPlanePosition(callsign.asString(),
situ.latitude().value(CAngleUnit::deg()), situ.latitude().value(CAngleUnit::deg()),

View File

@@ -52,12 +52,12 @@ namespace BlackSimPlugin
virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override; virtual BlackMisc::Aviation::CAircraft getOwnAircraft() const override;
//! \copydoc BlackCore::ISimulator::addRemoteAircraft //! \copydoc BlackCore::ISimulator::addRemoteAircraft
virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign, const QString &type, virtual void addRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign,
const BlackMisc::Aviation::CAircraftSituation &initialSituation) override; const BlackMisc::Aviation::CAircraftSituation &initialSituation) override;
//! \copydoc BlackCore::ISimulator::addAircraftSituation //! \copydoc BlackCore::ISimulator::addAircraftSituation
virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign, virtual void addAircraftSituation(const BlackMisc::Aviation::CCallsign &callsign,
const BlackMisc::Aviation::CAircraftSituation &initialSituation) override; const BlackMisc::Aviation::CAircraftSituation &situation) override;
//! \copydoc BlackCore::ISimulator::removeRemoteAircraft //! \copydoc BlackCore::ISimulator::removeRemoteAircraft
virtual void removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override; virtual void removeRemoteAircraft(const BlackMisc::Aviation::CCallsign &callsign) override;
@@ -109,7 +109,6 @@ namespace BlackSimPlugin
QTimer *m_slowTimer { nullptr }; QTimer *m_slowTimer { nullptr };
BlackMisc::Aviation::CAirportList m_airports; BlackMisc::Aviation::CAirportList m_airports;
QSet<QString> m_planes; // FIXME should not be needed here IMHO
struct // data is written by DBus async method callbacks struct // data is written by DBus async method callbacks
{ {