Skip to content

Commit

Permalink
Add @position_orientation expression variable
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Oct 22, 2023
1 parent da215ed commit 30a1624
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 7 deletions.
9 changes: 5 additions & 4 deletions src/core/positioning/gnsspositioninformation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
***************************************************************************/

#include "gnsspositioninformation.h"
#include "qgslogger.h"
#include "qgsnmeaconnection.h"

#include <QCoreApplication>
#include <QFileInfo>
Expand All @@ -28,7 +26,7 @@ GnssPositionInformation::GnssPositionInformation( double latitude, double longit
const QList<QgsSatelliteInfo> &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<int> &satPrn,
bool satInfoComplete, double verticalSpeed, double magneticVariation, int averagedCount, const QString &sourceName,
bool imuCorrection )
bool imuCorrection, double orientation )
: mLatitude( latitude )
, mLongitude( longitude )
, mElevation( elevation )
Expand All @@ -54,6 +52,7 @@ GnssPositionInformation::GnssPositionInformation( double latitude, double longit
, mAveragedCount( averagedCount )
, mSourceName( sourceName )
, mImuCorrection( imuCorrection )
, mOrientation( orientation )
{
}

Expand All @@ -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
}

Expand Down
11 changes: 10 additions & 1 deletion src/core/positioning/gnsspositioninformation.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
/**
Expand All @@ -103,7 +105,7 @@ class GnssPositionInformation
double hacc = std::numeric_limits<double>::quiet_NaN(), double vacc = std::numeric_limits<double>::quiet_NaN(), QDateTime utcDateTime = QDateTime(),
QChar fixMode = QChar(), int fixType = 0, int quality = -1, int satellitesUsed = 0, QChar status = QChar(), const QList<int> &satPrn = QList<int>(), bool satInfoComplete = false,
double verticalSpeed = std::numeric_limits<double>::quiet_NaN(), double magneticVariation = std::numeric_limits<double>::quiet_NaN(), int averagedCount = 0, const QString &sourceName = QString(),
bool imuCorrection = false );
bool imuCorrection = false, double orientation = std::numeric_limits<double>::quiet_NaN() );

bool operator==( const GnssPositionInformation &other ) const;
bool operator!=( const GnssPositionInformation &other ) const { return !operator==( other ); }
Expand Down Expand Up @@ -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<double>::quiet_NaN();
double mLongitude = std::numeric_limits<double>::quiet_NaN();
Expand All @@ -294,6 +302,7 @@ class GnssPositionInformation
int mAveragedCount = 0;
QString mSourceName;
bool mImuCorrection;
double mOrientation = std::numeric_limits<double>::quiet_NaN();
};

Q_DECLARE_METATYPE( GnssPositionInformation )
Expand Down
30 changes: 28 additions & 2 deletions src/core/positioning/positioning.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() )
Expand Down
2 changes: 2 additions & 0 deletions src/core/utils/expressioncontextutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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 );
Expand Down

0 comments on commit 30a1624

Please sign in to comment.