diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro
index 78f5c0703539c682b47e7f4831a4059f9b406d56..7abb20264c783c43cfe0107dc058bcf9cb719ac7 100644
--- a/qgroundcontrol.pro
+++ b/qgroundcontrol.pro
@@ -512,6 +512,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 \
@@ -690,6 +691,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 4e9f6343d8bebc0786e3872521de3d69df520fe2..643946656b2e6bb763e1e10bb77422e5fb956015 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -194,6 +194,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 3cac6a5bc5826d7ac495827a46b63f476d82ba86..41223e860e0f3b7fed5075be8ac17ecb7e07e428 160000
--- a/src/GPS/Drivers
+++ b/src/GPS/Drivers
@@ -1 +1 @@
-Subproject commit 3cac6a5bc5826d7ac495827a46b63f476d82ba86
+Subproject commit 41223e860e0f3b7fed5075be8ac17ecb7e07e428
diff --git a/src/GPS/GPSManager.cc b/src/GPS/GPSManager.cc
index 1db1fad2cc68c167ac676ab23d1bdff7841f748b..0c7c8406bdbfa5b76e03a15dd54637a99bd83524 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 e9e64e29b6264a346393b5dafdc4efc8f221b662..8cac9b8892b420bf0f15211933f3e3c0a81b3d53 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 85052800194bd5f99867072e222670509184f877..a9e704f8fa26b28ce4a4e495d05c0185dbf7e25b 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 0000000000000000000000000000000000000000..4283c69696b980d55aaacbca0f36a9a1eca32ea1
--- /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 0000000000000000000000000000000000000000..1e8699162038ee57fb7dc005b840006a056397bd
--- /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 0000000000000000000000000000000000000000..467df27a1433cae4effe5294098e0de758334f54
--- /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 6c5c1a4f63fe57fe66f4491e9f281b769b74ec28..0f3608ddac19f70004545e006f515d048f0d1185 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 c56b61d43ddef5c53ccf8065c27a97752d5e429c..05b09930df01a773cfe86e685b3c42f1fc406bb6 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 ed39e4a67cee72c391750c1ea000a939ed8b9fc2..0f1a160e6c3ec22fe1d17f1e842ace12d30336e7 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 {