Make fast position update settings persistent

Instead of enabling fast position updates via context methods, the
settings API will be used instead. This also allowed to move the timer
into CNetworkVatlib instead of CAirspaceMonitor. The only necessary thing
was to regularly update the receiver callsign set.

refs #677
This commit is contained in:
Roland Winklmeier
2016-06-17 10:17:00 +02:00
parent 1d1ca0faa3
commit fbad0977fd
13 changed files with 54 additions and 121 deletions

View File

@@ -69,8 +69,6 @@ namespace BlackCore
m_analyzer(new CAirspaceAnalyzer(ownAircraftProvider, this, network, this))
{
this->setObjectName("CAirspaceMonitor");
m_interimPositionUpdateTimer.setObjectName(this->objectName().append(":m_interimPositionUpdateTimer"));
m_interimPositionUpdateTimer.setInterval(1000);
this->connect(this->m_network, &INetwork::atcPositionUpdate, this, &CAirspaceMonitor::ps_atcPositionUpdate);
this->connect(this->m_network, &INetwork::atisReplyReceived, this, &CAirspaceMonitor::ps_atisReceived);
@@ -89,7 +87,6 @@ namespace BlackCore
this->connect(this->m_network, &INetwork::customFSinnPacketReceived, this, &CAirspaceMonitor::ps_customFSinnPacketReceived);
this->connect(this->m_network, &INetwork::serverReplyReceived, this, &CAirspaceMonitor::ps_serverReplyReceived);
this->connect(this->m_network, &INetwork::aircraftConfigPacketReceived, this, &CAirspaceMonitor::ps_aircraftConfigReceived);
this->connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CAirspaceMonitor::ps_sendInterimPositions);
// AutoConnection: this should also avoid race conditions by updating the bookings
Q_ASSERT_X(sApp->getWebDataServices(), Q_FUNC_INFO, "Missing data reader");
@@ -225,6 +222,8 @@ namespace BlackCore
CPropertyIndexVariantMap vm(CSimulatedAircraft::IndexFastPositionUpdates, CVariant::fromValue(enableFastPositonUpdates));
QWriteLocker l(&m_lockAircraft);
int c = m_aircraftInRange.applyIfCallsign(callsign, vm);
CSimulatedAircraftList enabledAircrafts = m_aircraftInRange.findBy(&CSimulatedAircraft::fastPositionUpdates, true);
m_network->setInterimPositionReceivers(enabledAircrafts.getCallsigns());
return c > 0;
}
@@ -429,29 +428,10 @@ namespace BlackCore
}
}
void CAirspaceMonitor::enableFastPositionSending(bool enable)
{
if (enable)
{
m_interimPositionUpdateTimer.start();
}
else
{
m_interimPositionUpdateTimer.stop();
}
m_sendInterimPositions = enable;
}
void CAirspaceMonitor::gracefulShutdown()
{
if (this->m_analyzer) { this->m_analyzer->gracefulShutdown(); }
QObject::disconnect(this);
this->enableFastPositionSending(false);
}
bool CAirspaceMonitor::isFastPositionSendingEnabled() const
{
return m_sendInterimPositions;
}
void CAirspaceMonitor::ps_realNameReplyReceived(const CCallsign &callsign, const QString &realname)
@@ -1093,14 +1073,6 @@ namespace BlackCore
this->m_aircraftInRange.setAircraftParts(callsign, parts);
}
void CAirspaceMonitor::ps_sendInterimPositions()
{
Q_ASSERT(CThreadUtils::isCurrentThreadObjectThread(this));
if (!this->m_connected || !m_sendInterimPositions) { return; }
CSimulatedAircraftList aircrafts = m_aircraftInRange.findBy(&CSimulatedAircraft::fastPositionUpdates, true);
m_network->sendInterimPositions(aircrafts.getCallsigns());
}
void CAirspaceMonitor::storeAircraftSituation(const CAircraftSituation &situation)
{
const CCallsign callsign(situation.getCallsign());

View File

@@ -190,12 +190,6 @@ namespace BlackCore
std::function<void(const BlackMisc::Simulation::CAirspaceAircraftSnapshot &)> aircraftSnapshotSlot
) override;
//! Is interim position sending enabled?
bool isFastPositionSendingEnabled() const;
//! Enable interim position sending
void enableFastPositionSending(bool enable);
//! Analyzer
CAirspaceAnalyzer *analyzer() const { return m_analyzer; }
@@ -254,9 +248,7 @@ namespace BlackCore
CAirspaceAnalyzer *m_analyzer = nullptr; //!< owned analyzer
bool m_serverSupportsNameQuery = false; //!< not all servers support name query
bool m_connected = false; //!< retrieve data
bool m_sendInterimPositions = false; //!< send interim positions to other clients
bool m_logMatchingProcess = false; //!< shall we log. information about the matching process
QTimer m_interimPositionUpdateTimer;
// locks
mutable QReadWriteLock m_lockSituations; //!< lock for situations
@@ -320,7 +312,7 @@ namespace BlackCore
void ps_receivedDataFile();
void ps_aircraftConfigReceived(const BlackMisc::Aviation::CCallsign &callsign, const QJsonObject &jsonObject, bool isFull);
void ps_aircraftInterimUpdateReceived(const BlackMisc::Aviation::CAircraftSituation &situation);
void ps_sendInterimPositions();
};
} // namespace

