From e782464a8e5a96acbf9152f8708df114af67dbb6 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 25 Aug 2026 15:10:17 +0200 Subject: [PATCH 1/4] Reset missing position data if missing --- .../providers/internalpositionprovider.cpp | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/app/position/providers/internalpositionprovider.cpp b/app/position/providers/internalpositionprovider.cpp index cbb00aa47..aba5c21f3 100644 --- a/app/position/providers/internalpositionprovider.cpp +++ b/app/position/providers/internalpositionprovider.cpp @@ -173,45 +173,51 @@ void InternalPositionProvider::parsePositionUpdate( const QGeoPositionInfo &posi positionDataHasChanged = true; } - const bool hasSpeedInfo = localPosition.hasAttribute( QGeoPositionInfo::GroundSpeed ); - if ( hasSpeedInfo && !qgsDoubleNear( localPosition.attribute( QGeoPositionInfo::GroundSpeed ), mLastPosition.speed ) ) + const double newSpeed = localPosition.hasAttribute( QGeoPositionInfo::GroundSpeed ) ? + localPosition.attribute( QGeoPositionInfo::GroundSpeed ) * 3.6 : std::numeric_limits::quiet_NaN(); // convert from m/s to km/h + if ( !qgsDoubleNear( newSpeed, mLastPosition.speed ) ) { - mLastPosition.speed = localPosition.attribute( QGeoPositionInfo::GroundSpeed ) * 3.6; // convert from m/s to km/h + mLastPosition.speed = newSpeed; positionDataHasChanged = true; } - const bool hasVerticalSpeedInfo = localPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ); - if ( hasVerticalSpeedInfo && !qgsDoubleNear( localPosition.attribute( QGeoPositionInfo::VerticalSpeed ), mLastPosition.verticalSpeed ) ) + const double newVerticalSpeed = localPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ? + localPosition.attribute( QGeoPositionInfo::VerticalSpeed ) * 3.6 : std::numeric_limits::quiet_NaN(); // convert from m/s to km/h + if ( !qgsDoubleNear( newVerticalSpeed, mLastPosition.verticalSpeed ) ) { - mLastPosition.verticalSpeed = localPosition.attribute( QGeoPositionInfo::VerticalSpeed ) * 3.6; // convert from m/s to km/h + mLastPosition.verticalSpeed = newVerticalSpeed; positionDataHasChanged = true; } - const bool hasDirectionInfo = localPosition.hasAttribute( QGeoPositionInfo::Direction ); - if ( hasDirectionInfo && !qgsDoubleNear( localPosition.attribute( QGeoPositionInfo::Direction ), mLastPosition.direction ) ) + const double newDirection = localPosition.hasAttribute( QGeoPositionInfo::Direction ) ? + localPosition.attribute( QGeoPositionInfo::Direction ) : std::numeric_limits::quiet_NaN(); + if ( !qgsDoubleNear( newDirection, mLastPosition.direction ) ) { - mLastPosition.direction = localPosition.attribute( QGeoPositionInfo::Direction ); + mLastPosition.direction = newDirection; positionDataHasChanged = true; } - const bool hasMagneticVariation = localPosition.hasAttribute( QGeoPositionInfo::MagneticVariation ); - if ( hasMagneticVariation && !qgsDoubleNear( localPosition.attribute( QGeoPositionInfo::MagneticVariation ), mLastPosition.magneticVariation ) ) + const double newMagneticVariation = localPosition.hasAttribute( QGeoPositionInfo::MagneticVariation ) ? + localPosition.attribute( QGeoPositionInfo::MagneticVariation ) : -1; + if ( !qgsDoubleNear( newMagneticVariation, mLastPosition.magneticVariation ) ) { - mLastPosition.magneticVariation = localPosition.attribute( QGeoPositionInfo::MagneticVariation ); + mLastPosition.magneticVariation = newMagneticVariation; positionDataHasChanged = true; } - const bool hasHacc = localPosition.hasAttribute( QGeoPositionInfo::HorizontalAccuracy ); - if ( hasHacc && !qgsDoubleNear( localPosition.attribute( QGeoPositionInfo::HorizontalAccuracy ), mLastPosition.hacc ) ) + const double newHorizontalAccuracy = localPosition.hasAttribute( QGeoPositionInfo::HorizontalAccuracy ) ? + localPosition.attribute( QGeoPositionInfo::HorizontalAccuracy ) : std::numeric_limits::quiet_NaN();; + if ( !qgsDoubleNear( newHorizontalAccuracy, mLastPosition.hacc ) ) { - mLastPosition.hacc = localPosition.attribute( QGeoPositionInfo::HorizontalAccuracy ); + mLastPosition.hacc = newHorizontalAccuracy; positionDataHasChanged = true; } - const bool hasVacc = localPosition.hasAttribute( QGeoPositionInfo::VerticalAccuracy ); - if ( hasVacc && !qgsDoubleNear( localPosition.attribute( QGeoPositionInfo::VerticalAccuracy ), mLastPosition.vacc ) ) + const double newVerticalAccuracy = localPosition.hasAttribute( QGeoPositionInfo::VerticalAccuracy ) ? + localPosition.attribute( QGeoPositionInfo::VerticalAccuracy ) : std::numeric_limits::quiet_NaN();; + if ( !qgsDoubleNear( newVerticalAccuracy, mLastPosition.vacc ) ) { - mLastPosition.vacc = localPosition.attribute( QGeoPositionInfo::VerticalAccuracy ); + mLastPosition.vacc = newVerticalAccuracy; positionDataHasChanged = true; } From 14ce34905be48bdc632e004d138aeaa6c697f6e8 Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Mon, 7 Sep 2026 12:43:08 +0200 Subject: [PATCH 2/4] Fix formatting --- app/position/providers/internalpositionprovider.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/position/providers/internalpositionprovider.cpp b/app/position/providers/internalpositionprovider.cpp index aba5c21f3..9c54ade40 100644 --- a/app/position/providers/internalpositionprovider.cpp +++ b/app/position/providers/internalpositionprovider.cpp @@ -206,7 +206,7 @@ void InternalPositionProvider::parsePositionUpdate( const QGeoPositionInfo &posi } const double newHorizontalAccuracy = localPosition.hasAttribute( QGeoPositionInfo::HorizontalAccuracy ) ? - localPosition.attribute( QGeoPositionInfo::HorizontalAccuracy ) : std::numeric_limits::quiet_NaN();; + localPosition.attribute( QGeoPositionInfo::HorizontalAccuracy ) : std::numeric_limits::quiet_NaN(); if ( !qgsDoubleNear( newHorizontalAccuracy, mLastPosition.hacc ) ) { mLastPosition.hacc = newHorizontalAccuracy; @@ -214,7 +214,7 @@ void InternalPositionProvider::parsePositionUpdate( const QGeoPositionInfo &posi } const double newVerticalAccuracy = localPosition.hasAttribute( QGeoPositionInfo::VerticalAccuracy ) ? - localPosition.attribute( QGeoPositionInfo::VerticalAccuracy ) : std::numeric_limits::quiet_NaN();; + localPosition.attribute( QGeoPositionInfo::VerticalAccuracy ) : std::numeric_limits::quiet_NaN(); if ( !qgsDoubleNear( newVerticalAccuracy, mLastPosition.vacc ) ) { mLastPosition.vacc = newVerticalAccuracy; From 4087f4feedbe35412476691195449261000c23dc Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 8 Sep 2026 10:32:20 +0200 Subject: [PATCH 3/4] Align default position values with definition --- app/position/geoposition.cpp | 3 --- app/position/providers/internalpositionprovider.cpp | 4 ++-- app/position/providers/trimblepositionprovider.cpp | 6 +++--- app/qml/gps/MMGpsDataDrawer.qml | 4 ++-- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/app/position/geoposition.cpp b/app/position/geoposition.cpp index 7d781729c..d557afd27 100644 --- a/app/position/geoposition.cpp +++ b/app/position/geoposition.cpp @@ -16,13 +16,10 @@ GeoPosition::GeoPosition() : QgsGpsInformation() longitude = std::numeric_limits::quiet_NaN(); elevation = std::numeric_limits::quiet_NaN(); elevation_diff = std::numeric_limits::quiet_NaN(); - direction = -1; speed = -1; pdop = -1; hdop = -1; vdop = -1; - hacc = -1; - vacc = -1; satellitesUsed = -1; } diff --git a/app/position/providers/internalpositionprovider.cpp b/app/position/providers/internalpositionprovider.cpp index 9c54ade40..082c38ca3 100644 --- a/app/position/providers/internalpositionprovider.cpp +++ b/app/position/providers/internalpositionprovider.cpp @@ -174,7 +174,7 @@ void InternalPositionProvider::parsePositionUpdate( const QGeoPositionInfo &posi } const double newSpeed = localPosition.hasAttribute( QGeoPositionInfo::GroundSpeed ) ? - localPosition.attribute( QGeoPositionInfo::GroundSpeed ) * 3.6 : std::numeric_limits::quiet_NaN(); // convert from m/s to km/h + localPosition.attribute( QGeoPositionInfo::GroundSpeed ) * 3.6 : -1; // convert from m/s to km/h if ( !qgsDoubleNear( newSpeed, mLastPosition.speed ) ) { mLastPosition.speed = newSpeed; @@ -182,7 +182,7 @@ void InternalPositionProvider::parsePositionUpdate( const QGeoPositionInfo &posi } const double newVerticalSpeed = localPosition.hasAttribute( QGeoPositionInfo::VerticalSpeed ) ? - localPosition.attribute( QGeoPositionInfo::VerticalSpeed ) * 3.6 : std::numeric_limits::quiet_NaN(); // convert from m/s to km/h + localPosition.attribute( QGeoPositionInfo::VerticalSpeed ) * 3.6 : -1; // convert from m/s to km/h if ( !qgsDoubleNear( newVerticalSpeed, mLastPosition.verticalSpeed ) ) { mLastPosition.verticalSpeed = newVerticalSpeed; diff --git a/app/position/providers/trimblepositionprovider.cpp b/app/position/providers/trimblepositionprovider.cpp index 80bd4c512..7f7c1d58b 100644 --- a/app/position/providers/trimblepositionprovider.cpp +++ b/app/position/providers/trimblepositionprovider.cpp @@ -216,7 +216,7 @@ GeoPosition TrimblePositionProvider::parseLocationMessage( const QString &json ) } if ( obj.contains( QStringLiteral( "bearing" ) ) && !obj.value( QStringLiteral( "bearing" ) ).isNull() ) - pos.direction = obj.value( QStringLiteral( "bearing" ) ).toDouble( -1 ); + pos.direction = obj.value( QStringLiteral( "bearing" ) ).toDouble( std::numeric_limits::quiet_NaN() ); if ( obj.contains( QStringLiteral( "pdop" ) ) && !obj.value( QStringLiteral( "pdop" ) ).isNull() ) pos.pdop = obj.value( QStringLiteral( "pdop" ) ).toDouble( -1 ); @@ -228,10 +228,10 @@ GeoPosition TrimblePositionProvider::parseLocationMessage( const QString &json ) pos.vdop = obj.value( QStringLiteral( "vdop" ) ).toDouble( -1 ); if ( obj.contains( QStringLiteral( "hrms" ) ) && !obj.value( QStringLiteral( "hrms" ) ).isNull() ) - pos.hacc = obj.value( QStringLiteral( "hrms" ) ).toDouble( -1 ); + pos.hacc = obj.value( QStringLiteral( "hrms" ) ).toDouble( std::numeric_limits::quiet_NaN() ); if ( obj.contains( QStringLiteral( "vrms" ) ) && !obj.value( QStringLiteral( "vrms" ) ).isNull() ) - pos.vacc = obj.value( QStringLiteral( "vrms" ) ).toDouble( -1 ); + pos.vacc = obj.value( QStringLiteral( "vrms" ) ).toDouble( std::numeric_limits::quiet_NaN() ); if ( obj.contains( QStringLiteral( "totalSatInUse" ) ) && !obj.value( QStringLiteral( "totalSatInUse" ) ).isNull() ) pos.satellitesUsed = obj.value( QStringLiteral( "totalSatInUse" ) ).toInt( -1 ); diff --git a/app/qml/gps/MMGpsDataDrawer.qml b/app/qml/gps/MMGpsDataDrawer.qml index b13a455d3..948d8b3b2 100644 --- a/app/qml/gps/MMGpsDataDrawer.qml +++ b/app/qml/gps/MMGpsDataDrawer.qml @@ -166,7 +166,7 @@ MMComponents.MMDrawer { title: qsTr( "Horizontal accuracy" ) value: { - if ( !PositionKit.hasPosition || PositionKit.horizontalAccuracy < 0 ) { + if ( !PositionKit.hasPosition || Number.isNaN( PositionKit.horizontalAccuracy ) ) { return qsTr( "N/A" ) } @@ -181,7 +181,7 @@ MMComponents.MMDrawer { title: qsTr( "Vertical accuracy" ) value: { - if ( !PositionKit.hasPosition || PositionKit.verticalAccuracy < 0 ) { + if ( !PositionKit.hasPosition || Number.isNaN( PositionKit.verticalAccuracy ) ) { return qsTr( "N/A" ) } From bd415a32eeb353ff7f1fd9e69628a758be7bf47d Mon Sep 17 00:00:00 2001 From: Matej Bagar Date: Tue, 8 Sep 2026 11:09:57 +0200 Subject: [PATCH 4/4] Fix position tests --- app/test/testposition.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/test/testposition.cpp b/app/test/testposition.cpp index 4180d89b3..e73e473ad 100644 --- a/app/test/testposition.cpp +++ b/app/test/testposition.cpp @@ -212,8 +212,8 @@ void TestPosition::testBluetoothProviderPosition() // test if position kit has correct information QVERIFY( qgsDoubleNear( positionKit->latitude(), 48.10305 ) ); QVERIFY( qgsDoubleNear( positionKit->longitude(), 17.1064 ) ); - QCOMPARE( positionKit->horizontalAccuracy(), -1 ); - QCOMPARE( positionKit->verticalAccuracy(), -1 ); + QVERIFY( std::isnan( positionKit->horizontalAccuracy() ) ); + QVERIFY( std::isnan( positionKit->verticalAccuracy() ) ); QCOMPARE( positionKit->altitude() + positionKit->antennaHeight(), 171.3 ); QCOMPARE( positionKit->speed(), -1 ); QCOMPARE( positionKit->hdop(), -1 );