3#include <QtNetwork/QNetworkDatagram>
4#include <QtNetwork/QUdpSocket>
22 _socket =
new QUdpSocket(
this);
23 if (!_socket->bind(QHostAddress::AnyIPv4, _port)) {
24 qCWarning(RTCMUdpInputLog) <<
"Failed to bind UDP socket on port" << _port <<
":" << _socket->errorString();
25 _socket->deleteLater();
29 connect(_socket, &QUdpSocket::readyRead,
this, &RTCMUdpInput::_readDatagrams);
33 qCDebug(RTCMUdpInputLog) <<
"Listening for RTCM data on UDP port" << _port;
45 _socket->deleteLater();
50 qCDebug(RTCMUdpInputLog) <<
"Stopped listening on UDP port" << _port;
67void RTCMUdpInput::_readDatagrams()
72 while (_socket->hasPendingDatagrams()) {
73 const QNetworkDatagram datagram = _socket->receiveDatagram();
74 const QByteArray data = datagram.data();
80 qCDebug(RTCMUdpInputLog) <<
"Received RTCM datagram:" << data.size() <<
"bytes";
86 int framesDropped = 0;
87 const QByteArray validData = _rtcmParser.
extractValidFrames(data, &framesFound, &framesDropped);
89 _validFrames +=
static_cast<quint64
>(framesFound);
90 _invalidFrames +=
static_cast<quint64
>(framesDropped);
91 if (framesDropped > 0) {
92 qCWarning(RTCMUdpInputLog) <<
"Dropped" << framesDropped <<
"RTCM frame(s) - CRC mismatch";
95 qCDebug(RTCMUdpInputLog) <<
"Datagram" << data.size() <<
"bytes -"
96 <<
"framesFound:" << framesFound <<
"framesDropped:" << framesDropped
97 <<
"validData:" << validData.size() <<
"bytes";
99 if (!validData.isEmpty()) {
103 const quint64 totalFrames = _validFrames + _invalidFrames;
104 if (totalFrames > 0) {
105 const double dropPct = 100.0 * _invalidFrames / totalFrames;
106 qCDebug(RTCMUdpInputLog) << QString(
"RTCM frame stats: %1 valid, %2 invalid, %3% dropped")
109 .arg(dropPct, 0,
'f', 1);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
QByteArray extractValidFrames(const QByteArray &in, int *framesFound=nullptr, int *framesDropped=nullptr)