From cfb51f3a3f3c1131e5d3059f40bdb9c2a8d27116 Mon Sep 17 00:00:00 2001 From: Mat Sutcliffe Date: Wed, 14 Jul 2021 19:21:10 +0100 Subject: [PATCH] Issue #113 Add SIMDATA packet logic in CFSDClient --- src/blackcore/fsd/enums.h | 3 ++- src/blackcore/fsd/fsdclient.cpp | 45 +++++++++++++++++++++++++++++--- src/blackcore/fsd/fsdclient.h | 2 ++ src/blackcore/fsd/serializer.cpp | 1 + 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/blackcore/fsd/enums.h b/src/blackcore/fsd/enums.h index 259606354..301d031b7 100644 --- a/src/blackcore/fsd/enums.h +++ b/src/blackcore/fsd/enums.h @@ -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. }; diff --git a/src/blackcore/fsd/fsdclient.cpp b/src/blackcore/fsd/fsdclient.cpp index 8b703f510..4e1ebe5d5 100644 --- a/src/blackcore/fsd/fsdclient.cpp +++ b/src/blackcore/fsd/fsdclient.cpp @@ -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: diff --git a/src/blackcore/fsd/fsdclient.h b/src/blackcore/fsd/fsdclient.h index 85291bae5..fbdc7d848 100644 --- a/src/blackcore/fsd/fsdclient.h +++ b/src/blackcore/fsd/fsdclient.h @@ -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); diff --git a/src/blackcore/fsd/serializer.cpp b/src/blackcore/fsd/serializer.cpp index 0768642c0..0da842b08 100644 --- a/src/blackcore/fsd/serializer.cpp +++ b/src/blackcore/fsd/serializer.cpp @@ -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"; }