QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGroundControlQmlGlobal.cc
Go to the documentation of this file.
2
3#include "QGCCorePlugin.h"
4#include "LinkManager.h"
5#include "MAVLinkProtocol.h"
7#include "AppSettings.h"
8#include "FlightMapSettings.h"
9#include "SettingsManager.h"
10#include "PositionManager.h"
11#include "QGCMapEngineManager.h"
12#include "ADSBVehicleManager.h"
13#include "AudioOutput.h"
14#include "NTRIPManager.h"
15#include "MAVLinkSigningKeys.h"
16#include "MissionCommandTree.h"
17#include "VideoManager.h"
18#include "MultiVehicleManager.h"
20#ifndef QGC_NO_SERIAL_LINK
21#include "GPSManager.h"
22#include "GPSRtk.h"
23#endif
24#ifdef QT_DEBUG
25#include "MockLink.h"
26#endif
27
28#include <QtCore/QLineF>
29#include <QtCore/QSettings>
30#include <QtGui/QClipboard>
31#include <QtGui/QGuiApplication>
32
33#include "QGCLoggingCategory.h"
34
35QGC_LOGGING_CATEGORY(GuidedActionsControllerLog, "QMLControls.GuidedActionsController")
36
37QGeoCoordinate QGroundControlQmlGlobal::_coord = QGeoCoordinate(0.0,0.0);
38double QGroundControlQmlGlobal::_zoom = 2;
39
41 : QObject(parent)
42 , _mapEngineManager(QGCMapEngineManager::instance())
43 , _adsbVehicleManager(ADSBVehicleManager::instance())
44 , _ntripManager(NTRIPManager::instance())
45 , _qgcPositionManager(QGCPositionManager::instance())
46 , _missionCommandTree(MissionCommandTree::instance())
47 , _mavlinkSigningKeys(MAVLinkSigningKeys::instance())
48 , _videoManager(VideoManager::instance())
49 , _linkManager(LinkManager::instance())
50 , _multiVehicleManager(MultiVehicleManager::instance())
51 , _settingsManager(SettingsManager::instance())
52 , _corePlugin(QGCCorePlugin::instance())
53 , _globalPalette(new QGCPalette(this))
54#ifndef QGC_NO_SERIAL_LINK
55 , _gpsRtkFactGroup(GPSManager::instance()->gpsRtk()->gpsRtkFactGroup())
56#endif
57{
58 // We clear the parent on this object since we run into shutdown problems caused by hybrid qml app. Instead we let it leak on shutdown.
59 // setParent(nullptr);
60
61 // Load last coordinates and zoom from config file
62 QSettings settings;
63 settings.beginGroup(_flightMapPositionSettingsGroup);
64 _coord.setLatitude(settings.value(_flightMapPositionLatitudeSettingsKey, _coord.latitude()).toDouble());
65 _coord.setLongitude(settings.value(_flightMapPositionLongitudeSettingsKey, _coord.longitude()).toDouble());
66 _zoom = settings.value(_flightMapZoomSettingsKey, _zoom).toDouble();
67 _flightMapPositionSettledTimer.setSingleShot(true);
68 _flightMapPositionSettledTimer.setInterval(1000);
69 (void) connect(&_flightMapPositionSettledTimer, &QTimer::timeout, this, []() {
70 // When they settle, save flightMapPosition and Zoom to the config file
71 QSettings settingsInner;
72 settingsInner.beginGroup(_flightMapPositionSettingsGroup);
73 settingsInner.setValue(_flightMapPositionLatitudeSettingsKey, _coord.latitude());
74 settingsInner.setValue(_flightMapPositionLongitudeSettingsKey, _coord.longitude());
75 settingsInner.setValue(_flightMapZoomSettingsKey, _zoom);
76 });
77 connect(this, &QGroundControlQmlGlobal::flightMapPositionChanged, this, [this](QGeoCoordinate){
78 if (!_flightMapPositionSettledTimer.isActive()) {
79 _flightMapPositionSettledTimer.start();
80 }
81 });
82 connect(this, &QGroundControlQmlGlobal::flightMapZoomChanged, this, [this](double){
83 if (!_flightMapPositionSettledTimer.isActive()) {
84 _flightMapPositionSettledTimer.start();
85 }
86 });
87}
88
92
93void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value)
94{
95 QSettings settings;
96 settings.beginGroup(kQmlGlobalKeyName);
97 settings.setValue(key, value);
98}
99
100QString QGroundControlQmlGlobal::loadGlobalSetting (const QString& key, const QString& defaultValue)
101{
102 QSettings settings;
103 settings.beginGroup(kQmlGlobalKeyName);
104 return settings.value(key, defaultValue).toString();
105}
106
107void QGroundControlQmlGlobal::saveBoolGlobalSetting (const QString& key, bool value)
108{
109 QSettings settings;
110 settings.beginGroup(kQmlGlobalKeyName);
111 settings.setValue(key, value);
112}
113
114bool QGroundControlQmlGlobal::loadBoolGlobalSetting (const QString& key, bool defaultValue)
115{
116 QSettings settings;
117 settings.beginGroup(kQmlGlobalKeyName);
118 return settings.value(key, defaultValue).toBool();
119}
120
121void QGroundControlQmlGlobal::startPX4MockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
122{
123#ifdef QT_DEBUG
124 MockLink::startPX4MockLink(sendStatusText, enableCamera, enableGimbal);
125#else
126 Q_UNUSED(sendStatusText);
127 Q_UNUSED(enableCamera);
128 Q_UNUSED(enableGimbal);
129#endif
130}
131
132void QGroundControlQmlGlobal::startGenericMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
133{
134#ifdef QT_DEBUG
135 MockLink::startGenericMockLink(sendStatusText, enableCamera, enableGimbal);
136#else
137 Q_UNUSED(sendStatusText);
138 Q_UNUSED(enableCamera);
139 Q_UNUSED(enableGimbal);
140#endif
141}
142
143void QGroundControlQmlGlobal::startAPMArduCopterMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
144{
145#ifdef QT_DEBUG
146 MockLink::startAPMArduCopterMockLink(sendStatusText, enableCamera, enableGimbal);
147#else
148 Q_UNUSED(sendStatusText);
149 Q_UNUSED(enableCamera);
150 Q_UNUSED(enableGimbal);
151#endif
152}
153
154void QGroundControlQmlGlobal::startAPMArduPlaneMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
155{
156#ifdef QT_DEBUG
157 MockLink::startAPMArduPlaneMockLink(sendStatusText, enableCamera, enableGimbal);
158#else
159 Q_UNUSED(sendStatusText);
160 Q_UNUSED(enableCamera);
161 Q_UNUSED(enableGimbal);
162#endif
163}
164
165void QGroundControlQmlGlobal::startAPMArduSubMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
166{
167#ifdef QT_DEBUG
168 MockLink::startAPMArduSubMockLink(sendStatusText, enableCamera, enableGimbal);
169#else
170 Q_UNUSED(sendStatusText);
171 Q_UNUSED(enableCamera);
172 Q_UNUSED(enableGimbal);
173#endif
174}
175
176void QGroundControlQmlGlobal::startAPMArduRoverMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
177{
178#ifdef QT_DEBUG
179 MockLink::startAPMArduRoverMockLink(sendStatusText, enableCamera, enableGimbal);
180#else
181 Q_UNUSED(sendStatusText);
182 Q_UNUSED(enableCamera);
183 Q_UNUSED(enableGimbal);
184#endif
185}
186
188{
189#ifdef QT_DEBUG
190 QList<SharedLinkInterfacePtr> sharedLinks = LinkManager::instance()->links();
191
192 for (int i=0; i<sharedLinks.count(); i++) {
193 LinkInterface* link = sharedLinks[i].get();
194 MockLink* mockLink = qobject_cast<MockLink*>(link);
195 if (mockLink) {
196 mockLink->disconnect();
197 return;
198 }
199 }
200#endif
201}
202
207
209{
210 if (singleFirmwareSupport()) {
211 return FirmwarePluginManager::instance()->supportedVehicleClasses(FirmwarePluginManager::instance()->supportedFirmwareClasses()[0]).count() == 1;
212 }
213
214 return false;
215}
216
221
226
227bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPointF line2A, QPointF line2B)
228{
229 QPointF intersectPoint;
230
231 auto intersect = QLineF(line1A, line1B).intersects(QLineF(line2A, line2B), &intersectPoint);
232
233 return intersect == QLineF::BoundedIntersection &&
234 intersectPoint != line1A && intersectPoint != line1B;
235}
236
237void QGroundControlQmlGlobal::setFlightMapPosition(QGeoCoordinate& coordinate)
238{
239 if (coordinate != flightMapPosition()) {
240 _coord.setLatitude(coordinate.latitude());
241 _coord.setLongitude(coordinate.longitude());
242 emit flightMapPositionChanged(coordinate);
243 }
244}
245
247{
248 if (zoom != flightMapZoom()) {
249 _zoom = zoom;
250 emit flightMapZoomChanged(zoom);
251 }
252}
253
255{
256 QString versionStr = QCoreApplication::applicationVersion();
257 if(QSysInfo::buildAbi().contains("32"))
258 {
259 versionStr += QStringLiteral(" %1").arg(tr("32 bit"));
260 }
261 else if(QSysInfo::buildAbi().contains("64"))
262 {
263 versionStr += QStringLiteral(" %1").arg(tr("64 bit"));
264 }
265 return versionStr;
266}
267
269{
270 switch (altFrame) {
272 return QString();
274 return tr("Rel");
276 return tr("AMSL");
278 return tr("AGLC");
280 return tr("AGL");
282 return tr("Mixed");
283 }
284
285 // Should never get here but makes some compilers happy
286 return QString();
287}
288
290{
291 switch (altFrame) {
293 return QString();
295 return tr("Relative (%1)").arg(altitudeFrameExtraUnits(altFrame));
297 return tr("Absolute (%1)").arg(altitudeFrameExtraUnits(altFrame));
299 return tr("Above Terrain Calced (%1)").arg(altitudeFrameExtraUnits(altFrame));
301 return tr("Above Terrain (%1)").arg(altitudeFrameExtraUnits(altFrame));
303 return tr("Mixed");
304 }
305
306 // Should never get here but makes some compilers happy
307 return QString();
308}
309
311 QObject* owner,
312 const QString& title,
313 const QString& text,
314 int buttons,
315 QJSValue acceptFunction,
316 QJSValue closeFunction)
317{
318 emit showMessageDialogRequested(owner, title, text, buttons, acceptFunction, closeFunction);
319}
320
325
327{
328 QGuiApplication::clipboard()->setText(text);
329}
330
332{
333 return _settingsManager->flightMapSettings()->elevationMapProvider()->rawValue().toString();
334}
335
337{
338 return _settingsManager->flightMapSettings()->elevationMapProvider()->rawValue().toString();
339}
340
345
350
352{
353 return QCoreApplication::applicationName();
354}
355
356
#define QGC_LOGGING_CATEGORY(name, categoryStr)
static constexpr const char * parameterFileExtension
static constexpr const char * telemetryFileExtension
void testAudioOutput()
Tests the audio output. Will stop current output before test.
static AudioOutput * instance()
QList< QGCMAVLink::FirmwareClass_t > supportedFirmwareClasses()
Returns list of firmwares which are supported by the system.
QList< QGCMAVLink::VehicleClass_t > supportedVehicleClasses(QGCMAVLink::FirmwareClass_t firmwareClass)
Returns the list of supported vehicle types for the specified firmware.
static FirmwarePluginManager * instance()
static GPSManager * instance()
Definition GPSManager.cc:23
The link interface defines the interface for all links used to communicate with the ground station ap...
Manage communication links The Link Manager organizes the physical Links. It can manage arbitrary lin...
Definition LinkManager.h:32
static LinkManager * instance()
QList< SharedLinkInterfacePtr > links()
Bag of named MAVLink signing keys; correct key per vehicle is auto-detected from incoming signed pack...
Manages a hierarchy of MissionCommandUIInfo.
Extension mechanism for generic, non-firmware-specific customization of QGC.
QGCPalette is used in QML ui to expose color properties for the QGC palette.
Definition QGCPalette.h:83
void setFlightMapPosition(QGeoCoordinate &coordinate)
Q_INVOKABLE void startGenericMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
Q_INVOKABLE void startAPMArduSubMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
QString telemetryFileExtension(void) const
void showMessageDialogRequested(QObject *owner, QString title, QString text, int buttons, QJSValue acceptFunction, QJSValue closeFunction)
void flightMapPositionChanged(QGeoCoordinate flightMapPosition)
Q_INVOKABLE void startAPMArduPlaneMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
Q_INVOKABLE QString loadGlobalSetting(const QString &key, const QString &defaultValue)
Q_INVOKABLE void startPX4MockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
Q_INVOKABLE QString altitudeFrameExtraUnits(AltitudeFrame altFrame)
String shown in the FactTextField.extraUnits ui.
static QGeoCoordinate flightMapPosition()
Q_INVOKABLE void startAPMArduCopterMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
void flightMapZoomChanged(double flightMapZoom)
Q_INVOKABLE void stopOneMockLink(void)
Q_INVOKABLE bool loadBoolGlobalSetting(const QString &key, bool defaultValue)
QString parameterFileExtension(void) const
Q_INVOKABLE bool linesIntersect(QPointF xLine1, QPointF yLine1, QPointF xLine2, QPointF yLine2)
Q_INVOKABLE void saveBoolGlobalSetting(const QString &key, bool value)
Q_INVOKABLE void startAPMArduRoverMockLink(bool sendStatusText, bool enableCamera, bool enableGimbal)
Q_INVOKABLE QString altitudeFrameShortDescription(AltitudeFrame altFrame)
String shown when a user needs to select an altitude frame.
Q_INVOKABLE void showMessageDialog(QObject *owner, const QString &title, const QString &text, int buttons=kDefaultMessageDialogButtons, QJSValue acceptFunction=QJSValue(), QJSValue closeFunction=QJSValue())
static Q_INVOKABLE void copyToClipboard(const QString &text)
Copy text to the system clipboard.
Q_INVOKABLE void saveGlobalSetting(const QString &key, const QString &value)
Provides access to all app settings.
FlightMapSettings * flightMapSettings() const