diff --git a/src/blackcore/context/contextnetworkimpl.cpp b/src/blackcore/context/contextnetworkimpl.cpp index f74e603d9..6741e8a25 100644 --- a/src/blackcore/context/contextnetworkimpl.cpp +++ b/src/blackcore/context/contextnetworkimpl.cpp @@ -290,7 +290,7 @@ namespace BlackCore::Context } m_fsdClient->setClientIdAndKey(static_cast(clientId), clientKey.toLocal8Bit()); - m_fsdClient->setClientCapabilities(Capabilities::AircraftInfo | Capabilities::FastPos | Capabilities::AtcInfo | Capabilities::AircraftConfig); + m_fsdClient->setClientCapabilities(Capabilities::AircraftInfo | Capabilities::FastPos | Capabilities::VisPos | Capabilities::AtcInfo | Capabilities::AircraftConfig); m_fsdClient->setServer(server); m_fsdClient->setPilotRating(PilotRating::Student); diff --git a/src/blackcore/fsd/enums.h b/src/blackcore/fsd/enums.h index 036d6e49e..a0e512131 100644 --- a/src/blackcore/fsd/enums.h +++ b/src/blackcore/fsd/enums.h @@ -166,11 +166,14 @@ namespace BlackCore::Fsd /*! Can send/receive fast position updates (pilot only). */ FastPos = (1 << 6), + /*! Can send/receive visual position updates (pilot only). */ + VisPos = (1 << 7), + /*! Stealth mode */ - Stealth = (1 << 7), + Stealth = (1 << 8), /*! Aircraft Config */ - AircraftConfig = (1 << 8) + AircraftConfig = (1 << 9) }; //! Operators diff --git a/src/blackcore/fsd/fsdclient.cpp b/src/blackcore/fsd/fsdclient.cpp index 5c5971a7a..0f05246da 100644 --- a/src/blackcore/fsd/fsdclient.cpp +++ b/src/blackcore/fsd/fsdclient.cpp @@ -854,6 +854,7 @@ namespace BlackCore::Fsd if (m_capabilities & Capabilities::OngoingCoord) responseData.push_back(toQString(Capabilities::OngoingCoord) % "=1"); if (m_capabilities & Capabilities::InterminPos) responseData.push_back(toQString(Capabilities::InterminPos) % "=1"); if (m_capabilities & Capabilities::FastPos) responseData.push_back(toQString(Capabilities::FastPos) % "=1"); + if (m_capabilities & Capabilities::VisPos) responseData.push_back(toQString(Capabilities::VisPos) % "=1"); if (m_capabilities & Capabilities::Stealth) responseData.push_back(toQString(Capabilities::Stealth) % "=1"); if (m_capabilities & Capabilities::AircraftConfig) responseData.push_back(toQString(Capabilities::AircraftConfig) % "=1"); const ClientResponse clientResponse(ownCallsign, receiver, ClientQueryType::Capabilities, responseData); @@ -1390,6 +1391,7 @@ namespace BlackCore::Fsd CClient::Capabilities caps = CClient::None; if (capabilities & Capabilities::AtcInfo) { caps |= CClient::FsdAtisCanBeReceived; } if (capabilities & Capabilities::FastPos) { caps |= CClient::FsdWithInterimPositions; } + if (capabilities & Capabilities::VisPos) { caps |= CClient::FsdWithVisualPositions; } if (capabilities & Capabilities::AircraftInfo) { caps |= CClient::FsdWithIcaoCodes; } if (capabilities & Capabilities::AircraftConfig) { caps |= CClient::FsdWithAircraftConfig; } @@ -1782,6 +1784,12 @@ namespace BlackCore::Fsd return (d & CFsdSetup::ReceiveInterimPositions); } + bool CFSDClient::isVisualPositionSendingEnabledForServer() const + { + const CFsdSetup::SendReceiveDetails d = this->getSetupForServer().getSendReceiveDetails(); + return (d & CFsdSetup::SendVisualPositions); + } + const CFsdSetup &CFSDClient::getSetupForServer() const { return m_server.getFsdSetup(); diff --git a/src/blackcore/fsd/fsdclient.h b/src/blackcore/fsd/fsdclient.h index 7a8c3757b..0468fa07f 100644 --- a/src/blackcore/fsd/fsdclient.h +++ b/src/blackcore/fsd/fsdclient.h @@ -416,6 +416,7 @@ namespace BlackCore::Fsd bool isInterimPositionSendingEnabledForServer() const; bool isInterimPositionReceivingEnabledForServer() const; + bool isVisualPositionSendingEnabledForServer() const; const BlackMisc::Network::CFsdSetup &getSetupForServer() const; //! Handles ATIS replies from non-VATSIM servers. If the conditions are not met, diff --git a/src/blackcore/fsd/serializer.cpp b/src/blackcore/fsd/serializer.cpp index 8c67714f3..fd711c02e 100644 --- a/src/blackcore/fsd/serializer.cpp +++ b/src/blackcore/fsd/serializer.cpp @@ -407,6 +407,7 @@ namespace BlackCore::Fsd case Capabilities::AircraftInfo: return "MODELDESC"; case Capabilities::OngoingCoord: return "ONGOINGCOORD"; case Capabilities::InterminPos: return "INTERIMPOS"; + case Capabilities::VisPos: return "VISUPDATE"; case Capabilities::FastPos: return "FASTPOS"; case Capabilities::Stealth: return "STEALTH"; case Capabilities::AircraftConfig: return "ACCONFIG"; @@ -424,6 +425,7 @@ namespace BlackCore::Fsd else if (str == "ONGOINGCOORD") return Capabilities::OngoingCoord; else if (str == "INTERIMPOS") return Capabilities::InterminPos; else if (str == "FASTPOS") return Capabilities::FastPos; + else if (str == "VISUPDATE") return Capabilities::VisPos; else if (str == "STEALTH") return Capabilities::Stealth; else if (str == "ACCONFIG") return Capabilities::AircraftConfig; diff --git a/src/blackgui/editors/fsdsetupform.cpp b/src/blackgui/editors/fsdsetupform.cpp index 5ee2aadf2..fbe679f35 100644 --- a/src/blackgui/editors/fsdsetupform.cpp +++ b/src/blackgui/editors/fsdsetupform.cpp @@ -40,6 +40,7 @@ namespace BlackGui::Editors ui->cb_AircraftPartsSend->isChecked(), ui->cb_AircraftPartsReceive->isChecked(), ui->cb_GndFlagSend->isChecked(), ui->cb_GndFlagReceive->isChecked(), ui->cb_FastPositionSend->isChecked(), ui->cb_FastPositionReceive->isChecked(), + false, //! \todo GUI for visual position updates ui->cb_EuroscopeSimData->isChecked() ); s.setForce3LetterAirlineCodes(ui->cb_3LetterAirlineICAO->isChecked()); diff --git a/src/blackmisc/network/client.cpp b/src/blackmisc/network/client.cpp index 72c1f9de5..4dc716f20 100644 --- a/src/blackmisc/network/client.cpp +++ b/src/blackmisc/network/client.cpp @@ -67,6 +67,7 @@ namespace BlackMisc::Network if (cap.testFlag(FsdWithAircraftConfig)) sl << "aircraft config"; if (cap.testFlag(FsdWithGroundFlag)) sl << "gnd.flag"; if (cap.testFlag(FsdModelString)) sl << "modelstring"; + if (cap.testFlag(FsdWithVisualPositions)) sl << "visual pos."; if (sl.isEmpty()) { return {}; } return sl.join(", "); } diff --git a/src/blackmisc/network/client.h b/src/blackmisc/network/client.h index 64135c0ab..df15ebb55 100644 --- a/src/blackmisc/network/client.h +++ b/src/blackmisc/network/client.h @@ -54,7 +54,8 @@ namespace BlackMisc::Network FsdAtisCanBeReceived = 1 << 2, //!< ATIS FsdWithAircraftConfig = 1 << 3, //!< Aircraft parts FsdWithGroundFlag = 1 << 4, //!< supports gnd. flag (in position) - FsdModelString = 1 << 5 //!< model string can be queried + FsdModelString = 1 << 5, //!< model string can be queried + FsdWithVisualPositions = 1 << 6 //!< visual position updates }; Q_DECLARE_FLAGS(Capabilities, Capability) diff --git a/src/blackmisc/network/fsdsetup.cpp b/src/blackmisc/network/fsdsetup.cpp index 51a09825d..d8bfcd40e 100644 --- a/src/blackmisc/network/fsdsetup.cpp +++ b/src/blackmisc/network/fsdsetup.cpp @@ -47,6 +47,7 @@ namespace BlackMisc::Network return ds.arg(boolToYesNo(details.testFlag(SendAircraftParts)), boolToYesNo(details.testFlag(SendGndFlag)), boolToYesNo(details.testFlag(SendInterimPositions)), + boolToYesNo(details.testFlag(SendVisualPositions)), boolToYesNo(details.testFlag(ReceiveAircraftParts)), boolToYesNo(details.testFlag(ReceiveGndFlag)), boolToYesNo(details.testFlag(ReceiveInterimPositions)), @@ -54,7 +55,7 @@ namespace BlackMisc::Network ); } - void CFsdSetup::setSendReceiveDetails(bool partsSend, bool partsReceive, bool gndSend, bool gndReceive, bool interimSend, bool interimReceive, bool euroscopeSimDataReceive) + void CFsdSetup::setSendReceiveDetails(bool partsSend, bool partsReceive, bool gndSend, bool gndReceive, bool interimSend, bool interimReceive, bool visualSend, bool euroscopeSimDataReceive) { SendReceiveDetails s = Nothing; if (partsSend) { s |= SendAircraftParts; } @@ -63,6 +64,7 @@ namespace BlackMisc::Network if (gndReceive) { s |= ReceiveGndFlag; } if (interimSend) { s |= SendInterimPositions; } if (interimReceive) { s |= ReceiveInterimPositions; } + if (visualSend) { s |= SendVisualPositions; } if (euroscopeSimDataReceive) { s |= ReceiveEuroscopeSimData; } this->setSendReceiveDetails(s); } diff --git a/src/blackmisc/network/fsdsetup.h b/src/blackmisc/network/fsdsetup.h index 42646a5ff..5c153f99e 100644 --- a/src/blackmisc/network/fsdsetup.h +++ b/src/blackmisc/network/fsdsetup.h @@ -46,9 +46,9 @@ namespace BlackMisc::Network ReceiveInterimPositions = 1 << 4, //!< fast position updates in ReceiveGndFlag = 1 << 5, //!< gnd.flag in (position) Force3LetterAirlineICAO = 1 << 6, //!< force 3 letter airline ICAO code - // bit 7 reserved for VISUPDATE + SendVisualPositions = 1 << 7, //!< visual positions out ReceiveEuroscopeSimData = 1 << 8, //!< euroscope SIMDATA in - AllSending = SendAircraftParts | SendInterimPositions | SendGndFlag, //!< all out + AllSending = SendAircraftParts | SendInterimPositions | SendVisualPositions | SendGndFlag, //!< all out AllReceive = ReceiveAircraftParts | ReceiveInterimPositions | ReceiveGndFlag, //!< all in All = AllReceive | AllSending, //!< all AllParts = SendAircraftParts | ReceiveAircraftParts, //!< send/receive parts @@ -56,7 +56,7 @@ namespace BlackMisc::Network AllReceiveWithoutGnd = AllReceive - ReceiveGndFlag, //!< all in, but no gnd.flag AllInterimPositions = SendInterimPositions | ReceiveInterimPositions, //!< all interim positions AllWithoutGnd = AllReceiveWithoutGnd | AllSendingWithoutGnd, //!< all, but no gnd.flag - VATSIMDefault = AllParts | Force3LetterAirlineICAO + VATSIMDefault = AllParts | Force3LetterAirlineICAO | SendVisualPositions }; Q_DECLARE_FLAGS(SendReceiveDetails, SendReceiveDetailsFlag) @@ -95,13 +95,14 @@ namespace BlackMisc::Network void removeSendReceiveDetails(SendReceiveDetails sendReceive) { m_sendReceive &= ~sendReceive; } //! Set send / receive details - void setSendReceiveDetails(bool partsSend, bool partsReceive, bool gndSend, bool gndReceive, bool interimSend, bool interimReceive, bool euroscopeSimDataReceive); + void setSendReceiveDetails(bool partsSend, bool partsReceive, bool gndSend, bool gndReceive, bool interimSend, bool interimReceive, bool visualSend, bool euroscopeSimDataReceive); //! FSD setup flags //! @{ bool sendAircraftParts() const { return this->getSendReceiveDetails().testFlag(SendAircraftParts); } bool sendGndFlag() const { return this->getSendReceiveDetails().testFlag(SendGndFlag); } bool sendInterimPositions() const { return this->getSendReceiveDetails().testFlag(SendInterimPositions); } + bool sendVisualPositions() const { return this->getSendReceiveDetails().testFlag(SendVisualPositions); } bool receiveAircraftParts() const { return this->getSendReceiveDetails().testFlag(ReceiveAircraftParts); } bool receiveGndFlag() const { return this->getSendReceiveDetails().testFlag(ReceiveGndFlag); }