Source

Target

Commits (2)
Showing with 59 additions and 17 deletions
......@@ -179,6 +179,8 @@ void QDeclarativePositionSource::setName(const QString &newName)
m_positionSource->setUpdateInterval(m_updateInterval);
m_positionSource->setPreferredPositioningMethods(
static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods)));
setPosition(m_positionSource->lastKnownPosition());
}
if (previousUpdateInterval != updateInterval())
......@@ -263,6 +265,7 @@ void QDeclarativePositionSource::setNmeaSource(const QUrl &nmeaSource)
m_nmeaSocket = 0;
delete m_positionSource;
m_positionSource = 0;
setPosition(QGeoPositionInfo());
// Create the NMEA source based on the given data. QML has automatically set QUrl
// type to point to correct path. If the file is not found, check if the file actually
// was an embedded resource file.
......@@ -280,6 +283,7 @@ void QDeclarativePositionSource::setNmeaSource(const QUrl &nmeaSource)
(qobject_cast<QNmeaPositionInfoSource *>(m_positionSource))->setDevice(m_nmeaFile);
connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
this, SLOT(positionUpdateReceived(QGeoPositionInfo)));
setPosition(m_positionSource->lastKnownPosition());
if (m_active && !m_singleUpdate) {
// Keep on updating even though source changed
QTimer::singleShot(0, this, SLOT(start()));
......@@ -326,6 +330,8 @@ void QDeclarativePositionSource::socketConnected()
connect(m_positionSource, &QNmeaPositionInfoSource::positionUpdated,
this, &QDeclarativePositionSource::positionUpdateReceived);
setPosition(m_positionSource->lastKnownPosition());
if (m_active && !m_singleUpdate) {
// Keep on updating even though source changed
QTimer::singleShot(0, this, SLOT(start()));
......@@ -362,6 +368,24 @@ void QDeclarativePositionSource::socketError(QAbstractSocket::SocketError error)
emit sourceErrorChanged();
}
void QDeclarativePositionSource::setPosition(const QGeoPositionInfo &pi)
{
if (pi.isValid()) {
m_position.setTimestamp(pi.timestamp());
m_position.setCoordinate(pi.coordinate());
if (pi.hasAttribute(QGeoPositionInfo::GroundSpeed))
m_position.setSpeed(pi.attribute(QGeoPositionInfo::GroundSpeed));
if (pi.hasAttribute(QGeoPositionInfo::HorizontalAccuracy))
m_position.setHorizontalAccuracy(pi.attribute(QGeoPositionInfo::HorizontalAccuracy));
if (pi.hasAttribute(QGeoPositionInfo::VerticalAccuracy))
m_position.setVerticalAccuracy(pi.attribute(QGeoPositionInfo::VerticalAccuracy));
} else {
m_position.invalidate();
}
emit positionChanged();
}
/*!
\internal
*/
......@@ -623,22 +647,8 @@ QDeclarativePosition *QDeclarativePositionSource::position()
void QDeclarativePositionSource::positionUpdateReceived(const QGeoPositionInfo &update)
{
if (update.isValid()) {
m_position.setTimestamp(update.timestamp());
m_position.setCoordinate(update.coordinate());
if (update.hasAttribute(QGeoPositionInfo::GroundSpeed)) {
m_position.setSpeed(update.attribute(QGeoPositionInfo::GroundSpeed));
}
if (update.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) {
m_position.setHorizontalAccuracy(update.attribute(QGeoPositionInfo::HorizontalAccuracy));
}
if (update.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) {
m_position.setVerticalAccuracy(update.attribute(QGeoPositionInfo::VerticalAccuracy));
}
emit positionChanged();
} else {
m_position.invalidate();
}
setPosition(update);
if (m_singleUpdate && m_active) {
m_active = false;
m_singleUpdate = false;
......@@ -686,6 +696,8 @@ void QDeclarativePositionSource::componentComplete()
m_positionSource->setUpdateInterval(m_updateInterval);
m_positionSource->setPreferredPositioningMethods(
static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods)));
setPosition(m_positionSource->lastKnownPosition());
}
if (previousUpdateInterval != updateInterval())
......
......@@ -136,7 +136,10 @@ private Q_SLOTS:
void sourceErrorReceived(const QGeoPositionInfoSource::Error error);
void socketConnected();
void socketError(QAbstractSocket::SocketError error);
private:
void setPosition(const QGeoPositionInfo &pi);
QGeoPositionInfoSource *m_positionSource;
QDeclarativePosition m_position;
PositioningMethods m_preferredPositioningMethods;
......
......@@ -43,7 +43,10 @@
#include "qgeopositioninfosource_geocluemaster_p.h"
#include <QtCore>
#include <QtCore/QDateTime>
#include <QtCore/QFile>
#include <QtCore/QSaveFile>
#include <QtCore/QStandardPaths>
#ifdef Q_LOCATION_GEOCLUE_DEBUG
#include <QDebug>
......@@ -127,6 +130,16 @@ QGeoPositionInfoSourceGeoclueMaster::QGeoPositionInfoSourceGeoclueMaster(QObject
m_lastPositionIsFresh(false), m_lastVelocityIsFresh(false), m_lastVelocity(0),
m_lastPositionFromSatellite(false), m_methods(AllPositioningMethods), m_running(false)
{
#ifndef QT_NO_DATASTREAM
// Load the last known location
QFile file(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) +
QStringLiteral("/qtposition-geoclue"));
if (file.open(QIODevice::ReadOnly)) {
QDataStream out(&file);
out >> m_lastPosition;
}
#endif
m_requestTimer.setSingleShot(true);
QObject::connect(&m_requestTimer, SIGNAL(timeout()), this, SLOT(requestUpdateTimeout()));
QObject::connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(startUpdatesTimeout()));
......@@ -134,6 +147,19 @@ QGeoPositionInfoSourceGeoclueMaster::QGeoPositionInfoSourceGeoclueMaster(QObject
QGeoPositionInfoSourceGeoclueMaster::~QGeoPositionInfoSourceGeoclueMaster()
{
#ifndef QT_NO_DATASTREAM
if (m_lastPosition.isValid()) {
QSaveFile file(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) +
QStringLiteral("/qtposition-geoclue"));
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
QDataStream out(&file);
// Only save position and timestamp.
out << QGeoPositionInfo(m_lastPosition.coordinate(), m_lastPosition.timestamp());
file.commit();
}
}
#endif
if (m_pos)
g_object_unref (m_pos);
if (m_vel)
......
......@@ -77,6 +77,7 @@ TestCase {
}
function test_inactive() {
defaultSourceSpy.clear();
compare(defaultSourceSpy.count, 0);
wait(1000);
compare(defaultSourceSpy.count, 0);
......