summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron McCarthy <aaron.mccarthy@jollamobile.com>2014-02-04 13:45:23 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-04 13:31:36 +0100
commitbe48e390962413258d9c310fbf226759c1229f78 (patch)
tree36aca95675e1329b831ac4203a318b356b75f457
parentacba4e0b3341b081ec1b8a4aba7a0c2639e7b2bf (diff)
Report direction and vertical speed with Geoclue plugin.
Geoclude provides both direction and vertical speed information with the velocity interface. These values were previously being ignored. [ChangeLog][QtPositioning][Geoclue] The Geoclue plugin now reports direction of travel and vertical speed attributes, if supported by the active Geoclue provider. Task-number: QTBUG-36298 Change-Id: I9f99a64f3c2bd78a06a6c60e0ef3af6f75223e9f Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r--src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp62
-rw-r--r--src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h5
2 files changed, 53 insertions, 14 deletions
diff --git a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp
index fc0b8b99..ad1fb4d0 100644
--- a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp
+++ b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster.cpp
@@ -90,14 +90,15 @@ static void velocity_changed (GeoclueVelocity *velocity,
gpointer userdata) // Ptr to this
{
Q_UNUSED(velocity)
- Q_UNUSED(timestamp)
- Q_UNUSED(direction)
- Q_UNUSED(climb)
- if (!(fields & GEOCLUE_VELOCITY_FIELDS_SPEED)) {
- static_cast<QGeoPositionInfoSourceGeoclueMaster *>(userdata)->velocityUpdateFailed();
+
+ QGeoPositionInfoSourceGeoclueMaster *master =
+ static_cast<QGeoPositionInfoSourceGeoclueMaster *>(userdata);
+
+ if (fields == GEOCLUE_VELOCITY_FIELDS_NONE) {
+ master->velocityUpdateFailed();
return;
}
- static_cast<QGeoPositionInfoSourceGeoclueMaster *>(userdata)->velocityUpdateSucceeded(speed);
+ master->velocityUpdateSucceeded(fields, timestamp, speed, direction, climb);
}
// Callback for single async update
@@ -117,10 +118,16 @@ static void position_callback (GeocluePosition *pos, GeocluePositionFields field
}
}
+static double knotsToMetersPerSecond(double knots)
+{
+ return knots * 1852.0 / 3600.0;
+}
+
QGeoPositionInfoSourceGeoclueMaster::QGeoPositionInfoSourceGeoclueMaster(QObject *parent)
: QGeoPositionInfoSource(parent), QGeoclueMaster(this), m_updateInterval(0), m_pos(0), m_vel(0),
- m_lastPositionIsFresh(false), m_lastVelocityIsFresh(false), m_lastVelocity(0),
- m_lastPositionFromSatellite(false), m_methods(AllPositioningMethods), m_running(false)
+ m_lastPositionIsFresh(false), m_lastVelocityIsFresh(false), m_lastVelocity(qQNaN()),
+ m_lastDirection(qQNaN()), m_lastClimb(qQNaN()), m_lastPositionFromSatellite(false),
+ m_methods(AllPositioningMethods), m_running(false)
{
#ifndef QT_NO_DATASTREAM
// Load the last known location
@@ -169,13 +176,31 @@ void QGeoPositionInfoSourceGeoclueMaster::velocityUpdateFailed()
m_lastVelocityIsFresh = false;
}
-void QGeoPositionInfoSourceGeoclueMaster::velocityUpdateSucceeded(double speed)
+void QGeoPositionInfoSourceGeoclueMaster::velocityUpdateSucceeded(GeoclueVelocityFields fields,
+ int timestamp, double speed,
+ double direction, double climb)
{
+ Q_UNUSED(timestamp);
+
#ifdef Q_LOCATION_GEOCLUE_DEBUG
qDebug() << "QGeoPositionInfoSourceGeoclueMaster velocity update succeeded, speed: " << speed;
#endif
// Store the velocity and mark it as fresh. Simple but hopefully adequate.
- m_lastVelocity = speed * 0.514444; // convert knots to m/s
+ if (fields & GEOCLUE_VELOCITY_FIELDS_SPEED)
+ m_lastVelocity = knotsToMetersPerSecond(speed);
+ else
+ m_lastVelocity = qQNaN();
+
+ if (fields & GEOCLUE_VELOCITY_FIELDS_DIRECTION)
+ m_lastDirection = direction;
+ else
+ m_lastDirection = qQNaN();
+
+ if (fields & GEOCLUE_VELOCITY_FIELDS_CLIMB)
+ m_lastClimb = climb;
+ else
+ m_lastClimb = qQNaN();
+
m_lastVelocityIsFresh = true;
}
@@ -190,8 +215,14 @@ void QGeoPositionInfoSourceGeoclueMaster::singleUpdateSucceeded(GeocluePositionF
m_lastPosition = info;
if (m_requestTimer.isActive())
m_requestTimer.stop();
- if (m_lastVelocityIsFresh)
- info.setAttribute(QGeoPositionInfo::GroundSpeed, m_lastVelocity); // assume groundspeed
+ if (m_lastVelocityIsFresh) {
+ if (!qIsNaN(m_lastVelocity))
+ info.setAttribute(QGeoPositionInfo::GroundSpeed, m_lastVelocity);
+ if (!qIsNaN(m_lastDirection))
+ info.setAttribute(QGeoPositionInfo::Direction, m_lastDirection);
+ if (!qIsNaN(m_lastClimb))
+ info.setAttribute(QGeoPositionInfo::VerticalSpeed, m_lastClimb);
+ }
#ifdef Q_LOCATION_GEOCLUE_DEBUG
qDebug() << "QGeoPositionInfoSourceGeoclueMaster single update succeeded: ";
qDebug() << "Lat, lon, alt, speed:" << info.coordinate().latitude() << info.coordinate().longitude() << info.coordinate().altitude() << info.attribute(QGeoPositionInfo::GroundSpeed);
@@ -230,7 +261,12 @@ void QGeoPositionInfoSourceGeoclueMaster::regularUpdateSucceeded(GeocluePosition
m_lastPosition = geoclueToPositionInfo(fields, timestamp, latitude, longitude, altitude, accuracy);
m_lastPositionIsFresh = true;
if (m_lastVelocityIsFresh) {
- m_lastPosition.setAttribute(QGeoPositionInfo::GroundSpeed, m_lastVelocity); // assume groundspeed
+ if (!qIsNaN(m_lastVelocity))
+ m_lastPosition.setAttribute(QGeoPositionInfo::GroundSpeed, m_lastVelocity);
+ if (!qIsNaN(m_lastDirection))
+ m_lastPosition.setAttribute(QGeoPositionInfo::Direction, m_lastDirection);
+ if (!qIsNaN(m_lastClimb))
+ m_lastPosition.setAttribute(QGeoPositionInfo::VerticalSpeed, m_lastClimb);
m_lastVelocityIsFresh = false;
}
// If a non-intervalled startUpdates has been issued, send an update.
diff --git a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h
index 4ddf6603..b9cc42e3 100644
--- a/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h
+++ b/src/plugins/position/geoclue/qgeopositioninfosource_geocluemaster_p.h
@@ -94,7 +94,8 @@ public:
double altitude,
GeoclueAccuracy *accuracy);
void velocityUpdateFailed();
- void velocityUpdateSucceeded(double speed);
+ void velocityUpdateSucceeded(GeoclueVelocityFields fields, int timestamp, double speed,
+ double direction, double climb);
Error error() const;
@@ -126,6 +127,8 @@ private:
bool m_lastPositionIsFresh;
bool m_lastVelocityIsFresh;
double m_lastVelocity;
+ double m_lastDirection;
+ double m_lastClimb;
bool m_lastPositionFromSatellite;
QGeoPositionInfo m_lastPosition;
PositioningMethods m_methods;