refs #375 finish sending of interim positions

Airspace monitor knows all remote aircrafts and which have interim
positions enabled. It passes the list of receivers to INetwork
and INetwork sends it to FSD.
This commit is contained in:
Roland Winklmeier
2015-04-12 15:30:30 +02:00
parent 78bc9e8769
commit c77c0e484f
6 changed files with 67 additions and 23 deletions

View File

@@ -59,6 +59,8 @@ namespace BlackCore
this->m_atcWatchdog.setTimeout(CTime(50, CTimeUnit::s()));
this->connect(&this->m_aircraftWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_pilotDisconnected);
this->connect(&this->m_atcWatchdog, &CAirspaceWatchdog::timeout, this, &CAirspaceMonitor::ps_atcControllerDisconnected);
this->connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CAirspaceMonitor::ps_sendInterimPosition);
}
const CSimulatedAircraftList &CAirspaceMonitor::remoteAircraft() const
@@ -378,6 +380,18 @@ namespace BlackCore
}
}
void CAirspaceMonitor::enableFastPositionSending(bool enable)
{
if (enable) m_interimPositionUpdateTimer.start();
else m_interimPositionUpdateTimer.stop();
m_sendInterimPositions = enable;
}
bool CAirspaceMonitor::isFastPositionSendingEnabled() const
{
return m_sendInterimPositions;
}
void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname)
{
Q_ASSERT(this->m_vatsimDataFileReader);
@@ -948,4 +962,12 @@ namespace BlackCore
this->m_aircraftWatchdog.resetCallsign(callsign);
}
void CAirspaceMonitor::ps_sendInterimPosition()
{
Q_ASSERT(BlackCore::isCurrentThreadCreatingThread(this));
if (!this->m_connected || !m_sendInterimPositions) { return; }
CSimulatedAircraftList aircrafts = m_aircraftInRange.findBy(&CSimulatedAircraft::fastPositionUpdates, true);
m_network->sendInterimPosition(aircrafts.getCallsigns());
}
} // namespace

View File

@@ -131,6 +131,12 @@ namespace BlackCore
std::function<void(const BlackMisc::Aviation::CCallsign &)> removedAircraftSlot
) override;
//! Is interim position sending enabled?
bool isFastPositionSendingEnabled() const;
//! Enable interim position sending
void enableFastPositionSending(bool enable);
static const qint64 AircraftSituationsRemovedOffsetMs = 30 * 1000; //!< situations older than now - offset will be removed
static const qint64 AircraftPartsRemoveOffsetMs = 30* 1000; //!< parts older than now - offset will be removed
@@ -184,6 +190,9 @@ namespace BlackCore
CAirspaceWatchdog m_aircraftWatchdog;
bool m_serverSupportsNameQuery = false; //!< not all servers support name query
bool m_connected = false; //!< retrieve data
bool m_sendInterimPositions = false;
QTimer m_interimPositionUpdateTimer;
//! Remove ATC online stations
void removeAllOnlineAtcStations();
@@ -224,6 +233,8 @@ namespace BlackCore
//! Send the information if aircraft and(!) client are vailable
void ps_sendReadyForModelMatching(const BlackMisc::Aviation::CCallsign &callsign, int trial);
void ps_sendInterimPosition();
};
} // namespace

View File

@@ -554,15 +554,15 @@ namespace BlackCore
bool CContextNetwork::isFastPositionSendingEnabled() const
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
Q_ASSERT(this->m_network);
return m_network->isFastPositionSendingEnabled();
Q_ASSERT(this->m_airspace);
return m_airspace->isFastPositionSendingEnabled();
}
void CContextNetwork::enableFastPositionSending(bool enable)
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << enable; }
Q_ASSERT(this->m_network);
m_network->enableFastPositionSending(enable);
Q_ASSERT(this->m_airspace);
m_airspace->enableFastPositionSending(enable);
}
void CContextNetwork::setFastPositionEnabledCallsigns(CCallsignSet &callsigns)

View File

