Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsgpsconnection.h - description
3 : : -------------------
4 : : begin : November 30th, 2009
5 : : copyright : (C) 2009 by Marco Hugentobler
6 : : email : marco at hugis dot net
7 : : ***************************************************************************/
8 : :
9 : : /***************************************************************************
10 : : * *
11 : : * This program is free software; you can redistribute it and/or modify *
12 : : * it under the terms of the GNU General Public License as published by *
13 : : * the Free Software Foundation; either version 2 of the License, or *
14 : : * (at your option) any later version. *
15 : : * *
16 : : ***************************************************************************/
17 : :
18 : : #ifndef QGSGPSCONNECTION_H
19 : : #define QGSGPSCONNECTION_H
20 : :
21 : : #include <QDateTime>
22 : : #include "qgis.h"
23 : : #include <QObject>
24 : : #include <QString>
25 : :
26 : : #include "qgis_core.h"
27 : :
28 : : class QIODevice;
29 : :
30 : : #ifdef SIP_RUN
31 : : % ModuleHeaderCode
32 : : #include "qgsgpsconnection.h"
33 : : % End
34 : : #endif
35 : :
36 : : /**
37 : : * \ingroup core
38 : : * \class QgsSatelliteInfo
39 : : * \brief Encapsulates information relating to a GPS satellite.
40 : : */
41 : 0 : class CORE_EXPORT QgsSatelliteInfo
42 : : {
43 : : public:
44 : :
45 : : /**
46 : : * Contains the satellite identifier number.
47 : : *
48 : : * The satellite identifier number can be used to identify a satellite inside the satellite system.
49 : : * For satellite system GPS the satellite identifier number represents the PRN (Pseudo-random noise)
50 : : * number. For satellite system GLONASS the satellite identifier number represents the slot number.
51 : : */
52 : 0 : int id = 0;
53 : :
54 : : /**
55 : : * TRUE if satellite was used in obtaining the position fix.
56 : : */
57 : 0 : bool inUse = false;
58 : :
59 : : #ifndef SIP_RUN
60 : :
61 : : /**
62 : : * Elevation of the satellite, in degrees.
63 : : */
64 : 0 : double elevation = std::numeric_limits< double >::quiet_NaN();
65 : : #else
66 : :
67 : : /**
68 : : * Elevation of the satellite, in degrees.
69 : : */
70 : : double elevation;
71 : : #endif
72 : :
73 : : #ifndef SIP_RUN
74 : :
75 : : /**
76 : : * The azimuth of the satellite to true north, in degrees.
77 : : */
78 : 0 : double azimuth = std::numeric_limits< double >::quiet_NaN();
79 : : #else
80 : :
81 : : /**
82 : : * The azimuth of the satellite to true north, in degrees.
83 : : */
84 : : double azimuth;
85 : : #endif
86 : :
87 : : /**
88 : : * Signal strength (0-99dB), or -1 if not available.
89 : : */
90 : 0 : int signal = -1;
91 : : };
92 : :
93 : : /**
94 : : * \ingroup core
95 : : * \class QgsGpsInformation
96 : : * \brief Encapsulates information relating to a GPS position fix.
97 : : */
98 : 0 : class CORE_EXPORT QgsGpsInformation
99 : : {
100 : : public:
101 : :
102 : : /**
103 : : * GPS fix status
104 : : * \since QGIS 3.10
105 : : */
106 : : enum FixStatus
107 : : {
108 : : NoData,
109 : : NoFix,
110 : : Fix2D,
111 : : Fix3D
112 : : };
113 : :
114 : : /**
115 : : * Latitude in decimal degrees, using the WGS84 datum. A positive value indicates the Northern Hemisphere, and
116 : : * a negative value indicates the Southern Hemisphere.
117 : : */
118 : 0 : double latitude = 0;
119 : :
120 : : /**
121 : : * Longitude in decimal degrees, using the WGS84 datum. A positive value indicates the Eastern Hemisphere, and
122 : : * a negative value indicates the Western Hemisphere.
123 : : */
124 : 0 : double longitude = 0;
125 : :
126 : : /**
127 : : * Altitude (in meters) above or below the mean sea level.
128 : : */
129 : 0 : double elevation = 0;
130 : :
131 : : /**
132 : : * Geoidal separation (Diff. between WGS-84 earth ellipsoid and
133 : : * mean sea level.
134 : : *
135 : : * \since QGIS 3.18
136 : : */
137 : 0 : double elevation_diff = 0;
138 : :
139 : : /**
140 : : * Ground speed, in km/h.
141 : : */
142 : 0 : double speed = 0;
143 : :
144 : : #ifndef SIP_RUN
145 : :
146 : : /**
147 : : * The bearing measured in degrees clockwise from true north to the direction of travel.
148 : : */
149 : 0 : double direction = std::numeric_limits< double >::quiet_NaN();
150 : : #else
151 : :
152 : : /**
153 : : * The bearing measured in degrees clockwise from true north to the direction of travel.
154 : : */
155 : : double direction;
156 : : #endif
157 : :
158 : : /**
159 : : * Contains a list of information relating to the current satellites in view.
160 : : */
161 : : QList<QgsSatelliteInfo> satellitesInView;
162 : :
163 : : /**
164 : : * Dilution of precision.
165 : : */
166 : 0 : double pdop = 0;
167 : :
168 : : /**
169 : : * Horizontal dilution of precision.
170 : : */
171 : 0 : double hdop = 0;
172 : :
173 : : /**
174 : : * Vertical dilution of precision.
175 : : */
176 : 0 : double vdop = 0;
177 : :
178 : : #ifndef SIP_RUN
179 : : //! Horizontal accuracy in meters
180 : 0 : double hacc = std::numeric_limits< double >::quiet_NaN();
181 : : //! Vertical accuracy in meters
182 : 0 : double vacc = std::numeric_limits< double >::quiet_NaN();
183 : :
184 : : /**
185 : : * 3D RMS
186 : : * \since QGIS 3.18
187 : : */
188 : 0 : double hvacc = std::numeric_limits< double >::quiet_NaN();
189 : : #else
190 : : //! Horizontal accuracy in meters
191 : : double hacc;
192 : : //! Vertical accuracy in meters
193 : : double vacc;
194 : :
195 : : /**
196 : : * 3D RMS
197 : : * \since QGIS 3.18
198 : : */
199 : : double hvacc;
200 : : #endif
201 : :
202 : : /**
203 : : * The date and time at which this position was reported, in UTC time.
204 : : */
205 : : QDateTime utcDateTime;
206 : :
207 : : /**
208 : : * Fix mode (where M = Manual, forced to operate in 2D or 3D or A = Automatic, 3D/2D)
209 : : */
210 : : QChar fixMode;
211 : :
212 : : /**
213 : : * Contains the fix type, where 1 = no fix, 2 = 2d fix, 3 = 3d fix
214 : : */
215 : 0 : int fixType = 0;
216 : :
217 : : /**
218 : : * GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive)
219 : : */
220 : 0 : int quality = -1;
221 : :
222 : : /**
223 : : * Count of satellites used in obtaining the fix.
224 : : */
225 : 0 : int satellitesUsed = 0;
226 : :
227 : : /**
228 : : * Status (A = active or V = void)
229 : : */
230 : : QChar status;
231 : :
232 : : /**
233 : : * IDs of satellites used in the position fix.
234 : : */
235 : : QList<int> satPrn;
236 : :
237 : : /**
238 : : * TRUE if satellite information is complete.
239 : : */
240 : 0 : bool satInfoComplete = false;
241 : :
242 : : /**
243 : : * Returns whether the connection information is valid
244 : : * \since QGIS 3.10
245 : : */
246 : : bool isValid() const;
247 : :
248 : : /**
249 : : * Returns the fix status
250 : : * \since QGIS 3.10
251 : : */
252 : : FixStatus fixStatus() const;
253 : :
254 : : /**
255 : : * Returns a descriptive string for the signal quality.
256 : : *
257 : : * \since QGIS 3.16
258 : : */
259 : : QString qualityDescription() const;
260 : : };
261 : :
262 : : /**
263 : : * \ingroup core
264 : : * \brief Abstract base class for connection to a GPS device
265 : : */
266 : : class CORE_EXPORT QgsGpsConnection : public QObject
267 : : {
268 : : #ifdef SIP_RUN
269 : : #include <qgsgpsdconnection.h>
270 : : #include <qgsnmeaconnection.h>
271 : : #endif
272 : :
273 : :
274 : : #ifdef SIP_RUN
275 : : SIP_CONVERT_TO_SUBCLASS_CODE
276 : : if ( sipCpp->inherits( "QgsGpsdConnection" ) )
277 : : sipType = sipType_QgsGpsdConnection;
278 : : else if ( sipCpp->inherits( "QgsNmeaConnection" ) )
279 : : sipType = sipType_QgsNmeaConnection;
280 : : else
281 : : sipType = NULL;
282 : : SIP_END
283 : : #endif
284 : :
285 : : Q_OBJECT
286 : : public:
287 : :
288 : : enum Status
289 : : {
290 : : NotConnected,
291 : : Connected,
292 : : DataReceived,
293 : : GPSDataReceived
294 : : };
295 : :
296 : : /**
297 : : * Constructor
298 : : * \param dev input device for the connection (e.g. serial device). The class takes ownership of the object
299 : : */
300 : : QgsGpsConnection( QIODevice *dev SIP_TRANSFER );
301 : : ~QgsGpsConnection() override;
302 : : //! Opens connection to device
303 : : bool connect();
304 : : //! Closes connection to device
305 : : bool close();
306 : :
307 : : //! Sets the GPS source. The class takes ownership of the device class
308 : : void setSource( QIODevice *source SIP_TRANSFER );
309 : :
310 : : //! Returns the status. Possible state are not connected, connected, data received
311 : 0 : Status status() const { return mStatus; }
312 : :
313 : : //! Returns the current gps information (lat, lon, etc.)
314 : : QgsGpsInformation currentGPSInformation() const { return mLastGPSInformation; }
315 : :
316 : : signals:
317 : : void stateChanged( const QgsGpsInformation &info );
318 : : void nmeaSentenceReceived( const QString &substring ); // added to capture 'raw' data
319 : :
320 : : protected:
321 : : //! Data source (e.g. serial device, socket, file,...)
322 : : std::unique_ptr< QIODevice > mSource;
323 : : //! Last state of the gps related variables (e.g. position, time, ...)
324 : : QgsGpsInformation mLastGPSInformation;
325 : : //! Connection status
326 : : Status mStatus = NotConnected;
327 : :
328 : : private:
329 : : //! Closes and deletes mSource
330 : : void cleanupSource();
331 : : void clearLastGPSInformation();
332 : :
333 : : protected slots:
334 : : //! Parse available data source content
335 : : virtual void parseData() = 0;
336 : : };
337 : :
338 : : #endif // QGSGPSCONNECTION_H
|