From 91b7cef8d987ec1fd1a702edf12b49d422b7c7b7 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Thu, 27 Dec 2018 23:51:40 -0500 Subject: [PATCH] Taisync Fixes Handle crash on first time switch from disable to enabled Handle video settings restore after disabling Taisync --- src/Taisync/TaisyncManager.cc | 65 +++++++++++++++++++---------------- src/Taisync/TaisyncManager.h | 9 ++--- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/src/Taisync/TaisyncManager.cc b/src/Taisync/TaisyncManager.cc index b6141cde7..4c9b15690 100644 --- a/src/Taisync/TaisyncManager.cc +++ b/src/Taisync/TaisyncManager.cc @@ -11,6 +11,7 @@ #include "TaisyncHandler.h" #include "SettingsManager.h" #include "QGCApplication.h" +#include "QGCCorePlugin.h" #include "VideoManager.h" #include @@ -88,10 +89,6 @@ TaisyncManager::_reset() emit connectedChanged(); _linkConnected = false; emit linkConnectedChanged(); - _taiSettings = new TaisyncSettings(this); - connect(_taiSettings, &TaisyncSettings::updateSettings, this, &TaisyncManager::_updateSettings); - connect(_taiSettings, &TaisyncSettings::connected, this, &TaisyncManager::_connected); - connect(_taiSettings, &TaisyncSettings::disconnected, this, &TaisyncManager::_disconnected); if(!_appSettings) { _appSettings = _toolbox->settingsManager()->appSettings(); connect(_appSettings->enableTaisync(), &Fact::rawValueChanged, this, &TaisyncManager::_setEnabled); @@ -183,6 +180,7 @@ TaisyncManager::setToolbox(QGCToolbox* toolbox) _videoRateList.append("high"); connect(_videoRate, &Fact::_containerRawValueChanged, this, &TaisyncManager::_videoSettingsChanged); } + //-- Start it all _reset(); } @@ -286,6 +284,12 @@ TaisyncManager::_setEnabled() { bool enable = _appSettings->enableTaisync()->rawValue().toBool(); if(enable) { + if(!_taiSettings) { + _taiSettings = new TaisyncSettings(this); + connect(_taiSettings, &TaisyncSettings::updateSettings, this, &TaisyncManager::_updateSettings); + connect(_taiSettings, &TaisyncSettings::connected, this, &TaisyncManager::_connected); + connect(_taiSettings, &TaisyncSettings::disconnected, this, &TaisyncManager::_disconnected); + } #if defined(__ios__) || defined(__android__) if(!_taiTelemetery) { _taiTelemetery = new TaisyncTelemetry(this); @@ -298,7 +302,7 @@ TaisyncManager::_setEnabled() _taiTelemetery->start(); } #endif - _reqMask = REQ_ALL; + _reqMask = static_cast(REQ_ALL); _workTimer.start(1000); } else { //-- Stop everything @@ -310,6 +314,16 @@ TaisyncManager::_setEnabled() _setVideoEnabled(); } +//----------------------------------------------------------------------------- +void +TaisyncManager::_restoreVideoSettings(Fact* setting) +{ + SettingsFact* pFact = dynamic_cast(setting); + if(pFact) { + pFact->setVisible(qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(VideoSettings::settingsGroup, *setting->metaData())); + } +} + //----------------------------------------------------------------------------- void TaisyncManager::_setVideoEnabled() @@ -317,21 +331,13 @@ TaisyncManager::_setVideoEnabled() //-- Check both if video is enabled and Taisync support itself is enabled as well. bool enable = _appSettings->enableTaisyncVideo()->rawValue().toBool() && _appSettings->enableTaisync()->rawValue().toBool(); if(enable) { - //-- If we haven't already saved the previous settings... - if(!_savedVideoSource.isValid()) { - //-- 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(); - _savedVideoState = pVSettings->visible(); - //-- 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); - pVSettings->videoSource()->setRawValue(QString(VideoSettings::videoSourceUDP)); - } + //-- Set it up the way we need it do be. + VideoSettings* pVSettings = qgcApp()->toolbox()->settingsManager()->videoSettings(); + pVSettings->setVisible(false); + pVSettings->udpPort()->setRawValue(5600); + //-- TODO: this AR must come from somewhere + pVSettings->aspectRatio()->setRawValue(1024.0 / 768.0); + pVSettings->videoSource()->setRawValue(QString(VideoSettings::videoSourceUDP)); #if defined(__ios__) || defined(__android__) if(!_taiVideo) { //-- iOS and Android receive raw h.264 and need a different pipeline @@ -350,14 +356,11 @@ TaisyncManager::_setVideoEnabled() _taiVideo = nullptr; } #endif - if(!_savedVideoSource.isValid()) { - VideoSettings* pVSettings = qgcApp()->toolbox()->settingsManager()->videoSettings(); - pVSettings->videoSource()->setRawValue(_savedVideoSource); - pVSettings->udpPort()->setRawValue(_savedVideoUDP); - pVSettings->aspectRatio()->setRawValue(_savedAR); - pVSettings->setVisible(_savedVideoState); - _savedVideoSource.clear(); - } + VideoSettings* pVSettings = qgcApp()->toolbox()->settingsManager()->videoSettings(); + _restoreVideoSettings(pVSettings->videoSource()); + _restoreVideoSettings(pVSettings->aspectRatio()); + _restoreVideoSettings(pVSettings->udpPort()); + pVSettings->setVisible(true); } _enableVideo = enable; } @@ -422,8 +425,10 @@ TaisyncManager::_checkTaisync() { if(_enabled) { if(!_isConnected) { - if(!_taiSettings->isServerRunning()) { - _taiSettings->start(); + if(_taiSettings) { + if(!_taiSettings->isServerRunning()) { + _taiSettings->start(); + } } } else { //qCDebug(TaisyncVerbose) << bin << _reqMask; diff --git a/src/Taisync/TaisyncManager.h b/src/Taisync/TaisyncManager.h index 34442ddcd..9034e9d21 100644 --- a/src/Taisync/TaisyncManager.h +++ b/src/Taisync/TaisyncManager.h @@ -110,6 +110,7 @@ private slots: private: void _close (); void _reset (); + void _restoreVideoSettings (Fact* setting); FactMetaData *_createMetadata (const char *name, QStringList enums); private: @@ -122,10 +123,10 @@ private: REQ_RADIO_SETTINGS = 16, REQ_RTSP_SETTINGS = 32, REQ_IP_SETTINGS = 64, - REQ_ALL = 0xFFFFFFFF, + REQ_ALL = 0xFFFFFFF, }; - uint32_t _reqMask = REQ_ALL; + uint32_t _reqMask = static_cast(REQ_ALL); bool _running = false; bool _isConnected = false; AppSettings* _appSettings = nullptr; @@ -148,10 +149,6 @@ private: int _decodeIndex = 0; QStringList _rateList; int _rateIndex = 0; - bool _savedVideoState = true; - QVariant _savedVideoSource; - QVariant _savedVideoUDP; - QVariant _savedAR; QString _serialNumber; QString _fwVersion; Fact* _radioMode = nullptr; -- 2.22.0