QGCApplication.h 7.64 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
36
#include "LinkManager.h"
#include "MAVLinkProtocol.h"
#include "FlightMapSettings.h"
#include "HomePositionManager.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
37

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

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

pixhawk's avatar
pixhawk committed
47
48
49
50
51
52
53
/**
 * @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
54
55
56
57
58
59
class QGCApplication : public
#ifdef __mobile__
    QGuiApplication // Native Qml based application
#else
    QApplication    // QtWidget based application
#endif
pixhawk's avatar
pixhawk committed
60
{
61
    Q_OBJECT
dogmaphobic's avatar
dogmaphobic committed
62

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

120
121
122
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
123

124
125
    /// 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
126

127
128
    /// 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
129

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

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

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

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

144
145
146
    /// 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
147

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

Don Gagne's avatar
Don Gagne committed
151
152
153
154
155
156
157
    /// @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
158

Don Gagne's avatar
Don Gagne committed
159
160
161
    /// @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
162

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

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

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

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

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

178
179
    static const char*  _darkStyleFile;
    static const char*  _lightStyleFile;
180
181
182
183
184
185
    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
186

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

191
192
    QGCToolbox* _toolbox;

dogmaphobic's avatar
dogmaphobic committed
193
194
    bool _bluetoothAvailable;

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

    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
202
203
204
    static const char* _lastKnownHomePositionLatKey;
    static const char* _lastKnownHomePositionLonKey;
    static const char* _lastKnownHomePositionAltKey;
Don Gagne's avatar
Don Gagne committed
205

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

pixhawk's avatar
pixhawk committed
209
210
};

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

#endif