From 5874f3aac84772a0f0a34f88962881943cd8ee37 Mon Sep 17 00:00:00 2001 From: Jeremy Jackson Date: Mon, 28 Jul 2025 20:37:28 -0400 Subject: [PATCH 1/4] improve correctness of GNSS datetime handline This prevents initial positioning window not being greyed out even when there has never been a GNSS fix. This also avoids pretending the system time is the GNSS time in EXIF metadata. That could potentially break someone's batch image processing, so maybe add to release notes. --- src/core/positioning/internalgnssreceiver.cpp | 4 +++- src/core/positioning/positioningsource.cpp | 2 +- src/core/tracker.cpp | 11 ++++++++--- src/core/utils/expressioncontextutils.cpp | 6 +++++- src/core/utils/fileutils.cpp | 7 +++++-- src/core/utils/positioningutils.cpp | 4 +++- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/core/positioning/internalgnssreceiver.cpp b/src/core/positioning/internalgnssreceiver.cpp index d6f187f2ca..b5d3e9ab39 100644 --- a/src/core/positioning/internalgnssreceiver.cpp +++ b/src/core/positioning/internalgnssreceiver.cpp @@ -177,7 +177,9 @@ void InternalGnssReceiver::handleSatellitesInUseUpdated( const QList( mSatellitesID.size() ), QChar( 'A' ), mSatellitesID, mSatelliteInformationValid, mLastGnssPositionInformation.verticalSpeed(), mLastGnssPositionInformation.magneticVariation(), diff --git a/src/core/positioning/positioningsource.cpp b/src/core/positioning/positioningsource.cpp index 7e534e260c..1fbc48a28a 100644 --- a/src/core/positioning/positioningsource.cpp +++ b/src/core/positioning/positioningsource.cpp @@ -298,7 +298,7 @@ void PositioningSource::lastGnssPositionInformationChanged( const GnssPositionIn lastGnssPositionInformation.vdop(), lastGnssPositionInformation.hacc(), lastGnssPositionInformation.vacc(), - lastGnssPositionInformation.utcDateTime().isValid() ? lastGnssPositionInformation.utcDateTime() : QDateTime::currentDateTimeUtc(), + lastGnssPositionInformation.utcDateTime(), lastGnssPositionInformation.fixMode(), lastGnssPositionInformation.fixType(), lastGnssPositionInformation.quality(), diff --git a/src/core/tracker.cpp b/src/core/tracker.cpp index 0651d72619..bd814409c0 100644 --- a/src/core/tracker.cpp +++ b/src/core/tracker.cpp @@ -306,16 +306,21 @@ void Tracker::processPositionInformation( const GnssPositionInformation &positio if ( !mIsActive && !mIsReplaying ) return; - mLastDevicePositionTimestampMSecsSinceEpoch = positionInformation.utcDateTime().toMSecsSinceEpoch(); + mLastDevicePositionTimestampMSecsSinceEpoch = positionInformation.utcDateTime().isValid() ? + positionInformation.utcDateTime().toMSecsSinceEpoch() : + QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(); double measureValue = 0.0; switch ( mMeasureType ) { case Tracker::SecondsSinceStart: - measureValue = positionInformation.utcDateTime().toSecsSinceEpoch() - mStartPositionTimestamp.toSecsSinceEpoch(); + if ( positionInformation.utcDateTime().isValid() && mStartPositionTimestamp.isValid() ) + measureValue = positionInformation.utcDateTime().toSecsSinceEpoch() - mStartPositionTimestamp.toSecsSinceEpoch(); break; case Tracker::Timestamp: - measureValue = positionInformation.utcDateTime().toSecsSinceEpoch(); + measureValue = positionInformation.utcDateTime().isValid() ? + positionInformation.utcDateTime().toSecsSinceEpoch() : + QDateTime::currentDateTimeUtc().toSecsSinceEpoch(); break; case Tracker::GroundSpeed: measureValue = positionInformation.speed(); diff --git a/src/core/utils/expressioncontextutils.cpp b/src/core/utils/expressioncontextutils.cpp index ca0815bc5e..463b8e927d 100644 --- a/src/core/utils/expressioncontextutils.cpp +++ b/src/core/utils/expressioncontextutils.cpp @@ -44,7 +44,11 @@ QgsExpressionContextScope *ExpressionContextUtils::positionScope( const GnssPosi const QgsGeometry point = QgsGeometry( new QgsPoint( positionInformation.longitude(), positionInformation.latitude(), positionInformation.elevation() ) ); addPositionVariable( scope, QStringLiteral( "coordinate" ), QVariant::fromValue( point ), positionLocked ); - addPositionVariable( scope, QStringLiteral( "timestamp" ), positionInformation.utcDateTime(), positionLocked ); + addPositionVariable( scope, QStringLiteral( "timestamp" ), + positionInformation.utcDateTime().isValid() ? + positionInformation.utcDateTime() : + QDateTime::currentDateTimeUtc(), + positionLocked ); addPositionVariable( scope, QStringLiteral( "direction" ), positionInformation.direction(), positionLocked ); // Speed direction addPositionVariable( scope, QStringLiteral( "ground_speed" ), positionInformation.speed(), positionLocked ); addPositionVariable( scope, QStringLiteral( "orientation" ), positionInformation.orientation(), positionLocked ); // Compass/magnetometer orientation diff --git a/src/core/utils/fileutils.cpp b/src/core/utils/fileutils.cpp index f2fdc38ba5..b1672f7048 100644 --- a/src/core/utils/fileutils.cpp +++ b/src/core/utils/fileutils.cpp @@ -373,8 +373,11 @@ void FileUtils::addImageMetadata( const QString &imagePath, const GnssPositionIn metadata["Exif.GPSInfo.GPSSpeedRef"] = "K"; } - metadata["Exif.GPSInfo.GPSDateStamp"] = positionInformation.utcDateTime().date(); - metadata["Exif.GPSInfo.GPSTimeStamp"] = positionInformation.utcDateTime().time(); + if ( positionInformation.utcDateTime().isValid() ) + { + metadata["Exif.GPSInfo.GPSDateStamp"] = positionInformation.utcDateTime().date(); + metadata["Exif.GPSInfo.GPSTimeStamp"] = positionInformation.utcDateTime().time(); + } metadata["Exif.GPSInfo.GPSSatellites"] = QString::number( positionInformation.satellitesUsed() ).rightJustified( 2, '0' ); diff --git a/src/core/utils/positioningutils.cpp b/src/core/utils/positioningutils.cpp index f18f53ff30..cf48e10ad8 100644 --- a/src/core/utils/positioningutils.cpp +++ b/src/core/utils/positioningutils.cpp @@ -74,7 +74,9 @@ GnssPositionInformation PositioningUtils::averagedPositionInformation( const QLi double verticalSpeed = std::numeric_limits::quiet_NaN(); double magneticVariation = std::numeric_limits::quiet_NaN(); - QDateTime utcDateTime = positionsInformation.last().utcDateTime(); + QDateTime utcDateTime = positionsInformation.last().utcDateTime().isValid() ? + positionsInformation.last().utcDateTime() : + QDateTime::currentDateTimeUtc(); QList satellitesInView = positionsInformation.at( 0 ).satellitesInView(); int satellitesUsed = satellitesInView.size(); From 9543d5229ba6e572bbfa4f6b899bd71c1f12338d Mon Sep 17 00:00:00 2001 From: Jeremy Jackson Date: Tue, 29 Jul 2025 15:51:27 -0400 Subject: [PATCH 2/4] forgot another pre-commit hook --- src/core/positioning/internalgnssreceiver.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/core/positioning/internalgnssreceiver.cpp b/src/core/positioning/internalgnssreceiver.cpp index b5d3e9ab39..d092d3b145 100644 --- a/src/core/positioning/internalgnssreceiver.cpp +++ b/src/core/positioning/internalgnssreceiver.cpp @@ -177,9 +177,7 @@ void InternalGnssReceiver::handleSatellitesInUseUpdated( const QList( mSatellitesID.size() ), QChar( 'A' ), mSatellitesID, mSatelliteInformationValid, mLastGnssPositionInformation.verticalSpeed(), mLastGnssPositionInformation.magneticVariation(), From 70d1283512e1307ecba451742958cb8e3eac1965 Mon Sep 17 00:00:00 2001 From: Jeremy Jackson Date: Tue, 29 Jul 2025 16:01:51 -0400 Subject: [PATCH 3/4] commit-hook for real this time --- src/core/tracker.cpp | 8 ++------ src/core/utils/expressioncontextutils.cpp | 8 +++----- src/core/utils/positioningutils.cpp | 4 +--- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/core/tracker.cpp b/src/core/tracker.cpp index bd814409c0..eae40b3807 100644 --- a/src/core/tracker.cpp +++ b/src/core/tracker.cpp @@ -306,9 +306,7 @@ void Tracker::processPositionInformation( const GnssPositionInformation &positio if ( !mIsActive && !mIsReplaying ) return; - mLastDevicePositionTimestampMSecsSinceEpoch = positionInformation.utcDateTime().isValid() ? - positionInformation.utcDateTime().toMSecsSinceEpoch() : - QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(); + mLastDevicePositionTimestampMSecsSinceEpoch = positionInformation.utcDateTime().isValid() ? positionInformation.utcDateTime().toMSecsSinceEpoch() : QDateTime::currentDateTimeUtc().toMSecsSinceEpoch(); double measureValue = 0.0; switch ( mMeasureType ) @@ -318,9 +316,7 @@ void Tracker::processPositionInformation( const GnssPositionInformation &positio measureValue = positionInformation.utcDateTime().toSecsSinceEpoch() - mStartPositionTimestamp.toSecsSinceEpoch(); break; case Tracker::Timestamp: - measureValue = positionInformation.utcDateTime().isValid() ? - positionInformation.utcDateTime().toSecsSinceEpoch() : - QDateTime::currentDateTimeUtc().toSecsSinceEpoch(); + measureValue = positionInformation.utcDateTime().isValid() ? positionInformation.utcDateTime().toSecsSinceEpoch() : QDateTime::currentDateTimeUtc().toSecsSinceEpoch(); break; case Tracker::GroundSpeed: measureValue = positionInformation.speed(); diff --git a/src/core/utils/expressioncontextutils.cpp b/src/core/utils/expressioncontextutils.cpp index 463b8e927d..a620860651 100644 --- a/src/core/utils/expressioncontextutils.cpp +++ b/src/core/utils/expressioncontextutils.cpp @@ -44,11 +44,9 @@ QgsExpressionContextScope *ExpressionContextUtils::positionScope( const GnssPosi const QgsGeometry point = QgsGeometry( new QgsPoint( positionInformation.longitude(), positionInformation.latitude(), positionInformation.elevation() ) ); addPositionVariable( scope, QStringLiteral( "coordinate" ), QVariant::fromValue( point ), positionLocked ); - addPositionVariable( scope, QStringLiteral( "timestamp" ), - positionInformation.utcDateTime().isValid() ? - positionInformation.utcDateTime() : - QDateTime::currentDateTimeUtc(), - positionLocked ); + addPositionVariable( scope, QStringLiteral( "timestamp" ), + positionInformation.utcDateTime().isValid() ? positionInformation.utcDateTime() : QDateTime::currentDateTimeUtc(), + positionLocked ); addPositionVariable( scope, QStringLiteral( "direction" ), positionInformation.direction(), positionLocked ); // Speed direction addPositionVariable( scope, QStringLiteral( "ground_speed" ), positionInformation.speed(), positionLocked ); addPositionVariable( scope, QStringLiteral( "orientation" ), positionInformation.orientation(), positionLocked ); // Compass/magnetometer orientation diff --git a/src/core/utils/positioningutils.cpp b/src/core/utils/positioningutils.cpp index cf48e10ad8..1cf274b5e6 100644 --- a/src/core/utils/positioningutils.cpp +++ b/src/core/utils/positioningutils.cpp @@ -74,9 +74,7 @@ GnssPositionInformation PositioningUtils::averagedPositionInformation( const QLi double verticalSpeed = std::numeric_limits::quiet_NaN(); double magneticVariation = std::numeric_limits::quiet_NaN(); - QDateTime utcDateTime = positionsInformation.last().utcDateTime().isValid() ? - positionsInformation.last().utcDateTime() : - QDateTime::currentDateTimeUtc(); + QDateTime utcDateTime = positionsInformation.last().utcDateTime().isValid() ? positionsInformation.last().utcDateTime() : QDateTime::currentDateTimeUtc(); QList satellitesInView = positionsInformation.at( 0 ).satellitesInView(); int satellitesUsed = satellitesInView.size(); From 0bdbd7daabe17a3d28dafdd2656bcc81545f4c11 Mon Sep 17 00:00:00 2001 From: Jeremy Jackson Date: Thu, 14 Aug 2025 10:57:49 -0400 Subject: [PATCH 4/4] add comment to trigger MacOS build --- src/core/utils/fileutils.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/utils/fileutils.cpp b/src/core/utils/fileutils.cpp index b1672f7048..d01faa3d16 100644 --- a/src/core/utils/fileutils.cpp +++ b/src/core/utils/fileutils.cpp @@ -373,6 +373,7 @@ void FileUtils::addImageMetadata( const QString &imagePath, const GnssPositionIn metadata["Exif.GPSInfo.GPSSpeedRef"] = "K"; } + // slight change in behaviour, but more correct if ( positionInformation.utcDateTime().isValid() ) { metadata["Exif.GPSInfo.GPSDateStamp"] = positionInformation.utcDateTime().date();