Ref T698, functions to count network VATLIB calls to identify packets

* functions in network classes
* context functions
This commit is contained in:
Klaus Basan
2019-07-04 00:14:21 +02:00
committed by Mat Sutcliffe
parent 92baa16536
commit f754154455
9 changed files with 262 additions and 17 deletions

View File

@@ -323,6 +323,12 @@ namespace BlackCore
//! Version of the underlying library (e.g. VATLIB) //! Version of the underlying library (e.g. VATLIB)
virtual QString getLibraryInfo(bool detailed) const = 0; virtual QString getLibraryInfo(bool detailed) const = 0;
//! Statistics info
virtual QString getNetworkStatistics(bool reset, const QString &separator) = 0;
//! Statistics enable/disable
virtual bool setNetworkStatisticsEnable(bool enabled) = 0;
// ------------------------ testing ------------------------ // ------------------------ testing ------------------------
//! Create dummy ATC stations for performance tests etc. //! Create dummy ATC stations for performance tests etc.

View File

@@ -470,6 +470,23 @@ namespace BlackCore
Q_UNUSED(enabled); Q_UNUSED(enabled);
} }
//! \copydoc IContextNetwork::getNetworkStatistics
virtual QString getNetworkStatistics(bool reset, const QString &separator) override
{
logEmptyContextWarning(Q_FUNC_INFO);
Q_UNUSED(reset);
Q_UNUSED(separator);
return {};
}
//! \copydoc IContextNetwork::setNetworkStatisticsEnable
virtual bool setNetworkStatisticsEnable(bool enabled) override
{
logEmptyContextWarning(Q_FUNC_INFO);
Q_UNUSED(enabled;);
return false;
}
public: public:
//! \copydoc IContextNetwork::connectRawFsdMessageSignal //! \copydoc IContextNetwork::connectRawFsdMessageSignal
virtual QMetaObject::Connection connectRawFsdMessageSignal(QObject *receiver, RawFsdMessageReceivedSlot rawFsdMessageReceivedSlot) override virtual QMetaObject::Connection connectRawFsdMessageSignal(QObject *receiver, RawFsdMessageReceivedSlot rawFsdMessageReceivedSlot) override

View File

@@ -807,6 +807,20 @@ namespace BlackCore
return m_airspace->partsLastModified(callsign); return m_airspace->partsLastModified(callsign);
} }
QString CContextNetwork::getNetworkStatistics(bool reset, const QString &separator)
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
if (!m_network) { return QString(); }
return m_network->getNetworkStatisticsAsText(reset, separator);
}
bool CContextNetwork::setNetworkStatisticsEnable(bool enabled)
{
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }
if (!m_network) { return false; }
return m_network->setStatisticsEnable(enabled);
}
bool CContextNetwork::testAddAltitudeOffset(const CCallsign &callsign, const CLength &offset) bool CContextNetwork::testAddAltitudeOffset(const CCallsign &callsign, const CLength &offset)
{ {
if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; } if (this->isDebugEnabled()) { CLogMessage(this, CLogCategory::contextSlot()).debug() << Q_FUNC_INFO; }

View File

@@ -192,6 +192,8 @@ namespace BlackCore
virtual int aircraftPartsAdded() const override; virtual int aircraftPartsAdded() const override;
virtual qint64 situationsLastModified(const BlackMisc::Aviation::CCallsign &callsign) const override; virtual qint64 situationsLastModified(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual qint64 partsLastModified(const BlackMisc::Aviation::CCallsign &callsign) const override; virtual qint64 partsLastModified(const BlackMisc::Aviation::CCallsign &callsign) const override;
virtual QString getNetworkStatistics(bool reset, const QString &separator) override;
virtual bool setNetworkStatisticsEnable(bool enabled) override;
virtual bool testAddAltitudeOffset(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &offset = BlackMisc::PhysicalQuantities::CLength::null()) override; virtual bool testAddAltitudeOffset(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::PhysicalQuantities::CLength &offset = BlackMisc::PhysicalQuantities::CLength::null()) override;
//! @} //! @}

View File

@@ -308,6 +308,16 @@ namespace BlackCore
m_dBusInterface->callDBus(QLatin1String("enableAircraftPartsHistory"), enabled); m_dBusInterface->callDBus(QLatin1String("enableAircraftPartsHistory"), enabled);
} }
QString CContextNetworkProxy::getNetworkStatistics(bool reset, const QString &separator)
{
return m_dBusInterface->callDBusRet<QString>(QLatin1String("getNetworkStatistics"), reset, separator);
}
bool CContextNetworkProxy::setNetworkStatisticsEnable(bool enabled)
{
return m_dBusInterface->callDBusRet<bool>(QLatin1String("setNetworkStatisticsEnable"), enabled);
}
void CContextNetworkProxy::testCreateDummyOnlineAtcStations(int number) void CContextNetworkProxy::testCreateDummyOnlineAtcStations(int number)
{ {
m_dBusInterface->callDBus(QLatin1String("testCreateDummyOnlineAtcStations"), number); m_dBusInterface->callDBus(QLatin1String("testCreateDummyOnlineAtcStations"), number);

View File

@@ -127,6 +127,8 @@ namespace BlackCore
virtual QString getLibraryInfo(bool detailed) const override; virtual QString getLibraryInfo(bool detailed) const override;
virtual bool isAircraftPartsHistoryEnabled() const override; virtual bool isAircraftPartsHistoryEnabled() const override;
virtual void enableAircraftPartsHistory(bool enabled) override; virtual void enableAircraftPartsHistory(bool enabled) override;
virtual QString getNetworkStatistics(bool reset, const QString &separator) override;
virtual bool setNetworkStatisticsEnable(bool enabled) override;
virtual void testCreateDummyOnlineAtcStations(int number) override; virtual void testCreateDummyOnlineAtcStations(int number) override;
virtual void testAddAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts, bool incremental) override; virtual void testAddAircraftParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts, bool incremental) override;
virtual void testReceivedTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) override; virtual void testReceivedTextMessages(const BlackMisc::Network::CTextMessageList &textMessages) override;

