[gps] Move GPS track point filtering settings to settings GPS pane

These are infrequently changed settings
This commit is contained in:
Nyall Dawson 2022-10-25 13:34:48 +10:00
parent 3897639507
commit 2223e19f63
9 changed files with 204 additions and 174 deletions

View File

@ -166,6 +166,8 @@ Abstract base class for connection to a GPS device
QgsGpsConnection( QIODevice *dev /Transfer/ );
%Docstring
Constructor

View File

@ -72,9 +72,6 @@
#include <QPen>
#include <QTimeZone>
const int MAXACQUISITIONINTERVAL = 3000; // max gps information acquisition suspension interval (in seconds)
const int MAXDISTANCETHRESHOLD = 200; // max gps distance threshold (in meters)
QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidget *parent )
: QgsPanelWidget( parent )
@ -317,27 +314,9 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidg
mStackedWidget->setCurrentIndex( 3 ); // force to Options
mBtnPosition->setFocus( Qt::TabFocusReason );
mAcquisitionIntValidator = new QIntValidator( 0, MAXACQUISITIONINTERVAL, this );
mDistanceThresholdValidator = new QIntValidator( 0, MAXDISTANCETHRESHOLD, this );
mAcquisitionTimer = std::unique_ptr<QTimer>( new QTimer( this ) );
mAcquisitionTimer->setSingleShot( true );
mCboAcquisitionInterval->addItem( QStringLiteral( "0" ), 0 );
mCboAcquisitionInterval->addItem( QStringLiteral( "2" ), 2 );
mCboAcquisitionInterval->addItem( QStringLiteral( "5" ), 5 );
mCboAcquisitionInterval->addItem( QStringLiteral( "10" ), 10 );
mCboAcquisitionInterval->addItem( QStringLiteral( "15" ), 15 );
mCboAcquisitionInterval->addItem( QStringLiteral( "30" ), 30 );
mCboAcquisitionInterval->addItem( QStringLiteral( "60" ), 60 );
mCboDistanceThreshold->addItem( QStringLiteral( "0" ), 0 );
mCboDistanceThreshold->addItem( QStringLiteral( "3" ), 3 );
mCboDistanceThreshold->addItem( QStringLiteral( "5" ), 5 );
mCboDistanceThreshold->addItem( QStringLiteral( "10" ), 10 );
mCboDistanceThreshold->addItem( QStringLiteral( "15" ), 15 );
mCboAcquisitionInterval->setValidator( mAcquisitionIntValidator );
mCboDistanceThreshold->setValidator( mDistanceThresholdValidator );
mCboAcquisitionInterval->setCurrentText( mySettings.value( QStringLiteral( "acquisitionInterval" ), 0, QgsSettings::Gps ).toString() );
mCboDistanceThreshold->setCurrentText( mySettings.value( QStringLiteral( "distanceThreshold" ), 0, QgsSettings::Gps ).toString() );
// Timestamp
mCboTimestampField->setAllowEmptyFieldName( true );
@ -396,12 +375,9 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidg
connect( mAcquisitionTimer.get(), &QTimer::timeout,
this, &QgsGpsInformationWidget::switchAcquisition );
connect( mCboAcquisitionInterval, qOverload< const QString & >( &QComboBox::currentTextChanged ),
this, &QgsGpsInformationWidget::cboAcquisitionIntervalEdited );
connect( mCboDistanceThreshold, qOverload< const QString & >( &QComboBox::currentTextChanged ),
this, &QgsGpsInformationWidget::cboDistanceThresholdEdited );
connect( QgsGui::instance(), &QgsGui::optionsChanged, this, &QgsGpsInformationWidget::updateTrackAppearance );
connect( QgsGui::instance(), &QgsGui::optionsChanged, this, &QgsGpsInformationWidget::gpsSettingsChanged );
gpsSettingsChanged();
mMapCanvas->installInteractionBlocker( this );
}
@ -426,8 +402,6 @@ QgsGpsInformationWidget::~QgsGpsInformationWidget()
mySettings.setValue( QStringLiteral( "calculateBearingFromTravel" ), mTravelBearingCheckBox->isChecked(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "autoAddVertices" ), mCbxAutoAddVertices->isChecked(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "autoCommit" ), mCbxAutoCommit->isChecked(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "acquisitionInterval" ), mCboAcquisitionInterval->currentText(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "distanceThreshold" ), mCboDistanceThreshold->currentText(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "timestampTimeZone" ), mCboTimeZones->currentText(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "applyLeapSeconds" ), mCbxLeapSeconds->isChecked(), QgsSettings::Gps );
mySettings.setValue( QStringLiteral( "leapSecondsCorrection" ), mLeapSeconds->value(), QgsSettings::Gps );
@ -481,6 +455,32 @@ void QgsGpsInformationWidget::setConnection( QgsGpsConnection *connection )
connected( connection );
}
void QgsGpsInformationWidget::gpsSettingsChanged()
{
updateTrackAppearance();
int acquisitionInterval = 0;
if ( QgsGpsConnection::settingsGpsConnectionType.exists() )
{
acquisitionInterval = QgsGpsConnection::settingGpsAcquisitionInterval.value();
mDistanceThreshold = QgsGpsConnection::settingGpsDistanceThreshold.value();
}
else
{
// legacy settings
QgsSettings settings;
acquisitionInterval = settings.value( QStringLiteral( "acquisitionInterval" ), 0, QgsSettings::Gps ).toInt();
mDistanceThreshold = settings.value( QStringLiteral( "distanceThreshold" ), 0, QgsSettings::Gps ).toDouble();
}
mAcquisitionInterval = acquisitionInterval * 1000;
if ( mAcquisitionTimer->isActive() )
mAcquisitionTimer->stop();
mAcquisitionEnabled = true;
switchAcquisition();
}
void QgsGpsInformationWidget::updateTrackAppearance()
{
if ( !mRubberBand )
@ -1498,19 +1498,6 @@ void QgsGpsInformationWidget::showStatusBarMessage( const QString &msg )
{
QgisApp::instance()->statusBarIface()->showMessage( msg );
}
void QgsGpsInformationWidget::setAcquisitionInterval( uint interval )
{
mAcquisitionInterval = static_cast<int>( interval ) * 1000 ;
if ( mAcquisitionTimer->isActive() )
mAcquisitionTimer->stop();
mAcquisitionEnabled = true;
switchAcquisition();
}
void QgsGpsInformationWidget::setDistanceThreshold( uint distance )
{
mDistanceThreshold = distance;
}
void QgsGpsInformationWidget::updateTimeZones()
{
@ -1571,16 +1558,6 @@ QVariant QgsGpsInformationWidget::timestamp( QgsVectorLayer *vlayer, int idx )
return value;
}
void QgsGpsInformationWidget::cboAcquisitionIntervalEdited()
{
setAcquisitionInterval( mCboAcquisitionInterval->currentText().toUInt() );
}
void QgsGpsInformationWidget::cboDistanceThresholdEdited()
{
setDistanceThreshold( mCboDistanceThreshold->currentText().toUInt() );
}
void QgsGpsInformationWidget::timestampFormatChanged( int )
{
QgsSettings().setValue( QStringLiteral( "timestampFormat" ), mCboTimestampFormat->currentData( ).toInt(), QgsSettings::Gps );

View File

@ -87,6 +87,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa
void logNmeaSentence( const QString &nmeaString ); // added to handle 'raw' data
void updateCloseFeatureButton( QgsMapLayer *lyr );
void layerEditStateChanged();
void gpsSettingsChanged();
void updateTrackAppearance();
void mBtnPosition_clicked();
void mBtnSignal_clicked();
@ -101,8 +102,6 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa
void connected( QgsGpsConnection * );
void timedout();
void switchAcquisition();
void cboAcquisitionIntervalEdited();
void cboDistanceThresholdEdited();
void timestampFormatChanged( int index );
void cursorCoordinateChanged( const QgsPointXY &point );
@ -122,8 +121,6 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa
void disconnectGps();
void setStatusIndicator( FixStatus statusValue );
void showStatusBarMessage( const QString &msg );
void setAcquisitionInterval( uint );
void setDistanceThreshold( uint );
void updateTimeZones();
QVariant timestamp( QgsVectorLayer *vlayer, int idx );
QgsGpsConnection *mNmea = nullptr;
@ -157,14 +154,12 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa
QPointer< QgsVectorLayer > mLastLayer;
QFile *mLogFile = nullptr;
QTextStream mLogFileTextStream;
QIntValidator *mAcquisitionIntValidator = nullptr;
QIntValidator *mDistanceThresholdValidator = nullptr;
nmeaPOS mLastNmeaPosition;
nmeaTIME mLastNmeaTime;
std::unique_ptr<QTimer> mAcquisitionTimer;
bool mAcquisitionEnabled = true;
int mAcquisitionInterval = 0;
unsigned int mDistanceThreshold = 0;
double mDistanceThreshold = 0;
//! Temporary storage of preferred fields
QMap<QString, QString> mPreferredTimestampFields;
//! Flag when updating fields

View File

@ -23,6 +23,8 @@
#include "qgsgpsconnection.h"
#include "qgsgpsinformationwidget.h"
const int MAXACQUISITIONINTERVAL = 3000; // max gps information acquisition suspension interval (in seconds)
const int MAXDISTANCETHRESHOLD = 200; // max gps distance threshold (in meters)
//
// QgsGpsOptionsWidget
@ -76,12 +78,34 @@ QgsGpsOptionsWidget::QgsGpsOptionsWidget( QWidget *parent )
connect( mBtnRefreshDevices, &QToolButton::clicked, this, &QgsGpsOptionsWidget::refreshDevices );
mCboAcquisitionInterval->addItem( QStringLiteral( "0" ), 0 );
mCboAcquisitionInterval->addItem( QStringLiteral( "2" ), 2 );
mCboAcquisitionInterval->addItem( QStringLiteral( "5" ), 5 );
mCboAcquisitionInterval->addItem( QStringLiteral( "10" ), 10 );
mCboAcquisitionInterval->addItem( QStringLiteral( "15" ), 15 );
mCboAcquisitionInterval->addItem( QStringLiteral( "30" ), 30 );
mCboAcquisitionInterval->addItem( QStringLiteral( "60" ), 60 );
mCboDistanceThreshold->addItem( QStringLiteral( "0" ), 0 );
mCboDistanceThreshold->addItem( QStringLiteral( "3" ), 3 );
mCboDistanceThreshold->addItem( QStringLiteral( "5" ), 5 );
mCboDistanceThreshold->addItem( QStringLiteral( "10" ), 10 );
mCboDistanceThreshold->addItem( QStringLiteral( "15" ), 15 );
mAcquisitionIntValidator = new QIntValidator( 0, MAXACQUISITIONINTERVAL, this );
mDistanceThresholdValidator = new QIntValidator( 0, MAXDISTANCETHRESHOLD, this );
mCboAcquisitionInterval->setValidator( mAcquisitionIntValidator );
mCboDistanceThreshold->setValidator( mDistanceThresholdValidator );
Qgis::GpsConnectionType connectionType = Qgis::GpsConnectionType::Automatic;
QString gpsdHost;
int gpsdPort = 0;
QString gpsdDevice;
double trackWidth = 2;
QColor trackColor;
int acquisitionInterval = 0;
double distanceThreshold = 0;
if ( QgsGpsConnection::settingsGpsConnectionType.exists() )
{
connectionType = QgsGpsConnection::settingsGpsConnectionType.value();
@ -90,6 +114,8 @@ QgsGpsOptionsWidget::QgsGpsOptionsWidget( QWidget *parent )
gpsdDevice = QgsGpsConnection::settingsGpsdDeviceName.value();
trackWidth = QgsGpsInformationWidget::settingGpsTrackWidth.value();
trackColor = QgsGpsInformationWidget::settingGpsTrackColor.value();
acquisitionInterval = QgsGpsConnection::settingGpsAcquisitionInterval.value();
distanceThreshold = QgsGpsConnection::settingGpsDistanceThreshold.value();
}
else
{
@ -120,6 +146,9 @@ QgsGpsOptionsWidget::QgsGpsOptionsWidget( QWidget *parent )
trackWidth = settings.value( QStringLiteral( "trackWidth" ), "2", QgsSettings::Gps ).toInt();
trackColor = settings.value( QStringLiteral( "trackColor" ), QColor( Qt::red ), QgsSettings::Gps ).value<QColor>();
acquisitionInterval = settings.value( QStringLiteral( "acquisitionInterval" ), 0, QgsSettings::Gps ).toInt();
distanceThreshold = settings.value( QStringLiteral( "distanceThreshold" ), 0, QgsSettings::Gps ).toDouble();
}
mGpsdHost->setText( gpsdHost );
@ -152,6 +181,9 @@ QgsGpsOptionsWidget::QgsGpsOptionsWidget( QWidget *parent )
mSpinTrackWidth->setValue( trackWidth );
mBtnTrackColor->setColor( trackColor );
mCboAcquisitionInterval->setCurrentText( QString::number( acquisitionInterval ) );
mCboDistanceThreshold->setCurrentText( QString::number( distanceThreshold ) );
refreshDevices();
}
@ -191,6 +223,9 @@ void QgsGpsOptionsWidget::apply()
QgsGpsInformationWidget::settingGpsTrackColor.setValue( mBtnTrackColor->color() );
QgsGpsInformationWidget::settingGpsTrackWidth.setValue( mSpinTrackWidth->value() );
QgsGpsConnection::settingGpsAcquisitionInterval.setValue( mCboAcquisitionInterval->currentText().toInt() );
QgsGpsConnection::settingGpsDistanceThreshold.setValue( mCboDistanceThreshold->currentText().toDouble() );
}
void QgsGpsOptionsWidget::refreshDevices()