@@ -22,6 +22,7 @@
#include "blackmisc/network/textmessagelist.h"
#include "blackmisc/aviation/informationmessage.h"
#include "blackmisc/aviation/flightplan.h"
#include "blackmisc/aviation/callsignset.h"
#include <QObject>
#include <QString>
#include <QMap>
@@ -198,12 +199,6 @@ namespace BlackCore
*/
virtual void terminateConnection() = 0;
//! Is interim position sending enabled?
virtual bool isFastPositionSendingEnabled() const = 0;
//! Enable interim position sending
virtual void enableFastPositionSending(bool enable) = 0;
/*!
* Send a ping message to a user with a specific callsign.
* \pre Network must be connected when calling this function.
@@ -346,6 +341,12 @@ namespace BlackCore
*/
virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) = 0;
/*!
* Send interim position directly to a set of receivers.
* \pre Network must be connected when calling this function.
*/
virtual void sendInterimPosition(const BlackMisc::Aviation::CCallsignSet &receiver) = 0;
//! @}
////////////////////////////////////////////////////////////////
//! \name Weather slots

View File

@@ -417,6 +417,28 @@ namespace BlackCore
Vat_SendClientQuery(m_net.data(), vatClientQueryInfo, toFSD(callsign));
}
void CNetworkVatlib::sendInterimPosition(const CCallsignSet &receivers)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
if (this->m_loginMode == LoginNormal)
{
VatInterimPilotPosition pos;
// TODO: we need to distinguish true and pressure altitude
pos.altitudeTrue = ownAircraft().getAltitude().value(CLengthUnit::ft());
pos.heading = ownAircraft().getHeading().value(CAngleUnit::deg());
pos.pitch = ownAircraft().getPitch().value(CAngleUnit::deg());
pos.bank = ownAircraft().getBank().value(CAngleUnit::deg());
pos.latitude = ownAircraft().latitude().value(CAngleUnit::deg());
pos.longitude = ownAircraft().longitude().value(CAngleUnit::deg());
for (const auto &receiver : receivers)
{
Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos);
}
}
}
void CNetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
@@ -604,16 +626,6 @@ namespace BlackCore
sendCustomPacket(callsign, "FSIPI", data);
}
void CNetworkVatlib::enableFastPositionSending(bool enable)
{
m_sendInterimPositions = enable;
}
bool CNetworkVatlib::isFastPositionSendingEnabled() const
{
return m_sendInterimPositions;
}
void CNetworkVatlib::broadcastAircraftConfig(const QJsonObject &config)
{
// Fixme: Use QJsonObject with std::initializer_list once 5.4 is baseline

View File

@@ -62,8 +62,6 @@ namespace BlackCore
virtual void sendCustomFsinnQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
virtual void sendCustomFsinnReponse(const BlackMisc::Aviation::CCallsign &callsign) override;
virtual bool isFastPositionSendingEnabled() const override;
virtual void enableFastPositionSending(bool enable) override;
virtual void broadcastAircraftConfig(const QJsonObject &config) override;
virtual void sendAircraftConfigQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
@@ -81,6 +79,7 @@ namespace BlackCore
virtual void sendIcaoCodesQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
virtual void sendFrequencyQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
virtual void sendUserInfoQuery(const BlackMisc::Aviation::CCallsign &callsign) override;
virtual void sendInterimPosition(const BlackMisc::Aviation::CCallsignSet &receiver) override;
// Weather slots
virtual void sendMetarQuery(const BlackMisc::Aviation::CAirportIcao &airportIcao) override;
@@ -167,7 +166,6 @@ namespace BlackCore
BlackMisc::Simulation::CSimulatorPluginInfo m_simulatorInfo;
BlackMisc::Aviation::CCallsign m_callsign; //!< "buffered callsign", as this must not change when connected
BlackMisc::Aviation::CAircraftIcao m_icaoCode; //!< "buffered icao", as this must not change when connected
bool m_sendInterimPositions = false; //!< send interim positions
QTimer m_processingTimer;
QTimer m_positionUpdateTimer;