3#include <QtCore/QByteArray>
5#include <QtCore/QThread>
20static_assert(
RTCMMavlink::kFragmentLen == MAVLINK_MSG_GPS_RTCM_DATA_FIELD_DATA_LEN);
24 qCDebug(RTCMMavlinkLog) <<
this;
29 qCDebug(RTCMMavlinkLog) <<
this;
32uint8_t RTCMMavlink::_makeFlags(
bool fragmented, uint8_t fragmentId, uint8_t sequenceId)
34 uint8_t flags =
static_cast<uint8_t
>((sequenceId & 0x1FU) << 3);
37 flags |=
static_cast<uint8_t
>((fragmentId & 0x03U) << 1);
56 while (start < data.size()) {
57 const qsizetype length = std::min(data.size() - start,
kFragmentLen);
60 packet.
data = data.mid(start, length).toByteArray();
61 result.
packets.append(std::move(packet));
70 packet.
flags = _makeFlags(
false, 0, sequenceId);
71 packet.
data = data.toByteArray();
72 result.
packets.append(std::move(packet));
78 uint8_t fragmentId = 0;
80 while (start < data.size()) {
81 const qsizetype length = std::min(data.size() - start,
kFragmentLen);
83 packet.
flags = _makeFlags(
true, fragmentId, sequenceId);
84 packet.
data = data.mid(start, length).toByteArray();
85 result.
packets.append(std::move(packet));
96 terminator.
flags = _makeFlags(
true, fragmentId, sequenceId);
97 terminator.
data.clear();
98 result.
packets.append(std::move(terminator));
107 if (data.isEmpty()) {
113 qCDebug(RTCMMavlinkLog) << QStringLiteral(
"RTCM bandwidth: %1 kB/s").arg(_rateTracker.
kBps(), 0,
'f', 3);
122 gpsRtcmData.flags = packet.flags;
123 gpsRtcmData.len =
static_cast<uint8_t
>(packet.data.size());
124 if (!packet.data.isEmpty()) {
125 (void) memcpy(gpsRtcmData.data, packet.data.constData(),
static_cast<size_t>(packet.data.size()));
127 _sendMessageOnAllLinks(gpsRtcmData);
133 constexpr int kMessageLengths[] = {30, 170, 240};
134 const QByteArray payload(kMessageLengths[2],
'\0');
135 while (!requestStop) {
136 for (
const int length : kMessageLengths) {
140 QThread::msleep(100);
147 QSet<const LinkInterface*> sentLinks;
148 for (qsizetype i = 0; i < vehicles->
count(); i++) {
149 Vehicle*
const vehicle = qobject_cast<Vehicle*>(vehicles->
get(i));
154 if (!sharedLink || !sharedLink->isConnected()) {
162 if (sentLinks.contains(sharedLink.get())) {
165 (void) sentLinks.insert(sharedLink.get());
171 sharedLink->sendMessageThreadSafe(message);
std::shared_ptr< LinkInterface > SharedLinkInterfacePtr
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
struct __mavlink_gps_rtcm_data_t mavlink_gps_rtcm_data_t
double kBps() const
Current data rate in KB/s.
void recordBytes(qsizetype bytes)
Record incoming/outgoing bytes. Call whenever data passes through.
static int getComponentId()
static MAVLinkProtocol * instance()
static MultiVehicleManager * instance()
QmlObjectListModel * vehicles() const
Q_INVOKABLE QObject * get(int index)
int count() const override final
static constexpr qsizetype kMaxFragments
Fragment ID is 2 bits — at most 4 fragments per reassembled message.
static constexpr qsizetype kMaxAssembledLen
Max payload that fits one fragmented sequence (4 * 180).
static constexpr qsizetype kFragmentLen
MAVLink GPS_RTCM_DATA data[] field length.
void RTCMDataUpdate(QByteArrayView data)
void sendSimulatedData(const std::atomic_bool &requestStop)
static PackResult pack(QByteArrayView data, uint8_t sequenceId)
WeakLinkInterfacePtr primaryLink() const
VehicleLinkManager * vehicleLinkManager()
QList< GpsRtcmPacket > packets