QGCApplication.h 8.17 KB
Newer Older
pixhawk's avatar
pixhawk committed
1
/*=====================================================================
dogmaphobic's avatar
dogmaphobic committed
2

Don Gagne's avatar
Don Gagne committed
3
 QGroundControl Open Source Ground Control Station
dogmaphobic's avatar
dogmaphobic committed
4

Don Gagne's avatar
Don Gagne committed
5
 (c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
dogmaphobic's avatar
dogmaphobic committed
6

Don Gagne's avatar
Don Gagne committed
7
 This file is part of the QGROUNDCONTROL project
dogmaphobic's avatar
dogmaphobic committed
8

Don Gagne's avatar
Don Gagne committed
9
10
11
12
 QGROUNDCONTROL is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
dogmaphobic's avatar
dogmaphobic committed
13

Don Gagne's avatar
Don Gagne committed
14
15
16
17
 QGROUNDCONTROL is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
dogmaphobic's avatar
dogmaphobic committed
18

Don Gagne's avatar
Don Gagne committed
19
20
 You should have received a copy of the GNU General Public License
 along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
dogmaphobic's avatar
dogmaphobic committed
21

Don Gagne's avatar
Don Gagne committed
22
 ======================================================================*/
pixhawk's avatar
pixhawk committed
23
24
25

