Issue #113 Add SIMDATA packet logic in CFSDClient

This commit is contained in:
Mat Sutcliffe
2021-07-14 19:21:10 +01:00
parent 96f38c472d
commit cfb51f3a3f
4 changed files with 47 additions and 4 deletions

View File

@@ -86,7 +86,8 @@ namespace BlackCore
PublicIP, /*!< What is my public IP address? */
INF, /*!< Supervisor Privileged Information Request. */
FP, /*!< Send Cached Flight Plan. Response by SERVER. */
AircraftConfig /*!< Aircraft Configuration */
AircraftConfig, /*!< Aircraft Configuration */
EuroscopeSimData/*!< Broadcast to announce we request SIMDATA packets. */
// There are many more which are only relevant to ATC clients.
};

View File

@@ -18,6 +18,7 @@
#include "blackcore/fsd/clientidentification.h"
#include "blackcore/fsd/deleteatc.h"
#include "blackcore/fsd/deletepilot.h"
#include "blackcore/fsd/euroscopesimdata.h"
#include "blackcore/fsd/pilotdataupdate.h"
#include "blackcore/fsd/ping.h"
#include "blackcore/fsd/pong.h"
@@ -312,6 +313,11 @@ namespace BlackCore
sendQueudedMessage(addAtc);
CStatusMessage(this).info(u"Sending OBS login as '%1' '%2' '%3' '%4' '%5'") << callsign << cid << toQString(m_atcRating) << m_protocolRevision << name;
}
if (m_server.getFsdSetup().receiveEuroscopeSimData())
{
this->sendClientQuery(ClientQueryType::EuroscopeSimData, {}, {});
}
}
void CFSDClient::sendDeletePilot()
@@ -508,6 +514,11 @@ namespace BlackCore
const ClientQuery clientQuery(getOwnCallsignAsString(), reveiverCallsign, ClientQueryType::AircraftConfig, queryData);
sendQueudedMessage(clientQuery);
}
else if (queryType == ClientQueryType::EuroscopeSimData)
{
const ClientQuery clientQuery(getOwnCallsignAsString(), "@94835", ClientQueryType::EuroscopeSimData, { "1" });
sendQueudedMessage(clientQuery);
}
increaseStatisticsValue(QStringLiteral("sendClientQuery"), toQString(queryType));
}
@@ -973,6 +984,9 @@ namespace BlackCore
m_messageTypeMapping["#TM"] = MessageType::TextMessage;
m_messageTypeMapping["#SB"] = MessageType::PilotClientCom;
// Euroscope
m_messageTypeMapping["SIMDATA"] = MessageType::EuroscopeSimData;
// IVAO only
// Ref: https://github.com/DemonRem/X-IvAP/blob/1b0a14880532a0f5c8fe84be44e462c6892a5596/src/XIvAp/FSDprotocol.h
m_messageTypeMapping["!R"] = MessageType::RegistrationInfo;
@@ -1135,6 +1149,33 @@ namespace BlackCore
emit pilotDataUpdateReceived(situation, transponder);
}
void CFSDClient::handleEuroscopeSimData(const QStringList &tokens)
{
const EuroscopeSimData data = EuroscopeSimData::fromTokens(tokens);
CAircraftSituation situation(
CCallsign(data.sender(), CCallsign::Aircraft),
CCoordinateGeodetic(data.m_latitude, data.m_longitude, data.m_altitude),
CHeading(data.m_heading, CAngleUnit::deg()),
CAngle(-data.m_pitch, CAngleUnit::deg()),
CAngle(-data.m_bank, CAngleUnit::deg()),
CSpeed(data.m_groundSpeed, CSpeedUnit::kts()));
situation.setOnGround(data.m_onGround);
situation.setOnGroundDetails(CAircraftSituation::InFromNetwork);
// Ref T297, default offset time
situation.setCurrentUtcTime();
const qint64 offsetTimeMs = receivedPositionFixTsAndGetOffsetTime(situation.getCallsign(), situation.getMSecsSinceEpoch());
situation.setTimeOffsetMs(offsetTimeMs);
CAircraftParts parts;
parts.setLights(data.m_lights);
parts.setGearDown(data.m_gearPercent);
parts.setOnGround(data.m_onGround);
emit euroscopeSimDataUpdatedReceived(situation, parts, currentOffsetTime(data.sender()), data.m_model, data.m_livery);
}
void CFSDClient::handlePing(const QStringList &tokens)
{
const Ping ping = Ping::fromTokens(tokens);
@@ -2031,9 +2072,7 @@ namespace BlackCore
case MessageType::TextMessage: handleTextMessage(tokens); break;
case MessageType::PilotClientCom: handleCustomPilotPacket(tokens); break;
case MessageType::RevBClientParts: handleRevBClientPartsPacket(tokens); break;
case MessageType::EuroscopeSimData: handleEuroscopeSimData(tokens); break;
// normally we should not get here
default:

View File

@@ -225,6 +225,7 @@ namespace BlackCore
void planeInformationReceived(const QString &sender, const QString &aircraft, const QString &airline, const QString &livery);
void customPilotPacketReceived(const QString &sender, const QStringList &data);
void interimPilotDataUpdatedReceived(const BlackMisc::Aviation::CAircraftSituation &situation);
void euroscopeSimDataUpdatedReceived(const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts, qint64 currentOffsetTimeMs, const QString &model, const QString &livery);
void rawFsdMessage(const BlackMisc::Network::CRawFsdMessage &rawFsdMessage);
void planeInformationFsinnReceived(const BlackMisc::Aviation::CCallsign &callsign, const QString &airlineIcaoDesignator, const QString &aircraftDesignator, const QString &combinedAircraftType, const QString &modelString);
void revbAircraftConfigReceived(const QString &sender, const QString &config, qint64 currentOffsetTimeMs);
@@ -364,6 +365,7 @@ namespace BlackCore
void handleDeletePilot(const QStringList &tokens);
void handleTextMessage(const QStringList &tokens);
void handlePilotDataUpdate(const QStringList &tokens);
void handleEuroscopeSimData(const QStringList &tokens);
void handlePing(const QStringList &tokens);
void handlePong(const QStringList &tokens);
void handleKillRequest(const QStringList &tokens);

View File

@@ -271,6 +271,7 @@ namespace BlackCore
case ClientQueryType::INF: return "INF";
case ClientQueryType::FP: return "FP";
case ClientQueryType::AircraftConfig: return "ACC";
case ClientQueryType::EuroscopeSimData: return "SIMDATA";
case ClientQueryType::Unknown: return "Unknown query type";
}