Skip to content
Snippets Groups Projects
MainWindow.cc 45.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •         msgBox.exec();
        }
    }
    
    void MainWindow::showRoadMap()
    {
        if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/roadmap")))
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Critical);
            msgBox.setText("Could not open roadmap in browser");
            msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/roadmap in a browser.");
            msgBox.setStandardButtons(QMessageBox::Ok);
            msgBox.setDefaultButton(QMessageBox::Ok);
            msgBox.exec();
        }
    }
    
    
    pixhawk's avatar
    pixhawk committed
    void MainWindow::configure()
    
    pixhawk's avatar
    pixhawk committed
    {
        joystickWidget = new JoystickWidget(joystick, this);
    }
    
    
    pixhawk's avatar
    pixhawk committed
    void MainWindow::addLink()
    
    pixhawk's avatar
    pixhawk committed
    {
        SerialLink* link = new SerialLink();
        // TODO This should be only done in the dialog itself
    
        LinkManager::instance()->addProtocol(link, mavlink);
    
        CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this);
    
        ui.menuNetwork->addAction(commWidget->getAction());
    
        commWidget->show();
    }
    
    
    pixhawk's avatar
    pixhawk committed
    void MainWindow::addLink(LinkInterface *link)
    {
    
        LinkManager::instance()->addProtocol(link, mavlink);
    
    pixhawk's avatar
    pixhawk committed
        CommConfigurationWindow* commWidget = new CommConfigurationWindow(link, mavlink, this);
        ui.menuNetwork->addAction(commWidget->getAction());
    
        // Special case for simulationlink
        MAVLinkSimulationLink* sim = dynamic_cast<MAVLinkSimulationLink*>(link);
        if (sim)
        {
    
            //connect(sim, SIGNAL(valueChanged(int,QString,double,quint64)), linechart, SLOT(appendData(int,QString,double,quint64)));
    
    pixhawk's avatar
    pixhawk committed
            connect(ui.actionSimulate, SIGNAL(triggered(bool)), sim, SLOT(connectLink(bool)));
        }
    }
    
    
    pixhawk's avatar
    pixhawk committed
    void MainWindow::UASCreated(UASInterface* uas)
    
    pixhawk's avatar
    pixhawk committed
    {
        // Connect the UAS to the full user interface
    
    
        if (uas != NULL)
        {
            QIcon icon;
            // Set matching icon
            switch (uas->getSystemType())
            {
            case 0:
                icon = QIcon(":/images/mavs/generic.svg");
                break;
            case 1:
                icon = QIcon(":/images/mavs/fixed-wing.svg");
                break;
            case 2:
                icon = QIcon(":/images/mavs/quadrotor.svg");
                break;
            case 3:
                icon = QIcon(":/images/mavs/coaxial.svg");
                break;
            case 4:
                icon = QIcon(":/images/mavs/helicopter.svg");
                break;
            case 5:
                icon = QIcon(":/images/mavs/groundstation.svg");
                break;
            default:
                icon = QIcon(":/images/mavs/unknown.svg");
                break;
            }
    
            ui.menuConnected_Systems->addAction(icon, tr("Select %1 for control").arg(uas->getUASName()), uas, SLOT(setSelected()));
    
            // FIXME Should be not inside the mainwindow
    
            if (debugConsoleDockWidget)
            {
    
    pixhawk's avatar
    pixhawk committed
                DebugConsole *debugConsole = dynamic_cast<DebugConsole*>(debugConsoleDockWidget->widget());
                if (debugConsole)
                {
                    connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)),
                            debugConsole, SLOT(receiveTextMessage(int,int,int,QString)));
                }
    
    
            // Health / System status indicator
    
    pixhawk's avatar
    pixhawk committed
                UASInfoWidget *infoWidget = dynamic_cast<UASInfoWidget*>(infoDockWidget->widget());
                if (infoWidget)
                {
                    infoWidget->addUAS(uas);
                }
    
    pixhawk's avatar
    pixhawk committed
                UASListWidget *listWidget = dynamic_cast<UASListWidget*>(listDockWidget->widget());
                if (listWidget)
                {
                    listWidget->addUAS(uas);
                }
    
    
            // Camera view
            //camera->addUAS(uas);
    
            // Revalidate UI
            // TODO Stylesheet reloading should in theory not be necessary
            reloadStylesheet();
    
    
            switch (uas->getAutopilotType())
            {
            case (MAV_AUTOPILOT_SLUGS):
                {
                    // Build Slugs Widgets
                    buildSlugsWidgets();
    
                    // Connect Slugs Widgets
                    connectSlugsWidgets();
    
                    // Arrange Slugs Centerstack
                    arrangeSlugsCenterStack();
    
                    // Connect Slugs Actions
                    connectSlugsActions();
    
                    // FIXME: This type checking might be redundant
                    //            if (slugsDataWidget) {
                    //              SlugsDataSensorView* dataWidget = dynamic_cast<SlugsDataSensorView*>(slugsDataWidget->widget());
                    //              if (dataWidget) {
                    //                SlugsMAV* mav2 = dynamic_cast<SlugsMAV*>(uas);
                    //                if (mav2) {
                    (dynamic_cast<SlugsDataSensorView*>(slugsDataWidget->widget()))->addUAS(uas);
                    //                  //loadSlugsView();
                    //                  loadGlobalOperatorView();
                    //                }
                    //              }
                    //            }
                }
                break;
            default:
            case (MAV_AUTOPILOT_GENERIC):
            case (MAV_AUTOPILOT_ARDUPILOTMEGA):
            case (MAV_AUTOPILOT_PIXHAWK):
                {
                    // Build Pixhawk Widgets
                    buildPxWidgets();
    
                    // Connect Pixhawk Widgets
                    connectPxWidgets();
    
                    // Arrange Pixhawk Centerstack
                    arrangePxCenterStack();
    
                    // Connect Pixhawk Actions
                    connectPxActions();
    
                }
                break;
    
            }
    
            // Change the view only if this is the first UAS
    
            // If this is the first connected UAS, it is both created as well as
            // the currently active UAS
            if (UASManager::instance()->getActiveUAS() == uas)
            {
                qDebug() << "UPDATING THE VIEW SINCE THIS IS THE FIRST CONNECTED SYSTEM";
    
                // Load last view if setting is present
                if (settings.contains("VIEW_ON_APPLICATION_CLOSE"))
                {
                    int view = settings.value("VIEW_ON_APPLICATION_CLOSE").toInt();
                    currentView = (VIEW_SECTIONS) view;
                    presentView();
                }
                else
                {
                    loadEngineerView();
                }
    
    pixhawk's avatar
    pixhawk committed
    }
    
    
    /**
     * Clears the current view completely
     */
    
    pixhawk's avatar
    pixhawk committed
    void MainWindow::clearView()
    
        // Remove all dock widgets from main window
        QObjectList childList( this->children() );
    
    pixhawk's avatar
    pixhawk committed
    
    
        QObjectList::iterator i;
        QDockWidget* dockWidget;
        for (i = childList.begin(); i != childList.end(); ++i)
    
    pixhawk's avatar
    pixhawk committed
        {
    
            dockWidget = dynamic_cast<QDockWidget*>(*i);
            if (dockWidget)
    
    pixhawk's avatar
    pixhawk committed
            {
    
                // Remove dock widget from main window
    
                //this->removeDockWidget(dockWidget);
                dockWidget->setVisible(false);
    
                // Deletion of dockWidget would also delete all child
                // widgets of dockWidget
                // Is there a way to unset a widget from QDockWidget?
    
    lm's avatar
    lm committed
    {
    
        clearView();
    
    lm's avatar
    lm committed
    
    
        currentView = VIEW_ENGINEER;
    
    lm's avatar
    lm committed
    
    
        presentView();
    
    lm's avatar
    lm committed
    }
    
    
    lm's avatar
    lm committed
    {
    
    lm's avatar
    lm committed
    
    
    lm's avatar
    lm committed
    }
    
    
    pixhawk's avatar
    pixhawk committed
    
    
    lm's avatar
    lm committed
    void MainWindow::presentView()
    {
    
        qDebug() << "LC";
        showTheCentralWidget(CENTRAL_LINECHART, currentView);
    
        // MAP
        qDebug() << "MAP";
        showTheCentralWidget(CENTRAL_MAP, currentView);
    
    pixhawk's avatar
    pixhawk committed
    
    
        // PROTOCOL
        qDebug() << "CP";
        showTheCentralWidget(CENTRAL_PROTOCOL, currentView);
    
    pixhawk's avatar
    pixhawk committed
    
    
        // HEAD UP DISPLAY
        showTheCentralWidget(CENTRAL_HUD, currentView);
    
    pixhawk's avatar
    pixhawk committed
    
        // GOOGLE EARTH
        showTheCentralWidget(CENTRAL_GOOGLE_EARTH, currentView);
    
        // LOCAL 3D VIEW
        showTheCentralWidget(CENTRAL_3D_LOCAL, currentView);
    
        // GLOBAL 3D VIEW
        showTheCentralWidget(CENTRAL_3D_MAP, currentView);
    
    
    
    pixhawk's avatar
    pixhawk committed
    
    
        // Show docked widgets based on current view and autopilot type
    
        // UAS CONTROL
        showTheWidget(MENU_UAS_CONTROL, currentView);
    
        // UAS LIST
        showTheWidget(MENU_UAS_LIST, currentView);
    
        // WAYPOINT LIST
        showTheWidget(MENU_WAYPOINTS, currentView);
    
        // UAS STATUS
        showTheWidget(MENU_STATUS, currentView);
    
        // DETECTION
        showTheWidget(MENU_DETECTION, currentView);
    
        // DEBUG CONSOLE
        showTheWidget(MENU_DEBUG_CONSOLE, currentView);
    
        // ONBOARD PARAMETERS
        showTheWidget(MENU_PARAMETERS, currentView);
    
        // WATCHDOG
        showTheWidget(MENU_WATCHDOG, currentView);
    
        // HUD
        showTheWidget(MENU_HUD, currentView);
        if (headUpDockWidget)
        {
            HUD* tmpHud = dynamic_cast<HUD*>( headUpDockWidget->widget() );
            if (tmpHud){
                if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HUD,currentView)).toBool()){
                    addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HUD, currentView)).toInt()),
                                  hsiDockWidget);
                    headUpDockWidget->show();
                } else {
                    headUpDockWidget->hide();
                }
    
        // RC View
        showTheWidget(MENU_RC_VIEW, currentView);
    
        // SLUGS DATA
        showTheWidget(MENU_SLUGS_DATA, currentView);
    
        // SLUGS PID
        showTheWidget(MENU_SLUGS_PID, currentView);
    
        // SLUGS HIL
        showTheWidget(MENU_SLUGS_HIL, currentView);
    
        // SLUGS CAMERA
        showTheWidget(MENU_SLUGS_CAMERA, currentView);
    
        // HORIZONTAL SITUATION INDICATOR
        showTheWidget(MENU_HSI, currentView);
    
        //    if (hsiDockWidget)
        //    {
        //        HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() );
        //        if (hsi){
        //            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HSI,currentView)).toBool()){
        //                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HSI, currentView)).toInt()),
        //                              hsiDockWidget);
        //            }
        //        }
        //    }
    
        // HEAD DOWN 1
        showTheWidget(MENU_HDD_1, currentView);
    
        //    if (headDown1DockWidget)
        //    {
        //        HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown1DockWidget->widget());
        //        if (hdd) {
        //            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HDD_1,currentView)).toBool()) {
        //                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HDD_1, currentView)).toInt()),
        //                              headDown1DockWidget);
        //                headDown1DockWidget->show();
        //                hdd->start();
        //            } else {
        //                headDown1DockWidget->hide();;
        //                hdd->stop();
        //            }
        //        }
        //    }
    
    
        // HEAD DOWN 2
        showTheWidget(MENU_HDD_2, currentView);
    
        //    if (headDown2DockWidget)
        //    {
        //        HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown2DockWidget->widget());
        //        if (hdd){
        //            if (settings.value(buildMenuKey (SUB_SECTION_CHECKED,MENU_HDD_2,currentView)).toBool()){
        //                addDockWidget(static_cast <Qt::DockWidgetArea>(settings.value(buildMenuKey (SUB_SECTION_LOCATION,MENU_HDD_2, currentView)).toInt()),
        //                              headDown2DockWidget);
        //                headDown2DockWidget->show();
        //                hdd->start();
        //            } else {
        //                headDown2DockWidget->hide();
        //                hdd->stop();
        //            }
        //        }
        //    }
    
        this->show();
    
    void MainWindow::showTheCentralWidget (TOOLS_WIDGET_NAMES centralWidget, VIEW_SECTIONS view)
    {
        bool tempVisible;
        QWidget* tempWidget = dockWidgets[centralWidget];
    
        tempVisible =  settings.value(buildMenuKey (SUB_SECTION_CHECKED,centralWidget,view)).toBool();
        qDebug() << buildMenuKey (SUB_SECTION_CHECKED,centralWidget,view) << tempVisible;
        if (toolsMenuActions[centralWidget])
    
            toolsMenuActions[centralWidget]->setChecked(tempVisible);
    
        if (centerStack && tempWidget && tempVisible)
    
            centerStack->setCurrentWidget(tempWidget);
    
    pixhawk's avatar
    pixhawk committed
    void MainWindow::loadWidgets()
    
    pixhawk's avatar
    pixhawk committed
    {
    
        loadOperatorView();
        //loadMAVLinkView();
    
    pixhawk's avatar
    pixhawk committed
        //loadPilotView();
    }
    
    void MainWindow::loadDataView(QString fileName)
    {
        // DATAPLOT
        if (dataplotWidget)
        {
            QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
            if (centerStack)
            {
                centerStack->setCurrentWidget(dataplotWidget);
                dataplotWidget->loadFile(fileName);
            }
        }
    }
    
    void MainWindow::load3DMapView()
    {
    #ifdef QGC_OSGEARTH_ENABLED
    
        clearView();
    
        // 3D map
        if (_3DMapWidget)
        {
            QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
            if (centerStack)
            {
                //map3DWidget->setActive(true);
                centerStack->setCurrentWidget(_3DMapWidget);
            }
        }
    
    #if (defined _MSC_VER) | (defined Q_OS_MAC)
    
        clearView();
    
        // 3D map
        if (gEarthWidget)
    
        {
            QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
            if (centerStack)
            {
    
                centerStack->setCurrentWidget(gEarthWidget);
    
    void MainWindow::load3DView()
    
        clearView();
    
        // 3D map
        if (_3DWidget)
    
            QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget());
            if (centerStack)
            {
                //map3DWidget->setActive(true);
                centerStack->setCurrentWidget(_3DWidget);
            }