Commit 00f04678 authored by Jacob Walser's avatar Jacob Walser

Add USB GPS support for GCS position

parent df6054f0
...@@ -22,6 +22,7 @@ QGCPositionManager::QGCPositionManager(QGCApplication* app, QGCToolbox* toolbox) ...@@ -22,6 +22,7 @@ QGCPositionManager::QGCPositionManager(QGCApplication* app, QGCToolbox* toolbox)
QGCPositionManager::~QGCPositionManager() QGCPositionManager::~QGCPositionManager()
{ {
delete(_simulatedSource); delete(_simulatedSource);
delete(_nmeaSource);
} }
void QGCPositionManager::setToolbox(QGCToolbox *toolbox) void QGCPositionManager::setToolbox(QGCToolbox *toolbox)
...@@ -41,7 +42,17 @@ void QGCPositionManager::setToolbox(QGCToolbox *toolbox) ...@@ -41,7 +42,17 @@ void QGCPositionManager::setToolbox(QGCToolbox *toolbox)
// _defaultSource = _simulatedSource; // _defaultSource = _simulatedSource;
// } // }
setPositionSource(QGCPositionSource::GPS); setPositionSource(QGCPositionSource::InternalGPS);
}
void QGCPositionManager::setNmeaSourceDevice(QIODevice* device)
{
if (_nmeaSource) {
delete _nmeaSource;
}
_nmeaSource = new QNmeaPositionInfoSource(QNmeaPositionInfoSource::RealTimeMode, this);
_nmeaSource->setDevice(device);
setPositionSource(QGCPositionManager::NmeaGPS);
} }
void QGCPositionManager::_positionUpdated(const QGeoPositionInfo &update) void QGCPositionManager::_positionUpdated(const QGeoPositionInfo &update)
...@@ -73,7 +84,10 @@ void QGCPositionManager::setPositionSource(QGCPositionManager::QGCPositionSource ...@@ -73,7 +84,10 @@ void QGCPositionManager::setPositionSource(QGCPositionManager::QGCPositionSource
case QGCPositionManager::Simulated: case QGCPositionManager::Simulated:
_currentSource = _simulatedSource; _currentSource = _simulatedSource;
break; break;
case QGCPositionManager::GPS: case QGCPositionManager::NmeaGPS:
_currentSource = _nmeaSource;
break;
case QGCPositionManager::InternalGPS:
default: default:
_currentSource = _defaultSource; _currentSource = _defaultSource;
break; break;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#pragma once #pragma once
#include <QGeoPositionInfoSource> #include <QGeoPositionInfoSource>
#include <QNmeaPositionInfoSource>
#include <QVariant> #include <QVariant>
...@@ -26,8 +27,9 @@ public: ...@@ -26,8 +27,9 @@ public:
enum QGCPositionSource { enum QGCPositionSource {
Simulated, Simulated,
GPS, InternalGPS,
Log Log,
NmeaGPS
}; };
void setPositionSource(QGCPositionSource source); void setPositionSource(QGCPositionSource source);
...@@ -36,6 +38,8 @@ public: ...@@ -36,6 +38,8 @@ public:
void setToolbox(QGCToolbox* toolbox); void setToolbox(QGCToolbox* toolbox);
void setNmeaSourceDevice(QIODevice* device);
private slots: private slots:
void _positionUpdated(const QGeoPositionInfo &update); void _positionUpdated(const QGeoPositionInfo &update);
void _error(QGeoPositionInfoSource::Error positioningError); void _error(QGeoPositionInfoSource::Error positioningError);
...@@ -48,5 +52,6 @@ private: ...@@ -48,5 +52,6 @@ private:
int _updateInterval; int _updateInterval;
QGeoPositionInfoSource * _currentSource; QGeoPositionInfoSource * _currentSource;
QGeoPositionInfoSource * _defaultSource; QGeoPositionInfoSource * _defaultSource;
QNmeaPositionInfoSource * _nmeaSource;
QGeoPositionInfoSource * _simulatedSource; QGeoPositionInfoSource * _simulatedSource;
}; };
...@@ -41,6 +41,20 @@ ...@@ -41,6 +41,20 @@
"type": "bool", "type": "bool",
"defaultValue": true "defaultValue": true
}, },
{
"name": "AutoconnectNmeaPort",
"shortDescription": "NMEA GPS device for GCS position",
"longDescription": "NMEA GPS device for GCS position",
"type": "string",
"defaultValue": "disabled"
},
{
"name": "AutoconnectNmeaBaud",
"shortDescription": "NMEA GPS Baudrate",
"longDescription": "NMEA GPS Baudrate",
"type": "uint32",
"defaultValue": 4800
},
{ {
"name": "AutoconnectUDPListenPort", "name": "AutoconnectUDPListenPort",
"shortDescription": "UDP port for autoconnect", "shortDescription": "UDP port for autoconnect",
......
...@@ -21,6 +21,8 @@ const char* AutoConnectSettings:: autoConnectSiKRadioSettingsName = "Autocon ...@@ -21,6 +21,8 @@ const char* AutoConnectSettings:: autoConnectSiKRadioSettingsName = "Autocon
const char* AutoConnectSettings:: autoConnectPX4FlowSettingsName = "AutoconnectPX4Flow"; const char* AutoConnectSettings:: autoConnectPX4FlowSettingsName = "AutoconnectPX4Flow";
const char* AutoConnectSettings:: autoConnectRTKGPSSettingsName = "AutoconnectRTKGPS"; const char* AutoConnectSettings:: autoConnectRTKGPSSettingsName = "AutoconnectRTKGPS";
const char* AutoConnectSettings:: autoConnectLibrePilotSettingsName = "AutoconnectLibrePilot"; const char* AutoConnectSettings:: autoConnectLibrePilotSettingsName = "AutoconnectLibrePilot";
const char* AutoConnectSettings:: autoConnectNmeaPortName = "AutoconnectNmeaPort";
const char* AutoConnectSettings:: autoConnectNmeaBaudName = "AutoconnectNmeaBaud";
const char* AutoConnectSettings:: udpListenPortName = "AutoconnectUDPListenPort"; const char* AutoConnectSettings:: udpListenPortName = "AutoconnectUDPListenPort";
const char* AutoConnectSettings:: udpTargetHostIPName = "AutoconnectUDPTargetHostIP"; const char* AutoConnectSettings:: udpTargetHostIPName = "AutoconnectUDPTargetHostIP";
const char* AutoConnectSettings:: udpTargetHostPortName = "AutoconnectUDPTargetHostPort"; const char* AutoConnectSettings:: udpTargetHostPortName = "AutoconnectUDPTargetHostPort";
...@@ -35,6 +37,8 @@ AutoConnectSettings::AutoConnectSettings(QObject* parent) ...@@ -35,6 +37,8 @@ AutoConnectSettings::AutoConnectSettings(QObject* parent)
, _autoConnectPX4FlowFact (NULL) , _autoConnectPX4FlowFact (NULL)
, _autoConnectRTKGPSFact (NULL) , _autoConnectRTKGPSFact (NULL)
, _autoConnectLibrePilotFact(NULL) , _autoConnectLibrePilotFact(NULL)
, _autoConnectNmeaPortFact (NULL)
, _autoConnectNmeaBaudFact (NULL)
, _udpListenPortFact (NULL) , _udpListenPortFact (NULL)
, _udpTargetHostIPFact (NULL) , _udpTargetHostIPFact (NULL)
, _udpTargetHostPortFact (NULL) , _udpTargetHostPortFact (NULL)
...@@ -97,6 +101,24 @@ Fact* AutoConnectSettings::autoConnectLibrePilot(void) ...@@ -97,6 +101,24 @@ Fact* AutoConnectSettings::autoConnectLibrePilot(void)
return _autoConnectLibrePilotFact; return _autoConnectLibrePilotFact;
} }
Fact* AutoConnectSettings::autoConnectNmeaPort(void)
{
if (!_autoConnectNmeaPortFact) {
_autoConnectNmeaPortFact = _createSettingsFact(autoConnectNmeaPortName);
}
return _autoConnectNmeaPortFact;
}
Fact* AutoConnectSettings::autoConnectNmeaBaud(void)
{
if (!_autoConnectNmeaBaudFact) {
_autoConnectNmeaBaudFact = _createSettingsFact(autoConnectNmeaBaudName);
}
return _autoConnectNmeaBaudFact;
}
Fact* AutoConnectSettings::udpListenPort(void) Fact* AutoConnectSettings::udpListenPort(void)
{ {
if (!_udpListenPortFact) { if (!_udpListenPortFact) {
......
...@@ -25,6 +25,8 @@ public: ...@@ -25,6 +25,8 @@ public:
Q_PROPERTY(Fact* autoConnectPX4Flow READ autoConnectPX4Flow CONSTANT) Q_PROPERTY(Fact* autoConnectPX4Flow READ autoConnectPX4Flow CONSTANT)
Q_PROPERTY(Fact* autoConnectRTKGPS READ autoConnectRTKGPS CONSTANT) Q_PROPERTY(Fact* autoConnectRTKGPS READ autoConnectRTKGPS CONSTANT)
Q_PROPERTY(Fact* autoConnectLibrePilot READ autoConnectLibrePilot CONSTANT) Q_PROPERTY(Fact* autoConnectLibrePilot READ autoConnectLibrePilot CONSTANT)
Q_PROPERTY(Fact* autoConnectNmeaPort READ autoConnectNmeaPort CONSTANT)
Q_PROPERTY(Fact* autoConnectNmeaBaud READ autoConnectNmeaBaud CONSTANT)
Q_PROPERTY(Fact* udpListenPort READ udpListenPort CONSTANT) ///< Port to listen on for UDP autoconnect Q_PROPERTY(Fact* udpListenPort READ udpListenPort CONSTANT) ///< Port to listen on for UDP autoconnect
Q_PROPERTY(Fact* udpTargetHostIP READ udpTargetHostIP CONSTANT) ///< Target host IP for UDP autoconnect, empty string for none Q_PROPERTY(Fact* udpTargetHostIP READ udpTargetHostIP CONSTANT) ///< Target host IP for UDP autoconnect, empty string for none
Q_PROPERTY(Fact* udpTargetHostPort READ udpTargetHostPort CONSTANT) ///< Target host post for UDP autoconnect Q_PROPERTY(Fact* udpTargetHostPort READ udpTargetHostPort CONSTANT) ///< Target host post for UDP autoconnect
...@@ -35,6 +37,8 @@ public: ...@@ -35,6 +37,8 @@ public:
Fact* autoConnectPX4Flow (void); Fact* autoConnectPX4Flow (void);
Fact* autoConnectRTKGPS (void); Fact* autoConnectRTKGPS (void);
Fact* autoConnectLibrePilot (void); Fact* autoConnectLibrePilot (void);
Fact* autoConnectNmeaPort (void);
Fact* autoConnectNmeaBaud (void);
Fact* udpListenPort (void); Fact* udpListenPort (void);
Fact* udpTargetHostIP (void); Fact* udpTargetHostIP (void);
Fact* udpTargetHostPort (void); Fact* udpTargetHostPort (void);
...@@ -47,6 +51,8 @@ public: ...@@ -47,6 +51,8 @@ public:
static const char* autoConnectPX4FlowSettingsName; static const char* autoConnectPX4FlowSettingsName;
static const char* autoConnectRTKGPSSettingsName; static const char* autoConnectRTKGPSSettingsName;
static const char* autoConnectLibrePilotSettingsName; static const char* autoConnectLibrePilotSettingsName;
static const char* autoConnectNmeaPortName;
static const char* autoConnectNmeaBaudName;
static const char* udpListenPortName; static const char* udpListenPortName;
static const char* udpTargetHostIPName; static const char* udpTargetHostIPName;
static const char* udpTargetHostPortName; static const char* udpTargetHostPortName;
...@@ -58,6 +64,8 @@ private: ...@@ -58,6 +64,8 @@ private:
SettingsFact* _autoConnectPX4FlowFact; SettingsFact* _autoConnectPX4FlowFact;
SettingsFact* _autoConnectRTKGPSFact; SettingsFact* _autoConnectRTKGPSFact;
SettingsFact* _autoConnectLibrePilotFact; SettingsFact* _autoConnectLibrePilotFact;
SettingsFact* _autoConnectNmeaPortFact;
SettingsFact* _autoConnectNmeaBaudFact;
SettingsFact* _udpListenPortFact; SettingsFact* _udpListenPortFact;
SettingsFact* _udpTargetHostIPFact; SettingsFact* _udpTargetHostIPFact;
SettingsFact* _udpTargetHostPortFact; SettingsFact* _udpTargetHostPortFact;
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "UDPLink.h" #include "UDPLink.h"
#include "TCPLink.h" #include "TCPLink.h"
#include "SettingsManager.h" #include "SettingsManager.h"
#include "PositionManager.h"
#ifdef QGC_ENABLE_BLUETOOTH #ifdef QGC_ENABLE_BLUETOOTH
#include "BluetoothLink.h" #include "BluetoothLink.h"
#endif #endif
...@@ -50,6 +51,7 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox) ...@@ -50,6 +51,7 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox)
, _mavlinkChannelsUsedBitMask(1) // We never use channel 0 to avoid sequence numbering problems , _mavlinkChannelsUsedBitMask(1) // We never use channel 0 to avoid sequence numbering problems
, _autoConnectSettings(NULL) , _autoConnectSettings(NULL)
, _mavlinkProtocol(NULL) , _mavlinkProtocol(NULL)
, _nmeaPort(NULL)
{ {
qmlRegisterUncreatableType<LinkManager> ("QGroundControl", 1, 0, "LinkManager", "Reference only"); qmlRegisterUncreatableType<LinkManager> ("QGroundControl", 1, 0, "LinkManager", "Reference only");
qmlRegisterUncreatableType<LinkConfiguration> ("QGroundControl", 1, 0, "LinkConfiguration", "Reference only"); qmlRegisterUncreatableType<LinkConfiguration> ("QGroundControl", 1, 0, "LinkConfiguration", "Reference only");
...@@ -64,7 +66,7 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox) ...@@ -64,7 +66,7 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox)
LinkManager::~LinkManager() LinkManager::~LinkManager()
{ {
delete _nmeaPort;
} }
void LinkManager::setToolbox(QGCToolbox *toolbox) void LinkManager::setToolbox(QGCToolbox *toolbox)
...@@ -500,8 +502,30 @@ void LinkManager::_updateAutoConnectLinks(void) ...@@ -500,8 +502,30 @@ void LinkManager::_updateAutoConnectLinks(void)
QGCSerialPortInfo::BoardType_t boardType; QGCSerialPortInfo::BoardType_t boardType;
QString boardName; QString boardName;
if (portInfo.getBoardInfo(boardType, boardName)) { if (portInfo.systemLocation().trimmed() == _autoConnectSettings->autoConnectNmeaPort()->cookedValueString()) {
if (portInfo.systemLocation().trimmed() != _nmeaDeviceName) {
_nmeaDeviceName = portInfo.systemLocation().trimmed();
qCDebug(LinkManagerLog) << "Configuring nmea port" << _nmeaDeviceName;
QSerialPort* newPort = new QSerialPort(portInfo);
_nmeaBaud = _autoConnectSettings->autoConnectNmeaBaud()->cookedValue().toUInt();
newPort->setBaudRate(_nmeaBaud);
qCDebug(LinkManagerLog) << "Configuring nmea baudrate" << _nmeaBaud;
// This will stop polling old device if previously set
_toolbox->qgcPositionManager()->setNmeaSourceDevice(newPort);
if (_nmeaPort) {
delete _nmeaPort;
}
_nmeaPort = newPort;
} else if (_autoConnectSettings->autoConnectNmeaBaud()->cookedValue().toUInt() != _nmeaBaud) {
_nmeaBaud = _autoConnectSettings->autoConnectNmeaBaud()->cookedValue().toUInt();
_nmeaPort->setBaudRate(_nmeaBaud);
qCDebug(LinkManagerLog) << "Configuring nmea baudrate" << _nmeaBaud;
}
} else if (portInfo.getBoardInfo(boardType, boardName)) {
if (portInfo.isBootloader()) { if (portInfo.isBootloader()) {
// Don't connect to bootloader // Don't connect to bootloader
qCDebug(LinkManagerLog) << "Waiting for bootloader to finish" << portInfo.systemLocation(); qCDebug(LinkManagerLog) << "Waiting for bootloader to finish" << portInfo.systemLocation();
......
...@@ -233,6 +233,11 @@ private: ...@@ -233,6 +233,11 @@ private:
static const char* _defaultUPDLinkName; static const char* _defaultUPDLinkName;
static const int _autoconnectUpdateTimerMSecs; static const int _autoconnectUpdateTimerMSecs;
static const int _autoconnectConnectDelayMSecs; static const int _autoconnectConnectDelayMSecs;
// NMEA GPS device for GCS position
QString _nmeaDeviceName;
QSerialPort* _nmeaPort;
uint32_t _nmeaBaud;
}; };
#endif #endif
...@@ -464,7 +464,7 @@ QGCView { ...@@ -464,7 +464,7 @@ QGCView {
Column { Column {
id: autoConnectCol id: autoConnectCol
spacing: ScreenTools.defaultFontPixelWidth spacing: ScreenTools.defaultFontPixelWidth * 2
anchors.centerIn: parent anchors.centerIn: parent
Row { Row {
...@@ -489,6 +489,61 @@ QGCView { ...@@ -489,6 +489,61 @@ QGCView {
} }
} }
} }
Row {
width: parent.width
spacing: ScreenTools.defaultFontPixelWidth
visible: !ScreenTools.isiOS
&& QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaPort.visible
&& QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaBaud.visible
QGCLabel {
anchors.baseline: nmeaPortCombo.baseline
text: qsTr("NMEA GPS Device:")
}
QGCComboBox {
id: nmeaPortCombo
width: parent.width/3
model: ListModel {
ListElement { text: "disabled" }
}
onActivated: {
if (index != -1) {
QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaPort.value = textAt(index);
}
}
Component.onCompleted: {
for (var i in QGroundControl.linkManager.serialPorts) {
nmeaPortCombo.model.append({text:QGroundControl.linkManager.serialPorts[i]})
}
var index = nmeaPortCombo.find(QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaPort.valueString);
nmeaPortCombo.currentIndex = index;
}
}
QGCLabel {
anchors.baseline: nmeaBaudCombo.baseline
text: qsTr("NMEA GPS Baudrate:")
}
QGCComboBox {
id: nmeaBaudCombo
width: parent.width/3
model: [4800, 9600, 19200, 38400, 57600, 115200]
onActivated: {
if (index != -1) {
QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaBaud.value = textAt(index);
}
}
Component.onCompleted: {
var index = nmeaBaudCombo.find(QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaBaud.valueString);
nmeaBaudCombo.currentIndex = index;
}
}
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment