QGCApplication.h 7.61 KB
Newer Older
1
2
3
4
5
6
7
8
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/
dogmaphobic's avatar
dogmaphobic committed
9

pixhawk's avatar
pixhawk committed
10
11
12

/**
 * @file
pixhawk's avatar
pixhawk committed
13
 *   @brief Definition of main class
pixhawk's avatar
pixhawk committed
14
15
16
17
18
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

Don Gagne's avatar
Don Gagne committed
19
20
#ifndef QGCAPPLICATION_H
#define QGCAPPLICATION_H
pixhawk's avatar
pixhawk committed
21
22

#include <QApplication>
23
#include <QTimer>
Don Gagne's avatar
Don Gagne committed
24
#include <QQmlApplicationEngine>
pixhawk's avatar
pixhawk committed
25

Don Gagne's avatar
Don Gagne committed
26
#include "LinkConfiguration.h"
27
28
29
30
31
32
33
34
35
#include "LinkManager.h"
#include "MAVLinkProtocol.h"
#include "FlightMapSettings.h"
#include "FirmwarePluginManager.h"
#include "MultiVehicleManager.h"
#include "JoystickManager.h"
#include "GAudioOutput.h"
#include "UASMessageHandler.h"
#include "FactSystem.h"
Don Gagne's avatar
Don Gagne committed
36

37
#ifdef QGC_RTLAB_ENABLED
38
39
#include "OpalLink.h"
#endif
Don Gagne's avatar
Don Gagne committed
40

Don Gagne's avatar
Don Gagne committed
41
42
43
// Work around circular header includes
class QGCSingleton;
class MainWindow;
44
class QGCToolbox;
Don Gagne's avatar
Don Gagne committed
45

pixhawk's avatar
pixhawk committed
46
47
48
49
50
51
52
/**
 * @brief The main application and management class.
 *
 * This class is started by the main method and provides
 * the central management unit of the groundstation application.
 *
 **/
Don Gagne's avatar
Don Gagne committed
53
54
55
56
57
58
class QGCApplication : public
#ifdef __mobile__
    QGuiApplication // Native Qml based application
#else
    QApplication    // QtWidget based application
#endif
pixhawk's avatar
pixhawk committed
59
{
60
    Q_OBJECT
dogmaphobic's avatar
dogmaphobic committed
61

pixhawk's avatar
pixhawk committed
62
public:
Don Gagne's avatar
Don Gagne committed
63
    QGCApplication(int &argc, char* argv[], bool unitTesting);
Don Gagne's avatar
Don Gagne committed
64
    ~QGCApplication();
dogmaphobic's avatar
dogmaphobic committed
65

Don Gagne's avatar
Don Gagne committed
66
67
    static const char* parameterFileExtension;
    static const char* missionFileExtension;
Don Gagne's avatar
Don Gagne committed
68
    static const char* fenceFileExtension;
69
    static const char* rallyPointFileExtension;
Don Gagne's avatar
Don Gagne committed
70
71
    static const char* telemetryFileExtension;

Don Gagne's avatar
Don Gagne committed
72
73
    /// @brief Sets the persistent flag to delete all settings the next time QGroundControl is started.
    void deleteAllSettingsNextBoot(void);
dogmaphobic's avatar
dogmaphobic committed
74

Don Gagne's avatar
Don Gagne committed
75
76
    /// @brief Clears the persistent flag to delete all settings the next time QGroundControl is started.
    void clearDeleteAllSettingsNextBoot(void);
dogmaphobic's avatar
dogmaphobic committed
77

78
    /// @return true: Prompt to save log file when vehicle goes away
Don Gagne's avatar
Don Gagne committed
79
    bool promptFlightDataSave(void);
dogmaphobic's avatar
dogmaphobic committed
80

81
82
83
    /// @return true: Prompt to save log file even if vehicle was not armed
    bool promptFlightDataSaveNotArmed(void);

Don Gagne's avatar
Don Gagne committed
84
    void setPromptFlightDataSave(bool promptForSave);
85
    void setPromptFlightDataSaveNotArmed(bool promptForSave);
Don Gagne's avatar
Don Gagne committed
86

Don Gagne's avatar
Don Gagne committed
87
88
    /// @brief Returns truee if unit test are being run
    bool runningUnitTests(void) { return _runningUnitTests; }
dogmaphobic's avatar
dogmaphobic committed
89

90
91
    /// @return true: dark ui style, false: light ui style
    bool styleIsDark(void) { return _styleIsDark; }
dogmaphobic's avatar
dogmaphobic committed
92

93
94
    /// Set the current UI style
    void setStyle(bool styleIsDark);
dogmaphobic's avatar
dogmaphobic committed
95

Don Gagne's avatar
Don Gagne committed
96
    /// Used to report a missing Parameter. Warning will be displayed to user. Method may be called
97
    /// multiple times.
Don Gagne's avatar
Don Gagne committed
98
    void reportMissingParameter(int componentId, const QString& name);
99

Don Gagne's avatar
Don Gagne committed
100
    /// Show a non-modal message to the user
101
    void showMessage(const QString& message);
Don Gagne's avatar
Don Gagne committed
102

dogmaphobic's avatar
dogmaphobic committed
103
104
105
    /// @return true: Fake ui into showing mobile interface
    bool fakeMobile(void) { return _fakeMobile; }

106
107
108
#ifdef QT_DEBUG
    bool testHighDPI(void) { return _testHighDPI; }
#endif
109
110
111

    // Still working on getting rid of this and using dependency injection instead for everything
    QGCToolbox* toolbox(void) { return _toolbox; }
dogmaphobic's avatar
dogmaphobic committed
112
113
114
115

    /// Do we have Bluetooth Support?
    bool isBluetoothAvailable() { return _bluetoothAvailable; }

Don Gagne's avatar
Don Gagne committed
116
117
    QGeoCoordinate lastKnownHomePosition(void) { return _lastKnownHomePosition; }
    void setLastKnownHomePosition(QGeoCoordinate& lastKnownHomePosition);
Don Gagne's avatar
Don Gagne committed
118

119
120
121
public slots:
    /// You can connect to this slot to show an information message box from a different thread.
    void informationMessageBoxOnMainThread(const QString& title, const QString& msg);
dogmaphobic's avatar
dogmaphobic committed
122

123
124
    /// You can connect to this slot to show a warning message box from a different thread.
    void warningMessageBoxOnMainThread(const QString& title, const QString& msg);
dogmaphobic's avatar
dogmaphobic committed
125

126
127
    /// You can connect to this slot to show a critical message box from a different thread.
    void criticalMessageBoxOnMainThread(const QString& title, const QString& msg);
dogmaphobic's avatar
dogmaphobic committed
128

Don Gagne's avatar
Don Gagne committed
129
130
    void showSetupView(void);

131
    void qmlAttemptWindowClose(void);
Don Gagne's avatar
Don Gagne committed
132

133
#ifndef __mobile__
134
135
    /// Save the specified Flight Data Log
    void saveTempFlightDataLogOnMainThread(QString tempLogfile);
136
#endif
137

138
signals:
139
140
141
    /// Signals that the style has changed
    ///     @param darkStyle true: dark style, false: light style
    void styleChanged(bool darkStyle);
dogmaphobic's avatar
dogmaphobic committed
142

143
144
145
    /// This is connected to MAVLinkProtocol::checkForLostLogFiles. We signal this to ourselves to call the slot
    /// on the MAVLinkProtocol thread;
    void checkForLostLogFiles(void);
dogmaphobic's avatar
dogmaphobic committed
146

Don Gagne's avatar
Don Gagne committed
147
public:
148
    // Although public, these methods are internal and should only be called by UnitTest code
dogmaphobic's avatar
dogmaphobic committed
149

Don Gagne's avatar
Don Gagne committed
150
151
152
153
154
155
156
    /// @brief Perform initialize which is common to both normal application running and unit tests.
    ///         Although public should only be called by main.
    void _initCommon(void);

    /// @brief Intialize the application for normal application boot. Or in other words we are not going to run
    ///         unit tests. Although public should only be called by main.
    bool _initForNormalAppBoot(void);
dogmaphobic's avatar
dogmaphobic committed
157

Don Gagne's avatar
Don Gagne committed
158
159
160
    /// @brief Intialize the application for normal application boot. Or in other words we are not going to run
    ///         unit tests. Although public should only be called by main.
    bool _initForUnitTests(void);
Don Gagne's avatar
Don Gagne committed
161

Don Gagne's avatar
Don Gagne committed
162
    static QGCApplication*  _app;   ///< Our own singleton. Should be reference directly by qgcApp
dogmaphobic's avatar
dogmaphobic committed
163

Don Gagne's avatar
Don Gagne committed
164
private slots:
Don Gagne's avatar
Don Gagne committed
165
    void _missingParamsDisplay(void);
dogmaphobic's avatar
dogmaphobic committed
166

pixhawk's avatar
pixhawk committed
167
private:
Gus Grubba's avatar
Gus Grubba committed
168
169
    void        _loadCurrentStyle   ();
    QObject*    _rootQmlObject      ();
Don Gagne's avatar
Don Gagne committed
170
171
172
173

#ifdef __mobile__
    QQmlApplicationEngine* _qmlAppEngine;
#endif
dogmaphobic's avatar
dogmaphobic committed
174

Don Gagne's avatar
Don Gagne committed
175
    bool _runningUnitTests; ///< true: running unit tests, false: normal app
dogmaphobic's avatar
dogmaphobic committed
176

177
178
    static const char*  _darkStyleFile;
    static const char*  _lightStyleFile;
179
180
181
182
183
184
    bool                _styleIsDark;                                       ///< true: dark style, false: light style
    static const int    _missingParamsDelayedDisplayTimerTimeout = 1000;    ///< Timeout to wait for next missing fact to come in before display
    QTimer              _missingParamsDelayedDisplayTimer;                  ///< Timer use to delay missing fact display
    QStringList         _missingParams;                                     ///< List of missing facts to be displayed
    bool				_fakeMobile;                                        ///< true: Fake ui into displaying mobile interface
    bool                _settingsUpgraded;                                  ///< true: Settings format has been upgrade to new version
dogmaphobic's avatar
dogmaphobic committed
185

186
187
188
#ifdef QT_DEBUG
    bool _testHighDPI;  ///< true: double fonts sizes for simulating high dpi devices
#endif
189

190
191
    QGCToolbox* _toolbox;

dogmaphobic's avatar
dogmaphobic committed
192
193
    bool _bluetoothAvailable;

Don Gagne's avatar
Don Gagne committed
194
    QGeoCoordinate _lastKnownHomePosition;    ///< Map position when all other sources fail
Don Gagne's avatar
Don Gagne committed
195
196
197
198
199
200

    static const char* _settingsVersionKey;             ///< Settings key which hold settings version
    static const char* _deleteAllSettingsKey;           ///< If this settings key is set on boot, all settings will be deleted
    static const char* _promptFlightDataSave;           ///< Settings key for promptFlightDataSave
    static const char* _promptFlightDataSaveNotArmed;   ///< Settings key for promptFlightDataSaveNotArmed
    static const char* _styleKey;                       ///< Settings key for UI style
Don Gagne's avatar
Don Gagne committed
201
202
203
    static const char* _lastKnownHomePositionLatKey;
    static const char* _lastKnownHomePositionLonKey;
    static const char* _lastKnownHomePositionAltKey;
Don Gagne's avatar
Don Gagne committed
204

Don Gagne's avatar
Don Gagne committed
205
206
    /// Unit Test have access to creating and destroying singletons
    friend class UnitTest;
Gus Grubba's avatar
Gus Grubba committed
207

pixhawk's avatar
pixhawk committed
208
209
};

Don Gagne's avatar
Don Gagne committed
210
211
212
213
/// @brief Returns the QGCApplication object singleton.
QGCApplication* qgcApp(void);

#endif