1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #include <QtPositioning/qgeopositioninfosource.h>
30 #include <QtPositioning/qgeopositioninfosourcefactory.h>
31 #include <QObject>
32 #include <QtPlugin>
33 #include <QTimer>
34 
35 QT_USE_NAMESPACE
36 
37 class DummySource : public QGeoPositionInfoSource
38 {
39     Q_OBJECT
40 
41 public:
42     DummySource(QObject *parent = nullptr);
43     ~DummySource();
44 
45     void startUpdates();
46     void stopUpdates();
47     void requestUpdate(int timeout=5000);
48 
49     QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const;
50     PositioningMethods supportedPositioningMethods() const;
51 
52     void setUpdateInterval(int msec);
53     int minimumUpdateInterval() const;
54     Error error() const;
55 
56 private:
57     QTimer *timer;
58     QTimer *timeoutTimer;
59     QTimer *singleTimer;
60     QGeoPositionInfo lastPosition;
61     QDateTime lastUpdateTime;
62 
63 private slots:
64     void updatePosition();
65     void doTimeout();
66 };
67 
DummySource(QObject * parent)68 DummySource::DummySource(QObject *parent) :
69     QGeoPositionInfoSource(parent),
70     timer(new QTimer(this)),
71     timeoutTimer(new QTimer(this)),
72     singleTimer(new QTimer(this)),
73     lastPosition(QGeoCoordinate(0,0), QDateTime::currentDateTime())
74 {
75     timer->setInterval(1000);
76     connect(timer, SIGNAL(timeout()),
77             this, SLOT(updatePosition()));
78     connect(singleTimer, SIGNAL(timeout()),
79             this, SLOT(updatePosition()));
80     connect(timeoutTimer, SIGNAL(timeout()),
81             this, SLOT(doTimeout()));
82 }
83 
error() const84 QGeoPositionInfoSource::Error DummySource::error() const
85 {
86     return QGeoPositionInfoSource::NoError;
87 }
88 
89 
setUpdateInterval(int msec)90 void DummySource::setUpdateInterval(int msec)
91 {
92     if (msec == 0) {
93         timer->setInterval(1000);
94     } else if (msec < 1000) {
95         msec = 1000;
96         timer->setInterval(msec);
97     } else {
98         timer->setInterval(msec);
99     }
100 
101     QGeoPositionInfoSource::setUpdateInterval(msec);
102 }
103 
minimumUpdateInterval() const104 int DummySource::minimumUpdateInterval() const
105 {
106     return 1000;
107 }
108 
lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const109 QGeoPositionInfo DummySource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const
110 {
111     Q_UNUSED(fromSatellitePositioningMethodsOnly);
112     return lastPosition;
113 }
114 
supportedPositioningMethods() const115 QGeoPositionInfoSource::PositioningMethods DummySource::supportedPositioningMethods() const
116 {
117     return QGeoPositionInfoSource::AllPositioningMethods;
118 }
119 
startUpdates()120 void DummySource::startUpdates()
121 {
122     timer->start();
123 }
124 
stopUpdates()125 void DummySource::stopUpdates()
126 {
127     timer->stop();
128 }
129 
requestUpdate(int timeout)130 void DummySource::requestUpdate(int timeout)
131 {
132     if (timeout == 0)
133         timeout = 5000;
134     if (timeout < 0)
135         timeout = 0;
136 
137     timeoutTimer->setInterval(timeout);
138     timeoutTimer->start();
139 
140     if (timer->isActive()) {
141         timer->stop();
142         timer->start();
143     }
144 
145     singleTimer->setInterval(1000);
146     singleTimer->start();
147 }
148 
~DummySource()149 DummySource::~DummySource()
150 {}
151 
updatePosition()152 void DummySource::updatePosition()
153 {
154     timeoutTimer->stop();
155     singleTimer->stop();
156 
157     const QDateTime now = QDateTime::currentDateTime();
158 
159     QGeoCoordinate coord(lastPosition.coordinate().latitude() + 0.1,
160                          lastPosition.coordinate().longitude() + 0.1);
161 
162     QGeoPositionInfo info(coord, now);
163     info.setAttribute(QGeoPositionInfo::Direction, lastPosition.coordinate().azimuthTo(coord));
164     if (lastUpdateTime.isValid()) {
165         double speed = lastPosition.coordinate().distanceTo(coord) / lastUpdateTime.msecsTo(now);
166         info.setAttribute(QGeoPositionInfo::GroundSpeed, 1000 * speed);
167     }
168 
169     lastUpdateTime = now;
170     lastPosition = info;
171     emit positionUpdated(info);
172 }
173 
doTimeout()174 void DummySource::doTimeout()
175 {
176     timeoutTimer->stop();
177     singleTimer->stop();
178     emit updateTimeout();
179 }
180 
181 
182 class QGeoPositionInfoSourceFactoryTestV1 : public QObject, public QGeoPositionInfoSourceFactory
183 {
184     Q_OBJECT
185     Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/5.0"
186                       FILE "plugin.json")
187     Q_INTERFACES(QGeoPositionInfoSourceFactory)
188 
189 public:
190     QGeoPositionInfoSource *positionInfoSource(QObject *parent);
191     QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent);
192     QGeoAreaMonitorSource *areaMonitor(QObject *parent);
193 };
194 
positionInfoSource(QObject * parent)195 QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryTestV1::positionInfoSource(QObject *parent)
196 {
197     return new DummySource(parent);
198 }
199 
satelliteInfoSource(QObject * parent)200 QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryTestV1::satelliteInfoSource(QObject *parent)
201 {
202     Q_UNUSED(parent);
203     return nullptr;
204 }
205 
areaMonitor(QObject * parent)206 QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryTestV1::areaMonitor(QObject* parent)
207 {
208     Q_UNUSED(parent);
209     return nullptr;
210 }
211 
212 #include "plugin.moc"
213