From 30a1624c468bd161b645210b860231e89c9b1835 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Sun, 22 Oct 2023 16:40:01 +0700 Subject: [PATCH] Add @position_orientation expression variable --- .../positioning/gnsspositioninformation.cpp | 9 +++--- .../positioning/gnsspositioninformation.h | 11 ++++++- src/core/positioning/positioning.cpp | 30 +++++++++++++++++-- src/core/utils/expressioncontextutils.cpp | 2 ++ 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/core/positioning/gnsspositioninformation.cpp b/src/core/positioning/gnsspositioninformation.cpp index 7dd7f83839..a5e9076f5a 100644 --- a/src/core/positioning/gnsspositioninformation.cpp +++ b/src/core/positioning/gnsspositioninformation.cpp @@ -14,8 +14,6 @@ ***************************************************************************/ #include "gnsspositioninformation.h" -#include "qgslogger.h" -#include "qgsnmeaconnection.h" #include #include @@ -28,7 +26,7 @@ GnssPositionInformation::GnssPositionInformation( double latitude, double longit const QList &satellitesInView, double pdop, double hdop, double vdop, double hacc, double vacc, QDateTime utcDateTime, QChar fixMode, int fixType, int quality, int satellitesUsed, QChar status, const QList &satPrn, bool satInfoComplete, double verticalSpeed, double magneticVariation, int averagedCount, const QString &sourceName, - bool imuCorrection ) + bool imuCorrection, double orientation ) : mLatitude( latitude ) , mLongitude( longitude ) , mElevation( elevation ) @@ -54,6 +52,7 @@ GnssPositionInformation::GnssPositionInformation( double latitude, double longit , mAveragedCount( averagedCount ) , mSourceName( sourceName ) , mImuCorrection( imuCorrection ) + , mOrientation( orientation ) { } @@ -78,7 +77,9 @@ bool GnssPositionInformation::operator==( const GnssPositionInformation &other ) mSatInfoComplete == other.mSatInfoComplete && mVerticalSpeed == other.mVerticalSpeed && mMagneticVariation == other.mMagneticVariation && - mSourceName == other.mSourceName; + mSourceName == other.mSourceName && + mImuCorrection== other.mImuCorrection && + mOrientation == other.mOrientation; // clang-format on } diff --git a/src/core/positioning/gnsspositioninformation.h b/src/core/positioning/gnsspositioninformation.h index 2286fc701e..9e4e2ece92 100644 --- a/src/core/positioning/gnsspositioninformation.h +++ b/src/core/positioning/gnsspositioninformation.h @@ -82,6 +82,8 @@ class GnssPositionInformation Q_PROPERTY( int averagedCount READ averagedCount ) Q_PROPERTY( QString sourceName READ sourceName ) Q_PROPERTY( bool imuCorrection READ imuCorrection ) + Q_PROPERTY( double orientation READ orientation ) + Q_PROPERTY( double orientationValid READ orientationValid ) public: /** @@ -103,7 +105,7 @@ class GnssPositionInformation double hacc = std::numeric_limits::quiet_NaN(), double vacc = std::numeric_limits::quiet_NaN(), QDateTime utcDateTime = QDateTime(), QChar fixMode = QChar(), int fixType = 0, int quality = -1, int satellitesUsed = 0, QChar status = QChar(), const QList &satPrn = QList(), bool satInfoComplete = false, double verticalSpeed = std::numeric_limits::quiet_NaN(), double magneticVariation = std::numeric_limits::quiet_NaN(), int averagedCount = 0, const QString &sourceName = QString(), - bool imuCorrection = false ); + bool imuCorrection = false, double orientation = std::numeric_limits::quiet_NaN() ); bool operator==( const GnssPositionInformation &other ) const; bool operator!=( const GnssPositionInformation &other ) const { return !operator==( other ); } @@ -268,6 +270,12 @@ class GnssPositionInformation */ bool imuCorrection() const { return mImuCorrection; } + /** + * Orientation (in degrees). + */ + double orientation() const { return mOrientation; } + bool orientationValid() const { return !std::isnan( mOrientation ); } + private: double mLatitude = std::numeric_limits::quiet_NaN(); double mLongitude = std::numeric_limits::quiet_NaN(); @@ -294,6 +302,7 @@ class GnssPositionInformation int mAveragedCount = 0; QString mSourceName; bool mImuCorrection; + double mOrientation = std::numeric_limits::quiet_NaN(); }; Q_DECLARE_METATYPE( GnssPositionInformation ) diff --git a/src/core/positioning/positioning.cpp b/src/core/positioning/positioning.cpp index e4fceddb06..6151d9b478 100644 --- a/src/core/positioning/positioning.cpp +++ b/src/core/positioning/positioning.cpp @@ -240,15 +240,41 @@ void Positioning::lastGnssPositionInformationChanged( const GnssPositionInformat if ( mPositionInformation == lastGnssPositionInformation ) return; + const GnssPositionInformation positionInformation( lastGnssPositionInformation.latitude(), + lastGnssPositionInformation.longitude(), + lastGnssPositionInformation.elevation(), + lastGnssPositionInformation.speed(), + lastGnssPositionInformation.direction(), + lastGnssPositionInformation.satellitesInView(), + lastGnssPositionInformation.pdop(), + lastGnssPositionInformation.hdop(), + lastGnssPositionInformation.vdop(), + lastGnssPositionInformation.hacc(), + lastGnssPositionInformation.vacc(), + lastGnssPositionInformation.utcDateTime(), + lastGnssPositionInformation.fixMode(), + lastGnssPositionInformation.fixType(), + lastGnssPositionInformation.quality(), + lastGnssPositionInformation.satellitesUsed(), + lastGnssPositionInformation.status(), + lastGnssPositionInformation.satPrn(), + lastGnssPositionInformation.satInfoComplete(), + lastGnssPositionInformation.verticalSpeed(), + lastGnssPositionInformation.magneticVariation(), + lastGnssPositionInformation.averagedCount(), + lastGnssPositionInformation.sourceName(), + lastGnssPositionInformation.imuCorrection(), + mOrientation ); + if ( mAveragedPosition ) { - mCollectedPositionInformations << lastGnssPositionInformation; + mCollectedPositionInformations << positionInformation; mPositionInformation = PositioningUtils::averagedPositionInformation( mCollectedPositionInformations ); emit averagedPositionCountChanged(); } else { - mPositionInformation = lastGnssPositionInformation; + mPositionInformation = positionInformation; } if ( mPositionInformation.isValid() ) diff --git a/src/core/utils/expressioncontextutils.cpp b/src/core/utils/expressioncontextutils.cpp index 6cdfeb0b53..c352c4146c 100644 --- a/src/core/utils/expressioncontextutils.cpp +++ b/src/core/utils/expressioncontextutils.cpp @@ -40,6 +40,7 @@ QgsExpressionContextScope *ExpressionContextUtils::positionScope( const GnssPosi const QDateTime timestamp = positionInformation.utcDateTime(); const qreal direction = positionInformation.direction(); const qreal groundSpeed = positionInformation.speed(); + const qreal orientation = positionInformation.orientation(); const qreal magneticVariation = positionInformation.magneticVariation(); const qreal horizontalAccuracy = positionInformation.hacc(); const qreal verticalAccuracy = positionInformation.vacc(); @@ -60,6 +61,7 @@ QgsExpressionContextScope *ExpressionContextUtils::positionScope( const GnssPosi addPositionVariable( scope, QStringLiteral( "timestamp" ), timestamp, positionLocked ); addPositionVariable( scope, QStringLiteral( "direction" ), direction, positionLocked ); addPositionVariable( scope, QStringLiteral( "ground_speed" ), groundSpeed, positionLocked ); + addPositionVariable( scope, QStringLiteral( "orientation" ), orientation, positionLocked ); addPositionVariable( scope, QStringLiteral( "magnetic_variation" ), magneticVariation, positionLocked ); addPositionVariable( scope, QStringLiteral( "horizontal_accuracy" ), horizontalAccuracy, positionLocked ); addPositionVariable( scope, QStringLiteral( "vertical_accuracy" ), verticalAccuracy, positionLocked );