diff --git a/src/GPS/GPSManager.cc b/src/GPS/GPSManager.cc index bd55d10347b2fa5c721c75f422288558b07960b3..47e917aad33a32ae814aead015e9b5d80bccbe7f 100644 --- a/src/GPS/GPSManager.cc +++ b/src/GPS/GPSManager.cc @@ -26,13 +26,22 @@ GPSManager::~GPSManager() disconnectGPS(); } -void GPSManager::connectGPS(const QString& device) +void GPSManager::connectGPS(const QString& device, const QString& gps_type) { RTKSettings* rtkSettings = qgcApp()->toolbox()->settingsManager()->rtkSettings(); + GPSProvider::GPSType type; + if (gps_type.contains("trimble", Qt::CaseInsensitive)) { + type = GPSProvider::GPSType::trimble; + qCDebug(RTKGPSLog) << "Connecting Trimble device"; + } else { + type = GPSProvider::GPSType::u_blox; + qCDebug(RTKGPSLog) << "Connecting U-blox device"; + } + disconnectGPS(); _requestGpsStop = false; - _gpsProvider = new GPSProvider(device, true, rtkSettings->surveyInAccuracyLimit()->rawValue().toDouble(), rtkSettings->surveyInMinObservationDuration()->rawValue().toInt(), _requestGpsStop); + _gpsProvider = new GPSProvider(device, type, true, rtkSettings->surveyInAccuracyLimit()->rawValue().toDouble(), rtkSettings->surveyInMinObservationDuration()->rawValue().toInt(), _requestGpsStop); _gpsProvider->start(); //create RTCM device diff --git a/src/GPS/GPSManager.h b/src/GPS/GPSManager.h index e116f383fcba3965fddea258ddc39f191c10ca96..35ad57388fcdc479f20cca27f792cdbaaaf7ecfa 100644 --- a/src/GPS/GPSManager.h +++ b/src/GPS/GPSManager.h @@ -28,7 +28,7 @@ public: GPSManager(QGCApplication* app, QGCToolbox* toolbox); ~GPSManager(); - void connectGPS (const QString& device); + void connectGPS (const QString& device, const QString& gps_type); void disconnectGPS (void); bool connected (void) const { return _gpsProvider && _gpsProvider->isRunning(); } diff --git a/src/GPS/GPSProvider.cc b/src/GPS/GPSProvider.cc index d993908c0fc8072ab2fa6da79c268be27074ccfb..8a4d8d7a6e4e743bb254d9aa96d60e5110d04add 100644 --- a/src/GPS/GPSProvider.cc +++ b/src/GPS/GPSProvider.cc @@ -16,6 +16,7 @@ #include #include "Drivers/src/ubx.h" +#include "Drivers/src/ashtech.h" #include "Drivers/src/gps_helper.h" #include "definitions.h" @@ -53,7 +54,7 @@ void GPSProvider::run() _serial->setFlowControl(QSerialPort::NoFlowControl); unsigned int baudrate; - GPSDriverUBX* gpsDriver = nullptr; + GPSHelper* gpsDriver = nullptr; while (!_requestStop) { @@ -62,8 +63,13 @@ void GPSProvider::run() gpsDriver = nullptr; } - gpsDriver = new GPSDriverUBX(GPSDriverUBX::Interface::UART, &callbackEntry, this, &_reportGpsPos, _pReportSatInfo); - baudrate = 0; // auto-configure + if (_type == GPSType::trimble) { + gpsDriver = new GPSDriverAshtech(&callbackEntry, this, &_reportGpsPos, _pReportSatInfo); + baudrate = 115200; + } else { + gpsDriver = new GPSDriverUBX(GPSDriverUBX::Interface::UART, &callbackEntry, this, &_reportGpsPos, _pReportSatInfo); + baudrate = 0; // auto-configure + } gpsDriver->setSurveyInSpecs(_surveyInAccMeters * 10000, _surveryInDurationSecs); if (gpsDriver->configure(baudrate, GPSDriverUBX::OutputMode::RTCM) == 0) { @@ -102,8 +108,9 @@ void GPSProvider::run() qCDebug(RTKGPSLog) << "Exiting GPS thread"; } -GPSProvider::GPSProvider(const QString& device, bool enableSatInfo, double surveyInAccMeters, int surveryInDurationSecs, const std::atomic_bool& requestStop) +GPSProvider::GPSProvider(const QString& device, GPSType type, bool enableSatInfo, double surveyInAccMeters, int surveryInDurationSecs, const std::atomic_bool& requestStop) : _device(device) + , _type(type) , _requestStop(requestStop) , _surveyInAccMeters(surveyInAccMeters) , _surveryInDurationSecs(surveryInDurationSecs) diff --git a/src/GPS/GPSProvider.h b/src/GPS/GPSProvider.h index c2b5c7e12cf4e1b2d80c07b33dd405093aecf31f..006dd494c21c91649d7dbf02f309ccbc02026134 100644 --- a/src/GPS/GPSProvider.h +++ b/src/GPS/GPSProvider.h @@ -29,7 +29,14 @@ class GPSProvider : public QThread { Q_OBJECT public: - GPSProvider(const QString& device, bool enableSatInfo, double surveyInAccMeters, int surveryInDurationSecs, const std::atomic_bool& requestStop); + + enum class GPSType { + u_blox, + trimble + }; + + GPSProvider(const QString& device, GPSType type, bool enableSatInfo, double surveyInAccMeters, int surveryInDurationSecs, + const std::atomic_bool& requestStop); ~GPSProvider(); /** @@ -57,6 +64,7 @@ private: int callback(GPSCallbackType type, void *data1, int data2); QString _device; + GPSType _type; const std::atomic_bool& _requestStop; double _surveyInAccMeters; int _surveryInDurationSecs; diff --git a/src/comm/LinkManager.cc b/src/comm/LinkManager.cc index ada53b2cdfde80d65e8b2a8683249b42332f32fe..0030c273c233004250d5fc89eb877087ffe62799 100644 --- a/src/comm/LinkManager.cc +++ b/src/comm/LinkManager.cc @@ -586,7 +586,7 @@ void LinkManager::_updateAutoConnectLinks(void) if (_autoConnectSettings->autoConnectRTKGPS()->rawValue().toBool() && !_toolbox->gpsManager()->connected()) { qCDebug(LinkManagerLog) << "RTK GPS auto-connected" << portInfo.portName().trimmed(); _autoConnectRTKPort = portInfo.systemLocation(); - _toolbox->gpsManager()->connectGPS(portInfo.systemLocation()); + _toolbox->gpsManager()->connectGPS(portInfo.systemLocation(), boardName); } break; #endif diff --git a/src/comm/USBBoardInfo.json b/src/comm/USBBoardInfo.json index dd24ff692fec3da289ac439bf71e106d71aa5fe4..f68a71f0bd1f77ce8302f290182d605b086f7464 100644 --- a/src/comm/USBBoardInfo.json +++ b/src/comm/USBBoardInfo.json @@ -27,7 +27,8 @@ { "vendorID": 1027, "productID": 24577, "boardClass": "SiK Radio", "name": "SiK Radio", "comment": "3DR Radio on FTDI" }, { "vendorID": 4292, "productID": 60000, "boardClass": "SiK Radio", "name": "SiK Radio", "comment": "SILabs Radio" }, - { "vendorID": 5446, "productID": 424, "boardClass": "RTK GPS", "name": "RTK GPS", "comment": "Ublox RTK GPS" }, + { "vendorID": 5446, "productID": 424, "boardClass": "RTK GPS", "name": "U-blox RTK GPS", "comment": "U-blox RTK GPS" }, + { "vendorID": 1317, "productID": 42151, "boardClass": "RTK GPS", "name": "Trimble RTK GPS", "comment": "Trimble RTK GPS" }, { "vendorID": 8352, "productID": 16732, "boardClass": "OpenPilot", "name": "OpenPilot OPLink" }, { "vendorID": 8352, "productID": 16733, "boardClass": "OpenPilot", "name": "OpenPilot CC3D" }, diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index 2a3c6b6aa48615fe4fff5088187c3c56ef995b4d..a82c319726efea81cd9eeca296955771b82a9d79 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -402,7 +402,7 @@ QGCView { anchors.horizontalCenter: parent.horizontalCenter columns: 2 - QGCLabel { text: qsTr("Survey in accuracy") } + QGCLabel { text: qsTr("Survey in accuracy (U-blox only)") } FactTextField { Layout.preferredWidth: _valueFieldWidth fact: QGroundControl.settingsManager.rtkSettings.surveyInAccuracyLimit diff --git a/src/ui/toolbar/GPSRTKIndicator.qml b/src/ui/toolbar/GPSRTKIndicator.qml index 7dfe170ae263037081b1e04600a3fda4e89b82ee..767278bd6b574c889195bc2bd42905e67f172c60 100644 --- a/src/ui/toolbar/GPSRTKIndicator.qml +++ b/src/ui/toolbar/GPSRTKIndicator.qml @@ -69,9 +69,11 @@ Item { QGCLabel { // during survey-in show the current accuracy, after that show the final accuracy text: QGroundControl.gpsRtk.valid.value ? qsTr("Accuracy:") : qsTr("Current Accuracy:") + visible: QGroundControl.gpsRtk.currentAccuracy.value > 0 } QGCLabel { text: QGroundControl.gpsRtk.currentAccuracy.valueString + " " + QGroundControl.appSettingsDistanceUnitsString + visible: QGroundControl.gpsRtk.currentAccuracy.value > 0 } QGCLabel { text: qsTr("Satellites:") } QGCLabel { text: QGroundControl.gpsRtk.numSatellites.value }