Revision control

Copy as Markdown

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtPositioning/qgeopositioninfosource.h>
#include <QtPositioning/qgeopositioninfosourcefactory.h>
#include <QObject>
#include <QtPlugin>
#include <QTimer>
QT_USE_NAMESPACE
class DummySourcePrivate;
class DummySource : public QGeoPositionInfoSource
{
Q_OBJECT
public:
DummySource(const QVariantMap &parameters, QObject *parent=0);
~DummySource();
void startUpdates() override;
void stopUpdates() override;
void requestUpdate(int timeout = 5000) override;
QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const override;
PositioningMethods supportedPositioningMethods() const override;
void setUpdateInterval(int msec) override;
int minimumUpdateInterval() const override;
Error error() const override;
bool setBackendProperty(const QString &name, const QVariant &value) override;
QVariant backendProperty(const QString &name) const override;
private:
QTimer *timer;
QTimer *timeoutTimer;
QTimer *singleTimer;
QGeoPositionInfo lastPosition;
QDateTime lastUpdateTime;
Error lastError = QGeoPositionInfoSource::NoError;
qreal altitude = 0.0;
private slots:
void updatePosition();
void doTimeout();
};
DummySource::DummySource(const QVariantMap &parameters, QObject *parent) :
QGeoPositionInfoSource(parent),
timer(new QTimer(this)),
timeoutTimer(new QTimer(this)),
singleTimer(new QTimer(this)),
lastPosition(QGeoCoordinate(0,0), QDateTime::currentDateTime())
{
if (parameters.contains(QStringLiteral("test.source.altitude"))) {
const qreal alti = parameters.value(QStringLiteral("test.source.altitude")).toReal();
altitude = alti;
QGeoCoordinate crd = lastPosition.coordinate();
crd.setAltitude(alti);
lastPosition.setCoordinate(crd);
}
timer->setInterval(200);
connect(timer, SIGNAL(timeout()),
this, SLOT(updatePosition()));
connect(singleTimer, SIGNAL(timeout()),
this, SLOT(updatePosition()));
connect(timeoutTimer, SIGNAL(timeout()),
this, SLOT(doTimeout()));
}
QGeoPositionInfoSource::Error DummySource::error() const
{
return lastError;
}
bool DummySource::setBackendProperty(const QString &name, const QVariant &value)
{
if (name == QStringLiteral("altitude")) {
altitude = value.toReal();
return true;
}
return false;
}
QVariant DummySource::backendProperty(const QString &name) const
{
if (name == QStringLiteral("altitude"))
return altitude;
return QVariant();
}
void DummySource::setUpdateInterval(int msec)
{
const int minInterval = minimumUpdateInterval();
if (msec == 0) {
timer->setInterval(minInterval);
} else if (msec < minInterval) {
msec = minInterval;
timer->setInterval(msec);
} else {
timer->setInterval(msec);
}
QGeoPositionInfoSource::setUpdateInterval(msec);
}
int DummySource::minimumUpdateInterval() const
{
return 200;
}
QGeoPositionInfo DummySource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const
{
Q_UNUSED(fromSatellitePositioningMethodsOnly);
return lastPosition;
}
QGeoPositionInfoSource::PositioningMethods DummySource::supportedPositioningMethods() const
{
return QGeoPositionInfoSource::AllPositioningMethods;
}
void DummySource::startUpdates()
{
lastError = QGeoPositionInfoSource::NoError;
timer->start();
}
void DummySource::stopUpdates()
{
timer->stop();
}
void DummySource::requestUpdate(int timeout)
{
lastError = QGeoPositionInfoSource::NoError;
if (timeout == 0)
timeout = 5000;
if (timeout < 0)
timeout = 0;
timeoutTimer->setInterval(timeout);
timeoutTimer->start();
if (timer->isActive()) {
timer->stop();
timer->start();
}
singleTimer->setInterval(minimumUpdateInterval());
singleTimer->start();
}
DummySource::~DummySource()
{}
void DummySource::updatePosition()
{
timeoutTimer->stop();
singleTimer->stop();
const QDateTime now = QDateTime::currentDateTime();
QGeoCoordinate coord(lastPosition.coordinate().latitude() + 0.1,
lastPosition.coordinate().longitude() + 0.1,
altitude);
QGeoPositionInfo info(coord, now);
info.setAttribute(QGeoPositionInfo::Direction, lastPosition.coordinate().azimuthTo(coord));
if (lastUpdateTime.isValid()) {
double speed = lastPosition.coordinate().distanceTo(coord) / lastUpdateTime.msecsTo(now);
info.setAttribute(QGeoPositionInfo::GroundSpeed, 1000 * speed);
}
lastUpdateTime = now;
lastPosition = info;
emit positionUpdated(info);
}
void DummySource::doTimeout()
{
timeoutTimer->stop();
singleTimer->stop();
lastError = QGeoPositionInfoSource::UpdateTimeoutError;
emit QGeoPositionInfoSource::errorOccurred(lastError);
}
class QGeoPositionInfoSourceFactoryTest : public QObject, public QGeoPositionInfoSourceFactory
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0"
FILE "plugin.json")
Q_INTERFACES(QGeoPositionInfoSourceFactory)
public:
QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap &parameters) override;
QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap &parameters) override;
QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap &parameters) override;
};
QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryTest::positionInfoSource(QObject *parent, const QVariantMap &parameters)
{
return new DummySource(parameters, parent);
}
QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryTest::satelliteInfoSource(QObject *parent, const QVariantMap &parameters)
{
Q_UNUSED(parent);
Q_UNUSED(parameters);
return nullptr;
}
QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryTest::areaMonitor(QObject *parent, const QVariantMap &parameters)
{
Q_UNUSED(parent);
Q_UNUSED(parameters);
return nullptr;
}
#include "plugin.moc"