5#include <QtNetwork/QTcpSocket>
11 , _hostAddress(hostAddress)
13 , _socket(new QTcpSocket(this))
15 if (ADSBTCPLinkLog().isDebugEnabled()) {
16 (void) connect(_socket, &QTcpSocket::stateChanged,
this, [](QTcpSocket::SocketState state) {
18 case QTcpSocket::UnconnectedState:
19 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket disconnected";
21 case QTcpSocket::SocketState::ConnectingState:
22 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket connecting...";
24 case QTcpSocket::SocketState::ConnectedState:
25 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket connected";
27 case QTcpSocket::SocketState::ClosingState:
28 qCDebug(ADSBTCPLinkLog) <<
"ADSB Socket closing...";
33 }, Qt::AutoConnection);
36 (void) QObject::connect(_socket, &QTcpSocket::errorOccurred,
this, [
this](QTcpSocket::SocketError
error) {
37 qCDebug(ADSBTCPLinkLog) <<
error << _socket->errorString();
39 emit errorOccurred(_socket->errorString(),
false);
40 }, Qt::AutoConnection);
42 (void) connect(_socket, &QTcpSocket::readyRead,
this, &ADSBTCPLink::_readBytes);
58 if (_hostAddress.isEmpty()) {
63 _socket->connectToHost(_hostAddress, _port);
68void ADSBTCPLink::_readBytes()
70 while (_socket && _socket->canReadLine()) {
71 const QByteArray bytes = _socket->readLine();
72 _parseLine(QString::fromLocal8Bit(bytes));
76void ADSBTCPLink::_parseLine(
const QString &line)
78 if (line.size() <= 4) {
82 if (!line.startsWith(QStringLiteral(
"MSG"))) {
86 const int msgType = line.at(4).digitValue();
88 qCDebug(ADSBTCPLinkLog) <<
"ADSB Invalid message type" << msgType;
97 qCDebug(ADSBTCPLinkLog) <<
"ADSB SBS-1" << line;
99 const QStringList values = line.split(QChar(
','));
100 if (values.size() <= 4) {
105 const uint32_t icaoAddress = values.at(4).toUInt(&icaoOk, 16);
117 _parseAndEmitCallsign(adsbInfo, values);
120 _parseAndEmitLocation(adsbInfo, values);
123 _parseAndEmitHeading(adsbInfo, values);
130void ADSBTCPLink::_parseAndEmitCallsign(
ADSB::VehicleInfo_t &adsbInfo,
const QStringList &values)
132 if (values.size() <= 10) {
136 const QString callsign = values.at(10).trimmed();
137 if (callsign.isEmpty()) {
147void ADSBTCPLink::_parseAndEmitLocation(
ADSB::VehicleInfo_t &adsbInfo,
const QStringList &values)
149 if (values.size() <= 19) {
158 QString altitudeStr = values.at(11);
159 if (altitudeStr.endsWith(
'H')) {
160 (void) altitudeStr.chop(1);
163 bool altOk, latOk, lonOk, alertOk;
164 const int modeCAltitude = altitudeStr.toInt(&altOk);
165 const double lat = values.at(14).toDouble(&latOk);
166 const double lon = values.at(15).toDouble(&lonOk);
167 const int alert = values.at(19).toInt(&alertOk);
169 if (!altOk || !latOk || !lonOk || !alertOk) {
173 if (qFuzzyIsNull(lat) && qFuzzyIsNull(lon)) {
177 const double altitude = modeCAltitude * 0.3048;
178 const QGeoCoordinate location(lat, lon, altitude);
181 adsbInfo.
alert = (alert == 1);
187void ADSBTCPLink::_parseAndEmitHeading(
ADSB::VehicleInfo_t &adsbInfo,
const QStringList &values)
189 if (values.size() <= 13) {
193 bool headingOk =
false, speedOk =
false;
194 const double heading = values.at(13).toDouble(&headingOk);
195 const double speedKnots = values.at(12).toDouble(&speedOk);
196 if (!headingOk || !speedOk) {
201 adsbInfo.
velocity = speedKnots * 0.514444;
204 if (values.size() > 16) {
206 const double verticalRate = values.at(16).toDouble(&vertOk);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
The ADSBTCPLink class handles the TCP connection to an ADS-B server and processes incoming ADS-B data...
bool init()
Attempts connection to a host.
~ADSBTCPLink()
Destroys the ADSBTCPLink object.
void adsbVehicleUpdate(const ADSB::VehicleInfo_t &vehicleInfo)
@ IdentificationAndCategory
AvailableInfoTypes availableFlags