MainWindow.h 13.1 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:
91 92

    enum CUSTOM_MODE {
93 94
        CUSTOM_MODE_UNCHANGED = 0,
        CUSTOM_MODE_NONE,
95 96 97 98
        CUSTOM_MODE_PX4,
        CUSTOM_MODE_WIFI
    };

Don Gagne's avatar
Don Gagne committed
99 100 101 102
    /// @brief Returns the MainWindow singleton. Will not create the MainWindow if it has not already
    ///         been created.
    static MainWindow* instance(void);
    
103 104 105
    /// @brief Deletes the MainWindow singleton
    void deleteInstance(void);
    
Don Gagne's avatar
Don Gagne committed
106 107 108 109 110
    /// @brief Creates the MainWindow singleton. Should only be called once by QGCApplication.
    static MainWindow* _create(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE mode);
    
    /// @brief Called to indicate that splash screen is no longer being displayed.
    void splashScreenFinished(void) { _splashScreen = NULL; }
111

112 113
    ~MainWindow();

114

115
    /** @brief Get auto link reconnect setting */
116
    bool autoReconnectEnabled() const
117 118 119 120 121
    {
        return autoReconnect;
    }

    /** @brief Get low power mode setting */
122
    bool lowPowerModeEnabled() const
123 124 125 126
    {
        return lowPowerMode;
    }

127
    void setCustomMode(MainWindow::CUSTOM_MODE mode)
128
    {
129 130 131 132
        if (mode != CUSTOM_MODE_UNCHANGED)
        {
            customMode = mode;
        }
133 134
    }

135
    MainWindow::CUSTOM_MODE getCustomMode() const
136 137 138 139
    {
        return customMode;
    }

140
    QList<QAction*> listLinkMenuActions();
141 142
    
    void hideSplashScreen(void);
143 144 145 146 147

public slots:
    /** @brief Show the application settings */
    void showSettings();
    /** @brief Add a communication link */
148
    LinkInterface* addLink();
149
    bool configLink(LinkInterface *link);
150 151
    /** @brief Simulate a link */
    void simulateLink(bool simulate);
152 153 154 155 156 157 158 159 160 161 162 163 164
    /** @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();

165
    void handleMisconfiguration(UASInterface* uas);
166
    /** @brief Load configuration views */
167
    void loadSetupView();
168 169
    /** @brief Load view for pilot */
    void loadPilotView();
170 171
    /** @brief Load view for simulation */
    void loadSimulationView();
172 173 174 175
    /** @brief Load view for engineer */
    void loadEngineerView();
    /** @brief Load view for operator */
    void loadOperatorView();
176 177
    /** @brief Load Terminal Console views */
    void loadTerminalView();
178 179 180 181
    /** @brief Load Google Earth View */
    void loadGoogleEarthView();
    /** @brief Load local 3D view */
    void loadLocal3DView();
182 183 184 185 186 187 188 189 190 191

    /** @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);
192

193 194 195 196 197 198 199 200
    /** @brief Save power by reducing update rates */
    void enableLowPowerMode(bool enabled) { lowPowerMode = enabled; }

    void closeEvent(QCloseEvent* event);

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

201
    void commsWidgetDestroyed(QObject *obj);
Don Gagne's avatar
Don Gagne committed
202
    
203
protected slots:
204 205 206 207 208 209 210 211 212 213 214 215
    /**
     * @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();
216

217
signals:
218
    void initStatusChanged(const QString& message, int alignment, const QColor &color);
John Tapsell's avatar
John Tapsell committed
219 220 221
    /** 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
222
#ifdef QGC_MOUSE_ENABLED_LINUX
223 224
    /** @brief Forward X11Event to catch 3DMouse inputs */
    void x11EventOccured(XEvent *event);
Don Gagne's avatar
Don Gagne committed
225
#endif //QGC_MOUSE_ENABLED_LINUX
226 227 228 229 230 231 232 233 234 235 236

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

protected:

    typedef enum _VIEW_SECTIONS
    {
237 238
        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
239 240
        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.
241 242 243
        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.
244
        VIEW_GOOGLEEARTH       // 3D Google Earth view. A 3D terrain view, though the vehicle is still 2D.
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
    } VIEW_SECTIONS;

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

    void connectCommonActions();

    void loadSettings();
    void storeSettings();


    LinkInterface* udpLink;

    QSettings settings;
    QActionGroup* centerStackActionGroup;

261
    // Center widgets
262
    QPointer<Linecharts> linechartWidget;
Don Gagne's avatar
Don Gagne committed
263 264 265 266 267 268 269
#ifdef QGC_OSG_ENABLED
    QPointer<QWidget> q3DWidget;
#endif
#ifdef QGC_GOOGLE_EARTH_ENABLED
	QPointer<QGCGoogleEarthView> earthWidget;
#endif
    QPointer<QGCFirmwareUpdate> firmwareUpdateWidget;
270 271 272 273 274 275 276 277

    QPointer<QGCToolBar> toolBar;

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

278 279
    QPointer<QGCUASFileViewMulti> fileWidget;

280
    JoystickInput* joystick; ///< The joystick manager for QGC
281

Don Gagne's avatar
Don Gagne committed
282
#ifdef QGC_MOUSE_ENABLED_WIN
283
    /** @brief 3d Mouse support (WIN only) */
284 285
    Mouse3DInput* mouseInput;               ///< 3dConnexion 3dMouse SDK
    Mouse6dofInput* mouse;                  ///< Implementation for 3dMouse input
Don Gagne's avatar
Don Gagne committed
286
#endif // QGC_MOUSE_ENABLED_WIN
287

Don Gagne's avatar
Don Gagne committed
288
#ifdef QGC_MOUSE_ENABLED_LINUX
289 290 291
    /** @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
292
#endif // QGC_MOUSE_ENABLED_LINUX
293

294 295 296 297 298 299 300 301 302 303 304 305 306 307
    /** 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;
308
    MAVLinkSimulationLink* simulationLink;
309 310 311
    bool lowPowerMode; ///< If enabled, QGC reduces the update rates of all widgets
    QGCFlightGearLink* fgLink;
    QTimer windowNameUpdateTimer;
312
    CUSTOM_MODE customMode;
Don Gagne's avatar
Don Gagne committed
313 314
    
private slots:
315
    void _addLinkMenu(LinkInterface* link);
316 317 318
    void _showDockWidgetAction(bool show);
    void _loadCustomWidgetFromFile(void);
    void _createNewCustomWidget(void);
319 320

private:
321
    /// Constructor is private since all creation should be through MainWindow::_create
Don Gagne's avatar
Don Gagne committed
322 323 324 325
    MainWindow(QSplashScreen* splashScreen, enum MainWindow::CUSTOM_MODE mode);
    
    void _openUrl(const QString& url, const QString& errorMessage);
    
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 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
    // 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;
    
385
    QList<QObject*> commsWidgetList;
386
    MenuActionHelper *menuActionHelper;
387 388 389 390
    Ui::MainWindow ui;

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

394
    friend class MenuActionHelper; //For VIEW_SECTIONS
395 396 397
};

#endif /* _MAINWINDOW_H_ */