QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GPSRtk.cc
Go to the documentation of this file.
1#include "GPSRtk.h"
2#include "GPSProvider.h"
3#include "GPSRTKFactGroup.h"
5#include "RTCMMavlink.h"
6#include "RTKSettings.h"
7#include "SettingsManager.h"
8
9QGC_LOGGING_CATEGORY(GPSRtkLog, "GPS.GPSRtk")
10
11GPSRtk::GPSRtk(QObject *parent)
12 : QObject(parent)
13 , _gpsRtkFactGroup(new GPSRTKFactGroup(this))
14{
15 qCDebug(GPSRtkLog) << this;
16
17 (void) qRegisterMetaType<satellite_info_s>("satellite_info_s");
18 (void) qRegisterMetaType<sensor_gnss_relative_s>("sensor_gnss_relative_s");
19 (void) qRegisterMetaType<sensor_gps_s>("sensor_gps_s");
20}
21
23{
25
26 qCDebug(GPSRtkLog) << this;
27}
28
29void GPSRtk::_onGPSConnect()
30{
31 _gpsRtkFactGroup->connected()->setRawValue(true);
32}
33
34void GPSRtk::_onGPSDisconnect()
35{
36 _gpsRtkFactGroup->connected()->setRawValue(false);
37}
38
39void GPSRtk::_onGPSSurveyInStatus(float duration, float accuracyMM, double latitude, double longitude, float altitude, bool valid, bool active)
40{
41 _gpsRtkFactGroup->currentDuration()->setRawValue(duration);
42 _gpsRtkFactGroup->currentAccuracy()->setRawValue(static_cast<double>(accuracyMM) / 1000.0);
43 _gpsRtkFactGroup->currentLatitude()->setRawValue(latitude);
44 _gpsRtkFactGroup->currentLongitude()->setRawValue(longitude);
45 _gpsRtkFactGroup->currentAltitude()->setRawValue(altitude);
46 _gpsRtkFactGroup->valid()->setRawValue(valid);
47 _gpsRtkFactGroup->active()->setRawValue(active);
48}
49
50void GPSRtk::connectGPS(const QString &device, QStringView gps_type)
51{
53 RTKSettings* rtkSettings = SettingsManager::instance()->rtkSettings();
54
55 if (gps_type.contains(QStringLiteral("trimble"), Qt::CaseInsensitive)) {
57 rtkSettings->baseReceiverManufacturers()->setRawValue(1); // Trimble
58 qCDebug(GPSRtkLog) << "Connecting Trimble device";
59
60 } else if (gps_type.contains(QStringLiteral("septentrio"), Qt::CaseInsensitive)) {
62 rtkSettings->baseReceiverManufacturers()->setRawValue(2); // Septentrio
63 qCDebug(GPSRtkLog) << "Connecting Septentrio device";
64
65 } else if (gps_type.contains(QStringLiteral("femtomes"), Qt::CaseInsensitive)) {
67 rtkSettings->baseReceiverManufacturers()->setRawValue(3); // Femto
68 qCDebug(GPSRtkLog) << "Connecting Femtomes device";
69
70 } else if(gps_type.contains(QStringLiteral("blox"), Qt::CaseInsensitive)) {
72 rtkSettings->baseReceiverManufacturers()->setRawValue(4); // Ublox
73 qCDebug(GPSRtkLog) << "Connecting U-blox device";
74 }else{
76 rtkSettings->baseReceiverManufacturers()->setRawValue(4); // Ublox
77 qCDebug(GPSRtkLog) << "Connecting device has U-blox by default";
78 }
79
81
82 _requestGpsStop = false;
83 const GPSProvider::rtk_data_s rtkData = {
84 rtkSettings->surveyInAccuracyLimit()->rawValue().toDouble(),
85 rtkSettings->surveyInMinObservationDuration()->rawValue().toInt(),
86 static_cast<BaseModeDefinition::Mode>(rtkSettings->useFixedBasePosition()->rawValue().toInt()),
87 rtkSettings->fixedBasePositionLatitude()->rawValue().toDouble(),
88 rtkSettings->fixedBasePositionLongitude()->rawValue().toDouble(),
89 rtkSettings->fixedBasePositionAltitude()->rawValue().toFloat(),
90 rtkSettings->fixedBasePositionAccuracy()->rawValue().toFloat()
91 };
92 _gpsProvider = new GPSProvider(
93 device,
94 type,
95 rtkData,
96 _requestGpsStop,
97 this
98 );
99 (void) QMetaObject::invokeMethod(_gpsProvider, "start", Qt::AutoConnection);
100
101 _rtcmMavlink = new RTCMMavlink(this);
102 (void) connect(_gpsProvider, &GPSProvider::RTCMDataUpdate, _rtcmMavlink, &RTCMMavlink::RTCMDataUpdate);
103
104 (void) connect(_gpsProvider, &GPSProvider::satelliteInfoUpdate, this, &GPSRtk::_satelliteInfoUpdate);
105 (void) connect(_gpsProvider, &GPSProvider::sensorGpsUpdate, this, &GPSRtk::_sensorGpsUpdate);
106 (void) connect(_gpsProvider, &GPSProvider::surveyInStatus, this, &GPSRtk::_onGPSSurveyInStatus);
107 (void) connect(_gpsProvider, &GPSProvider::finished, this, &GPSRtk::_onGPSDisconnect);
108
109 (void) QMetaObject::invokeMethod(this, "_onGPSConnect", Qt::AutoConnection);
110}
111
113{
114 if (_gpsProvider) {
115 _requestGpsStop = true;
116 if (!_gpsProvider->wait(kGPSThreadDisconnectTimeout)) {
117 qCWarning(GPSRtkLog) << "Failed to wait for GPS thread exit. Consider increasing the timeout";
118 }
119
120 _gpsProvider->deleteLater();
121 _gpsProvider = nullptr;
122 }
123
124 if (_rtcmMavlink) {
125 _rtcmMavlink->deleteLater();
126 _rtcmMavlink = nullptr;
127 }
128}
129
131{
132 return (_gpsProvider ? _gpsProvider->isRunning() : false);
133}
134
136{
137 return _gpsRtkFactGroup;
138}
139
140void GPSRtk::_satelliteInfoUpdate(const satellite_info_s &msg)
141{
142 qCDebug(GPSRtkLog) << Q_FUNC_INFO << QStringLiteral("%1 satellites").arg(msg.count);
143 _gpsRtkFactGroup->numSatellites()->setRawValue(msg.count);
144}
145
146void GPSRtk::_sensorGnssRelativeUpdate(const sensor_gnss_relative_s &/*msg*/)
147{
148 qCDebug(GPSRtkLog) << Q_FUNC_INFO;
149}
150
151void GPSRtk::_sensorGpsUpdate(const sensor_gps_s &msg)
152{
153 qCDebug(GPSRtkLog) << Q_FUNC_INFO << QStringLiteral("alt=%1, long=%2, lat=%3").arg(msg.altitude_msl_m).arg(msg.longitude_deg).arg(msg.latitude_deg);
154}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Used to group Facts together into an object hierarachy.
Definition FactGroup.h:19
void RTCMDataUpdate(const QByteArray &message)
void sensorGpsUpdate(const sensor_gps_s &message)
void satelliteInfoUpdate(const satellite_info_s &message)
void surveyInStatus(float duration, float accuracyMM, double latitude, double longitude, float altitude, bool valid, bool active)
void disconnectGPS()
Definition GPSRtk.cc:112
~GPSRtk()
Definition GPSRtk.cc:22
void connectGPS(const QString &device, QStringView gps_type)
Definition GPSRtk.cc:50
FactGroup * gpsRtkFactGroup()
Definition GPSRtk.cc:135
bool connected() const
Definition GPSRtk.cc:130
Fact *fixedBasePositionLongitude READ fixedBasePositionLongitude CONSTANT Fact * fixedBasePositionLongitude()
Fact *fixedBasePositionLatitude READ fixedBasePositionLatitude CONSTANT Fact * fixedBasePositionLatitude()
Definition RTKSettings.cc:9
Fact *surveyInMinObservationDuration READ surveyInMinObservationDuration CONSTANT Fact * surveyInMinObservationDuration()
Definition RTKSettings.cc:7
Fact *useFixedBasePosition READ useFixedBasePosition CONSTANT Fact * useFixedBasePosition()
Definition RTKSettings.cc:8
Fact *baseReceiverManufacturers READ baseReceiverManufacturers CONSTANT Fact * baseReceiverManufacturers()
Definition RTKSettings.cc:5
Fact *fixedBasePositionAltitude READ fixedBasePositionAltitude CONSTANT Fact * fixedBasePositionAltitude()
Fact *fixedBasePositionAccuracy READ fixedBasePositionAccuracy CONSTANT Fact * fixedBasePositionAccuracy()
Fact *surveyInAccuracyLimit READ surveyInAccuracyLimit CONSTANT Fact * surveyInAccuracyLimit()
Definition RTKSettings.cc:6
double latitude_deg
Definition sensor_gps.h:16
double altitude_msl_m
Definition sensor_gps.h:18
double longitude_deg
Definition sensor_gps.h:17