mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 06:45:37 +08:00
@@ -802,12 +802,15 @@ namespace swift::core::context
|
||||
{
|
||||
Q_UNUSED(from)
|
||||
SWIFT_VERIFY_X(this->getIContextNetwork(), Q_FUNC_INFO, "Missing network context");
|
||||
SWIFT_VERIFY_X(this->getIContextOwnAircraft(), Q_FUNC_INFO, "Missing own aircraft context");
|
||||
if (to.isConnected() && this->getIContextNetwork())
|
||||
{
|
||||
m_networkSessionId = this->getIContextNetwork()->getConnectedServer().getServerSessionId(false);
|
||||
if (m_simulatorPlugin.second) // check in case the plugin has been unloaded
|
||||
{
|
||||
m_simulatorPlugin.second->setFlightNetworkConnected(true);
|
||||
m_simulatorPlugin.second->setOwnCallsign(
|
||||
this->getIContextOwnAircraft()->getOwnAircraft().getCallsign());
|
||||
}
|
||||
}
|
||||
else if (to.isDisconnected())
|
||||
@@ -821,6 +824,7 @@ namespace swift::core::context
|
||||
{
|
||||
m_simulatorPlugin.second->removeAllRemoteAircraft(); // also removes aircraft
|
||||
m_simulatorPlugin.second->setFlightNetworkConnected(false);
|
||||
m_simulatorPlugin.second->setOwnCallsign({});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,6 +119,12 @@ namespace swift::core
|
||||
|
||||
void ISimulator::setFlightNetworkConnected(bool connected) { m_networkConnected = connected; }
|
||||
|
||||
void ISimulator::setOwnCallsign(const CCallsign &callsign)
|
||||
{
|
||||
Q_UNUSED(callsign)
|
||||
// void
|
||||
}
|
||||
|
||||
void ISimulator::clearAllRemoteAircraftData()
|
||||
{
|
||||
// rendering related stuff
|
||||
|
||||
@@ -152,6 +152,9 @@ namespace swift::core
|
||||
//! \sa ISimulator::isFlightNetworkConnected
|
||||
virtual void setFlightNetworkConnected(bool connected);
|
||||
|
||||
//! Own callsign has changed
|
||||
virtual void setOwnCallsign(const swift::misc::aviation::CCallsign &callsign);
|
||||
|
||||
//! Is the flight network connected
|
||||
bool isFlightNetworkConnected() const { return m_networkConnected; }
|
||||
|
||||
|
||||
@@ -219,6 +219,12 @@ namespace swift::simplugin::xplane
|
||||
CSimulatorPluginCommon::setFlightNetworkConnected(connected);
|
||||
}
|
||||
|
||||
void CSimulatorXPlane::setOwnCallsign(const CCallsign &callsign)
|
||||
{
|
||||
m_serviceProxy->setOwnCallsign(callsign.asString());
|
||||
CSimulatorPluginCommon::setOwnCallsign(callsign);
|
||||
}
|
||||
|
||||
bool CSimulatorXPlane::isSuspiciousTerrainValue(const CElevationPlane &elevation)
|
||||
{
|
||||
if (!elevation.hasMSLGeodeticHeight()) { return true; }
|
||||
|
||||
@@ -150,6 +150,7 @@ namespace swift::simplugin::xplane
|
||||
const swift::misc::aviation::CCallsign &callsign,
|
||||
bool isWater) override;
|
||||
void setFlightNetworkConnected(bool connected) override;
|
||||
void setOwnCallsign(const swift::misc::aviation::CCallsign &callsign) override;
|
||||
//! @}
|
||||
|
||||
//! \copydoc swift::misc::simulation::ISimulationEnvironmentProvider::requestElevation
|
||||
|
||||
@@ -363,6 +363,11 @@ namespace swift::simplugin::xplane
|
||||
m_dbusInterface->callDBus(QLatin1String("setFlightNetworkConnected"), connected);
|
||||
}
|
||||
|
||||
void CXSwiftBusServiceProxy::setOwnCallsign(const QString &callsign)
|
||||
{
|
||||
m_dbusInterface->callDBus(QLatin1String("setOwnCallsign"), callsign);
|
||||
}
|
||||
|
||||
double CXSwiftBusServiceProxy::getLatitudeDeg() const
|
||||
{
|
||||
return m_dbusInterface->callDBusRet<double>(QLatin1String("getLatitudeDeg"));
|
||||
|
||||
@@ -215,6 +215,9 @@ namespace swift::simplugin::xplane
|
||||
//! \copydoc XSwiftBus::CService::setFlightNetworkConnected
|
||||
void setFlightNetworkConnected(bool connected);
|
||||
|
||||
//! \copydoc XSwiftBus::CService::setOwnCallsign
|
||||
void setOwnCallsign(const QString &callsign);
|
||||
|
||||
//! @{
|
||||
//! \copydoc XSwiftBus::CService::getLatitudeDeg
|
||||
double getLatitudeDeg() const;
|
||||
|
||||
@@ -11,12 +11,17 @@ namespace XSwiftBus
|
||||
{
|
||||
//! Dataref name
|
||||
static constexpr const char *name() { return "org/swift-project/xswiftbus/connected"; }
|
||||
//! Can be written to?
|
||||
static constexpr bool writable = false;
|
||||
//! Dataref type
|
||||
using type = int;
|
||||
//! Not an array dataref
|
||||
static constexpr bool is_array = false;
|
||||
};
|
||||
|
||||
//! Current callsign
|
||||
struct TSwiftCallsign
|
||||
{
|
||||
//! Dataref name
|
||||
static constexpr const char *name() { return "org/swift-project/xswiftbus/callsign"; }
|
||||
//! Dataref type
|
||||
using type = std::string;
|
||||
};
|
||||
|
||||
} // namespace XSwiftBus
|
||||
|
||||
@@ -9,8 +9,10 @@
|
||||
#include <XPLM/XPLMDataAccess.h>
|
||||
#include <XPLM/XPLMUtilities.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
|
||||
// Avoid checking large auto-generated header with cppcheck
|
||||
@@ -223,8 +225,13 @@ namespace XSwiftBus
|
||||
XPLMDataRef m_ref;
|
||||
};
|
||||
|
||||
/* Helper to conditionally fail compilation if no matching constexpr if case is found */
|
||||
template <class...>
|
||||
constexpr bool dependent_false = false;
|
||||
|
||||
/*!
|
||||
* Class providing a custom variable + dataref
|
||||
* \hint Currently only readable int and std::string datarefs are supported
|
||||
* \tparam DataRefTraits The trait class representing the dataref.
|
||||
*/
|
||||
template <class DataRefTraits>
|
||||
@@ -236,10 +243,17 @@ namespace XSwiftBus
|
||||
{
|
||||
if constexpr (std::is_same_v<typename DataRefTraits::type, int>)
|
||||
{
|
||||
m_ref = XPLMRegisterDataAccessor(DataRefTraits::name(), xplmType_Int, 0, read, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, this, NULL);
|
||||
m_ref = XPLMRegisterDataAccessor(DataRefTraits::name(), xplmType_Int, 0, readInt, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, this, nullptr);
|
||||
}
|
||||
else { XPLMDebugString("Unsupported custom dataref type\n"); }
|
||||
else if constexpr (std::is_same_v<typename DataRefTraits::type, std::string>)
|
||||
{
|
||||
m_ref = XPLMRegisterDataAccessor(DataRefTraits::name(), xplmType_Data, 0, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
readData, nullptr, this, nullptr);
|
||||
}
|
||||
else { static_assert(dependent_false<typename DataRefTraits::type>, "Unsupported custom dataref type"); }
|
||||
if (!m_ref)
|
||||
{
|
||||
XPLMDebugString("Missing dataref:");
|
||||
@@ -257,11 +271,27 @@ namespace XSwiftBus
|
||||
if (m_ref) { XPLMUnregisterDataAccessor(m_ref); }
|
||||
}
|
||||
|
||||
static typename DataRefTraits::type read(void *refcon)
|
||||
static typename DataRefTraits::type readInt(void *refcon)
|
||||
{
|
||||
return reinterpret_cast<CustomDataRef *>(refcon)->get();
|
||||
}
|
||||
|
||||
static int readData(void *refcon, void *out, int offset, int max_length)
|
||||
{
|
||||
if constexpr (std::is_same_v<typename DataRefTraits::type, std::string>)
|
||||
{
|
||||
std::string_view sv(reinterpret_cast<CustomDataRef *>(refcon)->get());
|
||||
const size_t start = std::clamp<size_t>(offset, 0, sv.size());
|
||||
const size_t remaining_length = sv.size() - start;
|
||||
const auto len = std::min(static_cast<size_t>(max_length), remaining_length);
|
||||
sv = sv.substr(start, len);
|
||||
std::memcpy(out, sv.data(), len);
|
||||
return static_cast<int>(len);
|
||||
}
|
||||
|
||||
return -1; // should never be reached
|
||||
}
|
||||
|
||||
//! True if the dataref exists
|
||||
bool isValid() const { return m_ref != nullptr; }
|
||||
|
||||
@@ -269,7 +299,7 @@ namespace XSwiftBus
|
||||
void set(typename DataRefTraits::type val) { m_datarefVal = val; }
|
||||
|
||||
//! Get the value
|
||||
typename DataRefTraits::type get() const { return m_datarefVal; }
|
||||
const typename DataRefTraits::type &get() const { return m_datarefVal; }
|
||||
|
||||
XPLMDataRef m_ref;
|
||||
typename DataRefTraits::type m_datarefVal;
|
||||
|
||||
@@ -116,6 +116,9 @@ R"XML(<node>
|
||||
<method name="setFlightNetworkConnected">
|
||||
<arg type="b" direction="in"/>
|
||||
</method>
|
||||
<method name="setOwnCallsign">
|
||||
<arg type="s" direction="in"/>
|
||||
</method>
|
||||
<method name="getLatitudeDeg">
|
||||
<arg type="d" direction="out"/>
|
||||
</method>
|
||||
|
||||
@@ -94,6 +94,7 @@ namespace XSwiftBus
|
||||
this->updateMessageBoxFromSettings();
|
||||
m_framePeriodSampler->show();
|
||||
m_swiftNetworkConnected.set(0);
|
||||
m_swiftCallsign.set("");
|
||||
}
|
||||
|
||||
// Explicitly in cpp file to allow use of forward declaration
|
||||
@@ -139,6 +140,8 @@ namespace XSwiftBus
|
||||
|
||||
void CService::setFlightNetworkConnected(bool connected) { m_swiftNetworkConnected.set(connected); }
|
||||
|
||||
void CService::setOwnCallsign(const std::string &callsign) { m_swiftCallsign.set(callsign); }
|
||||
|
||||
void CService::addTextMessage(const std::string &text, double red, double green, double blue)
|
||||
{
|
||||
if (text.empty()) { return; }
|
||||
@@ -520,6 +523,14 @@ namespace XSwiftBus
|
||||
message.getArgument(connected);
|
||||
queueDBusCall([=]() { setFlightNetworkConnected(connected); });
|
||||
}
|
||||
else if (message.getMethodName() == "setOwnCallsign")
|
||||
{
|
||||
maybeSendEmptyDBusReply(wantsReply, sender, serial);
|
||||
std::string callsign;
|
||||
message.beginArgumentRead();
|
||||
message.getArgument(callsign);
|
||||
queueDBusCall([=]() { setOwnCallsign(callsign); });
|
||||
}
|
||||
else if (message.getMethodName() == "getLatitudeDeg")
|
||||
{
|
||||
queueDBusCall([=]() { sendDBusReply(sender, serial, getLatitudeDeg()); });
|
||||
|
||||
@@ -123,6 +123,9 @@ namespace XSwiftBus
|
||||
//! Set the current connection state
|
||||
void setFlightNetworkConnected(bool connected);
|
||||
|
||||
//! Set the current own callsign
|
||||
void setOwnCallsign(const std::string &callsign);
|
||||
|
||||
//! Get aircraft latitude in degrees
|
||||
double getLatitudeDeg() const { return m_latitude.get(); }
|
||||
|
||||
@@ -354,6 +357,7 @@ namespace XSwiftBus
|
||||
int m_sceneryWasLoading = 0;
|
||||
|
||||
CustomDataRef<TSwiftNetworkConnected> m_swiftNetworkConnected;
|
||||
CustomDataRef<TSwiftCallsign> m_swiftCallsign;
|
||||
StringDataRef<xplane::data::sim::aircraft::view::acf_livery_path> m_liveryPath;
|
||||
StringDataRef<xplane::data::sim::aircraft::view::acf_ICAO> m_icao;
|
||||
StringDataRef<xplane::data::sim::aircraft::view::acf_descrip> m_descrip;
|
||||
|
||||
Reference in New Issue
Block a user