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 QtPositioning module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
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 Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39 #include "qgeosatelliteinfo.h"
40 #include "qgeosatelliteinfo_p.h"
41
42 #include <QHash>
43 #include <QDebug>
44 #include <QDataStream>
45
46 QT_BEGIN_NAMESPACE
47
48 /*!
49 \class QGeoSatelliteInfo
50 \inmodule QtPositioning
51 \ingroup QtPositioning-positioning
52 \since 5.2
53
54 \brief The QGeoSatelliteInfo class contains basic information about a satellite.
55
56 \sa QGeoSatelliteInfoSource
57 */
58
59 /*!
60 \enum QGeoSatelliteInfo::Attribute
61 Defines the attributes for the satellite information.
62 \value Elevation The elevation of the satellite, in degrees.
63 \value Azimuth The azimuth to true north, in degrees.
64 */
65
66 /*!
67 \enum QGeoSatelliteInfo::SatelliteSystem
68 Defines the GNSS system of the satellite.
69 \value Undefined Not defined.
70 \value GPS Global Positioning System (USA).
71 \value GLONASS Global Positioning System (Russia).
72
73 */
74
75
76 /*!
77 Creates a satellite information object.
78 */
QGeoSatelliteInfo()79 QGeoSatelliteInfo::QGeoSatelliteInfo()
80 : d(new QGeoSatelliteInfoPrivate)
81 {
82 d->signal = -1;
83 d->satId = -1;
84 d->system = QGeoSatelliteInfo::Undefined;
85 }
86
87 /*!
88 Creates a satellite information object with the values of \a other.
89 */
90
QGeoSatelliteInfo(const QGeoSatelliteInfo & other)91 QGeoSatelliteInfo::QGeoSatelliteInfo(const QGeoSatelliteInfo &other)
92 : d(new QGeoSatelliteInfoPrivate)
93 {
94 operator=(other);
95 }
96
QGeoSatelliteInfo(QGeoSatelliteInfoPrivate & dd)97 QGeoSatelliteInfo::QGeoSatelliteInfo(QGeoSatelliteInfoPrivate &dd) : d(&dd)
98 {
99 }
100
101 /*!
102 Destroys a satellite information object.
103 */
~QGeoSatelliteInfo()104 QGeoSatelliteInfo::~QGeoSatelliteInfo()
105 {
106 delete d;
107 }
108
109 /*!
110 Assigns the values from \a other to this object.
111 */
operator =(const QGeoSatelliteInfo & other)112 QGeoSatelliteInfo &QGeoSatelliteInfo::operator=(const QGeoSatelliteInfo & other)
113 {
114 if (this == &other)
115 return *this;
116
117 delete d;
118 d = other.d->clone();
119
120 return *this;
121 }
122
123 /*!
124 Returns true if all the information for this satellite
125 are the same as those of \a other.
126 */
operator ==(const QGeoSatelliteInfo & other) const127 bool QGeoSatelliteInfo::operator==(const QGeoSatelliteInfo &other) const
128 {
129 return *d == *other.d;
130 }
131
132 /*!
133 \fn bool QGeoSatelliteInfo::operator!=(const QGeoSatelliteInfo &other) const;
134
135 Returns true if any of the information for this satellite
136 are not the same as those of \a other.
137 */
138
139
140 /*!
141 Sets the Satellite System (GPS, GLONASS, ...) to \a system.
142 */
setSatelliteSystem(SatelliteSystem system)143 void QGeoSatelliteInfo::setSatelliteSystem(SatelliteSystem system)
144 {
145 d->system = system;
146 }
147
148 /*!
149 Returns the Satellite System (GPS, GLONASS, ...)
150 */
satelliteSystem() const151 QGeoSatelliteInfo::SatelliteSystem QGeoSatelliteInfo::satelliteSystem() const
152 {
153 return d->system;
154 }
155
156 /*!
157 Sets the satellite identifier number to \a satId.
158
159 The satellite identifier number can be used to identify a satellite inside the satellite system.
160 For satellite system GPS the satellite identifier number represents the PRN (Pseudo-random noise) number.
161 For satellite system GLONASS the satellite identifier number represents the slot number.
162 */
setSatelliteIdentifier(int satId)163 void QGeoSatelliteInfo::setSatelliteIdentifier(int satId)
164 {
165 d->satId = satId;
166 }
167
168 /*!
169 Returns the satellite identifier number.
170
171 The satellite identifier number can be used to identify a satellite inside the satellite system.
172 For satellite system GPS the satellite identifier number represents the PRN (Pseudo-random noise) number.
173 For satellite system GLONASS the satellite identifier number represents the slot number.
174 */
satelliteIdentifier() const175 int QGeoSatelliteInfo::satelliteIdentifier() const
176 {
177 return d->satId;
178 }
179
180 /*!
181 Sets the signal strength to \a signalStrength, in decibels.
182 */
setSignalStrength(int signalStrength)183 void QGeoSatelliteInfo::setSignalStrength(int signalStrength)
184 {
185 d->signal = signalStrength;
186 }
187
188 /*!
189 Returns the signal strength, or -1 if the value has not been set.
190 */
signalStrength() const191 int QGeoSatelliteInfo::signalStrength() const
192 {
193 return d->signal;
194 }
195
196 /*!
197 Sets the value for \a attribute to \a value.
198 */
setAttribute(Attribute attribute,qreal value)199 void QGeoSatelliteInfo::setAttribute(Attribute attribute, qreal value)
200 {
201 d->doubleAttribs[int(attribute)] = value;
202 }
203
204 /*!
205 Returns the value of the specified \a attribute as a qreal value.
206
207 Returns -1 if the value has not been set.
208
209 \sa hasAttribute(), setAttribute()
210 */
attribute(Attribute attribute) const211 qreal QGeoSatelliteInfo::attribute(Attribute attribute) const
212 {
213 if (d->doubleAttribs.contains(int(attribute)))
214 return d->doubleAttribs[int(attribute)];
215 return -1;
216 }
217
218 /*!
219 Removes the specified \a attribute and its value.
220 */
removeAttribute(Attribute attribute)221 void QGeoSatelliteInfo::removeAttribute(Attribute attribute)
222 {
223 d->doubleAttribs.remove(int(attribute));
224 }
225
226 /*!
227 Returns true if the specified \a attribute is present in this update.
228 */
hasAttribute(Attribute attribute) const229 bool QGeoSatelliteInfo::hasAttribute(Attribute attribute) const
230 {
231 return d->doubleAttribs.contains(int(attribute));
232 }
233
234 #ifndef QT_NO_DEBUG_STREAM
operator <<(QDebug dbg,const QGeoSatelliteInfo & info)235 QDebug operator<<(QDebug dbg, const QGeoSatelliteInfo &info)
236 {
237 QDebugStateSaver saver(dbg);
238 dbg.nospace() << "QGeoSatelliteInfo(system=" << info.d->system;
239 dbg << ", satId=" << info.d->satId;
240 dbg << ", signal-strength=" << info.d->signal;
241
242
243 QList<int> attribs = info.d->doubleAttribs.keys();
244 for (int i = 0; i < attribs.count(); ++i) {
245 dbg << ", ";
246 switch (attribs[i]) {
247 case QGeoSatelliteInfo::Elevation:
248 dbg << "Elevation=";
249 break;
250 case QGeoSatelliteInfo::Azimuth:
251 dbg << "Azimuth=";
252 break;
253 }
254 dbg << info.d->doubleAttribs[attribs[i]];
255 }
256 dbg << ')';
257 return dbg;
258 }
259 #endif
260
261 #ifndef QT_NO_DATASTREAM
262 /*!
263 \fn QDataStream &operator<<(QDataStream &stream, const QGeoSatelliteInfo &info)
264 \relates QGeoSatelliteInfo
265
266 Writes the given \a info to the specified \a stream.
267
268 \sa {Serializing Qt Data Types}
269
270 */
271
operator <<(QDataStream & stream,const QGeoSatelliteInfo & info)272 QDataStream &operator<<(QDataStream &stream, const QGeoSatelliteInfo &info)
273 {
274 stream << info.d->signal;
275 stream << info.d->doubleAttribs;
276 stream << info.d->satId;
277 stream << int(info.d->system);
278 return stream;
279 }
280 #endif
281
282 #ifndef QT_NO_DATASTREAM
283 /*!
284 \fn QDataStream &operator>>(QDataStream &stream, QGeoSatelliteInfo &info)
285 \relates QGeoSatelliteInfo
286
287 Reads satellite information from the specified \a stream into the given
288 \a info.
289
290 \sa {Serializing Qt Data Types}
291 */
292
operator >>(QDataStream & stream,QGeoSatelliteInfo & info)293 QDataStream &operator>>(QDataStream &stream, QGeoSatelliteInfo &info)
294 {
295 int system;
296 stream >> info.d->signal;
297 stream >> info.d->doubleAttribs;
298 stream >> info.d->satId;
299 stream >> system;
300 info.d->system = (QGeoSatelliteInfo::SatelliteSystem)system;
301 return stream;
302 }
303
QGeoSatelliteInfoPrivate()304 QGeoSatelliteInfoPrivate::QGeoSatelliteInfoPrivate()
305 {
306
307 }
308
QGeoSatelliteInfoPrivate(const QGeoSatelliteInfoPrivate & other)309 QGeoSatelliteInfoPrivate::QGeoSatelliteInfoPrivate(const QGeoSatelliteInfoPrivate &other)
310 {
311 signal = other.signal;
312 satId = other.satId;
313 system = other.system;
314 doubleAttribs = other.doubleAttribs;
315 }
316
~QGeoSatelliteInfoPrivate()317 QGeoSatelliteInfoPrivate::~QGeoSatelliteInfoPrivate() {}
318
clone() const319 QGeoSatelliteInfoPrivate *QGeoSatelliteInfoPrivate::clone() const
320 {
321 return new QGeoSatelliteInfoPrivate(*this);
322 }
323
operator ==(const QGeoSatelliteInfoPrivate & other) const324 bool QGeoSatelliteInfoPrivate::operator==(const QGeoSatelliteInfoPrivate &other) const
325 {
326 return signal == other.signal
327 && satId == other.satId
328 && system == other.system
329 && doubleAttribs == other.doubleAttribs;
330 }
331
get(const QGeoSatelliteInfo & info)332 QGeoSatelliteInfoPrivate *QGeoSatelliteInfoPrivate::get(const QGeoSatelliteInfo &info)
333 {
334 return info.d;
335 }
336
337 #endif
338
339 QT_END_NAMESPACE
340