MainWindow.h 11.8 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2
/*=====================================================================

3
QGroundControl Open Source Ground Control Station
pixhawk's avatar
pixhawk committed
4

5
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
pixhawk's avatar
pixhawk committed
6

7
This file is part of the QGROUNDCONTROL project
pixhawk's avatar
pixhawk committed
8

9
    QGROUNDCONTROL is free software: you can redistribute it and/or modify
pixhawk's avatar
pixhawk committed
10 11 12 13
    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.

14
    QGROUNDCONTROL is distributed in the hope that it will be useful,
pixhawk's avatar
pixhawk committed
15 16 17 18 19
    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
20
    along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
pixhawk's avatar
pixhawk committed
21 22 23 24 25

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

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

#ifndef _MAINWINDOW_H_
#define _MAINWINDOW_H_

#include <QtGui/QMainWindow>
#include <QStatusBar>
#include <QStackedWidget>
37
#include <QSettings>
oberion's avatar
oberion committed
38
#include <qlist.h>
pixhawk's avatar
pixhawk committed
39 40 41 42 43 44 45

#include "ui_MainWindow.h"
#include "LinkManager.h"
#include "LinkInterface.h"
#include "UASInterface.h"
#include "UASManager.h"
#include "UASControlWidget.h"
46
#include "Linecharts.h"
pixhawk's avatar
pixhawk committed
47 48 49 50 51
#include "UASInfoWidget.h"
#include "WaypointList.h"
#include "CameraView.h"
#include "UASListWidget.h"
#include "MAVLinkProtocol.h"
52
#include "MAVLinkSimulationLink.h"
pixhawk's avatar
pixhawk committed
53 54 55 56 57 58 59 60
#include "ObjectDetectionView.h"
#include "HUD.h"
#include "JoystickWidget.h"
#include "input/JoystickInput.h"
#include "DebugConsole.h"
#include "ParameterInterface.h"
#include "XMLCommProtocolWidget.h"
#include "HDDisplay.h"
61
#include "WatchdogControl.h"
62
#include "HSIDisplay.h"
63
#include "QGCDataPlot2D.h"
lm's avatar
lm committed
64
#include "QGCRemoteControlView.h"
lm's avatar
lm committed
65
#include "opmapcontrol.h"
66
#if (defined Q_OS_MAC) | (defined _MSC_VER)
pixhawk's avatar
pixhawk committed
67
#include "QGCGoogleEarthView.h"
68
#endif
69
#include "QGCToolBar.h"
70
#include "SlugsDataSensorView.h"
pixhawk's avatar
pixhawk committed
71
#include "LogCompressor.h"
72

73
#include "SlugsHilSim.h"
pixhawk's avatar
pixhawk committed
74

75
#include "SlugsPadCameraControl.h"
76
#include "UASControlParameters.h"
lm's avatar
lm committed
77
#include "QGCMAVLinkInspector.h"
lm's avatar
lm committed
78
#include "QGCMAVLinkLogPlayer.h"
lm's avatar
lm committed
79 80
#include "MAVLinkDecoder.h"

81
class QGCMapTool;
Lorenz Meier's avatar
Lorenz Meier committed
82 83
class QGCMAVLinkMessageSender;
class QGCFirmwareUpdate;
lm's avatar
lm committed
84
class QSplashScreen;
85

pixhawk's avatar
pixhawk committed
86 87 88 89
/**
 * @brief Main Application Window
 *
 **/
90 91
class MainWindow : public QMainWindow
{
pixhawk's avatar
pixhawk committed
92 93 94
    Q_OBJECT

public:
lm's avatar
lm committed
95
    static MainWindow* instance(QSplashScreen* screen = 0);
pixhawk's avatar
pixhawk committed
96
    ~MainWindow();
pixhawk's avatar
pixhawk committed
97

Lorenz Meier's avatar
Lorenz Meier committed
98 99
    enum QGC_MAINWINDOW_STYLE
    {
100 101 102 103 104 105
        QGC_MAINWINDOW_STYLE_NATIVE,
        QGC_MAINWINDOW_STYLE_INDOOR,
        QGC_MAINWINDOW_STYLE_OUTDOOR
    };