View File

@@ -206,12 +206,6 @@ namespace BlackCore
//! Known FSD servers, available when data file was first read
virtual BlackMisc::Network::CServerList getVatsimFsdServers() const = 0;
//! Is interim position sending enabled?
virtual bool isFastPositionSendingEnabled() const = 0;
//! Enable interim position sending
virtual void enableFastPositionSending(bool enable) = 0;
//! Callsigns enabled for fast position updates
virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) = 0;

View File

@@ -274,20 +274,6 @@ namespace BlackCore
return false;
}
//! \copydoc IContextNetwork::isFastPositionSendingEnabled
virtual bool isFastPositionSendingEnabled() const override
{
logEmptyContextWarning(Q_FUNC_INFO);
return false;
}
//! \copydoc IContextNetwork::enableFastPositionSending
virtual void enableFastPositionSending(bool enable) override
{
Q_UNUSED(enable);
logEmptyContextWarning(Q_FUNC_INFO);
}
//! \copydoc IContextNetwork::setFastPositionEnabledCallsigns
virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) override
{

View File

@@ -587,20 +587,6 @@ namespace BlackCore
return this->m_airspace->getLatestAirspaceAircraftSnapshot();
}
bool CContextNetwork::isFastPositionSendingEnabled() const
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
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_airspace);
m_airspace->enableFastPositionSending(enable);
}
void CContextNetwork::setFastPositionEnabledCallsigns(CCallsignSet &callsigns)
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO << callsigns; }

View File

@@ -240,12 +240,6 @@ namespace BlackCore
//! \copydoc IContextNetwork::requestAtisUpdates
virtual void requestAtisUpdates() override;
//! \copydoc IContextNetwork::isFastPositionSendingEnabled
virtual bool isFastPositionSendingEnabled() const override;
//! \copydoc IContextNetwork::enableFastPositionSending
virtual void enableFastPositionSending(bool enable) override;
//! \copydoc IContextNetwork::setFastPositionEnabledCallsigns
virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) override;

View File

