7#include <QtNetwork/QNetworkDatagram>
8#include <QtNetwork/QUdpSocket>
17 , _peerIdleTimeout(peerIdleTimeout)
27 _socket = std::make_unique<QUdpSocket>();
28 if (!_socket->bind(QHostAddress::Any, _port)) {
29 qCWarning(UDPGPSTransportLog) <<
"Cannot listen for receiver data on UDP port" << _port
30 << _socket->errorString();
38 return !_socket || _socket->state() != QAbstractSocket::BoundState;
41void UDPGPSTransport::_receivePending()
43 while (_socket && _socket->hasPendingDatagrams()) {
44 const QNetworkDatagram datagram = _socket->receiveDatagram();
45 if (!datagram.isValid()) {
49 const bool selected = _peerPort != 0 && datagram.senderPort() == _peerPort &&
50 datagram.senderAddress().isEqual(_peerAddress, QHostAddress::TolerantConversion);
52 if (_peerPort != 0 && _peerIdle.durationElapsed() < _peerIdleTimeout) {
55 qCDebug(UDPGPSTransportLog) <<
"Receiving from UDP sender" << datagram.senderAddress()
56 << datagram.senderPort();
57 _peerAddress = datagram.senderAddress();
58 _peerPort =
static_cast<quint16
>(datagram.senderPort());
63 _pending.append(datagram.data());
65 _pending.remove(0, excess);
66 qCWarning(UDPGPSTransportLog)
67 <<
"Receiver input outran the decoder; dropped the oldest" << excess <<
"bytes";
79 const auto buffered = [
this]() {
81 return !_pending.isEmpty();
88 const qsizetype taken = (std::min) (
static_cast<qsizetype
>(buffer.size()), _pending.size());
89 std::memcpy(buffer.data(), _pending.constData(),
static_cast<size_t>(taken));
90 _pending.remove(0, taken);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
bool waitForDevice(const std::function< bool()> &ready, QDeadlineTimer deadline)
static constexpr qint64 READ_BUFFER_BYTES
QIODevice * device() const override
The open device, or null before open().
bool waitReadable(QDeadlineTimer deadline) override
Waits until input is buffered. Input reported buffered is delivered even after the link fails.
GPSOpenResult open() override
~UDPGPSTransport() override
GPSWriteResult writeData(QByteArrayView bytes, QDeadlineTimer deadline) override
Receives non-empty bytes and an unexpired, capped deadline that implementations must honor.
bool fatalError() const override
qint64 take(std::span< uint8_t > buffer) override
Takes buffered input.