QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GPSDriver.cc
Go to the documentation of this file.
1#include "GPSDriver.h"
2
3#include "GPSTransport.h"
5
6#include <ashtech.h>
7#include <base_station.h>
8#include <definitions.h>
9#include <femtomes.h>
10#include <gps_helper.h>
11#include <sbf.h>
12#include <ubx.h>
13
14#include <cstring>
15#include <utility>
16
17QGC_LOGGING_CATEGORY(GPSDriverLog, "GPS.GPSDriver")
18QGC_LOGGING_CATEGORY(GPSDriversLog, "GPS.Drivers") // backs the px4 GPS_INFO/WARN/ERR macros in definitions.h
19
20namespace {
21int callbackTrampoline(GPSCallbackType type, void *data1, int data2, void *user)
22{
23 return static_cast<GPSDriver *>(user)->handleCallback(static_cast<int>(type), data1, data2);
24}
25} // namespace
26
28 : _type(type)
29 , _transport(transport)
30 , _config(config)
31 , _sinks(std::move(sinks))
32{
33}
34
35GPSDriver::~GPSDriver() = default;
36
38{
39 unsigned baudrate = 0;
40 switch (_type) {
42 _driver.reset(new GPSDriverAshtech(&callbackTrampoline, this, &_sensorGps, &_satelliteInfo));
43 baudrate = 115200;
44 break;
46 _driver.reset(new GPSDriverSBF(&callbackTrampoline, this, &_sensorGps, &_satelliteInfo, _config.headingOffsetDeg));
47 break;
48 case GPSType::u_blox: {
49 const GPSDriverUBX::Settings settings{
50 .dynamic_model = 7,
51 .dgnss_timeout = 0,
52 .min_cno = 0,
53 .min_elev = 0,
54 .output_rate = 0,
55 .heading_offset = 0.0f,
56 .uart2_baudrate = 57600,
57 .ppk_output = false,
58 .jam_det_sensitivity_hi = false,
59 .mode = GPSDriverUBX::UBXMode::Normal,
60 };
61 _driver.reset(new GPSDriverUBX(GPSDriverUBX::Interface::UART, &callbackTrampoline, this, &_sensorGps, &_satelliteInfo, settings));
62 break;
63 }
64 case GPSType::femto:
65 _driver.reset(new GPSDriverFemto(&callbackTrampoline, this, &_sensorGps, &_satelliteInfo));
66 break;
67 }
68
69 if (!_driver) {
70 qCWarning(GPSDriverLog) << "Unsupported GPS type:" << static_cast<int>(_type);
71 return false;
72 }
73
74 if (_config.useFixedBase) {
75 _driver->setBasePosition(_config.fixedBaseLatitude, _config.fixedBaseLongitude,
76 _config.fixedBaseAltitudeMeters, _config.fixedBaseAccuracyMeters * 1000.0f);
77 } else {
78 _driver->setSurveyInSpecs(static_cast<uint32_t>(_config.surveyInAccMeters * 10000.0),
79 static_cast<uint32_t>(_config.surveyInDurationSecs));
80 }
81
82 GPSHelper::GPSConfig gpsConfig{};
83 gpsConfig.output_mode = GPSHelper::OutputMode::RTCM;
84
85 if (_driver->configure(baudrate, gpsConfig) != 0) {
86 qCWarning(GPSDriverLog) << "Driver configuration failed for type" << static_cast<int>(_type);
87 _driver.reset();
88 return false;
89 }
90
91 (void) memset(&_sensorGps, 0, sizeof(_sensorGps));
92 return true;
93}
94
95int GPSDriver::receive(unsigned timeoutMs)
96{
97 if (!_driver) {
98 return -1;
99 }
100
101 const int ret = _driver->receive(timeoutMs);
102 if (ret < 0) {
103 return ret;
104 }
105
106 if ((ret & 0x01) && _sinks.onPosition) {
107 _sinks.onPosition(_sensorGps);
108 }
109 if ((ret & 0x02) && _sinks.onSatelliteInfo) {
110 _sinks.onSatelliteInfo(_satelliteInfo);
111 }
112 return ret;
113}
114
115int GPSDriver::handleCallback(int type, void *data1, int data2)
116{
117 switch (static_cast<GPSCallbackType>(type)) {
118 case GPSCallbackType::readDeviceData: {
119 int timeoutMs = 0;
120 memcpy(&timeoutMs, data1, sizeof(timeoutMs)); // px4 packs the timeout into data1's first bytes (unaligned)
121 return _transport.read(static_cast<uint8_t *>(data1), data2, timeoutMs);
122 }
123 case GPSCallbackType::writeDeviceData:
124 return _transport.write(static_cast<const uint8_t *>(data1), data2);
125 case GPSCallbackType::setBaudrate:
126 return _transport.setBaudrate(static_cast<unsigned>(data2)) ? 0 : -1;
127 case GPSCallbackType::gotRTCMMessage:
128 if (_sinks.onRTCM) {
129 _sinks.onRTCM(QByteArray(static_cast<const char *>(data1), data2));
130 }
131 break;
132 case GPSCallbackType::surveyInStatus:
133 if (data1 && _sinks.onSurveyIn) {
134 const SurveyInStatus *const status = static_cast<const SurveyInStatus *>(data1);
136 out.latitude = status->latitude;
137 out.longitude = status->longitude;
138 out.altitude = status->altitude;
139 out.meanAccuracyMM = status->mean_accuracy;
140 out.durationSecs = status->duration;
141 out.valid = status->flags & 0x01;
142 out.active = (status->flags >> 1) & 0x01;
143 _sinks.onSurveyIn(out);
144 }
145 break;
146 case GPSCallbackType::setClock:
147 default:
148 break;
149 }
150
151 return 0;
152}
GPSType
Receiver families QGC can drive via the px4-gpsdrivers library.
Definition GPSType.h:5
#define QGC_LOGGING_CATEGORY(name, categoryStr)
GPSDriver(GPSType type, GPSTransport &transport, const GPSReceiverConfig &config, GPSDriverSinks sinks)
Definition GPSDriver.cc:27
int receive(unsigned timeoutMs)
Definition GPSDriver.cc:95
bool configure()
Create and configure the underlying driver. Returns false on failure.
Definition GPSDriver.cc:37
int handleCallback(int type, void *data1, int data2)
Definition GPSDriver.cc:115
virtual bool setBaudrate(unsigned baudrate)=0
Set the link baud rate. Returns true on success.
virtual int write(const uint8_t *buffer, int length)=0
Write length bytes. Returns bytes written, or -1 on error.
virtual int read(uint8_t *buffer, int length, int timeoutMs)=0
std::function< void(const sensor_gps_s &)> onPosition
Definition GPSDriver.h:47
std::function< void(const satellite_info_s &)> onSatelliteInfo
Definition GPSDriver.h:48
std::function< void(const GPSSurveyInStatus &)> onSurveyIn
Definition GPSDriver.h:50
std::function< void(const QByteArray &)> onRTCM
Definition GPSDriver.h:49
RTK base-station configuration, decoupled from QGC settings types.
Definition GPSDriver.h:19
double fixedBaseLatitude
Definition GPSDriver.h:23
float headingOffsetDeg
Definition GPSDriver.h:27
float fixedBaseAltitudeMeters
Definition GPSDriver.h:25
double fixedBaseLongitude
Definition GPSDriver.h:24
float fixedBaseAccuracyMeters
Definition GPSDriver.h:26
double surveyInAccMeters
Definition GPSDriver.h:21
Survey-in progress, translated from the px4 SurveyInStatus.
Definition GPSDriver.h:32
uint32_t meanAccuracyMM
Definition GPSDriver.h:36
uint32_t durationSecs
Definition GPSDriver.h:37