QGCApplication.h 8.65 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
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>
pixhawk's avatar
pixhawk committed
37

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

51
#ifdef QGC_RTLAB_ENABLED
52 53
#include "OpalLink.h"
#endif
54

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

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

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

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

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

Don Gagne's avatar
Don Gagne committed
86 87
    /// @brief Returns the location of user visible saved file associated with QGroundControl
    QString savedFilesLocation(void);
dogmaphobic's avatar
dogmaphobic committed
88

Don Gagne's avatar
Don Gagne committed
89 90
    /// @brief Sets the location of user visible saved file associated with QGroundControl
    void setSavedFilesLocation(QString& location);
dogmaphobic's avatar
dogmaphobic committed
91

Don Gagne's avatar
Don Gagne committed
92 93
    /// @brief Location to save and load parameter files from.
    QString savedParameterFilesLocation(void);
dogmaphobic's avatar
dogmaphobic committed
94

Don Gagne's avatar
Don Gagne committed
95 96
    /// @brief Location to save and load mavlink log files from
    QString mavlinkLogFilesLocation(void);
dogmaphobic's avatar
dogmaphobic committed
97

Don Gagne's avatar
Don Gagne committed
98 99
    /// @brief Validates that the specified location will work for the saved files location.
    bool validatePossibleSavedFilesLocation(QString& location);
dogmaphobic's avatar
dogmaphobic committed
100

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

104 105 106
    /// @return true: Prompt to save log file even if vehicle was not armed
    bool promptFlightDataSaveNotArmed(void);

Don Gagne's avatar
Don Gagne committed
107
    void setPromptFlightDataSave(bool promptForSave);
108
    void setPromptFlightDataSaveNotArmed(bool promptForSave);
109

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

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

116 117
    /// Set the current UI style
    void setStyle(bool styleIsDark);
dogmaphobic's avatar
dogmaphobic committed
118

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

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

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

129 130 131
#ifdef QT_DEBUG
    bool testHighDPI(void) { return _testHighDPI; }
#endif
132 133 134

    // Still working on getting rid of this and using dependency injection instead for everything
    QGCToolbox* toolbox(void) { return _toolbox; }
dogmaphobic's avatar
dogmaphobic committed
135 136 137 138

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

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

143 144
    /// 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
145

146 147
    /// 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
148

Don Gagne's avatar
Don Gagne committed
149 150 151 152 153 154
    void showFlyView(void);
    void showPlanView(void);
    void showSetupView(void);

    void showWindowCloseMessage(void);

155
#ifndef __mobile__
156 157
    /// Save the specified Flight Data Log
    void saveTempFlightDataLogOnMainThread(QString tempLogfile);
158
#endif
159

160
signals:
161 162 163
    /// Signals that the style has changed
    ///     @param darkStyle true: dark style, false: light style
    void styleChanged(bool darkStyle);
dogmaphobic's avatar
dogmaphobic committed
164

165 166 167
    /// 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
168

169
public:
170
    // Although public, these methods are internal and should only be called by UnitTest code
dogmaphobic's avatar
dogmaphobic committed
171

172 173 174 175 176 177 178
    /// @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
179

180 181 182
    /// @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
183 184 185 186 187

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

189
    static QGCApplication*  _app;   ///< Our own singleton. Should be reference directly by qgcApp
dogmaphobic's avatar
dogmaphobic committed
190

Don Gagne's avatar
Don Gagne committed
191
private slots:
Don Gagne's avatar
Don Gagne committed
192
    void _missingParamsDisplay(void);
dogmaphobic's avatar
dogmaphobic committed
193

pixhawk's avatar
pixhawk committed
194
private:
195
    void _loadCurrentStyle(void);
Don Gagne's avatar
Don Gagne committed
196 197 198 199 200
    QObject* _rootQmlObject(void);

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

Don Gagne's avatar
Don Gagne committed
202 203 204
    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* _savedFilesLocationKey;          ///< Settings key for user visible saved files location
205 206
    static const char* _promptFlightDataSave;           ///< Settings key for promptFlightDataSave
    static const char* _promptFlightDataSaveNotArmed;   ///< Settings key for promptFlightDataSaveNotArmed
207
    static const char* _styleKey;                       ///< Settings key for UI style
dogmaphobic's avatar
dogmaphobic committed
208

Don Gagne's avatar
Don Gagne committed
209 210 211
    static const char* _defaultSavedFileDirectoryName;      ///< Default name for user visible save file directory
    static const char* _savedFileMavlinkLogDirectoryName;   ///< Name of mavlink log subdirectory
    static const char* _savedFileParameterDirectoryName;    ///< Name of parameter subdirectory
212

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

215 216 217
    static const char*  _darkStyleFile;
    static const char*  _lightStyleFile;
    bool                _styleIsDark;      ///< true: dark style, false: light style
dogmaphobic's avatar
dogmaphobic committed
218

Don Gagne's avatar
Don Gagne committed
219 220 221
    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
222

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

225 226 227
#ifdef QT_DEBUG
    bool _testHighDPI;  ///< true: double fonts sizes for simulating high dpi devices
#endif
228

229 230
    QGCToolbox* _toolbox;

dogmaphobic's avatar
dogmaphobic committed
231 232
    bool _bluetoothAvailable;

Don Gagne's avatar
Don Gagne committed
233 234
    /// Unit Test have access to creating and destroying singletons
    friend class UnitTest;
pixhawk's avatar
pixhawk committed
235 236
};

Don Gagne's avatar
Don Gagne committed
237 238 239 240
/// @brief Returns the QGCApplication object singleton.
QGCApplication* qgcApp(void);

#endif