QGCApplication.h 6.24 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
    /// @brief Sets the persistent flag to delete all settings the next time QGroundControl is started.
    void deleteAllSettingsNextBoot(void);
dogmaphobic's avatar
dogmaphobic committed
68

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

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

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

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

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

85
86
87
#ifdef QT_DEBUG
    bool testHighDPI(void) { return _testHighDPI; }
#endif
88
89
90

    // Still working on getting rid of this and using dependency injection instead for everything
    QGCToolbox* toolbox(void) { return _toolbox; }
dogmaphobic's avatar
dogmaphobic committed
91
92
93
94

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

95
96
97
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
98

99
100
    /// 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
101

102
103
    /// 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
104

Don Gagne's avatar
Don Gagne committed
105
106
    void showSetupView(void);

107
    void qmlAttemptWindowClose(void);
Don Gagne's avatar
Don Gagne committed
108

109
#ifndef __mobile__
110
111
112
113
114
    /// Save the specified telemetry Log
    void saveTelemetryLogOnMainThread(QString tempLogfile);

    /// Check that the telemetry save path is set correctly
    void checkTelemetrySavePathOnMainThread(void);
115
#endif
116

117
118
119
120
signals:
    /// 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
121

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

Don Gagne's avatar
Don Gagne committed
125
126
127
128
129
130
131
    /// @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
132

Don Gagne's avatar
Don Gagne committed
133
134
135
    /// @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
136

137
138
    void _loadCurrentStyleSheet(void);

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

Don Gagne's avatar
Don Gagne committed
141
142
143
144
145
146
public:
    // Although public, these methods are internal and should only be called by UnitTest code

    /// Shutdown the application object
    void _shutdown(void);

147
148
    bool _checkTelemetrySavePath(bool useMessageBox);

Don Gagne's avatar
Don Gagne committed
149
private slots:
Don Gagne's avatar
Don Gagne committed
150
    void _missingParamsDisplay(void);
dogmaphobic's avatar
dogmaphobic committed
151

pixhawk's avatar
pixhawk committed
152
private:
153
    QObject* _rootQmlObject(void);
Don Gagne's avatar
Don Gagne committed
154
155
156
157

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

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

161
162
    static const char*  _darkStyleFile;
    static const char*  _lightStyleFile;
163
164
165
166
167
    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
168

169
170
171
#ifdef QT_DEBUG
    bool _testHighDPI;  ///< true: double fonts sizes for simulating high dpi devices
#endif
172

173
174
    QGCToolbox* _toolbox;

dogmaphobic's avatar
dogmaphobic committed
175
176
    bool _bluetoothAvailable;

Don Gagne's avatar
Don Gagne committed
177
178
179
    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

Don Gagne's avatar
Don Gagne committed
180
181
    /// Unit Test have access to creating and destroying singletons
    friend class UnitTest;
Gus Grubba's avatar
Gus Grubba committed
182

pixhawk's avatar
pixhawk committed
183
184
};

Don Gagne's avatar
Don Gagne committed
185
186
187
188
/// @brief Returns the QGCApplication object singleton.
QGCApplication* qgcApp(void);

#endif