    /** @brief Get current visual style */
Lorenz Meier's avatar
Lorenz Meier committed
106 107
    int getStyle()
    {
108 109
        return currentStyle;
    }
110
    /** @brief Get auto link reconnect setting */
Lorenz Meier's avatar
Lorenz Meier committed
111 112
    bool autoReconnectEnabled()
    {
113 114
        return autoReconnect;
    }
115

116
    /** @brief Get low power mode setting */
Lorenz Meier's avatar
Lorenz Meier committed
117 118
    bool lowPowerModeEnabled()
    {
119 120 121
        return lowPowerMode;
    }

lm's avatar
lm committed
122 123
    QList<QAction*> listLinkMenuActions(void);

pixhawk's avatar
pixhawk committed
124
public slots:
125

126
    /** @brief Shows a status message on the bottom status bar */
pixhawk's avatar
pixhawk committed
127
    void showStatusMessage(const QString& status, int timeout);
128
    /** @brief Shows a status message on the bottom status bar */
129
    void showStatusMessage(const QString& status);
130 131
    /** @brief Shows a critical message as popup or as widget */
    void showCriticalMessage(const QString& title, const QString& message);
lm's avatar
lm committed
132 133
    /** @brief Shows an info message as popup or as widget */
    void showInfoMessage(const QString& title, const QString& message);
134

135 136 137
    /** @brief Show the application settings */
    void showSettings();
    /** @brief Add a communication link */
pixhawk's avatar
pixhawk committed
138
    void addLink();
pixhawk's avatar
pixhawk committed
139
    void addLink(LinkInterface* link);
pixhawk's avatar
pixhawk committed
140
    void configure();
141 142
    /** @brief Set the currently controlled UAS */
    void setActiveUAS(UASInterface* uas);
Alejandro's avatar
Alejandro committed
143

144
    /** @brief Add a new UAS */
pixhawk's avatar
pixhawk committed
145
    void UASCreated(UASInterface* uas);
146 147
    /** @brief Update system specs of a UAS */
    void UASSpecsChanged(int uas);
pixhawk's avatar
pixhawk committed
148 149 150
    void startVideoCapture();
    void stopVideoCapture();
    void saveScreen();
pixhawk's avatar
pixhawk committed
151

152 153
    /** @brief Load default view when no MAV is connected */
    void loadUnconnectedView();
pixhawk's avatar
pixhawk committed
154 155 156 157 158 159
    /** @brief Load view for pilot */
    void loadPilotView();
    /** @brief Load view for engineer */
    void loadEngineerView();
    /** @brief Load view for operator */
    void loadOperatorView();
160 161
    /** @brief Load MAVLink XML generator view */
    void loadMAVLinkView();
Lorenz Meier's avatar
Lorenz Meier committed
162 163
    /** @brief Load firmware update view */
    void loadFirmwareUpdateView();
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();
pixhawk's avatar
pixhawk committed
171

172
    /** @brief Reload the CSS style sheet */
pixhawk's avatar
pixhawk committed
173
    void reloadStylesheet();
174 175
    /** @brief Let the user select the CSS style sheet */
    void selectStylesheet();
176 177
    /** @brief Automatically reconnect last link */
    void enableAutoReconnect(bool enabled);
178 179
    /** @brief Save power by reducing update rates */
    void enableLowPowerMode(bool enabled) { lowPowerMode = enabled; }
180 181 182 183 184 185 186 187
    /** @brief Switch to native application style */
    void loadNativeStyle();
    /** @brief Switch to indoor mission style */
    void loadIndoorStyle();
    /** @brief Switch to outdoor mission style */
    void loadOutdoorStyle();
    /** @brief Load a specific style */
    void loadStyle(QGC_MAINWINDOW_STYLE style);
188

189 190 191
    /** @brief Add a custom tool widget */
    void createCustomWidget();

LM's avatar
LM committed
192
    /** @brief Load a custom tool widget from a file chosen by user (QFileDialog) */
193 194
    void loadCustomWidget();

LM's avatar
LM committed
195 196 197 198 199 200
    /** @brief Load a custom tool widget from a file */
    void loadCustomWidget(const QString& fileName, bool singleinstance=false);

    /** @brief Load custom widgets from default file */
    void loadCustomWidgetsFromDefaults(const QString& systemType, const QString& autopilotType);

201 202
    void closeEvent(QCloseEvent* event);

203 204 205 206 207 208
    /** @brief Load data view, allowing to plot flight data */
    void loadDataView(QString fileName);

