Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qnmeasatelliteinfosource.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include "private/qnmeasatelliteinfosource_p.h"
6#include <QtPositioning/private/qgeosatelliteinfo_p.h>
7#include <QtPositioning/private/qgeosatelliteinfosource_p.h>
8#include <QtPositioning/private/qlocationutils_p.h>
9
10#include <QIODevice>
11#include <QBasicTimer>
12#include <QTimerEvent>
13#include <QTimer>
14#include <array>
15#include <QDebug>
16#include <QtCore/QtNumeric>
17
19
20#if USE_SATELLITE_NMEA_PIMPL
22{
23public:
26 virtual ~QGeoSatelliteInfoPrivateNmea();
27
28 QList<QByteArray> nmeaSentences;
29};
30
31QGeoSatelliteInfoPrivateNmea::QGeoSatelliteInfoPrivateNmea(const QGeoSatelliteInfoPrivate &other)
33{
34}
35
36QGeoSatelliteInfoPrivateNmea::QGeoSatelliteInfoPrivateNmea(const QGeoSatelliteInfoPrivateNmea &other)
38{
39 nmeaSentences = other.nmeaSentences;
40}
41
42QGeoSatelliteInfoPrivateNmea::~QGeoSatelliteInfoPrivateNmea() {}
43#else
45#endif
46
52
54{
56 if (m_requestTimer && m_requestTimer->isActive()) { // User called requestUpdate()
59 } else if (m_invokedStart) { // user called startUpdates()
60 if (m_updateTimer && m_updateTimer->isActive()) { // update interval > 0
61 // for periodic updates, only want the most recent update
63 // if the update was invalid when timerEvent was last called, a valid update
64 // should be sent ASAP
65 emitPendingUpdate(); // m_noUpdateLastInterval handled in there.
66 }
67 } else { // update interval <= 0, send anything new ASAP
69 }
70 }
71 }
72}
73
75{
76 char buf[1024];
77 qint64 size = m_device->readLine(buf, sizeof(buf));
78 if (size <= 0)
79 return;
80
81 QList<int> satInUse;
82 const auto satSystemType = m_source->parseSatellitesInUseFromNmea(QByteArrayView{buf,static_cast<qsizetype>(size)},
83 satInUse);
84 if (satSystemType != QGeoSatelliteInfo::Undefined) {
85 const bool res = updateInfo.setSatellitesInUse(satSystemType, satInUse);
86#if USE_SATELLITE_NMEA_PIMPL
87 if (res) {
88 updateInfo.gsa = QByteArray(buf, size);
89 auto &info = updateInfo.m_satellites[satSystemType];
90 if (!info.satellitesInUse.isEmpty()) {
91 for (auto &s : info.satellitesInUse) {
93 ->nmeaSentences.append(updateInfo.gsa);
94 }
95 for (auto &s : info.satellitesInView) {
97 ->nmeaSentences.append(updateInfo.gsa);
98 }
99 }
100 }
101#else
103#endif // USE_SATELLITE_NMEA_PIMPL
104 } else {
105 // Here we have the assumption that multiple parts of GSV sentence
106 // come one after another. At least this is how it should be.
107 auto systemType = QGeoSatelliteInfo::Undefined;
108 const auto parserStatus = m_source->parseSatelliteInfoFromNmea(
109 QByteArrayView{buf,static_cast<qsizetype>(size)}, updateInfo.m_satellitesInViewParsed, systemType);
110 if (parserStatus == QNmeaSatelliteInfoSource::PartiallyParsed) {
111 updateInfo.m_satellites[systemType].updatingGSV = true;
112#if USE_SATELLITE_NMEA_PIMPL
113 updateInfo.gsv.append(QByteArray(buf, size));
114#endif
115 } else if (parserStatus == QNmeaSatelliteInfoSource::FullyParsed) {
116#if USE_SATELLITE_NMEA_PIMPL
117 updateInfo.gsv.append(QByteArray(buf, size));
118 for (int i = 0; i < updateInfo.m_satellitesInViewParsed.size(); i++) {
119 const QGeoSatelliteInfo &s = updateInfo.m_satellitesInViewParsed.at(i);
122 pimpl->nmeaSentences.append(updateInfo.gsa);
123 pimpl->nmeaSentences.append(updateInfo.gsv);
125 }
126 updateInfo.gsv.clear();
127#endif
128 updateInfo.setSatellitesInView(systemType, updateInfo.m_satellitesInViewParsed);
129 }
130 }
131}
132
137
139{
140 if (m_invokedStart)
141 return;
142
144
145 m_invokedStart = true;
148
149 bool initialized = initialize();
150 if (!initialized)
151 return;
152
154 // skip over any buffered data - we only want the newest data.
155 // Don't do this in requestUpdate. In that case bufferedData is good to have/use.
156 if (m_device->bytesAvailable()) {
157 if (m_device->isSequential())
158 m_device->readAll();
159 else
161 }
162 }
163
164 if (m_updateTimer)
166
167 if (m_source->updateInterval() > 0) {
168 if (!m_updateTimer)
171 }
172
173 if (initialized)
175}
176
185
187{
189 return;
190
192
193 if (msec <= 0 || msec < m_source->minimumUpdateInterval()) {
195 return;
196 }
197
198 if (!m_requestTimer) {
199 m_requestTimer = new QTimer(this);
201 }
202
203 bool initialized = initialize();
204 if (!initialized) {
206 return;
207 }
208
209 m_requestTimer->start(msec);
211}
212
218
220{
222 m_updateTimeoutSent = false;
224 if (!emitUpdated(m_pendingUpdate, false))
226 // m_pendingUpdate.clear(); // Do not clear, it will be incrementally updated
227 } else { // invalid or not fresh update
229 m_updateTimeoutSent = true;
231 }
233 }
234}
235
241
247
249{
250 if (!m_device) {
251 qWarning("QNmeaSatelliteInfoSource: no QIODevice data source, call setDevice() first");
252 return false;
253 }
254
256 qWarning("QNmeaSatelliteInfoSource: cannot open QIODevice data source");
257 return false;
258 }
259
260 connect(m_device, SIGNAL(aboutToClose()), SLOT(sourceDataClosed()));
261 connect(m_device, SIGNAL(readChannelFinished()), SLOT(sourceDataClosed()));
263
264 return true;
265}
266
268{
269 if (m_nmeaReader)
270 return true;
271
272 if (!openSourceDevice())
273 return false;
274
277 else
279
280 return true;
281}
282
296
298 bool fromRequestUpdate)
299{
300 bool emitted = false;
301 if (!update.isFresh())
302 return emitted;
303
304 update.consume();
305 bool inUseUpdated = false;
306 bool inViewUpdated = false;
307 if (!fromRequestUpdate) {
308 // we need to send update if information from at least one satellite
309 // systems has changed
310 for (auto it = update.m_satellites.cbegin(); it != update.m_satellites.cend(); ++it) {
311 inUseUpdated |=
312 it->satellitesInUse != m_lastUpdate.m_satellites[it.key()].satellitesInUse;
313 inViewUpdated |=
314 it->satellitesInView != m_lastUpdate.m_satellites[it.key()].satellitesInView;
315 }
316 } else {
317 // if we come here from requestUpdate(), we need to emit, even if the data
318 // didn't really change
319 inUseUpdated = true;
320 inViewUpdated = true;
321 }
322
323 m_lastUpdate = update;
324 if (update.m_validInUse && inUseUpdated) {
326 emitted = true;
327 }
328 if (update.m_validInView && inViewUpdated) {
330 emitted = true;
331 }
332 return emitted;
333}
334
339
404 QStringLiteral("nmea.satellite_info_simulation_interval");
405
415
423
431
445{
446 if (device != d->m_device) {
447 if (!d->m_device)
448 d->m_device = device;
449 else
450 qWarning("QNmeaSatelliteInfoSource: source device has already been set");
451 }
452}
453
458{
459 return d->m_device;
460}
461
466{
467 int interval = msec;
468 if (interval != 0)
469 interval = qMax(msec, minimumUpdateInterval());
471 if (d->m_invokedStart) {
472 d->stopUpdates();
473 d->startUpdates();
474 }
475}
476
481{
482 return 2; // Some chips are capable of over 100 updates per seconds.
483}
484
492
497{
499 bool ok = false;
500 const int interval = value.toInt(&ok);
501 if (ok) {
502 auto *reader = dynamic_cast<QNmeaSatelliteSimulationReader *>(d->m_nmeaReader.get());
503 if (reader) {
504 reader->setUpdateInterval(interval);
505 } else {
506 // d->m_nmeaReader will use it in constructor
507 d->m_simulationUpdateInterval = interval;
508 }
509 return true;
510 }
511 }
512 return false;
513}
514
519{
521 auto *reader = dynamic_cast<QNmeaSatelliteSimulationReader *>(d->m_nmeaReader.get());
522 if (reader)
523 return reader->updateInterval();
524 else
526 }
527 return QVariant();
528}
529
537
545
550{
551 d->requestUpdate(msec == 0 ? 60000 * 5 : msec); // 5min default timeout
552}
553
568#if QT_DEPRECATED_SINCE(7, 0)
571 QList<int> &pnrsInUse)
572{
573#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
575#else
577#endif
578}
579#endif // QT_DEPRECATED_SINCE(7, 0)
580
583 QList<int> &pnrsInUse)
584{
585#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
586 return parseSatellitesInUseFromNmea(data.data(), static_cast<int>(data.size()), pnrsInUse);
587#else
588 return QLocationUtils::getSatInUseFromNmea(data, pnrsInUse);
589#endif
590}
591
621#if QT_DEPRECATED_SINCE(7, 0)
624 QList<QGeoSatelliteInfo> &infos,
626{
627#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
628 return static_cast<SatelliteInfoParseStatus>(
630#else
631 return parseSatelliteInfoFromNmea(QByteArrayView{data, size}, infos, system);
632#endif
633}
634#endif // QT_DEPRECATED_SINCE(7, 0)
635
638 QList<QGeoSatelliteInfo> &infos,
640{
641#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
642 return parseSatelliteInfoFromNmea(data.data(), static_cast<int>(data.size()), infos, system);
643#else
644 return static_cast<SatelliteInfoParseStatus>(
646#endif
647}
648
655
656QList<QGeoSatelliteInfo> QNmeaSatelliteInfoUpdate::allSatellitesInUse() const
657{
658 QList<QGeoSatelliteInfo> result;
659 for (const auto &s : m_satellites)
660 result.append(s.satellitesInUse);
661 return result;
662}
663
664QList<QGeoSatelliteInfo> QNmeaSatelliteInfoUpdate::allSatellitesInView() const
665{
666 QList<QGeoSatelliteInfo> result;
667 for (const auto &s : m_satellites)
668 result.append(s.satellitesInView);
669 return result;
670}
671
673 const QList<QGeoSatelliteInfo> &inView)
674{
675 auto &info = m_satellites[system];
676 info.updatingGSV = false;
677
678 info.satellitesInView = inView;
679 info.validInView = true;
680
681 if (!info.satellitesInUseReceived) {
682 // Normally a GSA message should come after a GSV message. If this flag
683 // is not set, we have received 2 consecutive GSV messages for this
684 // system without a GSA in between.
685 // This means that we could actually receive a $GNGSA empty message for
686 // this specific type. As it had no ids and GN talker id, we could not
687 // determine system type. This most probably means that we have no
688 // satellites in use for this system type.
689 // Clear satellites in use, if any.
690 info.satellitesInUse.clear();
691 info.inUseIds.clear();
692 info.validInUse = true;
693 }
694 info.satellitesInUseReceived = false;
695
696 if (info.satellitesInView.isEmpty()) {
697 // If we received an empty list of satellites in view, then the list of
698 // satellites in use will also be empty, so we would not be able to
699 // match it with correct system type in case of $GNGSA message. Clear
700 // the list in advance.
701 info.satellitesInUse.clear();
702 info.inUseIds.clear();
703 info.validInUse = true;
704 } else if (!info.inUseIds.isEmpty()) {
705 // We have some satellites in use cached. Check if we have received the
706 // proper GSV for them.
707 info.satellitesInUse.clear();
708 info.validInUse = false;
709 bool corrupt = false;
710 for (const auto id : info.inUseIds) {
711 bool found = false;
712 for (const auto &s : info.satellitesInView) {
713 if (s.satelliteIdentifier() == id) {
714 info.satellitesInUse.append(s);
715 found = true;
716 break;
717 }
718 }
719 if (!found) {
720 // The previoulsy received GSA is incorrect or not related to
721 // this GSV
722 info.satellitesInUse.clear();
723 corrupt = true;
724 break;
725 }
726 }
727 info.validInUse = !corrupt;
728 info.inUseIds.clear();
729 }
730
733 m_fresh = true;
734}
735
737 const QList<int> &inUse)
738{
740 return false; // No way to determine satellite system
741
743 info.satellitesInUse.clear();
744
745 info.satellitesInUseReceived = true;
746 info.inUseIds = inUse;
747
748 if (info.updatingGSV) {
749 info.validInView = false;
750 m_validInView = false;
751 return false;
752 }
753
754 for (const auto id : inUse) {
755 bool found = false;
756 for (const auto &s : info.satellitesInView) {
757 if (s.satelliteIdentifier() == id) {
758 info.satellitesInUse.append(s);
759 found = true;
760 break;
761 }
762 }
763 if (!found) {
764 // satellites in use are not in view -> related GSV is not yet received
765 info.satellitesInView.clear();
766 info.validInView = false;
767 m_validInView = false;
768 return false;
769 }
770 }
771
772 info.inUseIds.clear(); // make sure we remove all obsolete cache
773
774 info.validInUse = true;
775 m_fresh = true;
777
778 return true;
779}
780
782{
783 m_fresh = false;
784}
785
787{
788 return m_fresh;
789}
790
792{
795 m_validInView = false;
796 m_validInUse = false;
797 m_fresh = false;
798#if USE_SATELLITE_NMEA_PIMPL
799 gsa.clear();
800 gsv.clear();
801#endif
802}
803
805{
806 // GSV without GSA is valid. GSA with outdated but still matching GSV also valid.
807 return m_validInView || m_validInUse;
808}
809
811{
812 for (const auto &s : m_satellites) {
813 if (!s.validInUse)
814 return false;
815 }
816 return true;
817}
818
820{
821 for (const auto &s : m_satellites) {
822 if (!s.validInView)
823 return false;
824 }
825 return true;
826}
827
829 : m_proxy(sourcePrivate)
830{
831}
832
836
841
848
850 : QNmeaSatelliteReader(sourcePrivate)
851{
852 m_timer.reset(new QTimer);
853 QObject::connect(m_timer.get(), &QTimer::timeout, m_timer.get(), [this]() {
854 readAvailableData();
855 });
856 m_updateInterval =
858}
859
861{
862 if (!m_timer->isActive()) {
863 // At the very first start we just start a timer to simulate a short
864 // delay for overlapping requestUpdate() calls.
865 // See TestQGeoSatelliteInfoSource::requestUpdate_overlappingCalls and
866 // TestQGeoSatelliteInfoSource::requestUpdate_overlappingCallsWithTimeout
867 m_timer->start(m_updateInterval);
868 } else {
869 // Here we try to get both satellites in view and satellites in use.
870 // We behave like that because according to the QGeoSatelliteInfoSource
871 // tests each call to requestUpdate() should return both satellites in
872 // view and satellites in use. Same is expected on each interval for
873 // startUpdates().
874 // However user-provided NMEA logs might not contain some of the
875 // messages, so we will try not to get stuck here infinitely.
876 int numSatInUseMsgs = 0;
877 int numSatInViewMsgs = 0;
878 while (!m_proxy->m_device->atEnd() && (!numSatInUseMsgs || !numSatInViewMsgs)) {
881 numSatInUseMsgs++;
883 numSatInViewMsgs++;
884 // if we got the second message for one of them, but still didn't
885 // receive any for the other - break.
886 // We use 2 in the comparison, because, as soon as the m_validIn*
887 // flag is set, it will stay true until we receive invalid message.
888 if (numSatInUseMsgs > 2 || numSatInViewMsgs > 2) {
889 const QString msgType = (numSatInUseMsgs > numSatInViewMsgs)
890 ? QStringLiteral("GSA")
891 : QStringLiteral("GSV");
892 qWarning() << "nmea simulation reader: possibly incorrect message order. Got too "
893 "many consecutive"
894 << msgType << "messages";
895 break;
896 }
897 }
899 }
900}
901
903{
904 // restart the timer with new interval
905 m_updateInterval = qMax(msec, m_proxy->m_source->minimumUpdateInterval());
906 if (m_timer->isActive())
907 m_timer->start(m_updateInterval);
908}
909
911{
912 return m_updateInterval;
913}
914
916
917#include "moc_qnmeasatelliteinfosource_p.cpp"
918#include "moc_qnmeasatelliteinfosource.cpp"
IOBluetoothDevice * device
\inmodule QtCore
Definition qbasictimer.h:18
void start(int msec, QObject *obj)
\obsolete Use chrono overload instead.
void stop()
Stops the timer.
bool isActive() const noexcept
Returns true if the timer is running and has not been stopped; otherwise returns false.
Definition qbasictimer.h:34
void clear()
Clears the contents of the byte array and makes it null.
static QGeoSatelliteInfoPrivate * get(const QGeoSatelliteInfo &info)
\inmodule QtPositioning
virtual void setUpdateInterval(int msec)
Error
The Error enumeration represents the errors which can occur.
int updateInterval
This property holds the requested interval in milliseconds between each update.
void satellitesInViewUpdated(const QList< QGeoSatelliteInfo > &satellites)
If startUpdates() or requestUpdate() is called, this signal is emitted when an update is available on...
void satellitesInUseUpdated(const QList< QGeoSatelliteInfo > &satellites)
If startUpdates() or requestUpdate() is called, this signal is emitted when an update is available on...
void errorOccurred(QGeoSatelliteInfoSource::Error)
This signal is emitted after an error occurred.
\inmodule QtPositioning
SatelliteSystem
Defines the GNSS system of the satellite.
\inmodule QtCore \reentrant
Definition qiodevice.h:34
virtual bool open(QIODeviceBase::OpenMode mode)
Opens the device and sets its OpenMode to mode.
virtual bool isSequential() const
Returns true if this device is sequential; otherwise returns false.
qint64 readLine(char *data, qint64 maxlen)
This function reads a line of ASCII characters from the device, up to a maximum of maxSize - 1 bytes,...
bool isOpen() const
Returns true if the device is open; otherwise returns false.
QByteArray readAll()
Reads all remaining data from the device, and returns it as a byte array.
virtual qint64 bytesAvailable() const
Returns the number of bytes that are available for reading.
virtual bool seek(qint64 pos)
For random-access devices, this function sets the current position to pos, returning true on success,...
virtual bool atEnd() const
Returns true if the current read and write position is at the end of the device (i....
virtual bool canReadLine() const
Returns true if a complete line of data can be read from the device; otherwise returns false.
qsizetype size() const noexcept
Definition qlist.h:397
const_reference at(qsizetype i) const noexcept
Definition qlist.h:446
void replace(qsizetype i, parameter_type t)
Definition qlist.h:543
void append(parameter_type t)
Definition qlist.h:458
void clear()
Definition qlist.h:434
static QGeoSatelliteInfo::SatelliteSystem getSatInUseFromNmea(QByteArrayView bv, QList< int > &pnrsInUse)
static QNmeaSatelliteInfoSource::SatelliteInfoParseStatus getSatInfoFromNmea(QByteArrayView bv, QList< QGeoSatelliteInfo > &infos, QGeoSatelliteInfo::SatelliteSystem &system)
const_iterator cend() const
Definition qmap.h:605
const_iterator cbegin() const
Definition qmap.h:601
void clear()
Definition qmap.h:289
bool emitUpdated(QNmeaSatelliteInfoUpdate &update, bool fromRequestUpdate)
QScopedPointer< QNmeaSatelliteReader > m_nmeaReader
void processNmeaData(QNmeaSatelliteInfoUpdate &updateInfo)
QNmeaSatelliteInfoSourcePrivate(QNmeaSatelliteInfoSource *parent, QNmeaSatelliteInfoSource::UpdateMode updateMode)
QNmeaSatelliteInfoSource::UpdateMode m_updateMode
void timerEvent(QTimerEvent *event) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
QGeoSatelliteInfoSource::Error m_satelliteError
void setUpdateInterval(int msec) override
\reimp
UpdateMode
Defines the available update modes.
SatelliteInfoParseStatus
Defines the parse status of satellite information.
int minimumUpdateInterval() const override
\reimp
bool setBackendProperty(const QString &name, const QVariant &value) override
\reimp
UpdateMode updateMode() const
Returns the update mode.
SatelliteInfoParseStatus parseSatelliteInfoFromNmea(QByteArrayView data, QList< QGeoSatelliteInfo > &infos, QGeoSatelliteInfo::SatelliteSystem &system)
Parses an NMEA sentence string to extract the information about satellites in view.
QVariant backendProperty(const QString &name) const override
\reimp
QNmeaSatelliteInfoSourcePrivate * d
QGeoSatelliteInfo::SatelliteSystem parseSatellitesInUseFromNmea(QByteArrayView data, QList< int > &pnrsInUse)
Parses an NMEA sentence string to extract the IDs of satelites in use.
static QString SimulationUpdateInterval
\variable QNmeaSatelliteInfoSource::SimulationUpdateInterval
QNmeaSatelliteInfoSource(UpdateMode mode, QObject *parent=nullptr)
Constructs a \l QNmeaSatelliteInfoSource instance with the given parent and mode.
void setDevice(QIODevice *source)
Sets the NMEA data source to device.
~QNmeaSatelliteInfoSource() override
Destroys the satellite information source.
QIODevice * device() const
Returns the NMEA data source.
Error error() const override
\reimp
void setError(QGeoSatelliteInfoSource::Error satelliteError)
void requestUpdate(int timeout=0) override
\reimp
virtual void readAvailableData()=0
QNmeaSatelliteInfoSourcePrivate * m_proxy
QNmeaSatelliteReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate)
QNmeaSatelliteRealTimeReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate)
QNmeaSatelliteSimulationReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate)
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
T * get() const noexcept
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qcoreevent.h:366
\inmodule QtCore
Definition qtimer.h:20
void start(int msec)
Starts or restarts the timer with a timeout interval of msec milliseconds.
Definition qtimer.cpp:241
bool isActive() const
Returns true if the timer is running (pending); otherwise returns false.
Definition qtimer.cpp:167
void stop()
Stops the timer.
Definition qtimer.cpp:267
void timeout(QPrivateSignal)
This signal is emitted when the timer times out.
\inmodule QtCore
Definition qvariant.h:65
#define this
Definition dialogs.cpp:9
QSet< QString >::iterator it
Combined button and popup list for selecting options.
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qWarning
Definition qlogging.h:166
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
QT_BEGIN_NAMESPACE typedef QGeoSatelliteInfoPrivate QGeoSatelliteInfoPrivateNmea
#define SLOT(a)
Definition qobjectdefs.h:52
#define SIGNAL(a)
Definition qobjectdefs.h:53
GLenum mode
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLuint id
[7]
GLbitfield GLuint64 timeout
[4]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint name
GLdouble s
[6]
Definition qopenglext.h:235
GLuint res
GLuint64EXT * result
[6]
#define QStringLiteral(str)
#define emit
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:165
long long qint64
Definition qtypes.h:60
QSharedPointer< T > other(t)
[5]
QHostInfo info
[0]
QMap< QGeoSatelliteInfo::SatelliteSystem, SatelliteInfo > m_satellites
bool setSatellitesInUse(QGeoSatelliteInfo::SatelliteSystem system, const QList< int > &inUse)
QList< QGeoSatelliteInfo > allSatellitesInView() const
QList< QGeoSatelliteInfo > allSatellitesInUse() const
QList< QGeoSatelliteInfo > m_satellitesInViewParsed
void setSatellitesInView(QGeoSatelliteInfo::SatelliteSystem system, const QList< QGeoSatelliteInfo > &inView)