diff --git a/python/core/auto_generated/gps/qgsgpsconnection.sip.in b/python/core/auto_generated/gps/qgsgpsconnection.sip.in index 3404a26ba2c..f7b5a849bea 100644 --- a/python/core/auto_generated/gps/qgsgpsconnection.sip.in +++ b/python/core/auto_generated/gps/qgsgpsconnection.sip.in @@ -166,6 +166,8 @@ Abstract base class for connection to a GPS device + + QgsGpsConnection( QIODevice *dev /Transfer/ ); %Docstring Constructor diff --git a/src/app/gps/qgsgpsinformationwidget.cpp b/src/app/gps/qgsgpsinformationwidget.cpp index 6c5f6411c5e..a022cafb7f3 100644 --- a/src/app/gps/qgsgpsinformationwidget.cpp +++ b/src/app/gps/qgsgpsinformationwidget.cpp @@ -72,9 +72,6 @@ #include #include -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( 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( 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 ); diff --git a/src/app/gps/qgsgpsinformationwidget.h b/src/app/gps/qgsgpsinformationwidget.h index 00438aedb46..da6a6acf687 100644 --- a/src/app/gps/qgsgpsinformationwidget.h +++ b/src/app/gps/qgsgpsinformationwidget.h @@ -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 mAcquisitionTimer; bool mAcquisitionEnabled = true; int mAcquisitionInterval = 0; - unsigned int mDistanceThreshold = 0; + double mDistanceThreshold = 0; //! Temporary storage of preferred fields QMap mPreferredTimestampFields; //! Flag when updating fields diff --git a/src/app/options/qgsgpsoptions.cpp b/src/app/options/qgsgpsoptions.cpp index c6762dae932..731ec83e0b6 100644 --- a/src/app/options/qgsgpsoptions.cpp +++ b/src/app/options/qgsgpsoptions.cpp @@ -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(); + + 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() diff --git a/src/app/options/qgsgpsoptions.h b/src/app/options/qgsgpsoptions.h index bbc2c623f01..cf54629b197 100644 --- a/src/app/options/qgsgpsoptions.h +++ b/src/app/options/qgsgpsoptions.h @@ -44,6 +44,8 @@ class QgsGpsOptionsWidget : public QgsOptionsPageWidget, private Ui::QgsGpsOptio private: bool mBlockStoringChanges = false; + QIntValidator *mAcquisitionIntValidator = nullptr; + QIntValidator *mDistanceThresholdValidator = nullptr; }; diff --git a/src/core/gps/qgsgpsconnection.h b/src/core/gps/qgsgpsconnection.h index 3b03f97b1a7..da5e8ae36d0 100644 --- a/src/core/gps/qgsgpsconnection.h +++ b/src/core/gps/qgsgpsconnection.h @@ -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 diff --git a/src/core/settings/qgssettingsregistrycore.cpp b/src/core/settings/qgssettingsregistrycore.cpp index 7146fcc51fa..a6b5403385d 100644 --- a/src/core/settings/qgssettingsregistrycore.cpp +++ b/src/core/settings/qgssettingsregistrycore.cpp @@ -121,6 +121,8 @@ QgsSettingsRegistryCore::QgsSettingsRegistryCore() addSettingsEntry( &QgsGpsConnection::settingsGpsdPortNumber ); addSettingsEntry( &QgsGpsConnection::settingsGpsdDeviceName ); addSettingsEntry( &QgsGpsConnection::settingsGpsSerialDevice ); + addSettingsEntry( &QgsGpsConnection::settingGpsAcquisitionInterval ); + addSettingsEntry( &QgsGpsConnection::settingGpsDistanceThreshold ); } QgsSettingsRegistryCore::~QgsSettingsRegistryCore() diff --git a/src/ui/qgsgpsinformationwidgetbase.ui b/src/ui/qgsgpsinformationwidgetbase.ui index 18d175b4192..9fcd9153d2f 100644 --- a/src/ui/qgsgpsinformationwidgetbase.ui +++ b/src/ui/qgsgpsinformationwidgetbase.ui @@ -157,8 +157,8 @@ gray = no data 0 0 - 162 - 544 + 579 + 741 @@ -621,6 +621,78 @@ gray = no data 4 + + + + Show Bearing Line + + + true + + + + + + Line style + + + + + + + + 0 + 0 + + + + + + + + + + + + + + true + + + + 0 + 0 + + + + save GPS data (NMEA sentences) to a file + + + Log File + + + true + + + false + + + + 2 + + + 4 + + + + + Qt::StrongFocus + + + + + + @@ -731,79 +803,7 @@ gray = no data - - - - Show Bearing Line - - - true - - - - - - Line style - - - - - - - - 0 - 0 - - - - - - - - - - - - - - true - - - - 0 - 0 - - - - save GPS data (NMEA sentences) to a file - - - Log File - - - true - - - false - - - - 2 - - - 4 - - - - - Qt::StrongFocus - - - - - - - + Map Centering and Rotation @@ -932,42 +932,18 @@ gray = no data - - - - Filtering + + + + Qt::Vertical - - - - - true - - - - - - - Distance threshold (meters) - - - - - - - Acquisition interval (seconds) - - - - - - - true - - - - - + + + 20 + 40 + + + @@ -1208,8 +1184,6 @@ gray = no data mLeapSeconds mTravelBearingCheckBox mCheckShowMarker - mCboAcquisitionInterval - mCboDistanceThreshold radRecenterMap radRecenterWhenNeeded mSpinMapExtentMultiplier diff --git a/src/ui/qgsgpsoptionswidgetbase.ui b/src/ui/qgsgpsoptionswidgetbase.ui index ddda4eb375c..cd0ea3ef11a 100644 --- a/src/ui/qgsgpsoptionswidgetbase.ui +++ b/src/ui/qgsgpsoptionswidgetbase.ui @@ -194,7 +194,7 @@ - + GPS Track Visualization @@ -249,7 +249,44 @@ - + + + + Filtering + + + + + + true + + + + + + + Distance threshold (meters) + + + + + + + Acquisition interval (seconds) + + + + + + + true + + + + + + + Qt::Vertical @@ -262,7 +299,7 @@ - + GPS Visualization Options