QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGroundControlQmlGlobal.cc
Go to the documentation of this file.
2
4#include "AppSettings.h"
5#include "AudioOutput.h"
7#include "FlightMapSettings.h"
8#include "GPSManager.h"
9#include "LinkManager.h"
11#include "MAVLinkProtocol.h"
12#include "MAVLinkSigningKeys.h"
13#include "MissionCommandTree.h"
14#include "MultiVehicleManager.h"
15#include "PositionManager.h"
16#include "QGCCorePlugin.h"
17#include "QGCFormat.h"
18#include "QGCMapEngineManager.h"
19#include "QGCVersionCheck.h"
20#include "SettingsManager.h"
21#include "VideoManager.h"
22#ifndef QGC_NO_SERIAL_LINK
23#include "SerialPortManager.h"
24#endif
25#ifdef QT_DEBUG
26#include "MockLink.h"
27#endif
28
29#include <QtCore/QLineF>
30#include <QtCore/QSettings>
31#include <QtGui/QClipboard>
32#include <QtGui/QGuiApplication>
33
34#include "qgc_version.h"
35
36#include "QGCLoggingCategory.h"
37
38QGC_LOGGING_CATEGORY(GuidedActionsControllerLog, "QMLControls.GuidedActionsController")
39
40QGeoCoordinate QGroundControlQmlGlobal::_coord = QGeoCoordinate(0.0,0.0);
41double QGroundControlQmlGlobal::_zoom = 2;
42
44 : QObject(parent)
45 , _mapEngineManager(QGCMapEngineManager::instance())
46 , _adsbVehicleManager(ADSBVehicleManager::instance())
47 , _missionCommandTree(MissionCommandTree::instance())
48 , _mavlinkSigningKeys(MAVLinkSigningKeys::instance())
49 , _videoManager(VideoManager::instance())
50 , _linkManager(LinkManager::instance())
51 , _multiVehicleManager(MultiVehicleManager::instance())
52 , _settingsManager(SettingsManager::instance())
53 , _corePlugin(QGCCorePlugin::instance())
54 , _globalPalette(new QGCPalette(this))
55{
56 // 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.
57 // setParent(nullptr);
58
59 // Load last coordinates and zoom from config file
60 QSettings settings;
61 settings.beginGroup(_flightMapPositionSettingsGroup);
62 _coord.setLatitude(settings.value(_flightMapPositionLatitudeSettingsKey, _coord.latitude()).toDouble());
63 _coord.setLongitude(settings.value(_flightMapPositionLongitudeSettingsKey, _coord.longitude()).toDouble());
64 _zoom = settings.value(_flightMapZoomSettingsKey, _zoom).toDouble();
65 _flightMapPositionSettledTimer.setSingleShot(true);
66 _flightMapPositionSettledTimer.setInterval(1000);
67 (void) connect(&_flightMapPositionSettledTimer, &QTimer::timeout, this, []() {
68 // When they settle, save flightMapPosition and Zoom to the config file
69 QSettings settingsInner;
70 settingsInner.beginGroup(_flightMapPositionSettingsGroup);
71 settingsInner.setValue(_flightMapPositionLatitudeSettingsKey, _coord.latitude());
72 settingsInner.setValue(_flightMapPositionLongitudeSettingsKey, _coord.longitude());
73 settingsInner.setValue(_flightMapZoomSettingsKey, _zoom);
74 });
75 connect(this, &QGroundControlQmlGlobal::flightMapPositionChanged, this, [this](QGeoCoordinate){
76 if (!_flightMapPositionSettledTimer.isActive()) {
77 _flightMapPositionSettledTimer.start();
78 }
79 });
80 connect(this, &QGroundControlQmlGlobal::flightMapZoomChanged, this, [this](double){
81 if (!_flightMapPositionSettledTimer.isActive()) {
82 _flightMapPositionSettledTimer.start();
83 }
84 });
87}
88
92
97
102
103void QGroundControlQmlGlobal::saveGlobalSetting (const QString& key, const QString& value)
104{
105 QSettings settings;
106 settings.beginGroup(kQmlGlobalKeyName);
107 settings.setValue(key, value);
108}
109
110QString QGroundControlQmlGlobal::loadGlobalSetting (const QString& key, const QString& defaultValue)
111{
112 QSettings settings;
113 settings.beginGroup(kQmlGlobalKeyName);
114 return settings.value(key, defaultValue).toString();
115}
116
117void QGroundControlQmlGlobal::saveBoolGlobalSetting (const QString& key, bool value)
118{
119 QSettings settings;
120 settings.beginGroup(kQmlGlobalKeyName);
121 settings.setValue(key, value);
122}
123
124bool QGroundControlQmlGlobal::loadBoolGlobalSetting (const QString& key, bool defaultValue)
125{
126 QSettings settings;
127 settings.beginGroup(kQmlGlobalKeyName);
128 return settings.value(key, defaultValue).toBool();
129}
130
131#ifdef QT_DEBUG
132QGC_LOGGING_CATEGORY(QGroundControlQmlGlobalLog, "QMLControls.QGroundControlQmlGlobal")
133#endif
134
136{
137#ifdef QT_DEBUG
138 MockConfiguration* const mockConfig = new MockConfiguration(QStringLiteral("MockLink"));
139 for (auto it = properties.cbegin(); it != properties.cend(); ++it) {
140 if (!mockConfig->setProperty(it.key().toUtf8().constData(), it.value())) {
141 qCWarning(QGroundControlQmlGlobalLog) << "Invalid MockConfiguration property:" << it.key() << it.value();
142 }
143 }
144 (void) MockLink::startMockLink(mockConfig);
145#else
146 Q_UNUSED(properties);
147#endif
148}
149
151{
152#ifdef QT_DEBUG
153 QList<SharedLinkInterfacePtr> sharedLinks = LinkManager::instance()->links();
154
155 for (int i=0; i<sharedLinks.count(); i++) {
156 LinkInterface* link = sharedLinks[i].get();
157 MockLink* mockLink = qobject_cast<MockLink*>(link);
158 if (mockLink) {
159 mockLink->disconnect();
160 return;
161 }
162 }
163#endif
164}
165
170
175
180
185
187{
188 return QGC::bigSizeToString(size);
189}
190
191bool QGroundControlQmlGlobal::linesIntersect(QPointF line1A, QPointF line1B, QPointF line2A, QPointF line2B)
192{
193 QPointF intersectPoint;
194
195 auto intersect = QLineF(line1A, line1B).intersects(QLineF(line2A, line2B), &intersectPoint);
196
197 return intersect == QLineF::BoundedIntersection &&
198 intersectPoint != line1A && intersectPoint != line1B;
199}
200
201void QGroundControlQmlGlobal::setFlightMapPosition(QGeoCoordinate& coordinate)
202{
203 if (coordinate != flightMapPosition()) {
204 _coord.setLatitude(coordinate.latitude());
205 _coord.setLongitude(coordinate.longitude());
206 emit flightMapPositionChanged(coordinate);
207 }
208}
209
211{
212 if (zoom != flightMapZoom()) {
213 _zoom = zoom;
214 emit flightMapZoomChanged(zoom);
215 }
216}
217
219{
220 QString versionStr = QCoreApplication::applicationVersion();
221 if(QSysInfo::buildAbi().contains("32"))
222 {
223 versionStr += QStringLiteral(" %1").arg(tr("32 bit"));
224 }
225 else if(QSysInfo::buildAbi().contains("64"))
226 {
227 versionStr += QStringLiteral(" %1").arg(tr("64 bit"));
228 }
229 return versionStr;
230}
231
233{
234 return QGC_APP_DATE;
235}
236
241
243{
244 switch (altFrame) {
246 return QString();
248 return tr("Rel");
250 return tr("AMSL");
252 return tr("AGLC");
254 return tr("AGL");
256 return tr("Mixed");
257 }
258
259 // Should never get here but makes some compilers happy
260 return QString();
261}
262
264{
265 switch (altFrame) {
267 return QString();
269 return tr("Relative (%1)").arg(altitudeFrameExtraUnits(altFrame));
271 return tr("Absolute (%1)").arg(altitudeFrameExtraUnits(altFrame));
273 return tr("Above Terrain Calced (%1)").arg(altitudeFrameExtraUnits(altFrame));
275 return tr("Above Terrain (%1)").arg(altitudeFrameExtraUnits(altFrame));
277 return tr("Mixed");
278 }
279
280 // Should never get here but makes some compilers happy
281 return QString();
282}
283
285 QObject* owner,
286 const QString& title,
287 const QString& text,
288 int buttons,
289 QJSValue acceptFunction,
290 QJSValue closeFunction)
291{
292 emit showMessageDialogRequested(owner, title, text, buttons, acceptFunction, closeFunction);
293}
294
299
301{
302 QGuiApplication::clipboard()->setText(text);
303}
304
306{
307 return _settingsManager->flightMapSettings()->elevationMapProvider()->rawValue().toString();
308}
309
311{
312 return _settingsManager->flightMapSettings()->elevationMapProvider()->rawValue().toString();
313}
314
319
324
326{
327 return QCoreApplication::applicationName();
328}
329
331{
332#ifndef QGC_NO_SERIAL_LINK
333 auto* manager = SerialPortManager::instance();
334 (void) manager->availablePorts();
335 return manager;
336#else
337 return nullptr;
338#endif
339}
#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()
bool firmwareClassSupported(QGCMAVLink::FirmwareClass_t firmwareClass)
Returns true if the specified firmware class is supported by the system.
bool singleFirmwareSupport()
Returns true if the system supports only a single firmware class.
bool singleVehicleSupport()
Returns true if the system supports only a single firmware class with a single vehicle type.
static FirmwarePluginManager * instance()
static GPSManager * instance()
Definition GPSManager.cc:67
PositionManager * positionManager() const
Definition GPSManager.h:56
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:30
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
static QGCVersionCheck * instance()
QString newStableVersion() const
Newer stable version available for download, empty if none.
void newStableVersionChanged()
void setFlightMapPosition(QGeoCoordinate &coordinate)
QString telemetryFileExtension(void) const
Q_INVOKABLE void startMockLink(const QVariantMap &properties)
Starts a MockLink whose MockConfiguration properties are set from the map (e.g. { name: "PX4",...
void showMessageDialogRequested(QObject *owner, QString title, QString text, int buttons, QJSValue acceptFunction, QJSValue closeFunction)
void flightMapPositionChanged(QGeoCoordinate flightMapPosition)
Q_INVOKABLE QString loadGlobalSetting(const QString &key, const QString &defaultValue)
Q_INVOKABLE QString altitudeFrameExtraUnits(AltitudeFrame altFrame)
String shown in the FactTextField.extraUnits ui.
static Q_INVOKABLE QString bigSizeToString(quint64 size)
Byte size with a locale-aware unit, as QGC::bigSizeToString().
static QGeoCoordinate flightMapPosition()
PositionManager * positionManager() const
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 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)
static SerialPortManager * instance()
Provides access to all app settings.
FlightMapSettings * flightMapSettings() const
static GParamSpec * properties[PROP_LAST]
QString bigSizeToString(quint64 size)
Byte size with unit: B, KB, MB, GB, TB. 1 fractional digit above 1 KB.
Definition QGCFormat.cc:20