6#include <base_station.h>
15#include <QtSerialPort/QSerialPort>
25 , _requestStop(requestStop)
30 qCDebug(GPSProviderLog) << QString(
"Survey in accuracy: %1 | duration: %2").arg(_rtkData.surveyInAccMeters).arg(_rtkData.surveyInDurationSecs);
40void GPSProvider::_publishSatelliteInfo()
45void GPSProvider::_publishSensorGNSSRelative()
50void GPSProvider::_publishSensorGPS()
55void GPSProvider::_gotRTCMData(
const uint8_t *data,
size_t len)
57 const QByteArray message(
reinterpret_cast<const char*
>(data), len);
61int GPSProvider::_callbackEntry(GPSCallbackType type,
void *data1,
int data2,
void *user)
64 return gps->
callback(type, data1, data2);
70 case GPSCallbackType::readDeviceData:
72 const int timeout = *(
reinterpret_cast<int*
>(data1));
77 return _serial->read(
reinterpret_cast<char*
>(data1), data2);
78 case GPSCallbackType::writeDeviceData:
79 if (_serial->write(
reinterpret_cast<char*
>(data1), data2) >= 0) {
85 case GPSCallbackType::setBaudrate:
87 case GPSCallbackType::gotRTCMMessage:
88 _gotRTCMData(
reinterpret_cast<uint8_t*
>(data1), data2);
90 case GPSCallbackType::surveyInStatus:
92 const SurveyInStatus*
const status =
reinterpret_cast<SurveyInStatus*
>(data1);
93 qCDebug(GPSProviderLog) <<
"Position:" << status->latitude << status->longitude << status->altitude;
95 const bool valid = status->flags & 1;
96 const bool active = (status->flags >> 1) & 1;
98 qCDebug(GPSProviderLog) << QString(
"Survey-in status: %1s cur accuracy: %2mm valid: %3 active: %4").arg(status->duration).arg(status->mean_accuracy).arg(valid).arg(active);
99 emit
surveyInStatus(status->duration, status->mean_accuracy, status->latitude, status->longitude, status->altitude, valid, active);
102 case GPSCallbackType::setClock:
103 case GPSCallbackType::gotRelativePositionMessage:
112void GPSProvider::run()
114#ifdef SIMULATE_RTCM_OUTPUT
120 GPSBaseStationSupport *gpsDriver =
nullptr;
122 while (!_requestStop) {
128 gpsDriver = _connectGPS();
130 (void) memset(&_sensorGps, 0,
sizeof(_sensorGps));
132 uint8_t numTries = 0;
133 while (!_requestStop && (numTries < 3)) {
134 const int helperRet = gpsDriver->receive(kGPSReceiveTimeout);
139 if (helperRet & GPSReceiveType::Position) {
144 if (helperRet & GPSReceiveType::Satellite) {
145 _publishSatelliteInfo();
165 qCDebug(GPSProviderLog) << Q_FUNC_INFO <<
"Exiting GPS thread";
168bool GPSProvider::_connectSerial()
172 if (!_serial->
open(QIODevice::ReadWrite)) {
175 uint32_t retries = 60;
177 qCDebug(GPSProviderLog) <<
"Cannot open device... retrying";
179 if (_serial->
open(QIODevice::ReadWrite)) {
186 qCWarning(GPSProviderLog) <<
"GPS: Failed to open Serial Device" << _device << _serial->errorString();
200GPSBaseStationSupport *GPSProvider::_connectGPS()
202 GPSBaseStationSupport *gpsDriver =
nullptr;
203 uint32_t baudrate = 0;
206 gpsDriver =
new GPSDriverAshtech(&_callbackEntry,
this, &_sensorGps, &_satelliteInfo);
210 gpsDriver =
new GPSDriverSBF(&_callbackEntry,
this, &_sensorGps, &_satelliteInfo, kGPSHeadingOffset);
214 gpsDriver =
new GPSDriverUBX(GPSDriverUBX::Interface::UART, &_callbackEntry,
this, &_sensorGps, &_satelliteInfo);
218 gpsDriver =
new GPSDriverFemto(&_callbackEntry,
this, &_sensorGps, &_satelliteInfo);
223 qCWarning(GPSProviderLog) <<
"Unsupported GPS Type:" <<
static_cast<int>(_type);
238 _gpsConfig.output_mode = GPSHelper::OutputMode::RTCM;
240 if (gpsDriver->configure(baudrate, _gpsConfig) != 0) {
247void GPSProvider::_sendRTCMData()
251 const int fakeMsgLengths[3] = { 30, 170, 240 };
252 const uint8_t*
const fakeData =
new uint8_t[fakeMsgLengths[2]];
253 while (!_requestStop) {
254 for (
int i = 0; i < 3; ++i) {
255 const QByteArray message(
reinterpret_cast<const char*
>(fakeData), fakeMsgLengths[i]);
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void RTCMDataUpdate(const QByteArray &message)
void sensorGnssRelativeUpdate(const sensor_gnss_relative_s &message)
int callback(GPSCallbackType type, void *data1, int data2)
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)
Provides functions to access serial ports.
bool open(OpenMode mode) override
bool setStopBits(StopBits stopBits)
void setPortName(const QString &name)
bool waitForBytesWritten(int msecs=30000) override
bool waitForReadyRead(int msecs=30000) override
SerialPortError error() const
the error status of the serial port
bool setBaudRate(qint32 baudRate, Directions directions=AllDirections)
bool setDataBits(DataBits dataBits)
bool setParity(Parity parity)
qint64 bytesAvailable() const override
bool setFlowControl(FlowControl flowControl)
void RTCMDataUpdate(QByteArrayView data)
double fixedBaseLongitude
float fixedBaseAltitudeMeters
float fixedBaseAccuracyMeters
BaseModeDefinition::Mode useFixedBaseLocation