    /**
     * @brief Shows a Docked Widget based on the action sender
     *
209
     * This slot is written to be used in conjunction with the addTool() function
210 211 212
     * It shows the QDockedWidget based on the action sender
     *
     */
213
    void showTool(bool visible);
214 215 216 217

    /**
     * @brief Shows a Widget from the center stack based on the action sender
     *
218
     * This slot is written to be used in conjunction with the addCentralWidget() function
219 220 221
     * It shows the Widget based on the action sender
     *
     */
222
    void showCentralWidget();
223

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

lm's avatar
lm committed
227 228 229
signals:
    void initStatusChanged(const QString& message);

lm's avatar
lm committed
230 231 232 233 234 235 236 237 238 239 240
public:
    QGCMAVLinkLogPlayer* getLogPlayer()
    {
        return logPlayer;
    }

    MAVLinkProtocol* getMAVLink()
    {
        return mavlink;
    }

pixhawk's avatar
pixhawk committed
241
protected:
242

243 244
    MainWindow(QWidget *parent = 0);

lm's avatar
lm committed
245 246
    typedef enum _VIEW_SECTIONS
    {
247 248 249 250
        VIEW_ENGINEER,
        VIEW_OPERATOR,
        VIEW_PILOT,
        VIEW_MAVLINK,
Lorenz Meier's avatar
Lorenz Meier committed
251
        VIEW_FIRMWAREUPDATE,
252
        VIEW_UNCONNECTED,    ///< View in unconnected mode, when no UAS is available
253
        VIEW_FULL            ///< All widgets shown at once
254 255
    } VIEW_SECTIONS;

256 257 258 259 260 261 262
    /**
     * @brief Adds an already instantiated QDockedWidget to the Tools Menu
     *
     * This function does all the hosekeeping to have a QDockedWidget added to the
     * tools menu and connects the QMenuAction to a slot that shows the widget and
     * checks/unchecks the tools menu item
     *
263
     * @param widget    The QDockWidget being added
264 265 266
     * @param title     The entry that will appear in the Menu and in the QDockedWidget title bar
     * @param location  The default location for the QDockedWidget in case there is no previous key in the settings
     */
267
    void addTool(QDockWidget* widget, const QString& title, Qt::DockWidgetArea location=Qt::RightDockWidgetArea);
268 269 270 271 272 273 274 275 276 277 278 279

    /**
     * @brief Adds an already instantiated QWidget to the center stack
     *
     * This function does all the hosekeeping to have a QWidget added to the tools menu
     * tools menu and connects the QMenuAction to a slot that shows the widget and
     * checks/unchecks the tools menu item. This is used for all the central widgets (those in
     * the center stack.
     *
     * @param widget        The QWidget being added
     * @param title         The entry that will appear in the Menu
     */
280
    void addCentralWidget(QWidget* widget, const QString& title);
281

lm's avatar
lm committed
282 283
    /** @brief Catch window resize events */
    void resizeEvent(QResizeEvent * event);
284 285

    /** @brief Keeps track of the current view */
286
    VIEW_SECTIONS currentView;
287
    QGC_MAINWINDOW_STYLE currentStyle;
288
    bool aboutToCloseFlag;
289
    bool changingViewsFlag;
290

291 292
    void storeViewState();
    void loadViewState();
293

lm's avatar
lm committed
294
    void buildCustomWidget();
295 296 297
    void buildCommonWidgets();
    void connectCommonWidgets();
    void connectCommonActions();
298
	void connectSenseSoarActions();
299

300 301
    void loadSettings();
    void storeSettings();
pixhawk's avatar
pixhawk committed
302 303 304 305