@@ -199,16 +199,6 @@ namespace BlackCore
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("updateFastPositionEnabled"), callsign, enableFastPositionSending, originator);
}
bool CContextNetworkProxy::isFastPositionSendingEnabled() const
{
return this->m_dBusInterface->callDBusRet<bool>(QLatin1Literal("isFastPositionSendingEnabled"));
}
void CContextNetworkProxy::enableFastPositionSending(bool enable)
{
this->m_dBusInterface->callDBus(QLatin1Literal("enableFastPositionSending"), enable);
}
void CContextNetworkProxy::setFastPositionEnabledCallsigns(CCallsignSet &callsigns)
{
this->m_dBusInterface->callDBus(QLatin1Literal("setFastPositionEnabledCallsigns"), callsigns);

View File

@@ -173,12 +173,6 @@ namespace BlackCore
//! \copydoc IContextNetwork::updateFastPositionEnabled
virtual bool updateFastPositionEnabled(const BlackMisc::Aviation::CCallsign &callsign, bool enableFastPositionSending, const BlackMisc::CIdentifier &originator) override;
//! \copydoc IContextNetwork::isFastPositionSendingEnabled
virtual bool isFastPositionSendingEnabled() const override;
//! \copydoc IContextNetwork::enableFastPositionSending
virtual void enableFastPositionSending(bool enable) override;
//! \copydoc IContextNetwork::setFastPositionEnabledCallsigns
virtual void setFastPositionEnabledCallsigns(BlackMisc::Aviation::CCallsignSet &callsigns) override;

View File

@@ -347,10 +347,9 @@ 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.
* Set the group of callsigns receiving regular interim position updates.
*/
virtual void sendInterimPositions(const BlackMisc::Aviation::CCallsignSet &receiver) = 0;
virtual void setInterimPositionReceivers(const BlackMisc::Aviation::CCallsignSet &receiver) = 0;
//! @}
////////////////////////////////////////////////////////////////

View File

@@ -90,8 +90,14 @@ namespace BlackCore
connect(&m_positionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendPositionUpdate);
m_processingTimer.start(c_processingIntervalMsec);
m_interimPositionUpdateTimer.setObjectName(this->objectName().append(":m_interimPositionUpdateTimer"));
m_interimPositionUpdateTimer.setInterval(1000);
this->connect(&m_interimPositionUpdateTimer, &QTimer::timeout, this, &CNetworkVatlib::sendInterimPositions);
this->connect(&this->m_scheduledConfigUpdate, &QTimer::timeout, this, &CNetworkVatlib::sendIncrementalAircraftConfig);
m_scheduledConfigUpdate.setSingleShot(true);
reloadSettings();
}
void CNetworkVatlib::initializeSession()
@@ -192,6 +198,31 @@ namespace BlackCore
}
}
void CNetworkVatlib::sendInterimPositions()
{
if (!m_net) { return; }
if (isConnected())
{
CSimulatedAircraft myAircraft(getOwnAircraft());
if (this->m_loginMode == LoginNormal)
{
VatInterimPilotPosition pos;
pos.altitudeTrue = myAircraft.getAltitude().value(CLengthUnit::ft());
pos.heading = myAircraft.getHeading().value(CAngleUnit::deg());
pos.pitch = myAircraft.getPitch().value(CAngleUnit::deg());
pos.bank = myAircraft.getBank().value(CAngleUnit::deg());
pos.latitude = myAircraft.latitude().value(CAngleUnit::deg());
pos.longitude = myAircraft.longitude().value(CAngleUnit::deg());
for (const auto &receiver : as_const(m_interimPositionReceivers))
{
Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos);
}
}
}
}
//! Convert vatlib status code to INetwork::ConnectionStatus
INetwork::ConnectionStatus convertConnectionStatus(VatConnectionStatus status)
{
@@ -222,6 +253,12 @@ namespace BlackCore
}
}
void CNetworkVatlib::reloadSettings()
{
if (m_interimPositionsEnabled.get()) { m_interimPositionUpdateTimer.start(); }
else { m_interimPositionUpdateTimer.stop(); }
}
QByteArray CNetworkVatlib::toFSD(QString qstr) const
{
return m_fsdTextCodec->fromUnicode(qstr);
@@ -446,26 +483,9 @@ namespace BlackCore
Vat_SendClientQuery(m_net.data(), vatClientQueryInfo, toFSD(callsign));
}
void CNetworkVatlib::sendInterimPositions(const CCallsignSet &receivers)
void CNetworkVatlib::setInterimPositionReceivers(const CCallsignSet &receivers)
{
Q_ASSERT_X(isConnected(), "CNetworkVatlib", "Can't send to server when disconnected");
if (receivers.isEmpty()) { return; }
CSimulatedAircraft myAircraft(getOwnAircraft());
if (this->m_loginMode == LoginNormal)
{
VatInterimPilotPosition pos;
pos.altitudeTrue = myAircraft.getAltitude().value(CLengthUnit::ft());
pos.heading = myAircraft.getHeading().value(CAngleUnit::deg());
pos.pitch = myAircraft.getPitch().value(CAngleUnit::deg());
pos.bank = myAircraft.getBank().value(CAngleUnit::deg());
pos.latitude = myAircraft.latitude().value(CAngleUnit::deg());
pos.longitude = myAircraft.longitude().value(CAngleUnit::deg());
for (const auto &receiver : receivers)
{
Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos);
}
}
m_interimPositionReceivers = receivers;
}
void CNetworkVatlib::sendServerQuery(const BlackMisc::Aviation::CCallsign &callsign)

View File

@@ -108,7 +108,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 sendInterimPositions(const BlackMisc::Aviation::CCallsignSet &receiver) override;
virtual void setInterimPositionReceivers(const BlackMisc::Aviation::CCallsignSet &receivers) override;
//! @}
//! \name Weather functions
@@ -165,6 +165,7 @@ namespace BlackCore
void initializeSession();
void changeConnectionStatus(VatConnectionStatus newStatus);
bool isDisconnected() const { return m_status != vatStatusConnecting && m_status != vatStatusConnected; }
void reloadSettings();
static QString convertToUnicodeEscaped(const QString &str);
static VatSimType convertToSimType(BlackMisc::Simulation::CSimulatorPluginInfo &simInfo);
static void networkLogHandler(SeverityLevel severity, const char *message);
@@ -182,6 +183,7 @@ namespace BlackCore
private slots:
void process();
void sendPositionUpdate();
void sendInterimPositions();
void customPacketDispatcher(const BlackMisc::Aviation::CCallsign &callsign, const QString &packetId, const QStringList &data);
signals:
@@ -205,14 +207,17 @@ namespace BlackCore
BlackMisc::Aviation::CAircraftIcaoCode m_ownAircraftIcaoCode; //!< "buffered icao", as this must not change when connected
BlackMisc::Aviation::CAirlineIcaoCode m_ownAirlineIcaoCode; //!< "buffered icao", as this must not change when connected
QString m_ownLiveryDescription; //!< "buffered livery", as this must not change when connected
BlackMisc::Aviation::CCallsignSet m_interimPositionReceivers;
QTimer m_processingTimer;
QTimer m_positionUpdateTimer;
QTimer m_interimPositionUpdateTimer;
static int const c_processingIntervalMsec = 100;
static int const c_updateIntervalMsec = 5000;
static int const c_logoffTimeoutSec = 5;
BlackMisc::CSetting<Settings::Network::WireTextCodec> m_fsdTextCodecSetting { this };
BlackMisc::CSetting<Settings::Network::InterimPositionsEnabled> m_interimPositionsEnabled { this, &CNetworkVatlib::reloadSettings };
QTextCodec *m_fsdTextCodec = nullptr;
BlackMisc::Aviation::CAircraftParts m_sentAircraftConfig;