From 72f1a42b341d6d469701ff876c450ca3deaed804 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Wed, 26 Dec 2018 15:49:51 -0500 Subject: [PATCH] Done with desktop --- src/Taisync/TaisyncManager.cc | 68 ++++++++++++++++++++++++++++++--- src/Taisync/TaisyncManager.h | 6 +++ src/Taisync/TaisyncSettings.cc | 14 +++++-- src/Taisync/TaisyncSettings.qml | 67 +++++++++++++++++++++++--------- 4 files changed, 129 insertions(+), 26 deletions(-) diff --git a/src/Taisync/TaisyncManager.cc b/src/Taisync/TaisyncManager.cc index c7e1f8777..ba39d86a9 100644 --- a/src/Taisync/TaisyncManager.cc +++ b/src/Taisync/TaisyncManager.cc @@ -24,6 +24,9 @@ static const char *kVIDEO_RATE = "VideoRate"; static const char *kLOCAL_IP = "LocalIP"; static const char *kREMOTE_IP = "RemoteIP"; static const char *kNET_MASK = "NetMask"; +static const char *kRTSP_URI = "RTSPURI"; +static const char *kRTSP_ACCOUNT = "RTSPAccount"; +static const char *kRTSP_PASSWORD = "RTSPPassword"; //----------------------------------------------------------------------------- TaisyncManager::TaisyncManager(QGCApplication* app, QGCToolbox* toolbox) @@ -33,9 +36,12 @@ TaisyncManager::TaisyncManager(QGCApplication* app, QGCToolbox* toolbox) _workTimer.setSingleShot(true); QSettings settings; settings.beginGroup(kTAISYNC_GROUP); - _localIPAddr = settings.value(kLOCAL_IP, QString("192.168.199.33")).toString(); - _remoteIPAddr = settings.value(kREMOTE_IP, QString("192.168.199.16")).toString(); - _netMask = settings.value(kNET_MASK, QString("255.255.255.0")).toString(); + _localIPAddr = settings.value(kLOCAL_IP, QString("192.168.199.33")).toString(); + _remoteIPAddr = settings.value(kREMOTE_IP, QString("192.168.199.16")).toString(); + _netMask = settings.value(kNET_MASK, QString("255.255.255.0")).toString(); + _rtspURI = settings.value(kRTSP_URI, QString("rtsp://192.168.0.2")).toString(); + _rtspAccount = settings.value(kRTSP_ACCOUNT, QString("admin")).toString(); + _rtspPassword = settings.value(kRTSP_PASSWORD, QString("12345678")).toString(); settings.endGroup(); } @@ -80,6 +86,8 @@ TaisyncManager::_reset() _close(); _isConnected = false; emit connectedChanged(); + _linkConnected = false; + emit linkConnectedChanged(); _taiSettings = new TaisyncSettings(this); connect(_taiSettings, &TaisyncSettings::updateSettings, this, &TaisyncManager::_updateSettings); connect(_taiSettings, &TaisyncSettings::connected, this, &TaisyncManager::_connected); @@ -186,7 +194,23 @@ bool TaisyncManager::setRTSPSettings(QString uri, QString account, QString password) { if(_taiSettings) { - return _taiSettings->setRTSPSettings(uri, account, password); + if(_taiSettings->setRTSPSettings(uri, account, password)) { + _rtspURI = uri; + _rtspAccount = account; + _rtspPassword = password; + QSettings settings; + settings.beginGroup(kTAISYNC_GROUP); + settings.setValue(kRTSP_URI, _rtspURI); + settings.setValue(kRTSP_ACCOUNT, _rtspAccount); + settings.setValue(kRTSP_PASSWORD, _rtspPassword); + settings.endGroup(); + emit rtspURIChanged(); + emit rtspAccountChanged(); + emit rtspPasswordChanged(); + _needReboot = true; + emit needRebootChanged(); + return true; + } } return false; } @@ -198,10 +222,14 @@ TaisyncManager::setIPSettings(QString localIP_, QString remoteIP_, QString netMa bool res = false; if(_localIPAddr != localIP_ || _remoteIPAddr != remoteIP_ || _netMask != netMask_) { //-- If we are connected to the Taisync - if(_linkConnected) { + if(_isConnected) { if(_taiSettings) { //-- Change IP settings res = _taiSettings->setIPSettings(localIP_, remoteIP_, netMask_); + if(res) { + _needReboot = true; + emit needRebootChanged(); + } } } else { //-- We're not connected. Record the change and restart. @@ -369,6 +397,8 @@ TaisyncManager::_connected() qCDebug(TaisyncLog) << "Taisync Settings Connected"; _isConnected = true; emit connectedChanged(); + _needReboot = false; + emit needRebootChanged(); } //----------------------------------------------------------------------------- @@ -378,6 +408,10 @@ TaisyncManager::_disconnected() qCDebug(TaisyncLog) << "Taisync Settings Disconnected"; _isConnected = false; emit connectedChanged(); + _needReboot = false; + emit needRebootChanged(); + _linkConnected = false; + emit linkConnectedChanged(); _reset(); } @@ -424,6 +458,17 @@ TaisyncManager::_checkTaisync() _taiSettings->requestIPSettings(); break; } + //-- Check link status + if(_timeoutTimer.elapsed() > 3000) { + //-- Give up and restart + _disconnected(); + break; + } + //-- If it's been too long since we last heard, ping it. + if(_timeoutTimer.elapsed() > 1000) { + _taiSettings->requestLinkStatus(); + break; + } break; } } @@ -435,6 +480,7 @@ TaisyncManager::_checkTaisync() void TaisyncManager::_updateSettings(QByteArray jSonData) { + _timeoutTimer.start(); qCDebug(TaisyncVerbose) << jSonData; QJsonParseError jsonParseError; QJsonDocument doc = QJsonDocument::fromJson(jSonData, &jsonParseError); @@ -522,20 +568,32 @@ TaisyncManager::_updateSettings(QByteArray jSonData) //-- RTSP URI Settings? } else if(jSonData.contains("\"rtspURI\":")) { QString value; + bool changed = false; value = jObj["rtspURI"].toString(_rtspURI); if(value != _rtspURI) { _rtspURI = value; + changed = true; emit rtspURIChanged(); } value = jObj["account"].toString(_rtspAccount); if(value != _rtspAccount) { _rtspAccount = value; + changed = true; emit rtspAccountChanged(); } value = jObj["passwd"].toString(_rtspPassword); if(value != _rtspPassword) { _rtspPassword = value; + changed = true; emit rtspPasswordChanged(); } + if(changed) { + QSettings settings; + settings.beginGroup(kTAISYNC_GROUP); + settings.setValue(kRTSP_URI, _rtspURI); + settings.setValue(kRTSP_ACCOUNT, _rtspAccount); + settings.setValue(kRTSP_PASSWORD, _rtspPassword); + settings.endGroup(); + } } } diff --git a/src/Taisync/TaisyncManager.h b/src/Taisync/TaisyncManager.h index 2f9b4ba4d..34442ddcd 100644 --- a/src/Taisync/TaisyncManager.h +++ b/src/Taisync/TaisyncManager.h @@ -19,6 +19,7 @@ #endif #include +#include class AppSettings; class QGCApplication; @@ -31,6 +32,7 @@ public: Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged) Q_PROPERTY(bool linkConnected READ linkConnected NOTIFY linkConnectedChanged) + Q_PROPERTY(bool needReboot READ needReboot NOTIFY needRebootChanged) Q_PROPERTY(QString linkVidFormat READ linkVidFormat NOTIFY linkChanged) Q_PROPERTY(int uplinkRSSI READ uplinkRSSI NOTIFY linkChanged) Q_PROPERTY(int downlinkRSSI READ downlinkRSSI NOTIFY linkChanged) @@ -58,6 +60,7 @@ public: bool connected () { return _isConnected; } bool linkConnected () { return _linkConnected; } + bool needReboot () { return _needReboot; } QString linkVidFormat () { return _linkVidFormat; } int uplinkRSSI () { return _downlinkRSSI; } int downlinkRSSI () { return _uplinkRSSI; } @@ -88,6 +91,7 @@ signals: void localIPAddrChanged (); void remoteIPAddrChanged (); void netMaskChanged (); + void needRebootChanged (); private slots: void _connected (); @@ -135,6 +139,7 @@ private: bool _enableVideo = true; bool _enabled = true; bool _linkConnected = false; + bool _needReboot = false; QTimer _workTimer; QString _linkVidFormat; int _downlinkRSSI = 0; @@ -163,4 +168,5 @@ private: QString _localIPAddr; QString _remoteIPAddr; QString _netMask; + QTime _timeoutTimer; }; diff --git a/src/Taisync/TaisyncSettings.cc b/src/Taisync/TaisyncSettings.cc index a78ae0ae6..29d03c975 100644 --- a/src/Taisync/TaisyncSettings.cc +++ b/src/Taisync/TaisyncSettings.cc @@ -158,12 +158,18 @@ void TaisyncSettings::_readBytes() { QByteArray bytesIn = _tcpSocket->read(_tcpSocket->bytesAvailable()); - //qCDebug(TaisyncVerbose) << "Taisync settings data:" << bytesIn.size(); - //qCDebug(TaisyncVerbose) << QString(bytesIn); //-- Go straight to Json payload int idx = bytesIn.indexOf('{'); - if(idx > 0) { - emit updateSettings(bytesIn.mid(idx)); + //-- We may receive more than one response within one TCP packet. + while(idx >= 0) { + bytesIn = bytesIn.mid(idx); + idx = bytesIn.indexOf('}'); + if(idx > 0) { + QByteArray data = bytesIn.left(idx + 1); + emit updateSettings(data); + bytesIn = bytesIn.mid(idx+1); + idx = bytesIn.indexOf('{'); + } } } diff --git a/src/Taisync/TaisyncSettings.qml b/src/Taisync/TaisyncSettings.qml index 41651d920..a002b84e4 100644 --- a/src/Taisync/TaisyncSettings.qml +++ b/src/Taisync/TaisyncSettings.qml @@ -58,6 +58,13 @@ QGCView { width: _qgcView.width spacing: ScreenTools.defaultFontPixelHeight * 0.5 anchors.margins: ScreenTools.defaultFontPixelWidth + QGCLabel { + text: qsTr("Reboot ground unit for changes to take effect.") + color: qgcPal.colorOrange + visible: QGroundControl.taisyncManager.needReboot + font.family: ScreenTools.demiboldFontFamily + anchors.horizontalCenter: parent.horizontalCenter + } //----------------------------------------------------------------- //-- General Item { @@ -86,13 +93,14 @@ QGCView { FactCheckBox { text: qsTr("Enable Taisync") fact: _taisyncEnabledFact + enabled: !QGroundControl.taisyncManager.needReboot visible: _taisyncEnabledFact.visible } FactCheckBox { text: qsTr("Enable Taisync Video") fact: _taisyncVideoEnabledFact visible: _taisyncVideoEnabledFact.visible - enabled: _taisyncEnabled + enabled: _taisyncEnabled && !QGroundControl.taisyncManager.needReboot } } } @@ -245,7 +253,7 @@ QGCView { FactComboBox { fact: QGroundControl.taisyncManager.radioMode indexModel: true - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.linkConnected && !QGroundControl.taisyncManager.needReboot Layout.minimumWidth: _valueWidth } QGCLabel { @@ -254,7 +262,7 @@ QGCView { FactComboBox { fact: QGroundControl.taisyncManager.radioChannel indexModel: true - enabled: QGroundControl.taisyncManager.linkConnected && QGroundControl.taisyncManager.radioMode.rawValue > 0 + enabled: QGroundControl.taisyncManager.linkConnected && QGroundControl.taisyncManager.radioMode.rawValue > 0 && !QGroundControl.taisyncManager.needReboot Layout.minimumWidth: _valueWidth } } @@ -298,7 +306,7 @@ QGCView { FactComboBox { fact: QGroundControl.taisyncManager.videoOutput indexModel: true - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.linkConnected && !QGroundControl.taisyncManager.needReboot Layout.minimumWidth: _valueWidth } QGCLabel { @@ -307,7 +315,7 @@ QGCView { FactComboBox { fact: QGroundControl.taisyncManager.videoMode indexModel: true - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.linkConnected && !QGroundControl.taisyncManager.needReboot Layout.minimumWidth: _valueWidth } QGCLabel { @@ -316,7 +324,7 @@ QGCView { FactComboBox { fact: QGroundControl.taisyncManager.videoRate indexModel: true - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.linkConnected && !QGroundControl.taisyncManager.needReboot Layout.minimumWidth: _valueWidth } } @@ -329,7 +337,7 @@ QGCView { height: rtspSettingsLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: _taisyncEnabled && QGroundControl.taisyncManager.linkConnected + visible: _taisyncEnabled && QGroundControl.taisyncManager.connected QGCLabel { id: rtspSettingsLabel text: qsTr("Streaming Settings") @@ -340,7 +348,7 @@ QGCView { height: rtspSettingsCol.height + (ScreenTools.defaultFontPixelHeight * 2) width: _panelWidth color: qgcPal.windowShade - visible: _taisyncEnabled && QGroundControl.taisyncManager.linkConnected + visible: _taisyncEnabled && QGroundControl.taisyncManager.connected anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter Column { @@ -360,7 +368,7 @@ QGCView { QGCTextField { id: rtspURI text: QGroundControl.taisyncManager.rtspURI - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.connected && !QGroundControl.taisyncManager.needReboot inputMethodHints: Qt.ImhUrlCharactersOnly Layout.minimumWidth: _valueWidth } @@ -370,7 +378,7 @@ QGCView { QGCTextField { id: rtspAccount text: QGroundControl.taisyncManager.rtspAccount - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.connected && !QGroundControl.taisyncManager.needReboot Layout.minimumWidth: _valueWidth } QGCLabel { @@ -379,28 +387,46 @@ QGCView { QGCTextField { id: rtspPassword text: QGroundControl.taisyncManager.rtspPassword - enabled: QGroundControl.taisyncManager.linkConnected + enabled: QGroundControl.taisyncManager.connected && !QGroundControl.taisyncManager.needReboot inputMethodHints: Qt.ImhHiddenText Layout.minimumWidth: _valueWidth } } + Item { + width: 1 + height: ScreenTools.defaultFontPixelHeight + } QGCButton { function testEnabled() { - if(!QGroundControl.taisyncManager.linkConnected) + if(!QGroundControl.taisyncManager.connected) return false if(rtspPassword.text === QGroundControl.taisyncManager.rtspPassword && - rtspAccount === QGroundControl.taisyncManager.rtspAccount && - rtspURI === QGroundControl.taisyncManager.rtspURI) + rtspAccount.text === QGroundControl.taisyncManager.rtspAccount && + rtspURI.text === QGroundControl.taisyncManager.rtspURI) return false if(rtspURI === "") return false return true } - enabled: testEnabled() + enabled: testEnabled() && !QGroundControl.taisyncManager.needReboot text: qsTr("Apply") anchors.horizontalCenter: parent.horizontalCenter onClicked: { - + setRTSPDialog.open() + } + MessageDialog { + id: setRTSPDialog + icon: StandardIcon.Warning + standardButtons: StandardButton.Yes | StandardButton.No + title: qsTr("Set Streaming Settings") + text: qsTr("Once changed, you will need to reboot the ground unit for the changes to take effect.\n\nConfirm change?") + onYes: { + QGroundControl.taisyncManager.setRTSPSettings(rtspURI.text, rtspAccount.text, rtspPassword.text) + setRTSPDialog.close() + } + onNo: { + setRTSPDialog.close() + } } } } @@ -443,6 +469,7 @@ QGCView { QGCTextField { id: localIP text: QGroundControl.taisyncManager.localIPAddr + enabled: !QGroundControl.taisyncManager.needReboot inputMethodHints: Qt.ImhFormattedNumbersOnly Layout.minimumWidth: _valueWidth } @@ -452,6 +479,7 @@ QGCView { QGCTextField { id: remoteIP text: QGroundControl.taisyncManager.remoteIPAddr + enabled: !QGroundControl.taisyncManager.needReboot inputMethodHints: Qt.ImhFormattedNumbersOnly Layout.minimumWidth: _valueWidth } @@ -461,10 +489,15 @@ QGCView { QGCTextField { id: netMask text: QGroundControl.taisyncManager.netMask + enabled: !QGroundControl.taisyncManager.needReboot inputMethodHints: Qt.ImhFormattedNumbersOnly Layout.minimumWidth: _valueWidth } } + Item { + width: 1 + height: ScreenTools.defaultFontPixelHeight + } QGCButton { function validateIPaddress(ipaddress) { if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress)) @@ -481,7 +514,7 @@ QGCView { if(!validateIPaddress(netMask.text)) return false return true } - enabled: testEnabled() + enabled: testEnabled() && !QGroundControl.taisyncManager.needReboot text: qsTr("Apply") anchors.horizontalCenter: parent.horizontalCenter onClicked: { -- 2.22.0