QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
Viewer3DManager.cc
Go to the documentation of this file.
1#include "Viewer3DManager.h"
2
4#include "OsmParser.h"
6#include "Fact.h"
7#include "SettingsManager.h"
8#include "Vehicle.h"
10#include "Viewer3DSettings.h"
11
12QGC_LOGGING_CATEGORY(Viewer3DManagerLog, "Viewer3d.Viewer3DManager")
13
14Viewer3DManager::Viewer3DManager(QObject *parent)
15 : QObject(parent)
16 , _mapProvider(new OsmParser(this))
17{
18 _onActiveVehicleChanged(MultiVehicleManager::instance()->activeVehicle());
19
20 connect(_mapProvider, &Viewer3DMapProvider::gpsRefChanged, this, &Viewer3DManager::_onGpsRefChanged);
21 connect(MultiVehicleManager::instance(), &MultiVehicleManager::activeVehicleChanged, this, &Viewer3DManager::_onActiveVehicleChanged);
22 connect(SettingsManager::instance()->viewer3DSettings()->enabled(), &Fact::rawValueChanged, this, &Viewer3DManager::_onEnabledChanged);
23}
24
25void Viewer3DManager::setDisplayMode(DisplayMode mode)
26{
27 if (_displayMode == mode) {
28 return;
29 }
30
31 if (mode == DisplayMode::View3D) {
32 if (!SettingsManager::instance()->viewer3DSettings()->enabled()->rawValue().toBool()) {
33 return;
34 }
35 }
36
37 _displayMode = mode;
38 qCDebug(Viewer3DManagerLog) << "Display mode changed to" << (mode == DisplayMode::View3D ? "View3D" : "Map");
39 emit displayModeChanged();
40}
41
42void Viewer3DManager::_onActiveVehicleChanged(Vehicle *vehicle)
43{
44 if (_activeVehicle) {
45 disconnect(_activeVehicle, &Vehicle::coordinateChanged, this, &Viewer3DManager::_onActiveVehicleCoordinateChanged);
46 }
47
48 _activeVehicle = vehicle;
49 if (!_activeVehicle) {
50 if (_gpsRefSource == GpsRefSource::Vehicle) {
51 _gpsRefSource = GpsRefSource::None;
52 _gpsRef = QGeoCoordinate();
53 emit gpsRefChanged();
54 }
55 } else {
56 _onActiveVehicleCoordinateChanged(_activeVehicle->coordinate());
57 connect(_activeVehicle, &Vehicle::coordinateChanged, this, &Viewer3DManager::_onActiveVehicleCoordinateChanged);
58 }
59}
60
61void Viewer3DManager::_onActiveVehicleCoordinateChanged(const QGeoCoordinate &newCoordinate)
62{
63 if (_gpsRefSource == GpsRefSource::None) {
64 if (newCoordinate.isValid()) {
65 _gpsRef = newCoordinate;
66 _gpsRef.setAltitude(0);
67 _gpsRefSource = GpsRefSource::Vehicle;
68 emit gpsRefChanged();
69
70 qCDebug(Viewer3DManagerLog) << "GPS ref set by vehicle:" << _gpsRef.latitude() << _gpsRef.longitude() << _gpsRef.altitude();
71 }
72 }
73}
74
75void Viewer3DManager::_onGpsRefChanged(const QGeoCoordinate &newGpsRef, bool isRefSet)
76{
77 if (isRefSet) {
78 _gpsRef = newGpsRef;
79 _gpsRefSource = GpsRefSource::Map;
80 emit gpsRefChanged();
81 qCDebug(Viewer3DManagerLog) << "GPS ref set by map provider:" << _gpsRef.latitude() << _gpsRef.longitude() << _gpsRef.altitude();
82 } else {
83 if (_gpsRefSource != GpsRefSource::Map) {
84 return;
85 }
86
87 _gpsRefSource = GpsRefSource::None;
88 if (_activeVehicle && _activeVehicle->coordinate().isValid()) {
89 _gpsRef = _activeVehicle->coordinate();
90 _gpsRef.setAltitude(0);
91 _gpsRefSource = GpsRefSource::Vehicle;
92 } else {
93 _gpsRef = QGeoCoordinate();
94 }
95 emit gpsRefChanged();
96 }
97}
98
99void Viewer3DManager::_onEnabledChanged(const QVariant &value)
100{
101 if (!value.toBool()) {
102 setDisplayMode(DisplayMode::Map);
103 }
104}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void rawValueChanged(const QVariant &value)
void activeVehicleChanged(Vehicle *activeVehicle)
void coordinateChanged(QGeoCoordinate coordinate)
QGeoCoordinate coordinate()
Definition Vehicle.h:412
void gpsRefChanged()
void displayModeChanged()
void gpsRefChanged(QGeoCoordinate newGpsRef, bool isRefSet)