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