diff --git a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp index 3e29d878c..b73bdf741 100644 --- a/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp +++ b/src/plugins/simulator/xplane/xswiftbustrafficproxy.cpp @@ -159,13 +159,19 @@ namespace BlackSimPlugin if (!reply.isError()) { const QStringList callsigns = reply.argumentAt<0>(); - const QList latitudesDeg = reply.argumentAt<1>(); + const QList latitudesDeg = reply.argumentAt<1>(); const QList longitudesDeg = reply.argumentAt<2>(); - const QList elevationsM = reply.argumentAt<3>(); - const QList waterFlags = reply.argumentAt<4>(); + const QList elevationsM = reply.argumentAt<3>(); + const QList waterFlags = reply.argumentAt<4>(); const QList verticalOffsets = reply.argumentAt<5>(); + setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, waterFlags, verticalOffsets); } + else + { + const QString errorMsg = reply.error().message(); + CLogMessage(this).warning(u"XSwiftBus DBus error getRemoteAircraftData: %1") << errorMsg; + } watcher->deleteLater(); }; m_dbusInterface->callDBusAsync(QLatin1String("getRemoteAircraftData"), callback, callsigns); diff --git a/src/xswiftbus/dbusmessage.cpp b/src/xswiftbus/dbusmessage.cpp index 1f695b8c8..0523348d8 100644 --- a/src/xswiftbus/dbusmessage.cpp +++ b/src/xswiftbus/dbusmessage.cpp @@ -109,6 +109,24 @@ namespace XSwiftBus dbus_message_iter_append_basic(&m_messageIterator, DBUS_TYPE_DOUBLE, &value); } + void CDBusMessage::appendArgument(const std::vector &array) + { + // array.data() not existing for bool + // changing dbus_message_iter_open_container here affects DBus signature + // using int16 creates signature "n", mismatch on swift side + // using int32 creates signature "i" + // there are also xml files for the signature: src/xswiftbus/org.swift_project.xswiftbus.traffic.xml + // discussion: https://discordapp.com/channels/539048679160676382/539925070550794240/698552502831939676 + + DBusMessageIter arrayIterator; + dbus_message_iter_open_container(&m_messageIterator, DBUS_TYPE_ARRAY, DBUS_TYPE_BOOLEAN_AS_STRING, &arrayIterator); + + const std::vector ints(array.begin(), array.end()); + const unsigned *ptr = ints.data(); + dbus_message_iter_append_fixed_array(&arrayIterator, DBUS_TYPE_BOOLEAN, &ptr, static_cast(array.size())); + dbus_message_iter_close_container(&m_messageIterator, &arrayIterator); + } + void CDBusMessage::appendArgument(const std::vector &array) { DBusMessageIter arrayIterator; diff --git a/src/xswiftbus/dbusmessage.h b/src/xswiftbus/dbusmessage.h index 8b6b61028..a14c73dc3 100644 --- a/src/xswiftbus/dbusmessage.h +++ b/src/xswiftbus/dbusmessage.h @@ -76,6 +76,7 @@ namespace XSwiftBus void appendArgument(const std::string &value); void appendArgument(int value); void appendArgument(double value); + void appendArgument(const std::vector &array); void appendArgument(const std::vector &array); void appendArgument(const std::vector &array); //! @} diff --git a/src/xswiftbus/traffic.cpp b/src/xswiftbus/traffic.cpp index bb5b639e8..538648428 100644 --- a/src/xswiftbus/traffic.cpp +++ b/src/xswiftbus/traffic.cpp @@ -498,6 +498,7 @@ namespace XSwiftBus longitudesDeg.clear(); elevationsM.clear(); verticalOffsets.clear(); + waterFlags.clear(); for (const auto &requestedCallsign : requestedCallsigns) { @@ -800,7 +801,7 @@ namespace XSwiftBus std::vector latitudesDeg; std::vector longitudesDeg; std::vector elevationsM; - std::vector waterFlags; + std::vector waterFlags; std::vector verticalOffsets; getRemoteAircraftData(callsigns, latitudesDeg, longitudesDeg, elevationsM, waterFlags, verticalOffsets); CDBusMessage reply = CDBusMessage::createReply(sender, serial); @@ -809,6 +810,7 @@ namespace XSwiftBus reply.appendArgument(latitudesDeg); reply.appendArgument(longitudesDeg); reply.appendArgument(elevationsM); + reply.appendArgument(waterFlags); reply.appendArgument(verticalOffsets); sendDBusMessage(reply); });