/**
 * @file
pixhawk's avatar
pixhawk committed
26
 *   @brief Definition of main class
pixhawk's avatar
pixhawk committed
27
28
29
30
31
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

Don Gagne's avatar
Don Gagne committed
32
33
#ifndef QGCAPPLICATION_H
#define QGCAPPLICATION_H
pixhawk's avatar
pixhawk committed
34
35

#include <QApplication>
36
#include <QTimer>
Don Gagne's avatar
Don Gagne committed
37
#include <QQmlApplicationEngine>
pixhawk's avatar
pixhawk committed
38

Don Gagne's avatar
Don Gagne committed
39
#include "LinkConfiguration.h"
40
41
42
43
44
45
46
47
48
49
50
#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 "AutoPilotPluginManager.h"
#include "UASMessageHandler.h"
#include "FactSystem.h"
Don Gagne's avatar
Don Gagne committed
51

52
#ifdef QGC_RTLAB_ENABLED
53
54
#include "OpalLink.h"
#endif
Don Gagne's avatar
Don Gagne committed
55

Don Gagne's avatar
Don Gagne committed
56
57
58
// Work around circular header includes
class QGCSingleton;
class MainWindow;
59
class QGCToolbox;
Don Gagne's avatar
Don Gagne committed
60

pixhawk's avatar
pixhawk committed
61
62
63
64
65
66
67
/**
 * @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
68
69
70
71
72
73
class QGCApplication : public
#ifdef __mobile__
    QGuiApplication // Native Qml based application
#else
    QApplication    // QtWidget based application
#endif
pixhawk's avatar
pixhawk committed
74
{
75
    Q_OBJECT
dogmaphobic's avatar
dogmaphobic committed
76

pixhawk's avatar
pixhawk committed
77
public:
Don Gagne's avatar
Don Gagne committed
78
    QGCApplication(int &argc, char* argv[], bool unitTesting);
Don Gagne's avatar
Don Gagne committed
79
    ~QGCApplication();
dogmaphobic's avatar
dogmaphobic committed
80

Don Gagne's avatar
Don Gagne committed
81
82
83
84
    static const char* parameterFileExtension;
    static const char* missionFileExtension;
    static const char* telemetryFileExtension;

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

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

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

94
95
96
    /// @return true: Prompt to save log file even if vehicle was not armed
    bool promptFlightDataSaveNotArmed(void);

Don Gagne's avatar
Don Gagne committed
97
    void setPromptFlightDataSave(bool promptForSave);
98
    void setPromptFlightDataSaveNotArmed(bool promptForSave);
Don Gagne's avatar
Don Gagne committed
99

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

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

106
107
    /// Set the current UI style
    void setStyle(bool styleIsDark);
dogmaphobic's avatar
dogmaphobic committed
108

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

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

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

119
120
121
#ifdef QT_DEBUG
    bool testHighDPI(void) { return _testHighDPI; }
#endif
122
123
124

    // Still working on getting rid of this and using dependency injection instead for everything
    QGCToolbox* toolbox(void) { return _toolbox; }
dogmaphobic's avatar
dogmaphobic committed
125
126
127
128

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

Don Gagne's avatar
Don Gagne committed
129
130
    QGeoCoordinate lastKnownHomePosition(void) { return _lastKnownHomePosition; }
    void setLastKnownHomePosition(QGeoCoordinate& lastKnownHomePosition);
Don Gagne's avatar
Don Gagne committed
131

132
133
134
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
135

136
137
    /// 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
138

139
140
    /// 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
141

Don Gagne's avatar
Don Gagne committed
142
143
144
145
    void showFlyView(void);
    void showPlanView(void);
    void showSetupView(void);

146
    void qmlAttemptWindowClose(void);
Don Gagne's avatar
Don Gagne committed
147

148
#ifndef __mobile__
149
150
    /// Save the specified Flight Data Log
    void saveTempFlightDataLogOnMainThread(QString tempLogfile);
151
#endif
152

153
signals:
154
155
156
    /// Signals that the style has changed
    ///     @param darkStyle true: dark style, false: light style
    void styleChanged(bool darkStyle);
dogmaphobic's avatar
dogmaphobic committed
157

158
159
160
    /// 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
161

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

Don Gagne's avatar
Don Gagne committed
165
166
167
168
169
170
171
    /// @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
172

Don Gagne's avatar
Don Gagne committed
173
174
175
    /// @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
176
177
178
179
180

    void _showSetupFirmware(void);
    void _showSetupParameters(void);
    void _showSetupSummary(void);
    void _showSetupVehicleComponent(VehicleComponent* vehicleComponent);
dogmaphobic's avatar
dogmaphobic committed
181

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

Don Gagne's avatar
Don Gagne committed
184
private slots:
Don Gagne's avatar
Don Gagne committed
185
    void _missingParamsDisplay(void);
dogmaphobic's avatar
dogmaphobic committed
186

pixhawk's avatar
pixhawk committed
187
private:
188
    void _loadCurrentStyle(void);
Don Gagne's avatar
Don Gagne committed
189
190
191
192
193
    QObject* _rootQmlObject(void);

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

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

197
198
199
    static const char*  _darkStyleFile;
    static const char*  _lightStyleFile;
    bool                _styleIsDark;      ///< true: dark style, false: light style
dogmaphobic's avatar
dogmaphobic committed
200

Don Gagne's avatar
Don Gagne committed
201
202
203
    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
204

dogmaphobic's avatar
dogmaphobic committed
205
206
    bool				_fakeMobile;	///< true: Fake ui into displaying mobile interface

207
208
209
#ifdef QT_DEBUG
    bool _testHighDPI;  ///< true: double fonts sizes for simulating high dpi devices
#endif
210

211
212
    QGCToolbox* _toolbox;

dogmaphobic's avatar
dogmaphobic committed
213
214
    bool _bluetoothAvailable;

Don Gagne's avatar
Don Gagne committed
215
    QGeoCoordinate _lastKnownHomePosition;    ///< Map position when all other sources fail
Don Gagne's avatar
Don Gagne committed
216
217
218
219
220
221

    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
222
223
224
    static const char* _lastKnownHomePositionLatKey;
    static const char* _lastKnownHomePositionLonKey;
    static const char* _lastKnownHomePositionAltKey;
Don Gagne's avatar
Don Gagne committed
225

Don Gagne's avatar
Don Gagne committed
226
227
    /// Unit Test have access to creating and destroying singletons
    friend class UnitTest;
pixhawk's avatar
pixhawk committed
228
229
};

Don Gagne's avatar
Don Gagne committed
230
231
232
233
/// @brief Returns the QGCApplication object singleton.
QGCApplication* qgcApp(void);

#endif