46
src/blackcore/network.cpp Normal file
View File

@@ -0,0 +1,46 @@
/* Copyright (C) 2019
* 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. 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 "network.h"
#include "blackmisc/range.h"
#include <QStringBuilder>
using namespace BlackMisc;
namespace BlackCore
{
int INetwork::increaseStatisticsValue(const QString &identifier, const QString &appendix)
{
if (identifier.isEmpty() || !m_statistics) { return -1; }
int &v = appendix.isEmpty() ? m_callStatistics[identifier] : m_callStatistics[identifier % u"." % appendix];
v++;
return v;
}
QString INetwork::getNetworkStatisticsAsText(bool reset, const QString &separator)
{
QMap<int, QString> transformed;
for (const auto pair : makePairsRange(as_const(m_callStatistics)))
{
// key is pair.first, value is pair.second
transformed.insertMulti(pair.second, pair.first);
}
if (reset) { this->clearStatistics(); }
// sorted by value
QString stats;
for (const auto pair : makePairsRange(as_const(transformed)))
{
stats +=
(stats.isEmpty() ? QString() : separator) %
pair.second % u": " % QString::number(pair.first);
}
return stats;
}
} // ns

View File

@@ -105,6 +105,20 @@ namespace BlackCore
}; };
Q_ENUM(ConnectionStatus) Q_ENUM(ConnectionStatus)
//! Statistics enable functions @{
bool setStatisticsEnable(bool enabled) { m_statistics = enabled; return enabled; }
bool isStatisticsEnabled() const { return m_statistics; }
//! @}
//! Increase the statistics value for given identifier
int increaseStatisticsValue(const QString &identifier, const QString &appendix = {});
//! Clear the statistics
void clearStatistics() { m_callStatistics.clear(); }
//! Text statistics
QString getNetworkStatisticsAsText(bool reset, const QString &separator = "\n");
//! Convert a ConnectionStatus to a string. //! Convert a ConnectionStatus to a string.
static QString connectionStatusToString(ConnectionStatus status) static QString connectionStatusToString(ConnectionStatus status)
{ {
@@ -581,6 +595,10 @@ namespace BlackCore
void metarReplyReceived(const QString &data); void metarReplyReceived(const QString &data);
//! @} //! @}
private:
bool m_statistics = false;
QMap <QString, int> m_callStatistics;
}; };
} // namespace } // namespace

View File

@@ -206,6 +206,9 @@ namespace BlackCore
pos.rating = vatAtcRatingObserver; pos.rating = vatAtcRatingObserver;
pos.frequency = 199998; pos.frequency = 199998;
Vat_SendATCUpdate(m_net.data(), &pos); Vat_SendATCUpdate(m_net.data(), &pos);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendATCUpdate"));
} }
else else
{ {
@@ -230,6 +233,9 @@ namespace BlackCore
default: pos.transponderMode = vatTransponderModeStandby; break; default: pos.transponderMode = vatTransponderModeStandby; break;
} }
Vat_SendPilotUpdate(m_net.data(), &pos); Vat_SendPilotUpdate(m_net.data(), &pos);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendPilotUpdate"));
} }
} }
} }
@@ -254,6 +260,9 @@ namespace BlackCore
for (const auto &receiver : as_const(m_interimPositionReceivers)) for (const auto &receiver : as_const(m_interimPositionReceivers))
{ {
Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos); Vat_SendInterimPilotUpdate(m_net.data(), toFSD(receiver), &pos);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendInterimPilotUpdate"));
} }
} }
} }
@@ -505,6 +514,9 @@ namespace BlackCore
toFSDnoColon(m_server.getUser().getId()), toFSDnoColon(m_server.getUser().getId()),
toFSDnoColon(m_server.getUser().getPassword()), toFSDnoColon(m_server.getUser().getPassword()),
&info); &info);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SpecifyATCLogon"));
} }
else else
{ {
@@ -519,10 +531,16 @@ namespace BlackCore
toFSDnoColon(m_server.getUser().getId()), toFSDnoColon(m_server.getUser().getId()),
toFSDnoColon(m_server.getUser().getPassword()), toFSDnoColon(m_server.getUser().getPassword()),
&info); &info);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SpecifyPilotLogon"));
} }
Vat_Logon(m_net.data()); Vat_Logon(m_net.data());
this->startPositionTimers(); this->startPositionTimers();
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_Logon"));
} }
void CNetworkVatlib::terminateConnection() void CNetworkVatlib::terminateConnection()
@@ -533,6 +551,9 @@ namespace BlackCore
// Process all pending tasks before logging off // Process all pending tasks before logging off
process(); process();
Vat_Logoff(m_net.data()); Vat_Logoff(m_net.data());
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_Logoff"));
} }
this->clearState(); this->clearState();
} }
@@ -549,6 +570,9 @@ namespace BlackCore
if (message.getRecipientCallsign().isEmpty()) { continue; } if (message.getRecipientCallsign().isEmpty()) { continue; }
Vat_SendTextMessage(m_net.data(), toFSD(message.getRecipientCallsign()), toFSD(message.getMessage())); Vat_SendTextMessage(m_net.data(), toFSD(message.getRecipientCallsign()), toFSD(message.getMessage()));
emit this->textMessageSent(message); emit this->textMessageSent(message);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendTextMessage"));
} }
CTextMessageList radioMessages = messages.getRadioMessages(); CTextMessageList radioMessages = messages.getRadioMessages();
@@ -569,6 +593,9 @@ namespace BlackCore
freqsVec.push_back(freqkHz); freqsVec.push_back(freqkHz);
Vat_SendRadioMessage(m_net.data(), freqsVec.data(), static_cast<unsigned int>(freqsVec.size()), toFSDnoColon(message.getMessage())); Vat_SendRadioMessage(m_net.data(), freqsVec.data(), static_cast<unsigned int>(freqsVec.size()), toFSDnoColon(message.getMessage()));
emit this->textMessageSent(message); emit this->textMessageSent(message);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendRadioMessage"));
} }
} }
@@ -578,30 +605,45 @@ namespace BlackCore
BLACK_VERIFY_X(this->isConnected(), Q_FUNC_INFO, "Sending wallop, but not connected"); BLACK_VERIFY_X(this->isConnected(), Q_FUNC_INFO, "Sending wallop, but not connected");
if (!this->isConnected()) { return; } if (!this->isConnected()) { return; }
Vat_SendWallop(m_net.data(), toFSDnoColon(simplifyTextMessage(message))); Vat_SendWallop(m_net.data(), toFSDnoColon(simplifyTextMessage(message)));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendWallop"));
} }
void CNetworkVatlib::sendCustomPacket(const CCallsign &callsign, const QString &packetId, const QStringList &data) void CNetworkVatlib::sendCustomPacket(const CCallsign &callsign, const QString &packetId, const QStringList &data)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendCustomPilotPacket(m_net.data(), toFSD(callsign), toFSD(packetId), toFSD(data)(), data.size()); Vat_SendCustomPilotPacket(m_net.data(), toFSD(callsign), toFSD(packetId), toFSD(data)(), data.size());
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendCustomPilotPacket"));
} }
void CNetworkVatlib::sendIpQuery() void CNetworkVatlib::sendIpQuery()
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryIP, nullptr); Vat_SendClientQuery(m_net.data(), vatClientQueryIP, nullptr);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendFrequencyQuery(const CCallsign &callsign) void CNetworkVatlib::sendFrequencyQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryFreq, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryFreq, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendUserInfoQuery(const CCallsign &callsign) void CNetworkVatlib::sendUserInfoQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryInfo, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryInfo, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::setInterimPositionReceivers(const CCallsignSet &receivers) void CNetworkVatlib::setInterimPositionReceivers(const CCallsignSet &receivers)
@@ -631,12 +673,18 @@ namespace BlackCore
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryServer, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryServer, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendAtcQuery(const CCallsign &callsign) void CNetworkVatlib::sendAtcQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryAtc, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryAtc, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendAtisQuery(const CCallsign &callsign) void CNetworkVatlib::sendAtisQuery(const CCallsign &callsign)
@@ -647,6 +695,9 @@ namespace BlackCore
m_pendingAtisQueries.insert(callsign, {}); m_pendingAtisQueries.insert(callsign, {});
} }
Vat_SendClientQuery(m_net.data(), vatClientQueryAtis, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryAtis, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendFlightPlan(const CFlightPlan &flightPlan) void CNetworkVatlib::sendFlightPlan(const CFlightPlan &flightPlan)
@@ -695,36 +746,54 @@ namespace BlackCore
case CFlightPlan::DVFR: vatlibFP.flightType = vatFlightTypeDVFR; break; case CFlightPlan::DVFR: vatlibFP.flightType = vatFlightTypeDVFR; break;
} }
Vat_SendFlightPlan(m_net.data(), &vatlibFP); Vat_SendFlightPlan(m_net.data(), &vatlibFP);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendFlightPlan"));
} }
void CNetworkVatlib::sendFlightPlanQuery(const CCallsign &callsign) void CNetworkVatlib::sendFlightPlanQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryFP, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryFP, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendRealNameQuery(const CCallsign &callsign) void CNetworkVatlib::sendRealNameQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryName, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryName, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::sendCapabilitiesQuery(const CCallsign &callsign) void CNetworkVatlib::sendCapabilitiesQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendClientQuery(m_net.data(), vatClientQueryCaps, toFSD(callsign)); Vat_SendClientQuery(m_net.data(), vatClientQueryCaps, toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQuery"));
} }
void CNetworkVatlib::replyToFrequencyQuery(const CCallsign &callsign) // private void CNetworkVatlib::replyToFrequencyQuery(const CCallsign &callsign) // private
{ {
QStringList response { QString::number(getOwnAircraft().getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3)}; QStringList response { QString::number(getOwnAircraft().getCom1System().getFrequencyActive().value(CFrequencyUnit::MHz()), 'f', 3)};
Vat_SendClientQueryResponse(m_net.data(), vatClientQueryFreq, toFSD(callsign), toFSD(response)(), response.size()); Vat_SendClientQueryResponse(m_net.data(), vatClientQueryFreq, toFSD(callsign), toFSD(response)(), response.size());
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQueryResponse"));
} }
void CNetworkVatlib::replyToNameQuery(const CCallsign &callsign) // private void CNetworkVatlib::replyToNameQuery(const CCallsign &callsign) // private
{ {
QStringList response { removeColon(m_server.getUser().getRealNameAndHomeBase()), "" }; QStringList response { removeColon(m_server.getUser().getRealNameAndHomeBase()), "" };
Vat_SendClientQueryResponse(m_net.data(), vatClientQueryName, toFSD(callsign), toFSD(response)(), response.size()); Vat_SendClientQueryResponse(m_net.data(), vatClientQueryName, toFSD(callsign), toFSD(response)(), response.size());
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendClientQueryResponse"));
} }
void CNetworkVatlib::replyToConfigQuery(const CCallsign &callsign) void CNetworkVatlib::replyToConfigQuery(const CCallsign &callsign)
@@ -734,12 +803,18 @@ namespace BlackCore
QString data = QJsonDocument(QJsonObject { { "config", config } }).toJson(QJsonDocument::Compact); QString data = QJsonDocument(QJsonObject { { "config", config } }).toJson(QJsonDocument::Compact);
data = convertToUnicodeEscaped(data); data = convertToUnicodeEscaped(data);
Vat_SendAircraftConfig(m_net.data(), toFSD(callsign), toFSD(data)); Vat_SendAircraftConfig(m_net.data(), toFSD(callsign), toFSD(data));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendAircraftConfig"));
} }
void CNetworkVatlib::sendIcaoCodesQuery(const CCallsign &callsign) void CNetworkVatlib::sendIcaoCodesQuery(const CCallsign &callsign)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_RequestAircraftInfo(m_net.data(), toFSD(callsign)); Vat_RequestAircraftInfo(m_net.data(), toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_RequestAircraftInfo"));
} }
void CNetworkVatlib::sendAircraftInfo(const CCallsign &callsign) // private void CNetworkVatlib::sendAircraftInfo(const CCallsign &callsign) // private
@@ -751,6 +826,9 @@ namespace BlackCore
VatAircraftInfo aircraftInfo {acTypeICAObytes, airlineICAObytes, liverybytes}; VatAircraftInfo aircraftInfo {acTypeICAObytes, airlineICAObytes, liverybytes};
Vat_SendAircraftInfo(m_net.data(), toFSD(callsign), &aircraftInfo); Vat_SendAircraftInfo(m_net.data(), toFSD(callsign), &aircraftInfo);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendAircraftInfo"));
} }
void CNetworkVatlib::sendIncrementalAircraftConfig() void CNetworkVatlib::sendIncrementalAircraftConfig()
@@ -783,12 +861,18 @@ namespace BlackCore
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_SendPing(m_net.data(), toFSD(callsign)); Vat_SendPing(m_net.data(), toFSD(callsign));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendPing"));
} }
void CNetworkVatlib::sendMetarQuery(const CAirportIcaoCode &airportIcao) void CNetworkVatlib::sendMetarQuery(const CAirportIcaoCode &airportIcao)
{ {
Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected"); Q_ASSERT_X(isConnected(), Q_FUNC_INFO, "Can't send to server when disconnected");
Vat_RequestMetar(m_net.data(), toFSD(airportIcao.asString())); Vat_RequestMetar(m_net.data(), toFSD(airportIcao.asString()));
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_RequestMetar"));
} }
const QList<QCommandLineOption> &CNetworkVatlib::getCmdLineOptions() const QList<QCommandLineOption> &CNetworkVatlib::getCmdLineOptions()
@@ -858,6 +942,9 @@ namespace BlackCore
const QString dataStr = convertToUnicodeEscaped(QJsonDocument(QJsonObject { { "config", config } }).toJson(QJsonDocument::Compact)); const QString dataStr = convertToUnicodeEscaped(QJsonDocument(QJsonObject { { "config", config } }).toJson(QJsonDocument::Compact));
const QByteArray data(toFSD(dataStr)); const QByteArray data(toFSD(dataStr));
Vat_SendAircraftConfigBroadcast(m_net.data(), data); Vat_SendAircraftConfigBroadcast(m_net.data(), data);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendAircraftConfigBroadcast"));
} }
void CNetworkVatlib::sendAircraftConfigQuery(const CCallsign &callsign) void CNetworkVatlib::sendAircraftConfigQuery(const CCallsign &callsign)
@@ -865,6 +952,9 @@ namespace BlackCore
static const QString dataStr { QJsonDocument(JsonPackets::aircraftConfigRequest()).toJson(QJsonDocument::Compact) }; static const QString dataStr { QJsonDocument(JsonPackets::aircraftConfigRequest()).toJson(QJsonDocument::Compact) };
static const QByteArray data(toFSD(dataStr)); static const QByteArray data(toFSD(dataStr));
Vat_SendAircraftConfig(m_net.data(), toFSD(callsign), data); Vat_SendAircraftConfig(m_net.data(), toFSD(callsign), data);
// statistics
this->increaseStatisticsValue(QStringLiteral("Vat_SendAircraftConfig"));
} }
/********************************** * * * * * * * * * * * * * * * * * * * ************************************/ /********************************** * * * * * * * * * * * * * * * * * * * ************************************/
@@ -885,6 +975,10 @@ namespace BlackCore
void CNetworkVatlib::onTextMessageReceived(VatFsdClient *, const char *from, const char *to, const char *msg, void *cbvar) void CNetworkVatlib::onTextMessageReceived(VatFsdClient *, const char *from, const char *to, const char *msg, void *cbvar)
{ {
auto *self = cbvar_cast(cbvar); auto *self = cbvar_cast(cbvar);
// statistics
self->increaseStatisticsValue(__func__);
const CCallsign sender(self->fromFSD(from)); const CCallsign sender(self->fromFSD(from));
const CCallsign receiver(self->fromFSD(to)); const CCallsign receiver(self->fromFSD(to));
const QString message(self->fromFSD(msg)); const QString message(self->fromFSD(msg));
@@ -909,6 +1003,10 @@ namespace BlackCore
void CNetworkVatlib::onRadioMessageReceived(VatFsdClient *, const char *from, unsigned int numFreq, int *freqList, const char *msg, void *cbvar) void CNetworkVatlib::onRadioMessageReceived(VatFsdClient *, const char *from, unsigned int numFreq, int *freqList, const char *msg, void *cbvar)
{ {
auto *self = cbvar_cast(cbvar); auto *self = cbvar_cast(cbvar);
// statistics
self->increaseStatisticsValue(__func__);
const CFrequency com1 = self->getOwnAircraft().getCom1System().getFrequencyActive(); const CFrequency com1 = self->getOwnAircraft().getCom1System().getFrequencyActive();
const CFrequency com2 = self->getOwnAircraft().getCom2System().getFrequencyActive(); const CFrequency com2 = self->getOwnAircraft().getCom2System().getFrequencyActive();
QList<CFrequency> frequencies; QList<CFrequency> frequencies;
@@ -945,6 +1043,9 @@ namespace BlackCore
{ {
auto *self = cbvar_cast(cbvar); auto *self = cbvar_cast(cbvar);
// statistics
self->increaseStatisticsValue(__func__);
const CCallsign callsign(callsignChar, CCallsign::Aircraft); const CCallsign callsign(callsignChar, CCallsign::Aircraft);
CAircraftSituation situation( CAircraftSituation situation(
callsign, callsign,
@@ -992,6 +1093,10 @@ namespace BlackCore
void CNetworkVatlib::onAircraftConfigReceived(VatFsdClient *, const char *callsignChar, const char *aircraftConfig, void *cbvar) void CNetworkVatlib::onAircraftConfigReceived(VatFsdClient *, const char *callsignChar, const char *aircraftConfig, void *cbvar)
{ {
auto *self = cbvar_cast(cbvar); auto *self = cbvar_cast(cbvar);
const CCallsign callsign(self->fromFSD(callsignChar), CCallsign::Aircraft);
// statistics
self->increaseStatisticsValue(__func__);
QJsonParseError parserError; QJsonParseError parserError;
const QByteArray json = self->fromFSD(aircraftConfig).toUtf8(); const QByteArray json = self->fromFSD(aircraftConfig).toUtf8();
@@ -1003,7 +1108,6 @@ namespace BlackCore
return; // we cannot parse the packet, so we give up here return; // we cannot parse the packet, so we give up here
} }
const CCallsign callsign(self->fromFSD(callsignChar), CCallsign::Aircraft);
const QJsonObject packet = doc.object(); const QJsonObject packet = doc.object();
if (packet == JsonPackets::aircraftConfigRequest()) if (packet == JsonPackets::aircraftConfigRequest())
{ {
@@ -1024,6 +1128,9 @@ namespace BlackCore
CNetworkVatlib *self = cbvar_cast(cbvar); CNetworkVatlib *self = cbvar_cast(cbvar);
if (!self->isInterimPositionReceivingEnabledForServer()) { return; } if (!self->isInterimPositionReceivingEnabledForServer()) { return; }
// statistics
self->increaseStatisticsValue(__func__);
CAircraftSituation situation( CAircraftSituation situation(
CCallsign(self->fromFSD(sender), CCallsign::Aircraft), CCallsign(self->fromFSD(sender), CCallsign::Aircraft),
CCoordinateGeodetic(position->latitude, position->longitude, position->altitudeTrue), CCoordinateGeodetic(position->latitude, position->longitude, position->altitudeTrue),
@@ -1044,20 +1151,25 @@ namespace BlackCore
void CNetworkVatlib::onAtcPositionUpdate(VatFsdClient *, const char *callsign, const VatAtcPosition *pos, void *cbvar) void CNetworkVatlib::onAtcPositionUpdate(VatFsdClient *, const char *callsign, const VatAtcPosition *pos, void *cbvar)
{ {
CNetworkVatlib *self = cbvar_cast(cbvar);
// statistics
self->increaseStatisticsValue(__func__);
const int frequencyKHz = pos->frequency; const int frequencyKHz = pos->frequency;
CFrequency freq(frequencyKHz, CFrequencyUnit::kHz()); CFrequency freq(frequencyKHz, CFrequencyUnit::kHz());
freq.switchUnit(CFrequencyUnit::MHz()); // we would not need to bother, but this makes it easier to identify freq.switchUnit(CFrequencyUnit::MHz()); // we would not need to bother, but this makes it easier to identify
CLength range(pos->visibleRange, CLengthUnit::NM()); CLength range(pos->visibleRange, CLengthUnit::NM());
QString cs = cbvar_cast(cbvar)->fromFSD(callsign); const QString cs = cbvar_cast(cbvar)->fromFSD(callsign);
// Filter non-ATC like OBS stations, like pilots logging in as shared cockpit co-pilots. // Filter non-ATC like OBS stations, like pilots logging in as shared cockpit co-pilots.
if (pos->facility == vatFacilityTypeUnknown && !cs.endsWith("_OBS")) { return; } if (pos->facility == vatFacilityTypeUnknown && !cs.endsWith("_OBS")) { return; }
// ATIS often have a range of 0 nm. Correct this to a proper value. // ATIS often have a range of 0 nm. Correct this to a proper value.
if (cs.contains("_ATIS") && pos->visibleRange == 0) { range.setValueSameUnit(150.0); } if (cs.contains("_ATIS") && pos->visibleRange == 0) { range.setValueSameUnit(150.0); }
CCoordinateGeodetic position(pos->latitude, pos->longitude, 0); const CCoordinateGeodetic position(pos->latitude, pos->longitude, 0);
emit cbvar_cast(cbvar)->atcPositionUpdate(CCallsign(cs, CCallsign::Atc), freq, position, range); emit self->atcPositionUpdate(CCallsign(cs, CCallsign::Atc), freq, position, range);
} }
void CNetworkVatlib::onKicked(VatFsdClient *, const char *reason, void *cbvar) void CNetworkVatlib::onKicked(VatFsdClient *, const char *reason, void *cbvar)
@@ -1072,7 +1184,10 @@ namespace BlackCore
void CNetworkVatlib::onCustomPacketReceived(VatFsdClient *, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar) void CNetworkVatlib::onCustomPacketReceived(VatFsdClient *, const char *callsign, const char *packetId, const char **data, int dataSize, void *cbvar)
{ {
cbvar_cast(cbvar)->customPacketDispatcher(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(packetId), cbvar_cast(cbvar)->fromFSD(data, dataSize)); // statistics en detail handled in customPacketDispatcher
CNetworkVatlib *self = cbvar_cast(cbvar);
self->increaseStatisticsValue(__func__);
self->customPacketDispatcher(cbvar_cast(cbvar)->fromFSD(callsign), cbvar_cast(cbvar)->fromFSD(packetId), cbvar_cast(cbvar)->fromFSD(data, dataSize));
} }
void CNetworkVatlib::onRawFsdMessage(VatFsdClient *, const char *message, void *cbvar) void CNetworkVatlib::onRawFsdMessage(VatFsdClient *, const char *message, void *cbvar)
@@ -1092,7 +1207,10 @@ namespace BlackCore
{ {
// It doesn't matter whether it was a query or response. The information // It doesn't matter whether it was a query or response. The information
// is the same for both. // is the same for both.
emit customFSInnPacketReceived(callsign, data[1], data[2], data[7], data[8]); emit this->customFSInnPacketReceived(callsign, data[1], data[2], data[7], data[8]);
// statistics
this->increaseStatisticsValue(__func__, packetId);
} }
} }
else if (packetId.compare("FSIPIR", Qt::CaseInsensitive) == 0) else if (packetId.compare("FSIPIR", Qt::CaseInsensitive) == 0)
@@ -1103,22 +1221,34 @@ namespace BlackCore
} }
else else
{ {
sendCustomFsinnReponse(callsign); this->sendCustomFsinnReponse(callsign);
// It doesn't matter whether it was a query or response. The information // It doesn't matter whether it was a query or response. The information
// is the same for both. // is the same for both.
emit customFSInnPacketReceived(callsign, data[1], data[2], data[7], data[8]); emit this->customFSInnPacketReceived(callsign, data[1], data[2], data[7], data[8]);
// statistics
this->increaseStatisticsValue(__func__, packetId);
} }
} }
else if (packetId.compare("FSIP2PR", Qt::CaseInsensitive) == 0) else if (packetId.compare("FSIP2PR", Qt::CaseInsensitive) == 0)
{ {
// FSInn peer2peer protocol - ignore, not supported // FSInn peer2peer protocol - ignore, not supported
// statistics
this->increaseStatisticsValue(__func__, packetId);
} }
else if (packetId.compare("FSIP2P", Qt::CaseInsensitive) == 0) else if (packetId.compare("FSIP2P", Qt::CaseInsensitive) == 0)
{ {
// FSInn peer2peer protocol - ignore, not supported // FSInn peer2peer protocol - ignore, not supported
// statistics
this->increaseStatisticsValue(__func__, packetId);
} }
else else
{ {
// statistics
this->increaseStatisticsValue(__func__, packetId);
CLogMessage(this).warning(u"Unknown custom packet from %1 - id: %2") << callsign.toQString() << packetId; CLogMessage(this).warning(u"Unknown custom packet from %1 - id: %2") << callsign.toQString() << packetId;
} }
} }
@@ -1166,23 +1296,23 @@ namespace BlackCore
if (setting.getFileWriteMode() == CRawFsdMessageSettings::None || setting.getFileDir().isEmpty()) { return; } if (setting.getFileWriteMode() == CRawFsdMessageSettings::None || setting.getFileDir().isEmpty()) { return; }
if (setting.getFileWriteMode() == CRawFsdMessageSettings::Truncate) if (setting.getFileWriteMode() == CRawFsdMessageSettings::Truncate)
{ {
QString filePath = CFileUtils::appendFilePaths(setting.getFileDir(), "rawfsdmessages.log"); const QString filePath = CFileUtils::appendFilePaths(setting.getFileDir(), "rawfsdmessages.log");
m_rawFsdMessageLogFile.setFileName(filePath); m_rawFsdMessageLogFile.setFileName(filePath);
m_rawFsdMessageLogFile.open(QIODevice::Text | QIODevice::WriteOnly); m_rawFsdMessageLogFile.open(QIODevice::Text | QIODevice::WriteOnly);
} }
else if (setting.getFileWriteMode() == CRawFsdMessageSettings::Append) else if (setting.getFileWriteMode() == CRawFsdMessageSettings::Append)
{ {
QString filePath = CFileUtils::appendFilePaths(setting.getFileDir(), "rawfsdmessages.log"); const QString filePath = CFileUtils::appendFilePaths(setting.getFileDir(), "rawfsdmessages.log");
m_rawFsdMessageLogFile.setFileName(filePath); m_rawFsdMessageLogFile.setFileName(filePath);
m_rawFsdMessageLogFile.open(QIODevice::Text | QIODevice::WriteOnly | QIODevice::Append); m_rawFsdMessageLogFile.open(QIODevice::Text | QIODevice::WriteOnly | QIODevice::Append);
} }
else if (setting.getFileWriteMode() == CRawFsdMessageSettings::Timestamped) else if (setting.getFileWriteMode() == CRawFsdMessageSettings::Timestamped)
{ {
QString filename("rawfsdmessages"); const QString filename = u"rawfsdmessages" %
filename += QLatin1String("_"); QLatin1String("_") %
filename += QDateTime::currentDateTime().toString(QStringLiteral("yyMMddhhmmss")); QDateTime::currentDateTime().toString(QStringLiteral("yyMMddhhmmss")) %
filename += QLatin1String(".log"); QLatin1String(".log");
QString filePath = CFileUtils::appendFilePaths(setting.getFileDir(), filename); const QString filePath = CFileUtils::appendFilePaths(setting.getFileDir(), filename);
m_rawFsdMessageLogFile.setFileName(filePath); m_rawFsdMessageLogFile.setFileName(filePath);
m_rawFsdMessageLogFile.open(QIODevice::Text | QIODevice::WriteOnly); m_rawFsdMessageLogFile.open(QIODevice::Text | QIODevice::WriteOnly);
} }
@@ -1500,7 +1630,7 @@ namespace BlackCore
case vatServerErrorServFull: CLogMessage(self).error(u"The server is full"); emit self->terminate(); break; case vatServerErrorServFull: CLogMessage(self).error(u"The server is full"); emit self->terminate(); break;
case vatServerErrorCsSuspended: CLogMessage(self).error(u"Your user account is suspended"); emit self->terminate(); break; case vatServerErrorCsSuspended: CLogMessage(self).error(u"Your user account is suspended"); emit self->terminate(); break;
case vatServerErrorInvPos: CLogMessage(self).error(u"You are not authorized to use the requested rating"); emit self->terminate(); break; case vatServerErrorInvPos: CLogMessage(self).error(u"You are not authorized to use the requested rating"); emit self->terminate(); break;
case vatServerErrorUnAuth: CLogMessage(self).error(u"This software is not authorized for use on this network"); emit self->terminate(); break; case vatServerErrorUnAuth: CLogMessage(self).error(u"This software is not authorized for use on this network %1") << self->m_server.getName(); emit self->terminate(); break;
case vatServerErrorNone: CLogMessage(self).info(u"OK"); break; case vatServerErrorNone: CLogMessage(self).info(u"OK"); break;
case vatServerErrorSyntax: CLogMessage(self).info(u"Malformed packet: Syntax error: %1") << self->fromFSD(data); break; case vatServerErrorSyntax: CLogMessage(self).info(u"Malformed packet: Syntax error: %1") << self->fromFSD(data); break;
@@ -1516,7 +1646,7 @@ namespace BlackCore
// default: qFatal("vatlib: %s (error %d)", msg, error); emit self->terminate(); // default: qFatal("vatlib: %s (error %d)", msg, error); emit self->terminate();
// KB: Why the hard termination? // KB: Why the hard termination?
default: CLogMessage(self).error(u"vatlib: %1 (error %2)") << msg << error; emit self->terminate(); break; default: CLogMessage(self).error(u"vatlib: %1 (error %2) server: '%3'") << msg << error << self->m_server.getName(); emit self->terminate(); break;
} }
} }