    // TODO Should be moved elsewhere, as the protocol does not belong to the UI
    MAVLinkProtocol* mavlink;

306
    MAVLinkSimulationLink* simulationLink;
pixhawk's avatar
pixhawk committed
307 308
    LinkInterface* udpLink;

309
    QSettings settings;
310
    QStackedWidget *centerStack;
311
    QActionGroup* centerStackActionGroup;
312

313 314 315
    // Center widgets
    QPointer<Linecharts> linechartWidget;
    QPointer<HUD> hudWidget;
316
    QPointer<QGCMapTool> mapWidget;
317 318
    QPointer<XMLCommProtocolWidget> protocolWidget;
    QPointer<QGCDataPlot2D> dataplotWidget;
319
#ifdef QGC_OSG_ENABLED
320
    QPointer<QWidget> _3DWidget;
321
#endif
322
#if (defined _MSC_VER) || (defined Q_OS_MAC)
pixhawk's avatar
pixhawk committed
323
    QPointer<QGCGoogleEarthView> gEarthWidget;
324
#endif
Lorenz Meier's avatar
Lorenz Meier committed
325
    QPointer<QGCFirmwareUpdate> firmwareUpdateWidget;
LM's avatar
LM committed
326

327 328
    // Dock widgets
    QPointer<QDockWidget> controlDockWidget;
329
    QPointer<QDockWidget> controlParameterWidget;
330 331 332 333 334 335 336 337 338 339
    QPointer<QDockWidget> infoDockWidget;
    QPointer<QDockWidget> cameraDockWidget;
    QPointer<QDockWidget> listDockWidget;
    QPointer<QDockWidget> waypointsDockWidget;
    QPointer<QDockWidget> detectionDockWidget;
    QPointer<QDockWidget> debugConsoleDockWidget;
    QPointer<QDockWidget> parametersDockWidget;
    QPointer<QDockWidget> headDown1DockWidget;
    QPointer<QDockWidget> headDown2DockWidget;
    QPointer<QDockWidget> watchdogControlDockWidget;
340

341
    QPointer<QDockWidget> headUpDockWidget;
pixhawk's avatar
pixhawk committed
342 343
    QPointer<QDockWidget> video1DockWidget;
    QPointer<QDockWidget> video2DockWidget;
344 345
    QPointer<QDockWidget> rgbd1DockWidget;
    QPointer<QDockWidget> rgbd2DockWidget;
346
    QPointer<QDockWidget> logPlayerDockWidget;
347

348 349
    QPointer<QDockWidget> hsiDockWidget;
    QPointer<QDockWidget> rcViewDockWidget;
350
    QPointer<QDockWidget> hudDockWidget;
351
    QPointer<QDockWidget> slugsDataWidget;
352
    QPointer<QDockWidget> slugsHilSimWidget;
353
    QPointer<QDockWidget> slugsCamControlWidget;
pixhawk's avatar
pixhawk committed
354

355 356
    QPointer<QGCToolBar> toolBar;

lm's avatar
lm committed
357
    QPointer<QDockWidget> mavlinkInspectorWidget;
lm's avatar
lm committed
358
    QPointer<MAVLinkDecoder> mavlinkDecoder;
Lorenz Meier's avatar
Lorenz Meier committed
359
    QPointer<QDockWidget> mavlinkSenderWidget;
lm's avatar
lm committed
360
    QGCMAVLinkLogPlayer* logPlayer;
pixhawk's avatar
pixhawk committed
361

362 363 364 365 366 367 368 369 370 371 372 373 374
    // Popup widgets
    JoystickWidget* joystickWidget;

    JoystickInput* joystick;

    /** User interface actions **/
    QAction* connectUASAct;
    QAction* disconnectUASAct;
    QAction* startUASAct;
    QAction* returnUASAct;
    QAction* stopUASAct;
    QAction* killUASAct;
    QAction* simulateUASAct;
375

376

pixhawk's avatar
pixhawk committed
377
    LogCompressor* comp;
pixhawk's avatar
pixhawk committed
378 379
    QString screenFileName;
    QTimer* videoTimer;
380
    QString styleFileName;
381
    bool autoReconnect;
382
    Qt::WindowStates windowStateVal;
383
    bool lowPowerMode; ///< If enabled, QGC reduces the update rates of all widgets
lm's avatar
lm committed
384
    QGCFlightGearLink* fgLink;
385
    QTimer windowNameUpdateTimer;
pixhawk's avatar
pixhawk committed
386 387

private:
pixhawk's avatar
pixhawk committed
388
    Ui::MainWindow ui;
389

390 391
    QString getWindowStateKey();
    QString getWindowGeometryKey();
392

pixhawk's avatar
pixhawk committed
393 394 395
};

#endif /* _MAINWINDOW_H_ */