View File

@ -44,6 +44,8 @@ class QgsGpsOptionsWidget : public QgsOptionsPageWidget, private Ui::QgsGpsOptio
private:
bool mBlockStoringChanges = false;
QIntValidator *mAcquisitionIntValidator = nullptr;
QIntValidator *mDistanceThresholdValidator = nullptr;
};

View File

@ -338,6 +338,12 @@ class CORE_EXPORT QgsGpsConnection : public QObject
//! Settings entry GPS serial device name
static const inline QgsSettingsEntryString settingsGpsSerialDevice = QgsSettingsEntryString( QStringLiteral( "gpsd-serial-device" ), QgsSettings::Prefix::GPS, QString(), QStringLiteral( "GPS serial device name" ) ) SIP_SKIP;
//! Settings entry GPS track point acquisition interval
static const inline QgsSettingsEntryInteger settingGpsAcquisitionInterval = QgsSettingsEntryInteger( QStringLiteral( "acquisition-interval" ), QgsSettings::Prefix::GPS, 0, QStringLiteral( "GPS track point acquisition interval" ) ) SIP_SKIP;
//! Settings entry GPS track point distance threshold
static const inline QgsSettingsEntryDouble settingGpsDistanceThreshold = QgsSettingsEntryDouble( QStringLiteral( "distance-threshold" ), QgsSettings::Prefix::GPS, 0, QStringLiteral( "GPS track point distance threshold" ) ) SIP_SKIP;
/**
* Constructor
* \param dev input device for the connection (e.g. serial device). The class takes ownership of the object

View File

@ -121,6 +121,8 @@ QgsSettingsRegistryCore::QgsSettingsRegistryCore()
addSettingsEntry( &QgsGpsConnection::settingsGpsdPortNumber );
addSettingsEntry( &QgsGpsConnection::settingsGpsdDeviceName );
addSettingsEntry( &QgsGpsConnection::settingsGpsSerialDevice );
addSettingsEntry( &QgsGpsConnection::settingGpsAcquisitionInterval );
addSettingsEntry( &QgsGpsConnection::settingGpsDistanceThreshold );
}
QgsSettingsRegistryCore::~QgsSettingsRegistryCore()

View File

@ -157,8 +157,8 @@ gray = no data
<rect>
<x>0</x>
<y>0</y>
<width>162</width>
<height>544</height>
<width>579</width>
<height>741</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
@ -621,6 +621,78 @@ gray = no data
<property name="verticalSpacing">
<number>4</number>
</property>
<item row="4" column="0">
<widget class="QgsCollapsibleGroupBox" name="mShowBearingLineCheck">
<property name="title">
<string>Show Bearing Line</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,1">
<item>
<widget class="QLabel" name="label_11">
<property name="text">
<string>Line style</string>
</property>
</widget>
</item>
<item>
<widget class="QgsSymbolButton" name="mBearingLineStyleButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="0">
<widget class="QgsCollapsibleGroupBox" name="mLogFileGroupBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>save GPS data (NMEA sentences) to a file</string>
</property>
<property name="title">
<string>Log File</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_13" columnstretch="100">
<property name="topMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item row="0" column="0">
<widget class="QgsFileWidget" name="mLogFilename" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QgsCollapsibleGroupBox" name="groupBox_2">
<property name="title">
@ -731,79 +803,7 @@ gray = no data
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QgsCollapsibleGroupBox" name="mShowBearingLineCheck">
<property name="title">
<string>Show Bearing Line</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4" stretch="0,1">
<item>
<widget class="QLabel" name="label_11">
<property name="text">
<string>Line style</string>
</property>
</widget>
</item>
<item>
<widget class="QgsSymbolButton" name="mBearingLineStyleButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="6" column="0">
<widget class="QgsCollapsibleGroupBox" name="mLogFileGroupBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>save GPS data (NMEA sentences) to a file</string>
</property>
<property name="title">
<string>Log File</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_13" columnstretch="100">
<property name="topMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item row="0" column="0">
<widget class="QgsFileWidget" name="mLogFilename" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="0">
<widget class="QgsCollapsibleGroupBoxBasic" name="groupBox">
<property name="title">
<string>Map Centering and Rotation</string>
@ -932,42 +932,18 @@ gray = no data
</layout>
</widget>
</item>
<item row="3" column="0">
<widget class="QgsCollapsibleGroupBox" name="groupBox_4">
<property name="title">
<string>Filtering</string>
<item row="6" column="0">
<spacer name="verticalSpacer_6">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<layout class="QGridLayout" name="gridLayout_14" columnstretch="0,1">
<item row="1" column="1">
<widget class="QComboBox" name="mCboDistanceThreshold">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Distance threshold (meters)</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Acquisition interval (seconds)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="mCboAcquisitionInterval">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
@ -1208,8 +1184,6 @@ gray = no data
<tabstop>mLeapSeconds</tabstop>
<tabstop>mTravelBearingCheckBox</tabstop>
<tabstop>mCheckShowMarker</tabstop>
<tabstop>mCboAcquisitionInterval</tabstop>
<tabstop>mCboDistanceThreshold</tabstop>
<tabstop>radRecenterMap</tabstop>
<tabstop>radRecenterWhenNeeded</tabstop>
<tabstop>mSpinMapExtentMultiplier</tabstop>

View File

@ -194,7 +194,7 @@
</layout>
</widget>
</item>
<item row="4" column="0">
<item row="5" column="0">
<widget class="QgsCollapsibleGroupBox" name="groupBox_3">
<property name="title">
<string>GPS Track Visualization</string>
@ -249,7 +249,44 @@
</layout>
</widget>
</item>
<item row="5" column="0">
<item row="3" column="0">
<widget class="QgsCollapsibleGroupBox" name="groupBox_4">
<property name="title">
<string>Filtering</string>
</property>
<layout class="QGridLayout" name="gridLayout_14" columnstretch="0,1">
<item row="1" column="1">
<widget class="QComboBox" name="mCboDistanceThreshold">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Distance threshold (meters)</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Acquisition interval (seconds)</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="mCboAcquisitionInterval">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="6" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -262,7 +299,7 @@
</property>
</spacer>
</item>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QgsCollapsibleGroupBox" name="groupBox_2">
<property name="title">
<string>GPS Visualization Options</string>