From bab3c35af886321cefe8aa42cec12988ec3b19a1 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Fri, 14 Dec 2018 18:34:30 -0400 Subject: [PATCH] Get (and expose) link status --- src/Taisync/TaisyncHandler.cc | 1 + src/Taisync/TaisyncHandler.h | 3 ++ src/Taisync/TaisyncSettings.cc | 52 ++++++++++++++++++++++++++++++++++ src/Taisync/TaisyncSettings.h | 20 +++++++++++++ src/comm/TaisyncLink.cc | 29 ++++++++++++++++++- src/comm/TaisyncLink.h | 5 ++++ 6 files changed, 109 insertions(+), 1 deletion(-) diff --git a/src/Taisync/TaisyncHandler.cc b/src/Taisync/TaisyncHandler.cc index d39cd3d67..e161215e1 100644 --- a/src/Taisync/TaisyncHandler.cc +++ b/src/Taisync/TaisyncHandler.cc @@ -60,6 +60,7 @@ TaisyncHandler::_newConnection() } _tcpSocket = _tcpServer->nextPendingConnection(); QObject::connect(_tcpSocket, &QIODevice::readyRead, this, &TaisyncHandler::_readBytes); + emit connected(); } //----------------------------------------------------------------------------- diff --git a/src/Taisync/TaisyncHandler.h b/src/Taisync/TaisyncHandler.h index d1aea53a7..5c090681d 100644 --- a/src/Taisync/TaisyncHandler.h +++ b/src/Taisync/TaisyncHandler.h @@ -39,6 +39,9 @@ protected slots: virtual void _socketDisconnected (); virtual void _readBytes () = 0; +signals: + void connected (); + protected: QTcpServer* _tcpServer = nullptr; QTcpSocket* _tcpSocket = nullptr; diff --git a/src/Taisync/TaisyncSettings.cc b/src/Taisync/TaisyncSettings.cc index 3cd44db87..e9b98e3e6 100644 --- a/src/Taisync/TaisyncSettings.cc +++ b/src/Taisync/TaisyncSettings.cc @@ -15,6 +15,14 @@ QGC_LOGGING_CATEGORY(TaisyncSettingsLog, "TaisyncSettingsLog") +static const char* kPostReq = + "POST %1 HTTP/1.1\r\n" + "Content-Type: application/json\r\n" + "Content-Length: %2\r\n\r\n" + "%3"; + +static const char* kGetReq = "GET %1 HTTP/1.1\r\n\r\n"; + //----------------------------------------------------------------------------- TaisyncSettings::TaisyncSettings(QObject* parent) : TaisyncHandler(parent) @@ -29,11 +37,55 @@ TaisyncSettings::start() _start(TAISYNC_SETTINGS_PORT); } +//----------------------------------------------------------------------------- +bool +TaisyncSettings::requestSettings() +{ + if(_tcpSocket) { + QString req = QString(kGetReq).arg("/v1/baseband.json"); + _tcpSocket->write(req.toUtf8()); + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +bool +TaisyncSettings::requestFreqScan() +{ + if(_tcpSocket) { + QString req = QString(kGetReq).arg("/v1/freqscan.json"); + _tcpSocket->write(req.toUtf8()); + return true; + } + return false; +} + //----------------------------------------------------------------------------- void TaisyncSettings::_readBytes() { QByteArray bytesIn = _tcpSocket->read(_tcpSocket->bytesAvailable()); qCDebug(TaisyncSettingsLog) << "Taisync settings data:" << bytesIn.size(); + qCDebug(TaisyncSettingsLog) << QString(bytesIn); + if(bytesIn.contains("200 OK")) { + //-- Link Status? + int idx = bytesIn.indexOf('{'); + QJsonParseError jsonParseError; + QJsonDocument doc = QJsonDocument::fromJson(bytesIn.mid(idx), &jsonParseError); + if (jsonParseError.error != QJsonParseError::NoError) { + qWarning() << "Unable to parse Taisync response:" << jsonParseError.errorString() << jsonParseError.offset; + return; + } + QJsonObject jObj = doc.object(); + //-- Link Status? + if(bytesIn.contains("\"flight\":")) { + _linkConnected = jObj["flight"].toBool(_linkConnected); + _linkVidFormat = jObj["videoformat"].toString(_linkVidFormat); + _downlinkRSSI = jObj["radiorssi"].toInt(_downlinkRSSI); + _uplinkRSSI = jObj["hdrssi"].toInt(_uplinkRSSI); + emit linkChanged(); + } + } } diff --git a/src/Taisync/TaisyncSettings.h b/src/Taisync/TaisyncSettings.h index b33b8ac61..a28406100 100644 --- a/src/Taisync/TaisyncSettings.h +++ b/src/Taisync/TaisyncSettings.h @@ -18,10 +18,30 @@ class TaisyncSettings : public TaisyncHandler Q_OBJECT public: + Q_PROPERTY(bool linkConnected READ linkConnected NOTIFY linkChanged) + Q_PROPERTY(QString linkVidFormat READ linkVidFormat NOTIFY linkChanged) + Q_PROPERTY(int uplinkRSSI READ uplinkRSSI NOTIFY linkChanged) + Q_PROPERTY(int downlinkRSSI READ downlinkRSSI NOTIFY linkChanged) + explicit TaisyncSettings (QObject* parent = nullptr); void start () override; + bool requestSettings (); + bool requestFreqScan (); + + bool linkConnected () { return _linkConnected; } + QString linkVidFormat () { return _linkVidFormat; } + int uplinkRSSI () { return _downlinkRSSI; } + int downlinkRSSI () { return _uplinkRSSI; } + +signals: + void linkChanged (); protected slots: void _readBytes () override; +private: + bool _linkConnected = false; + QString _linkVidFormat; + int _downlinkRSSI = 0; + int _uplinkRSSI = 0; }; diff --git a/src/comm/TaisyncLink.cc b/src/comm/TaisyncLink.cc index c3fb75a65..f57d3036a 100644 --- a/src/comm/TaisyncLink.cc +++ b/src/comm/TaisyncLink.cc @@ -50,6 +50,7 @@ TaisyncLink::~TaisyncLink() void TaisyncLink::run() { + // Thread if(_hardwareConnect()) { exec(); } @@ -96,9 +97,11 @@ TaisyncLink::_readBytes(QByteArray bytes) void TaisyncLink::_disconnect() { + //-- Stop thread _running = false; quit(); wait(); + //-- Kill Taisync handlers if (_taiTelemetery) { _hardwareDisconnect(); emit disconnected(); @@ -129,6 +132,7 @@ TaisyncLink::_connect(void) if(_taiConfig->videoEnabled()) { //-- Hide video selection as we will be fixed to Taisync video and set the way we need it. VideoSettings* pVSettings = qgcApp()->toolbox()->settingsManager()->videoSettings(); + //-- First save current state _savedVideoSource = pVSettings->videoSource()->rawValue(); _savedVideoUDP = pVSettings->udpPort()->rawValue(); _savedAR = pVSettings->aspectRatio()->rawValue(); @@ -137,6 +141,7 @@ TaisyncLink::_connect(void) //-- iOS and Android receive raw h.264 and need a different pipeline qgcApp()->toolbox()->videoManager()->setIsTaisync(true); #endif + //-- Now set it up the way we need it do be pVSettings->setVisible(false); pVSettings->udpPort()->setRawValue(5600); pVSettings->aspectRatio()->setRawValue(1024.0 / 768.0); @@ -167,6 +172,7 @@ TaisyncLink::_hardwareDisconnect() _taiVideo = nullptr; } #endif + _connected = false; } //----------------------------------------------------------------------------- @@ -176,9 +182,11 @@ TaisyncLink::_hardwareConnect() _hardwareDisconnect(); _taiTelemetery = new TaisyncTelemetry(this); QObject::connect(_taiTelemetery, &TaisyncTelemetry::bytesReady, this, &TaisyncLink::_readBytes); + QObject::connect(_taiTelemetery, &TaisyncTelemetry::connected, this, &TaisyncLink::_telemetryReady); _taiTelemetery->start(); _taiSettings = new TaisyncSettings(this); _taiSettings->start(); + QObject::connect(_taiSettings, &TaisyncSettings::connected, this, &TaisyncLink::_settingsReady); #if defined(__ios__) || defined(__android__) if(_taiConfig->videoEnabled()) { _taiVideo = new TaisyncVideoReceiver(this); @@ -192,7 +200,7 @@ TaisyncLink::_hardwareConnect() bool TaisyncLink::isConnected() const { - return _taiTelemetery != nullptr; + return _connected; } //----------------------------------------------------------------------------- @@ -216,6 +224,25 @@ TaisyncLink::getCurrentOutDataRate() const return 0; } +//----------------------------------------------------------------------------- +void +TaisyncLink::_telemetryReady() +{ + qCDebug(TaisyncLog) << "Taisync telemetry ready"; + if(!_connected) { + _connected = true; + emit connected(); + } +} + +//----------------------------------------------------------------------------- +void +TaisyncLink::_settingsReady() +{ + qCDebug(TaisyncLog) << "Taisync settings ready"; + _taiSettings->requestSettings(); +} + //-------------------------------------------------------------------------- //-- TaisyncConfiguration diff --git a/src/comm/TaisyncLink.h b/src/comm/TaisyncLink.h index 77b3471d3..b2bb73076 100644 --- a/src/comm/TaisyncLink.h +++ b/src/comm/TaisyncLink.h @@ -81,6 +81,8 @@ public: bool isConnected () const override; QString getName () const override; + TaisyncSettings*taisyncSettings () { return _taiSettings; } + // Extensive statistics for scientific purposes qint64 getConnectionSpeed () const override; qint64 getCurrentInDataRate () const; @@ -97,6 +99,8 @@ public: private slots: void _writeBytes (const QByteArray data) override; void _readBytes (QByteArray bytes); + void _telemetryReady (); + void _settingsReady (); private: // Links are only created/destroyed by LinkManager so constructor/destructor is not public @@ -121,6 +125,7 @@ private: TaisyncVideoReceiver* _taiVideo = nullptr; #endif bool _savedVideoState = true; + bool _connected = false; QVariant _savedVideoSource; QVariant _savedVideoUDP; QVariant _savedAR; -- 2.22.0