MainWindow.h 12.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*=====================================================================

QGroundControl Open Source Ground Control Station

(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

This file is part of the QGROUNDCONTROL project

    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.

    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.

    You should have received a copy of the GNU General Public License
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

======================================================================*/

/**
 * @file
 *   @brief Definition of class MainWindow
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */

#ifndef _MAINWINDOW_H_
#define _MAINWINDOW_H_
33
#include <QMainWindow>
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
#include <QStatusBar>
#include <QStackedWidget>
#include <QSettings>
#include <qlist.h>

#include "ui_MainWindow.h"
#include "LinkManager.h"
#include "LinkInterface.h"
#include "UASInterface.h"
#include "UASManager.h"
#include "UASControlWidget.h"
#include "UASInfoWidget.h"
#include "WaypointList.h"
#include "CameraView.h"
#include "UASListWidget.h"
#include "MAVLinkSimulationLink.h"
#include "input/JoystickInput.h"
Don Gagne's avatar
Don Gagne committed
51
#if (defined QGC_MOUSE_ENABLED_WIN) | (defined QGC_MOUSE_ENABLED_LINUX)
52
#include "Mouse6dofInput.h"
Don Gagne's avatar
Don Gagne committed
53
#endif // QGC_MOUSE_ENABLED_WIN
54 55 56
#include "DebugConsole.h"
#include "ParameterInterface.h"
#include "HDDisplay.h"
Don Gagne's avatar
Don Gagne committed
57 58 59 60 61 62
#include "HSIDisplay.h"
#include "opmapcontrol.h"
#ifdef QGC_GOOGLE_EARTH_ENABLED
#include "QGCGoogleEarthView.h"
#endif
#include "QGCToolBar.h"
63 64 65 66 67
#include "LogCompressor.h"

#include "QGCMAVLinkInspector.h"
#include "QGCMAVLinkLogPlayer.h"
#include "MAVLinkDecoder.h"
68
#include "QGCUASFileViewMulti.h"
Don Gagne's avatar
Don Gagne committed
69
#include "QGCFlightGearLink.h"
70
#include "QGCToolWidget.h"
71 72 73 74 75

class QGCMapTool;
class QGCMAVLinkMessageSender;
class QGCFirmwareUpdate;
class QSplashScreen;
76
class QGCStatusBar;
77 78
class Linecharts;
class QGCDataPlot2D;
79
class MenuActionHelper;
80
class QGCUASFileViewMulti;
81 82 83 84 85 86 87 88 89 90

/**
 * @brief Main Application Window
 *
 **/
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
Don Gagne's avatar
Don Gagne committed
91 92 93 94
    /// @brief Returns the MainWindow singleton. Will not create the MainWindow if it has not already
    ///         been created.
    static MainWindow* instance(void);
    
95 96 97
    /// @brief Deletes the MainWindow singleton
    void deleteInstance(void);
    
Don Gagne's avatar
Don Gagne committed
98
    /// @brief Creates the MainWindow singleton. Should only be called once by QGCApplication.
99
    static MainWindow* _create(QSplashScreen* splashScreen);
Don Gagne's avatar
Don Gagne committed
100 101 102
    
    /// @brief Called to indicate that splash screen is no longer being displayed.
    void splashScreenFinished(void) { _splashScreen = NULL; }
103

104 105
    ~MainWindow();

106

107
    /** @brief Get auto link reconnect setting */
108
    bool autoReconnectEnabled() const
109 110 111 112 113
    {
        return autoReconnect;
    }

    /** @brief Get low power mode setting */
114
    bool lowPowerModeEnabled() const
115 116 117 118
    {
        return lowPowerMode;
    }

119
    QList<QAction*> listLinkMenuActions();
120 121
    
    void hideSplashScreen(void);
122 123 124 125 126

public slots:
    /** @brief Show the application settings */
    void showSettings();
    /** @brief Add a communication link */
127
    LinkInterface* addLink();
128
    bool configLink(LinkInterface *link);
129 130
    /** @brief Simulate a link */
    void simulateLink(bool simulate);
131 132 133 134 135 136 137 138 139 140 141 142 143
    /** @brief Set the currently controlled UAS */
    void setActiveUAS(UASInterface* uas);

    /** @brief Add a new UAS */
    void UASCreated(UASInterface* uas);
    /** Delete an UAS */
    void UASDeleted(UASInterface* uas);
    /** @brief Update system specs of a UAS */
    void UASSpecsChanged(int uas);
    void startVideoCapture();
    void stopVideoCapture();
    void saveScreen();

144
    void handleMisconfiguration(UASInterface* uas);
145
    /** @brief Load configuration views */
146
    void loadSetupView();
147 148
    /** @brief Load view for pilot */
    void loadPilotView();
149 150
    /** @brief Load view for simulation */
    void loadSimulationView();
151 152 153 154
    /** @brief Load view for engineer */
    void loadEngineerView();
    /** @brief Load view for operator */
    void loadOperatorView();
155 156
    /** @brief Load Terminal Console views */
    void loadTerminalView();
157 158 159 160
    /** @brief Load Google Earth View */
    void loadGoogleEarthView();
    /** @brief Load local 3D view */
    void loadLocal3DView();
161 162 163 164 165 166 167 168 169 170

    /** @brief Show the online help for users */
    void showHelp();
    /** @brief Show the authors / credits */
    void showCredits();
    /** @brief Show the project roadmap */
    void showRoadMap();

    /** @brief Automatically reconnect last link */
    void enableAutoReconnect(bool enabled);
171

172 173 174 175 176 177 178 179
    /** @brief Save power by reducing update rates */
    void enableLowPowerMode(bool enabled) { lowPowerMode = enabled; }

    void closeEvent(QCloseEvent* event);

    /** @brief Update the window name */
    void configureWindowName();

180
    void commsWidgetDestroyed(QObject *obj);
Don Gagne's avatar
Don Gagne committed
181
    
182
protected slots:
183 184 185 186 187 188 189 190 191 192 193 194
    /**
     * @brief Unchecks the normalActionItem.
     * Used as a triggered() callback by the fullScreenAction to make sure only one of it or the
     * normalAction are checked at a time, as they're mutually exclusive.
     */
    void fullScreenActionItemCallback();
    /**
     * @brief Unchecks the fullScreenActionItem.
     * Used as a triggered() callback by the normalAction to make sure only one of it or the
     * fullScreenAction are checked at a time, as they're mutually exclusive.
     */
    void normalActionItemCallback();
195

196
signals:
197
    void initStatusChanged(const QString& message, int alignment, const QColor &color);
John Tapsell's avatar
John Tapsell committed
198 199 200
    /** Emitted when any value changes from any source */
    void valueChanged(const int uasId, const QString& name, const QString& unit, const QVariant& value, const quint64 msec);

Don Gagne's avatar
Don Gagne committed
201
#ifdef QGC_MOUSE_ENABLED_LINUX
202 203
    /** @brief Forward X11Event to catch 3DMouse inputs */
    void x11EventOccured(XEvent *event);
Don Gagne's avatar
Don Gagne committed
204
#endif //QGC_MOUSE_ENABLED_LINUX
205 206 207 208 209 210 211 212 213 214 215

public:
    QGCMAVLinkLogPlayer* getLogPlayer()
    {
        return logPlayer;
    }

protected:

    typedef enum _VIEW_SECTIONS
    {
216 217
        VIEW_ENGINEER,         // Engineering/Analyze view mode. Used for analyzing data and modifying onboard parameters
        VIEW_MISSION,          // Mission/Map/Plan view mode. Used for setting mission waypoints and high-level system commands.
Bryant's avatar
Bryant committed
218 219
        VIEW_FLIGHT,           // Flight/Fly/Operate view mode. Used for 1st-person observation of the vehicle.
        VIEW_SIMULATION,       // HIL Simulation view. Useful overview of the entire system when doing hardware-in-the-loop simulations.
220 221 222
        VIEW_SETUP,            // Setup view. Used for initializing the system for operation. Includes UI for calibration, firmware updating/checking, and parameter modifcation.
        VIEW_TERMINAL,         // Terminal interface. Used for communicating with the remote system, usually in a special configuration input mode.
        VIEW_LOCAL3D,          // A local 3D view. Provides a local 3D view that makes visualizing 3D attitude/orientation/pose easy while in operation.
223
        VIEW_GOOGLEEARTH       // 3D Google Earth view. A 3D terrain view, though the vehicle is still 2D.
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
    } VIEW_SECTIONS;

    /** @brief Catch window resize events */
    void resizeEvent(QResizeEvent * event);

    void connectCommonActions();

    void loadSettings();
    void storeSettings();


    LinkInterface* udpLink;

    QSettings settings;
    QActionGroup* centerStackActionGroup;

240
    // Center widgets
241
    QPointer<Linecharts> linechartWidget;
Don Gagne's avatar
Don Gagne committed
242 243 244 245 246 247 248
#ifdef QGC_OSG_ENABLED
    QPointer<QWidget> q3DWidget;
#endif
#ifdef QGC_GOOGLE_EARTH_ENABLED
	QPointer<QGCGoogleEarthView> earthWidget;
#endif
    QPointer<QGCFirmwareUpdate> firmwareUpdateWidget;
249 250 251 252 253 254 255 256

    QPointer<QGCToolBar> toolBar;

    QPointer<QDockWidget> mavlinkInspectorWidget;
    QPointer<MAVLinkDecoder> mavlinkDecoder;
    QPointer<QDockWidget> mavlinkSenderWidget;
    QGCMAVLinkLogPlayer* logPlayer;

257 258
    QPointer<QGCUASFileViewMulti> fileWidget;

259
    JoystickInput* joystick; ///< The joystick manager for QGC
260

Don Gagne's avatar
Don Gagne committed
261
#ifdef QGC_MOUSE_ENABLED_WIN
262
    /** @brief 3d Mouse support (WIN only) */
263 264
    Mouse3DInput* mouseInput;               ///< 3dConnexion 3dMouse SDK
    Mouse6dofInput* mouse;                  ///< Implementation for 3dMouse input
Don Gagne's avatar
Don Gagne committed
265
#endif // QGC_MOUSE_ENABLED_WIN
266

Don Gagne's avatar
Don Gagne committed
267
#ifdef QGC_MOUSE_ENABLED_LINUX
268 269 270
    /** @brief Reimplementation of X11Event to handle 3dMouse Events (magellan) */
    bool x11Event(XEvent *event);
    Mouse6dofInput* mouse;                  ///< Implementation for 3dMouse input
Don Gagne's avatar
Don Gagne committed
271
#endif // QGC_MOUSE_ENABLED_LINUX
272

273 274 275 276 277 278 279 280 281 282 283 284 285 286
    /** User interface actions **/
    QAction* connectUASAct;
    QAction* disconnectUASAct;
    QAction* startUASAct;
    QAction* returnUASAct;
    QAction* stopUASAct;
    QAction* killUASAct;
    QAction* simulateUASAct;


    LogCompressor* comp;
    QString screenFileName;
    QTimer* videoTimer;
    bool autoReconnect;
287
    MAVLinkSimulationLink* simulationLink;
288 289 290
    bool lowPowerMode; ///< If enabled, QGC reduces the update rates of all widgets
    QGCFlightGearLink* fgLink;
    QTimer windowNameUpdateTimer;
Don Gagne's avatar
Don Gagne committed
291 292
    
private slots:
293
    void _addLinkMenu(LinkInterface* link);
294 295 296
    void _showDockWidgetAction(bool show);
    void _loadCustomWidgetFromFile(void);
    void _createNewCustomWidget(void);
297 298 299 300
#ifdef UNITTEST_BUILD
    void _showQmlTestWidget(void);
#endif
    
301
private:
302
    /// Constructor is private since all creation should be through MainWindow::_create
303
    MainWindow(QSplashScreen* splashScreen);
Don Gagne's avatar
Don Gagne committed
304 305 306
    
    void _openUrl(const QString& url, const QString& errorMessage);
    
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
    // Center widgets
    QPointer<QWidget> _plannerView;
    QPointer<QWidget> _pilotView;
    QPointer<QWidget> _setupView;
    QPointer<QWidget> _engineeringView;
    QPointer<QWidget> _simView;
    QPointer<QWidget> _terminalView;
    QPointer<QWidget> _googleEarthView;
    QPointer<QWidget> _local3DView;
    
    VIEW_SECTIONS   _currentView;       ///< Currently displayed view
    QWidget*        _currentViewWidget; ///< Currently displayed view widget
    
    // Dock widget names
    static const char* _uasControlDockWidgetName;
    static const char* _uasListDockWidgetName;
    static const char* _waypointsDockWidgetName;
    static const char* _mavlinkDockWidgetName;
    static const char* _parametersDockWidgetName;
    static const char* _filesDockWidgetName;
    static const char* _uasStatusDetailsDockWidgetName;
    static const char* _mapViewDockWidgetName;
    static const char* _hsiDockWidgetName;
    static const char* _hdd1DockWidgetName;
    static const char* _hdd2DockWidgetName;
    static const char* _pfdDockWidgetName;
    static const char* _hudDockWidgetName;
    static const char* _uasInfoViewDockWidgetName;
    static const char* _debugConsoleDockWidgetName;
    
    QMap<QString, QDockWidget*>     _mapName2DockWidget;
    QMap<int, QDockWidget*>         _mapUasId2HilDockWidget;
    QMap<QDockWidget*, QAction*>    _mapDockWidget2Action;
    
    void _buildPlannerView(void);
    void _buildPilotView(void);
    void _buildSetupView(void);
    void _buildEngineeringView(void);
    void _buildSimView(void);
    void _buildTerminalView(void);
    void _buildGoogleEarthView(void);
    void _buildLocal3DView(void);
    
    void _storeCurrentViewState(void);
    void _loadCurrentViewState(void);
    
    void _createDockWidget(const QString& title, const QString& name, Qt::DockWidgetArea area, QWidget* innerWidget);
    void _createInnerDockWidget(const QString& widgetName);
    void _buildCustomWidgets(void);
    void _buildCommonWidgets(void);
    void _hideAllHilDockWidgets(void);
    void _hideAllDockWidgets(void);
    void _showDockWidget(const QString &name, bool show);
    void _showHILConfigurationWidgets(void);
    
    QList<QGCToolWidget*> _customWidgets;
    
    QVBoxLayout* _centralLayout;
    
366
    QList<QObject*> commsWidgetList;
367
    MenuActionHelper *menuActionHelper;
368 369 370 371
    Ui::MainWindow ui;

    QString getWindowStateKey();
    QString getWindowGeometryKey();
Don Gagne's avatar
Don Gagne committed
372 373
    
    QSplashScreen* _splashScreen;   ///< Splash screen, NULL is splash screen not currently being shown
374

375
    friend class MenuActionHelper; //For VIEW_SECTIONS
376 377 378
};

#endif /* _MAINWINDOW_H_ */