From 90393e32ce1da6e9775f7c40ac54c9e9c1562f0f Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Tue, 11 Apr 2017 15:13:00 -0700 Subject: [PATCH] Configurable survey in --- qgroundcontrol.pro | 2 ++ qgroundcontrol.qrc | 1 + src/GPS/Drivers | 2 +- src/GPS/GPSManager.cc | 7 +++- src/GPS/GPSProvider.cc | 23 ++++++++------ src/GPS/GPSProvider.h | 4 ++- src/Settings/RTK.SettingsGroup.json | 22 +++++++++++++ src/Settings/RTKSettings.cc | 44 ++++++++++++++++++++++++++ src/Settings/RTKSettings.h | 35 ++++++++++++++++++++ src/Settings/SettingsManager.cc | 2 ++ src/Settings/SettingsManager.h | 4 +++ src/ui/preferences/GeneralSettings.qml | 44 ++++++++++++++++++++++++++ 12 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 src/Settings/RTK.SettingsGroup.json create mode 100644 src/Settings/RTKSettings.cc create mode 100644 src/Settings/RTKSettings.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 9d4fdd951..623338d04 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -504,6 +504,7 @@ HEADERS += \ src/Settings/AppSettings.h \ src/Settings/AutoConnectSettings.h \ src/Settings/FlightMapSettings.h \ + src/Settings/RTKSettings.h \ src/Settings/SettingsGroup.h \ src/Settings/SettingsManager.h \ src/Settings/UnitsSettings.h \ @@ -682,6 +683,7 @@ SOURCES += \ src/Settings/AppSettings.cc \ src/Settings/AutoConnectSettings.cc \ src/Settings/FlightMapSettings.cc \ + src/Settings/RTKSettings.cc \ src/Settings/SettingsGroup.cc \ src/Settings/SettingsManager.cc \ src/Settings/UnitsSettings.cc \ diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index bfcbdcffb..d62898892 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -190,6 +190,7 @@ src/Settings/App.SettingsGroup.json src/Settings/AutoConnect.SettingsGroup.json src/Settings/FlightMap.SettingsGroup.json + src/Settings/RTK.SettingsGroup.json src/MissionManager/Survey.SettingsGroup.json src/Settings/Units.SettingsGroup.json src/Settings/Video.SettingsGroup.json diff --git a/src/GPS/Drivers b/src/GPS/Drivers index 3cac6a5bc..381061af5 160000 --- a/src/GPS/Drivers +++ b/src/GPS/Drivers @@ -1 +1 @@ -Subproject commit 3cac6a5bc5826d7ac495827a46b63f476d82ba86 +Subproject commit 381061af5aa2ab7a2b1fcf243d01fcd721caebae diff --git a/src/GPS/GPSManager.cc b/src/GPS/GPSManager.cc index 1db1fad2c..0c7c8406b 100644 --- a/src/GPS/GPSManager.cc +++ b/src/GPS/GPSManager.cc @@ -10,6 +10,9 @@ #include "GPSManager.h" #include "QGCLoggingCategory.h" +#include "QGCApplication.h" +#include "SettingsManager.h" +#include "RTKSettings.h" GPSManager::GPSManager(QGCApplication* app, QGCToolbox* toolbox) : QGCTool(app, toolbox) @@ -27,9 +30,11 @@ void GPSManager::connectGPS(const QString& device) { Q_ASSERT(_toolbox); + RTKSettings* rtkSettings = qgcApp()->toolbox()->settingsManager()->rtkSettings(); + cleanup(); _requestGpsStop = false; - _gpsProvider = new GPSProvider(device, true, _requestGpsStop); + _gpsProvider = new GPSProvider(device, true, rtkSettings->surveyInAccuracyLimit()->rawValue().toDouble(), rtkSettings->surveyInMinObservationDuration()->rawValue().toInt(), _requestGpsStop); _gpsProvider->start(); //create RTCM device diff --git a/src/GPS/GPSProvider.cc b/src/GPS/GPSProvider.cc index e9e64e29b..8cac9b889 100644 --- a/src/GPS/GPSProvider.cc +++ b/src/GPS/GPSProvider.cc @@ -53,18 +53,19 @@ void GPSProvider::run() _serial->setFlowControl(QSerialPort::NoFlowControl); unsigned int baudrate; - GPSHelper* gpsHelper = nullptr; + GPSDriverUBX* gpsDriver = nullptr; while (!_requestStop) { - if (gpsHelper) { - delete gpsHelper; - gpsHelper = nullptr; + if (gpsDriver) { + delete gpsDriver; + gpsDriver = nullptr; } - gpsHelper = new GPSDriverUBX(&callbackEntry, this, &_reportGpsPos, _pReportSatInfo); + gpsDriver = new GPSDriverUBX(GPSDriverUBX::Interface::UART, &callbackEntry, this, &_reportGpsPos, _pReportSatInfo); + gpsDriver->setSurveyInSpecs(_surveyInAccMeters * 10000, _surveryInDurationSecs); - if (gpsHelper->configure(baudrate, GPSHelper::OutputMode::RTCM) == 0) { + if (gpsDriver->configure(baudrate, GPSDriverUBX::OutputMode::RTCM) == 0) { /* reset report */ memset(&_reportGpsPos, 0, sizeof(_reportGpsPos)); @@ -74,7 +75,7 @@ void GPSProvider::run() int numTries = 0; while (!_requestStop && numTries < 3) { - int helperRet = gpsHelper->receive(GPS_RECEIVE_TIMEOUT); + int helperRet = gpsDriver->receive(GPS_RECEIVE_TIMEOUT); if (helperRet > 0) { numTries = 0; @@ -100,9 +101,13 @@ void GPSProvider::run() qCDebug(RTKGPSLog) << "Exiting GPS thread"; } -GPSProvider::GPSProvider(const QString& device, bool enableSatInfo, const std::atomic_bool& requestStop) - : _device(device), _requestStop(requestStop) +GPSProvider::GPSProvider(const QString& device, bool enableSatInfo, double surveyInAccMeters, int surveryInDurationSecs, const std::atomic_bool& requestStop) + : _device(device) + , _requestStop(requestStop) + , _surveyInAccMeters(surveyInAccMeters) + , _surveryInDurationSecs(surveryInDurationSecs) { + qCDebug(RTKGPSLog) << "Survey in accuracy:duration" << surveyInAccMeters << surveryInDurationSecs; if (enableSatInfo) _pReportSatInfo = new satellite_info_s(); } diff --git a/src/GPS/GPSProvider.h b/src/GPS/GPSProvider.h index 850528001..a9e704f8f 100644 --- a/src/GPS/GPSProvider.h +++ b/src/GPS/GPSProvider.h @@ -29,7 +29,7 @@ class GPSProvider : public QThread { Q_OBJECT public: - GPSProvider(const QString& device, bool enableSatInfo, const std::atomic_bool& requestStop); + GPSProvider(const QString& device, bool enableSatInfo, double surveyInAccMeters, int surveryInDurationSecs, const std::atomic_bool& requestStop); ~GPSProvider(); /** @@ -57,6 +57,8 @@ private: QString _device; const std::atomic_bool& _requestStop; + double _surveyInAccMeters; + int _surveryInDurationSecs; struct vehicle_gps_position_s _reportGpsPos; struct satellite_info_s *_pReportSatInfo = nullptr; diff --git a/src/Settings/RTK.SettingsGroup.json b/src/Settings/RTK.SettingsGroup.json new file mode 100644 index 000000000..4283c6969 --- /dev/null +++ b/src/Settings/RTK.SettingsGroup.json @@ -0,0 +1,22 @@ +[ +{ + "name": "SurveyInAccuracyLimit", + "shortDescription": "Survey in accuracy limit", + "longDescription": "The maximum accuracy allowed prior to completing survey in.", + "type": "double", + "defaultValue": 2.0, + "min": 0.5, + "units": "m", + "decimalPlaces": 1 +}, +{ + "name": "SurveyInMinObservationDuration", + "shortDescription": "Minimum observation time", + "longDescription": "Defines the minimum amount of observation time for the position calculation.", + "type": "Uint32", + "defaultValue": 180, + "min": 1, + "units": "secs", + "decimalPlaces": 0 +} +] diff --git a/src/Settings/RTKSettings.cc b/src/Settings/RTKSettings.cc new file mode 100644 index 000000000..1e8699162 --- /dev/null +++ b/src/Settings/RTKSettings.cc @@ -0,0 +1,44 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "RTKSettings.h" + +#include +#include + +const char* RTKSettings::RTKSettingsGroupName = "RTK"; +const char* RTKSettings::surveyInAccuracyLimitName = "SurveyInAccuracyLimit"; +const char* RTKSettings::surveyInMinObservationDurationName = "SurveyInMinObservationDuration"; + +RTKSettings::RTKSettings(QObject* parent) + : SettingsGroup(RTKSettingsGroupName, QString(RTKSettingsGroupName), parent) + , _surveyInAccuracyLimitFact(NULL) + , _surveyInMinObservationDurationFact(NULL) +{ + QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); + qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "RTKSettings", "Reference only"); +} + +Fact* RTKSettings::surveyInAccuracyLimit(void) +{ + if (!_surveyInAccuracyLimitFact) { + _surveyInAccuracyLimitFact = _createSettingsFact(surveyInAccuracyLimitName); + } + + return _surveyInAccuracyLimitFact; +} + +Fact* RTKSettings::surveyInMinObservationDuration(void) +{ + if (!_surveyInMinObservationDurationFact) { + _surveyInMinObservationDurationFact = _createSettingsFact(surveyInMinObservationDurationName); + } + + return _surveyInMinObservationDurationFact; +} diff --git a/src/Settings/RTKSettings.h b/src/Settings/RTKSettings.h new file mode 100644 index 000000000..467df27a1 --- /dev/null +++ b/src/Settings/RTKSettings.h @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "SettingsGroup.h" + +class RTKSettings : public SettingsGroup +{ + Q_OBJECT + +public: + RTKSettings(QObject* parent = NULL); + + Q_PROPERTY(Fact* surveyInAccuracyLimit READ surveyInAccuracyLimit CONSTANT) + Q_PROPERTY(Fact* surveyInMinObservationDuration READ surveyInMinObservationDuration CONSTANT) + + Fact* surveyInAccuracyLimit (void); + Fact* surveyInMinObservationDuration(void); + + static const char* RTKSettingsGroupName; + + static const char* surveyInAccuracyLimitName; + static const char* surveyInMinObservationDurationName; + +private: + SettingsFact* _surveyInAccuracyLimitFact; + SettingsFact* _surveyInMinObservationDurationFact; +}; diff --git a/src/Settings/SettingsManager.cc b/src/Settings/SettingsManager.cc index 6c5c1a4f6..0f3608dda 100644 --- a/src/Settings/SettingsManager.cc +++ b/src/Settings/SettingsManager.cc @@ -19,6 +19,7 @@ SettingsManager::SettingsManager(QGCApplication* app, QGCToolbox* toolbox) , _autoConnectSettings(NULL) , _videoSettings(NULL) , _flightMapSettings(NULL) + , _rtkSettings(NULL) { } @@ -34,4 +35,5 @@ void SettingsManager::setToolbox(QGCToolbox *toolbox) _autoConnectSettings = new AutoConnectSettings(this); _videoSettings = new VideoSettings(this); _flightMapSettings = new FlightMapSettings(this); + _rtkSettings = new RTKSettings(this); } diff --git a/src/Settings/SettingsManager.h b/src/Settings/SettingsManager.h index c56b61d43..05b09930d 100644 --- a/src/Settings/SettingsManager.h +++ b/src/Settings/SettingsManager.h @@ -19,6 +19,7 @@ #include "AutoConnectSettings.h" #include "VideoSettings.h" #include "FlightMapSettings.h" +#include "RTKSettings.h" #include @@ -35,6 +36,7 @@ public: Q_PROPERTY(QObject* autoConnectSettings READ autoConnectSettings CONSTANT) Q_PROPERTY(QObject* videoSettings READ videoSettings CONSTANT) Q_PROPERTY(QObject* flightMapSettings READ flightMapSettings CONSTANT) + Q_PROPERTY(QObject* rtkSettings READ rtkSettings CONSTANT) // Override from QGCTool virtual void setToolbox(QGCToolbox *toolbox); @@ -44,6 +46,7 @@ public: AutoConnectSettings* autoConnectSettings (void) { return _autoConnectSettings; } VideoSettings* videoSettings (void) { return _videoSettings; } FlightMapSettings* flightMapSettings (void) { return _flightMapSettings; } + RTKSettings* rtkSettings (void) { return _rtkSettings; } private: AppSettings* _appSettings; @@ -51,6 +54,7 @@ private: AutoConnectSettings* _autoConnectSettings; VideoSettings* _videoSettings; FlightMapSettings* _flightMapSettings; + RTKSettings* _rtkSettings; }; #endif diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index ed39e4a67..0f1a160e6 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -389,6 +389,50 @@ QGCView { } } + //----------------------------------------------------------------- + //-- RTK GPS + Item { + width: _qgcView.width * 0.8 + height: unitLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: QGroundControl.settingsManager.rtkSettings.visible + QGCLabel { + id: rtkLabel + text: qsTr("RTK GPS (Requires Restart)") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: rtkGrid.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _qgcView.width * 0.8 + color: qgcPal.windowShade + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: QGroundControl.settingsManager.rtkSettings.visible + GridLayout { + id: rtkGrid + anchors.centerIn: parent + columns: 2 + rowSpacing: ScreenTools.defaultFontPixelWidth + columnSpacing: ScreenTools.defaultFontPixelWidth + + QGCLabel { + text: qsTr("Survey in accuracy:") + } + FactTextField { + fact: QGroundControl.settingsManager.rtkSettings.surveyInAccuracyLimit + } + + QGCLabel { + text: qsTr("Minumum observation duration:") + } + FactTextField { + fact: QGroundControl.settingsManager.rtkSettings.surveyInMinObservationDuration + } + } + } + //----------------------------------------------------------------- //-- Autoconnect settings Item { -- 2.22.0