From 21d9ae69dc54f3f53a22490d58990b6189350e67 Mon Sep 17 00:00:00 2001 From: Gus Grubba Date: Sat, 22 Dec 2018 23:08:32 -0500 Subject: [PATCH] Initial work on POST settings (not done yet) --- src/Taisync/TaisyncManager.cc | 56 ++++++++++++++++++++++++++++++++++++++--- src/Taisync/TaisyncManager.h | 42 ++++++++++++++++++------------- src/Taisync/TaisyncSettings.cc | 29 ++++++++++++++++++--- src/Taisync/TaisyncSettings.h | 2 ++ src/Taisync/TaisyncSettings.qml | 53 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 157 insertions(+), 25 deletions(-) diff --git a/src/Taisync/TaisyncManager.cc b/src/Taisync/TaisyncManager.cc index eddeb5d..49b775e 100644 --- a/src/Taisync/TaisyncManager.cc +++ b/src/Taisync/TaisyncManager.cc @@ -13,6 +13,14 @@ #include "QGCApplication.h" #include "VideoManager.h" +static const char *kRADIO_MODE = "RadioMode"; +static const char *kRadioModeValues[] = { + "auto", + "manual" +}; + +static const char *kRADIO_CHANNEL = "RadioChannel"; + //----------------------------------------------------------------------------- TaisyncManager::TaisyncManager(QGCApplication* app, QGCToolbox* toolbox) : QGCTool(app, toolbox) @@ -27,6 +35,15 @@ TaisyncManager::TaisyncManager(QGCApplication* app, QGCToolbox* toolbox) } //----------------------------------------------------------------------------- +void +TaisyncManager::_radioSettingsChanged(QVariant) +{ + if(_taiSettings) { + _taiSettings->setRadioSettings(kRadioModeValues[_radioMode->rawValue().toInt()], _radioChannel->enumStringValue()); + } +} + +//----------------------------------------------------------------------------- TaisyncManager::~TaisyncManager() { _close(); @@ -85,6 +102,37 @@ void TaisyncManager::setToolbox(QGCToolbox* toolbox) { QGCTool::setToolbox(toolbox); + { + //-- Radio Mode + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, kRADIO_MODE, this); + QQmlEngine::setObjectOwnership(metaData, QQmlEngine::CppOwnership); + metaData->setShortDescription(kRADIO_MODE); + metaData->setLongDescription(kRADIO_MODE); + metaData->setRawDefaultValue(QVariant(0)); + metaData->setHasControl(true); + metaData->setReadOnly(false); + metaData->addEnumInfo(tr("Auto"), QVariant(0)); + metaData->addEnumInfo(tr("Manual"), QVariant(1)); + _radioMode = new Fact("Taisync", metaData, this); + QQmlEngine::setObjectOwnership(_radioMode, QQmlEngine::CppOwnership); + connect(_radioMode, &Fact::rawValueChanged, this, &TaisyncManager::_radioSettingsChanged); + } + { + //-- Radio Channel + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, kRADIO_CHANNEL, this); + QQmlEngine::setObjectOwnership(metaData, QQmlEngine::CppOwnership); + metaData->setShortDescription(kRADIO_CHANNEL); + metaData->setLongDescription(kRADIO_CHANNEL); + metaData->setRawDefaultValue(QVariant(0)); + metaData->setHasControl(true); + metaData->setReadOnly(false); + for(int i = 0; i < 13; i++) { + metaData->addEnumInfo(QString("ch%1").arg(i), QVariant(i)); + } + _radioChannel = new Fact("Taisync", metaData, this); + QQmlEngine::setObjectOwnership(_radioChannel, QQmlEngine::CppOwnership); + connect(_radioChannel, &Fact::rawValueChanged, this, &TaisyncManager::_radioSettingsChanged); + } _reset(); } @@ -266,7 +314,6 @@ TaisyncManager::_checkTaisync() void TaisyncManager::_updateSettings(QByteArray jSonData) { - qDebug() << jSonData; QJsonParseError jsonParseError; QJsonDocument doc = QJsonDocument::fromJson(jSonData, &jsonParseError); if (jsonParseError.error != QJsonParseError::NoError) { @@ -301,9 +348,10 @@ TaisyncManager::_updateSettings(QByteArray jSonData) } //-- Radio Settings? } else if(jSonData.contains("\"freq\":")) { - // {\"mode\":\"auto\",\"freq\":\"ch12\"} - - + QString mode = jObj["mode"].toString(_radioMode->enumStringValue()); + QString channel = jObj["freq"].toString(_radioChannel->enumStringValue()); + _radioMode->_containerSetRawValue(mode); + _radioChannel->_containerSetRawValue(channel); //-- Video Settings? } else if(jSonData.contains("\"maxbitrate\":")) { //{\"decode\":\"phone\",\"mode\":\"h264\",\"maxbitrate\":\"high\"} diff --git a/src/Taisync/TaisyncManager.h b/src/Taisync/TaisyncManager.h index 893a506..36715ff 100644 --- a/src/Taisync/TaisyncManager.h +++ b/src/Taisync/TaisyncManager.h @@ -12,6 +12,7 @@ #include "QGCToolbox.h" #include "QGCLoggingCategory.h" #include "TaisyncSettings.h" +#include "Fact.h" #if defined(__ios__) || defined(__android__) #include "TaisyncTelemetry.h" #include "TaisyncVideoReceiver.h" @@ -39,6 +40,8 @@ public: Q_PROPERTY(int decodeIndex READ decodeIndex WRITE setDecodeIndex NOTIFY decodeIndexChanged) Q_PROPERTY(QStringList rateList READ rateList NOTIFY rateIndexChanged) Q_PROPERTY(int rateIndex READ rateIndex WRITE setRateIndex NOTIFY rateIndexChanged) + Q_PROPERTY(Fact* radioMode READ radioMode CONSTANT) + Q_PROPERTY(Fact* radioChannel READ radioChannel CONSTANT) explicit TaisyncManager (QGCApplication* app, QGCToolbox* toolbox); ~TaisyncManager () override; @@ -58,6 +61,8 @@ public: QStringList rateList () { return _rateList; } int rateIndex () { return _rateIndex; } void setRateIndex (int idx); + Fact* radioMode () { return _radioMode; } + Fact* radioChannel () { return _radioChannel; } signals: void linkChanged (); @@ -74,6 +79,7 @@ private slots: void _updateSettings (QByteArray jSonData); void _setEnabled (); void _setVideoEnabled (); + void _radioSettingsChanged (QVariant); #if defined(__ios__) || defined(__android__) void _readUDPBytes (); void _readTelemBytes (QByteArray bytesIn); @@ -105,21 +111,23 @@ private: TaisyncVideoReceiver* _taiVideo = nullptr; QUdpSocket* _telemetrySocket= nullptr; #endif - bool _enableVideo = true; - bool _enabled = true; - bool _linkConnected = false; - QTimer _workTimer; - QString _linkVidFormat; - int _downlinkRSSI = 0; - int _uplinkRSSI = 0; - QStringList _decodeList; - int _decodeIndex = 0; - QStringList _rateList; - int _rateIndex = 0; - bool _savedVideoState = true; - QVariant _savedVideoSource; - QVariant _savedVideoUDP; - QVariant _savedAR; - QString _serialNumber; - QString _fwVersion; + bool _enableVideo = true; + bool _enabled = true; + bool _linkConnected = false; + QTimer _workTimer; + QString _linkVidFormat; + int _downlinkRSSI = 0; + int _uplinkRSSI = 0; + QStringList _decodeList; + int _decodeIndex = 0; + QStringList _rateList; + int _rateIndex = 0; + bool _savedVideoState = true; + QVariant _savedVideoSource; + QVariant _savedVideoUDP; + QVariant _savedAR; + QString _serialNumber; + QString _fwVersion; + Fact* _radioMode = nullptr; + Fact* _radioChannel = nullptr; }; diff --git a/src/Taisync/TaisyncSettings.cc b/src/Taisync/TaisyncSettings.cc index 0bc693c..98d0019 100644 --- a/src/Taisync/TaisyncSettings.cc +++ b/src/Taisync/TaisyncSettings.cc @@ -13,15 +13,14 @@ #include "QGCApplication.h" #include "VideoManager.h" -/* 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"; +static const char* kGetReq = "GET %1 HTTP/1.1\r\n\r\n"; +static const char* kRadioURI = "/v1/radio.json"; //----------------------------------------------------------------------------- TaisyncSettings::TaisyncSettings(QObject* parent) @@ -72,7 +71,7 @@ TaisyncSettings::requestVideoSettings() bool TaisyncSettings::requestRadioSettings() { - return _request("/v1/radio.json"); + return _request(kRadioURI); } //----------------------------------------------------------------------------- @@ -89,6 +88,28 @@ TaisyncSettings::_request(const QString& request) } //----------------------------------------------------------------------------- +bool +TaisyncSettings::_post(const QString& post, const QString &postPayload) +{ + if(_tcpSocket) { + QString req = QString(kPostReq).arg(post).arg(postPayload.size()).arg(postPayload); + qCDebug(TaisyncVerbose) << "Request" << req; + _tcpSocket->write(req.toUtf8()); + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +bool +TaisyncSettings::setRadioSettings(const QString& mode, const QString& channel) +{ + static const char* kRadioPost = "{\"mode\":\"%1\",\"freq\":\"%2\"}"; + QString post = QString(kRadioPost).arg(mode.size()).arg(channel); + return _post(kRadioURI, post); +} + +//----------------------------------------------------------------------------- void TaisyncSettings::_readBytes() { diff --git a/src/Taisync/TaisyncSettings.h b/src/Taisync/TaisyncSettings.h index 06545aa..bb2f407 100644 --- a/src/Taisync/TaisyncSettings.h +++ b/src/Taisync/TaisyncSettings.h @@ -22,6 +22,7 @@ public: bool requestFreqScan (); bool requestVideoSettings (); bool requestRadioSettings (); + bool setRadioSettings (const QString& mode, const QString& channel); signals: void updateSettings (QByteArray jSonData); @@ -31,4 +32,5 @@ protected slots: private: bool _request (const QString& request); + bool _post (const QString& post, const QString& postPayload); }; diff --git a/src/Taisync/TaisyncSettings.qml b/src/Taisync/TaisyncSettings.qml index a239f0f..30a34af 100644 --- a/src/Taisync/TaisyncSettings.qml +++ b/src/Taisync/TaisyncSettings.qml @@ -207,6 +207,59 @@ QGCView { } } } + //----------------------------------------------------------------- + //-- Radio Settings + Item { + width: _panelWidth + height: radioSettingsLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: _taisyncEnabled + QGCLabel { + id: radioSettingsLabel + text: qsTr("Radio Settings") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: radioSettingsCol.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + visible: _taisyncEnabled + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + Column { + id: radioSettingsCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + width: parent.width + anchors.centerIn: parent + GridLayout { + anchors.margins: ScreenTools.defaultFontPixelHeight + columnSpacing: ScreenTools.defaultFontPixelWidth * 2 + anchors.horizontalCenter: parent.horizontalCenter + columns: 2 + QGCLabel { + text: qsTr("Radio Mode:") + Layout.minimumWidth: _labelWidth + } + FactComboBox { + fact: QGroundControl.taisyncManager.radioMode + indexModel: true + enabled: QGroundControl.taisyncManager.linkConnected + Layout.minimumWidth: _valueWidth + } + QGCLabel { + text: qsTr("Radio Frequency:") + } + FactComboBox { + fact: QGroundControl.taisyncManager.radioChannel + indexModel: true + enabled: QGroundControl.taisyncManager.linkConnected && QGroundControl.taisyncManager.radioMode.rawValue > 0 + Layout.minimumWidth: _valueWidth + } + } + } + } } } }