5#include <QtCore/QTimer>
6#include <QtNetwork/QTcpSocket>
12 , _hostAddress(hostAddress)
14 , _socket(new QTcpSocket(this))
15 , _processTimer(new QTimer(this))
17 if (ADSBTCPLinkLog().isDebugEnabled()) {
18 (void) connect(_socket, &QTcpSocket::stateChanged,
this, [](QTcpSocket::SocketState state) {
20 case QTcpSocket::UnconnectedState:
21 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket disconnected";
23 case QTcpSocket::SocketState::ConnectingState:
24 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket connecting...";
26 case QTcpSocket::SocketState::ConnectedState:
27 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket connected";
29 case QTcpSocket::SocketState::ClosingState:
30 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket closing...";
35 }, Qt::AutoConnection);
38 (void) QObject::connect(_socket, &QTcpSocket::errorOccurred,
this, [
this](QTcpSocket::SocketError
error) {
39 qCDebug(ADSBTCPLinkLog) <<
error << _socket->errorString();
41 emit errorOccurred(_socket->errorString(),
false);
42 }, Qt::AutoConnection);
44 (void) connect(_socket, &QTcpSocket::readyRead,
this, &ADSBTCPLink::_readBytes);
46 _processTimer->setInterval(_processInterval);
47 (void) connect(_processTimer, &QTimer::timeout,
this, &ADSBTCPLink::_processLines);
63 if (_hostAddress.isNull()) {
67 _socket->connectToHost(_hostAddress, _port);
72void ADSBTCPLink::_readBytes()
74 while (_socket && _socket->canReadLine()) {
75 const QByteArray bytes = _socket->readLine();
76 (void) _lineBuffer.append(QString::fromLocal8Bit(bytes));
80 if (!_processTimer->isActive()) {
81 _processTimer->start();
85void ADSBTCPLink::_processLines()
87 int linesProcessed = 0;
88 while (!_lineBuffer.isEmpty() && (linesProcessed < _maxLinesToProcess)) {
89 const QString line = _lineBuffer.takeFirst();
95 if (_lineBuffer.isEmpty()) {
96 _processTimer->stop();
100void ADSBTCPLink::_parseLine(
const QString &line)
102 if (line.size() <= 4) {
106 if (!line.startsWith(QStringLiteral(
"MSG"))) {
110 const int msgType = line.at(4).digitValue();
112 qCDebug(ADSBTCPLinkLog) <<
"ADSB Invalid message type" << msgType;
121 qCDebug(ADSBTCPLinkLog) <<
"ADSB SBS-1" << line;
123 const QStringList values = line.split(QChar(
','));
124 if (values.size() <= 4) {
129 const uint32_t icaoAddress = values.at(4).toUInt(&icaoOk, 16);
141 _parseAndEmitCallsign(adsbInfo, values);
144 _parseAndEmitLocation(adsbInfo, values);
147 _parseAndEmitHeading(adsbInfo, values);
154void ADSBTCPLink::_parseAndEmitCallsign(
ADSB::VehicleInfo_t &adsbInfo,
const QStringList &values)
156 if (values.size() <= 10) {
160 const QString callsign = values.at(10).trimmed();
161 if (callsign.isEmpty()) {
171void ADSBTCPLink::_parseAndEmitLocation(
ADSB::VehicleInfo_t &adsbInfo,
const QStringList &values)
173 if (values.size() <= 19) {
182 QString altitudeStr = values.at(11);
183 if (altitudeStr.endsWith(
'H')) {
184 (void) altitudeStr.chop(1);
187 bool altOk, latOk, lonOk, alertOk;
188 const int modeCAltitude = altitudeStr.toInt(&altOk);
189 const double lat = values.at(14).toDouble(&latOk);
190 const double lon = values.at(15).toDouble(&lonOk);
191 const int alert = values.at(19).toInt(&alertOk);
193 if (!altOk || !latOk || !lonOk || !alertOk) {
197 if (qFuzzyIsNull(lat) && qFuzzyIsNull(lon)) {
201 const double altitude = modeCAltitude * 0.3048;
202 const QGeoCoordinate location(lat, lon, altitude);
205 adsbInfo.
alert = (alert == 1);
211void ADSBTCPLink::_parseAndEmitHeading(
ADSB::VehicleInfo_t &adsbInfo,
const QStringList &values)
213 if (values.size() <= 13) {
217 bool headingOk =
false, speedOk =
false;
218 const double heading = values.at(13).toDouble(&headingOk);
219 const double speedKnots = values.at(12).toDouble(&speedOk);
220 if (!headingOk || !speedOk) {
225 adsbInfo.
velocity = speedKnots * 0.514444;
228 if (values.size() > 16) {
230 const double verticalRate = values.at(16).toDouble(&vertOk);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
bool init()
Attempts connection to a host.
~ADSBTCPLink()
Destroys the ADSBTCPLink object.
void adsbVehicleUpdate(const ADSB::VehicleInfo_t &vehicleInfo)
@ IdentificationAndCategory
AvailableInfoTypes availableFlags