QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
RTCMMavlink.cc
Go to the documentation of this file.
1#include "RTCMMavlink.h"
2
3#include <QtCore/QByteArray>
4#include <QtCore/QThread>
5
6#include "MAVLinkProtocol.h"
10#include "Vehicle.h"
11#include "VehicleLinkManager.h"
12
13QGC_LOGGING_CATEGORY(RTCMMavlinkLog, "GPS.RTCMMavlink")
14
15RTCMMavlink::RTCMMavlink(QObject* parent) : QObject(parent)
16{
17 qCDebug(RTCMMavlinkLog) << this;
18}
19
21{
22 qCDebug(RTCMMavlinkLog) << this;
23}
24
25void RTCMMavlink::RTCMDataUpdate(QByteArrayView data)
26{
27 _rateTracker.recordBytes(data.size());
28 if (_rateTracker.rateUpdated()) {
29 qCDebug(RTCMMavlinkLog) << QStringLiteral("RTCM bandwidth: %1 kB/s").arg(_rateTracker.kBps(), 0, 'f', 3);
30 emit bandwidthChanged();
31 }
32
33 mavlink_gps_rtcm_data_t gpsRtcmData{};
34
35 static constexpr qsizetype maxMessageLength = MAVLINK_MSG_GPS_RTCM_DATA_FIELD_DATA_LEN;
36 if (data.size() < maxMessageLength) {
37 gpsRtcmData.len = data.size();
38 gpsRtcmData.flags = (_sequenceId & 0x1FU) << 3;
39 (void) memcpy(&gpsRtcmData.data, data.data(), data.size());
40 _sendMessageToVehicle(gpsRtcmData);
41 } else {
42 uint8_t fragmentId = 0;
43 qsizetype start = 0;
44 while (start < data.size()) {
45 gpsRtcmData.flags = 0x01U; // LSB set indicates message is fragmented
46 gpsRtcmData.flags |= fragmentId++ << 1; // Next 2 bits are fragment id
47 gpsRtcmData.flags |= (_sequenceId & 0x1FU) << 3; // Next 5 bits are sequence id
48
49 const qsizetype length = std::min(data.size() - start, maxMessageLength);
50 gpsRtcmData.len = length;
51
52 (void) memcpy(gpsRtcmData.data, data.constData() + start, length);
53 _sendMessageToVehicle(gpsRtcmData);
54
55 start += length;
56 }
57 }
58
59 ++_sequenceId;
60}
61
62void RTCMMavlink::sendSimulatedData(const std::atomic_bool& requestStop)
63{
64 constexpr int kMessageLengths[] = {30, 170, 240};
65 const QByteArray payload(kMessageLengths[2], '\0');
66 while (!requestStop) {
67 for (const int length : kMessageLengths) {
68 RTCMDataUpdate(QByteArrayView(payload).first(length));
69 QThread::msleep(4);
70 }
71 QThread::msleep(100);
72 }
73}
74
75void RTCMMavlink::_sendMessageToVehicle(const mavlink_gps_rtcm_data_t& data)
76{
78 for (qsizetype i = 0; i < vehicles->count(); i++) {
79 Vehicle* const vehicle = qobject_cast<Vehicle*>(vehicles->get(i));
80 if (!vehicle) {
81 continue;
82 }
83 const SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock();
84 if (sharedLink) {
85 mavlink_message_t message;
86 (void) mavlink_msg_gps_rtcm_data_encode_chan(MAVLinkProtocol::instance()->getSystemId(),
88 sharedLink->mavlinkChannel(), &message, &data);
89 (void) vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), message);
90 }
91 }
92}
std::shared_ptr< LinkInterface > SharedLinkInterfacePtr
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
double kBps() const
Current data rate in KB/s.
void recordBytes(qsizetype bytes)
Record incoming/outgoing bytes. Call whenever data passes through.
bool rateUpdated() const
static int getComponentId()
static MAVLinkProtocol * instance()
int getSystemId() const
static MultiVehicleManager * instance()
QmlObjectListModel * vehicles() const
Q_INVOKABLE QObject * get(int index)
int count() const override final
WeakLinkInterfacePtr primaryLink() const
VehicleLinkManager * vehicleLinkManager()
Definition Vehicle.h:579
bool sendMessageOnLinkThreadSafe(LinkInterface *link, mavlink_message_t message)
Definition Vehicle.cc:1390