QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
GPSManager.cc
Go to the documentation of this file.
1#include "GPSManager.h"
2
3#include <QtCore/QApplicationStatic>
4#include <QtCore/QPointer>
5
7#include "GPSReceiver.h"
10#include "LinkManager.h"
11#include "NTRIPGgaReporter.h"
12#include "NTRIPManager.h"
14#include "PositionManager.h"
15#include "QGCCorePlugin.h"
16#include "QGCLoggingCategory.h"
18#include "RTKSettings.h"
19#include "RuntimeScheduler.h"
20#include "SettingsManager.h"
21#ifndef QGC_NO_SERIAL_LINK
22#include "SerialPortManager.h"
23#endif
24
25QGC_LOGGING_CATEGORY(GPSManagerLog, "GPS.GPSManager")
26
28
29namespace {
30
31GPSReceiver::Dependencies receiverDependencies(GPSCorrectionManager* corrections, PositionManager* positions)
32{
33 GPSReceiver::Dependencies dependencies{.corrections = corrections, .positions = positions};
34#ifndef QGC_NO_SERIAL_LINK
35 dependencies.serialPorts = SerialPortManager::instance();
36#endif
37 return dependencies;
38}
39
40} // namespace
41
42GPSManager::GPSManager(QObject* parent, RuntimeScheduler* scheduler)
43 : QObject(parent)
44 , _scheduler(RuntimeScheduler::orDefault(scheduler, nullptr))
45 , _corrections(new GPSCorrectionManager(this, _scheduler))
46 , _positionManager(new PositionManager(this, _scheduler))
47 , _receiver(new GPSReceiver(this, _scheduler, receiverDependencies(_corrections, _positionManager)))
48 , _ntripManager(new NTRIPManager(this, _scheduler,
49 {.corrections = _corrections, .network = new QGCNetworkAvailabilityMonitor(this)}))
50 , _vehicleGga(new NTRIPVehicleGgaSource(_scheduler, this))
51{
52 qCDebug(GPSManagerLog) << this;
53 _positionManager->setPlatformSourceFactory(
54 [](QObject* sourceParent) { return QGCCorePlugin::instance()->createPositionSource(sourceParent); });
55 if (!scheduler) {
56 // The last child, so the services it runs are destroyed before it.
57 _scheduler->setParent(this);
58 }
59}
60
62{
63 shutdown();
64 qCDebug(GPSManagerLog) << this;
65}
66
68{
69 return _gpsManager();
70}
71
73{
74 // A copy: a settings observer may reconfigure the receiver, which rewrites the receiver Facts.
75 const std::optional<GPSBaseStationConfig::Fixed> base = _receiver->facts()->currentBasePosition();
76 if (!base) {
77 return false;
78 }
79 _receiver->facts()->_setCurrentBasePositionSaved(true);
81 settings->fixedBasePositionLatitude()->setRawValue(base->position.latitudeDegrees);
82 settings->fixedBasePositionLongitude()->setRawValue(base->position.longitudeDegrees);
83 settings->fixedBasePositionAltitude()->setRawValue(base->position.altitudeMeters);
84 settings->fixedBasePositionAccuracy()->setRawValue(base->accuracyMeters);
85 return true;
86}
87
89{
90 if (_initialized || _shutdown) {
91 return;
92 }
93 _initialized = true;
94 GPSSettingsBindings::bindPosition(SettingsManager::instance()->rtkSettings(), _positionManager);
95 _positionManager->init();
96 _initGgaSources();
98 GPSSettingsBindings::bindCorrections(SettingsManager::instance()->gpsCorrectionSettings(), _corrections);
99 GPSSettingsBindings::bindNtrip(SettingsManager::instance()->ntripSettings(), _ntripManager);
100 _ntripManager->init();
102}
103
105{
106 if (_shutdown) {
107 return;
108 }
109 _shutdown = true;
110 qCDebug(GPSManagerLog) << "Shutting down GPS sources and correction outputs";
111 _receiver->shutdown();
112 _ntripManager->shutdown();
113 _corrections->shutdown();
114 _positionManager->shutdown();
115}
116
117void GPSManager::_initGgaSources()
118{
120 using Observation = std::optional<GPSObservation>;
121 _vehicleGga->attach(_ntripManager);
122 _ntripManager->setGgaPositionProvider(
123 Source::RTKReceiver, [receiver = QPointer<GPSReceiver>(_receiver)]() -> Observation {
125 });
126 _ntripManager->setGgaPositionProvider(
127 Source::GCSPosition, [positionManager = QPointer<PositionManager>(_positionManager)]() -> Observation {
129 : std::nullopt;
130 });
131}
Q_APPLICATION_STATIC(GPSManager, _gpsManager)
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void shutdown()
Stops the GPS services, then the position manager.
Q_INVOKABLE bool saveCurrentBasePosition()
Definition GPSManager.cc:72
static GPSManager * instance()
Definition GPSManager.cc:67
GPSManager(QObject *parent=nullptr, RuntimeScheduler *scheduler=nullptr)
scheduler runs the timers of every GPS service; the manager creates one when none is given.
Definition GPSManager.cc:42
void init()
Definition GPSManager.cc:88
PositionManager * positionManager() const
Definition GPSManager.h:56
GPSReceiver * receiver() const
Definition GPSManager.h:50
std::optional< GPSBaseStationConfig::Fixed > currentBasePosition() const
void startConnectionPolling(std::function< bool()> suspended={})
Runs tick() every POLL_INTERVAL until shutdown(), skipping ticks while suspended returns true.
void shutdown()
GPSReceiverFactGroup * facts() const
The receiver's reported state; with no receiver, every Fact is at its metadata default.
std::optional< GPSObservation > acceptedPositionObservation(GPSObservation::PositionUse use) const
Latest receiver solution that passes the consumer's gates; empty without a fresh fix.
static void bindReceiver(RTKSettings *settings, GPSReceiver *receiver)
static void bindPosition(RTKSettings *settings, PositionManager *positions)
static void bindCorrections(GPSCorrectionSettings *settings, GPSCorrectionManager *corrections)
Applies the correction settings to corrections now and whenever they change.
static void bindNtrip(NTRIPSettings *settings, NTRIPManager *ntrip)
bool connectionsSuspended() const
Definition LinkManager.h:82
static LinkManager * instance()
void setGgaPositionProvider(NTRIPGgaReporter::PositionSource source, NTRIPGgaReporter::PositionProvider provider)
void init()
Applies the configuration; call once the position providers are installed.
void shutdown()
Permanently retire this manager, including deferred settings work.
void attach(NTRIPManager *ntrip)
void shutdown()
Releases the position sources and ignores later configuration; init() does not restart them.
std::optional< GPSObservation > acceptedObservation(GPSObservation::PositionUse use=GPSObservation::PositionUse::GroundStation, std::optional< std::chrono::milliseconds > maximumAge=std::nullopt) const
virtual QGeoPositionInfoSource * createPositionSource(QObject *parent)
static QGCCorePlugin * instance()
static SerialPortManager * instance()
RTKSettings * rtkSettings() const
static SettingsManager * instance()
Services a GPSReceiver uses, which must outlive it.
Definition GPSReceiver.h:32
GPSCorrectionManager * corrections
Receives a forwarding receiver's RTCM output as the local correction source.
Definition GPSReceiver.h:34