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)
QGCPositionManager::~QGCPositionManager()
{
delete(_simulatedSource);
delete(_nmeaSource);
}
void QGCPositionManager::setToolbox(QGCToolbox *toolbox)
......@@ -41,7 +42,17 @@ void QGCPositionManager::setToolbox(QGCToolbox *toolbox)
// _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)
......@@ -73,7 +84,10 @@ void QGCPositionManager::setPositionSource(QGCPositionManager::QGCPositionSource
case QGCPositionManager::Simulated:
_currentSource = _simulatedSource;
break;
case QGCPositionManager::GPS:
case QGCPositionManager::NmeaGPS:
_currentSource = _nmeaSource;
break;
case QGCPositionManager::InternalGPS:
default:
_currentSource = _defaultSource;
break;
......
......@@ -10,6 +10,7 @@
#pragma once
#include <QGeoPositionInfoSource>
#include <QNmeaPositionInfoSource>
#include <QVariant>
......@@ -26,8 +27,9 @@ public:
enum QGCPositionSource {
Simulated,
GPS,
Log
InternalGPS,
Log,
NmeaGPS
};
void setPositionSource(QGCPositionSource source);
......@@ -36,6 +38,8 @@ public:
void setToolbox(QGCToolbox* toolbox);
void setNmeaSourceDevice(QIODevice* device);
private slots:
void _positionUpdated(const QGeoPositionInfo &update);
void _error(QGeoPositionInfoSource::Error positioningError);
......@@ -48,5 +52,6 @@ private:
int _updateInterval;
QGeoPositionInfoSource * _currentSource;
QGeoPositionInfoSource * _defaultSource;
QNmeaPositionInfoSource * _nmeaSource;
QGeoPositionInfoSource * _simulatedSource;
};
......@@ -41,6 +41,20 @@
"type": "bool",
"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",
"shortDescription": "UDP port for autoconnect",
......
......@@ -21,6 +21,8 @@ const char* AutoConnectSettings:: autoConnectSiKRadioSettingsName = "Autocon
const char* AutoConnectSettings:: autoConnectPX4FlowSettingsName = "AutoconnectPX4Flow";
const char* AutoConnectSettings:: autoConnectRTKGPSSettingsName = "AutoconnectRTKGPS";
const char* AutoConnectSettings:: autoConnectLibrePilotSettingsName = "AutoconnectLibrePilot";
const char* AutoConnectSettings:: autoConnectNmeaPortName = "AutoconnectNmeaPort";
const char* AutoConnectSettings:: autoConnectNmeaBaudName = "AutoconnectNmeaBaud";
const char* AutoConnectSettings:: udpListenPortName = "AutoconnectUDPListenPort";
const char* AutoConnectSettings:: udpTargetHostIPName = "AutoconnectUDPTargetHostIP";
const char* AutoConnectSettings:: udpTargetHostPortName = "AutoconnectUDPTargetHostPort";
......@@ -35,6 +37,8 @@ AutoConnectSettings::AutoConnectSettings(QObject* parent)
, _autoConnectPX4FlowFact (NULL)
, _autoConnectRTKGPSFact (NULL)
, _autoConnectLibrePilotFact(NULL)
, _autoConnectNmeaPortFact (NULL)
, _autoConnectNmeaBaudFact (NULL)
, _udpListenPortFact (NULL)
, _udpTargetHostIPFact (NULL)
, _udpTargetHostPortFact (NULL)
......@@ -97,6 +101,24 @@ Fact* AutoConnectSettings::autoConnectLibrePilot(void)
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)
{
if (!_udpListenPortFact) {
......
......@@ -25,6 +25,8 @@ public:
Q_PROPERTY(Fact* autoConnectPX4Flow READ autoConnectPX4Flow CONSTANT)
Q_PROPERTY(Fact* autoConnectRTKGPS READ autoConnectRTKGPS 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* 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
......@@ -35,6 +37,8 @@ public:
Fact* autoConnectPX4Flow (void);
Fact* autoConnectRTKGPS (void);
Fact* autoConnectLibrePilot (void);
Fact* autoConnectNmeaPort (void);
Fact* autoConnectNmeaBaud (void);
Fact* udpListenPort (void);
Fact* udpTargetHostIP (void);
Fact* udpTargetHostPort (void);
......@@ -47,6 +51,8 @@ public:
static const char* autoConnectPX4FlowSettingsName;
static const char* autoConnectRTKGPSSettingsName;
static const char* autoConnectLibrePilotSettingsName;
static const char* autoConnectNmeaPortName;
static const char* autoConnectNmeaBaudName;
static const char* udpListenPortName;
static const char* udpTargetHostIPName;
static const char* udpTargetHostPortName;
......@@ -58,6 +64,8 @@ private:
SettingsFact* _autoConnectPX4FlowFact;
SettingsFact* _autoConnectRTKGPSFact;
SettingsFact* _autoConnectLibrePilotFact;
SettingsFact* _autoConnectNmeaPortFact;
SettingsFact* _autoConnectNmeaBaudFact;
SettingsFact* _udpListenPortFact;
SettingsFact* _udpTargetHostIPFact;
SettingsFact* _udpTargetHostPortFact;
......
......@@ -21,6 +21,7 @@
#include "UDPLink.h"
#include "TCPLink.h"
#include "SettingsManager.h"
#include "PositionManager.h"
#ifdef QGC_ENABLE_BLUETOOTH
#include "BluetoothLink.h"
#endif
......@@ -50,6 +51,7 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox)
, _mavlinkChannelsUsedBitMask(1) // We never use channel 0 to avoid sequence numbering problems
, _autoConnectSettings(NULL)
, _mavlinkProtocol(NULL)
, _nmeaPort(NULL)
{
qmlRegisterUncreatableType<LinkManager> ("QGroundControl", 1, 0, "LinkManager", "Reference only");
qmlRegisterUncreatableType<LinkConfiguration> ("QGroundControl", 1, 0, "LinkConfiguration", "Reference only");
......@@ -64,7 +66,7 @@ LinkManager::LinkManager(QGCApplication* app, QGCToolbox* toolbox)
LinkManager::~LinkManager()
{
delete _nmeaPort;
}
void LinkManager::setToolbox(QGCToolbox *toolbox)
......@@ -500,8 +502,30 @@ void LinkManager::_updateAutoConnectLinks(void)
QGCSerialPortInfo::BoardType_t boardType;
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()) {
// Don't connect to bootloader
qCDebug(LinkManagerLog) << "Waiting for bootloader to finish" << portInfo.systemLocation();
......
......@@ -233,6 +233,11 @@ private:
static const char* _defaultUPDLinkName;
static const int _autoconnectUpdateTimerMSecs;
static const int _autoconnectConnectDelayMSecs;
// NMEA GPS device for GCS position
QString _nmeaDeviceName;
QSerialPort* _nmeaPort;
uint32_t _nmeaBaud;
};
#endif
......@@ -464,7 +464,7 @@ QGCView {
Column {
id: autoConnectCol
spacing: ScreenTools.defaultFontPixelWidth
spacing: ScreenTools.defaultFontPixelWidth * 2
anchors.centerIn: parent
Row {
......@@ -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