diff --git a/images/style-mission.css b/images/style-mission.css index c911b67613bb96e243b0383f55126f68d2b20cb4..ceacf759608263b76ecb79a732be8246eb9dd51e 100644 --- a/images/style-mission.css +++ b/images/style-mission.css @@ -1,3 +1,4 @@ +* { font-family: "Bitstream Vera Sans"; font: "Roman"; font-size: 12px; } QWidget#colorIcon {} QWidget { diff --git a/src/Core.cc b/src/Core.cc index e1be758f75bdf8802aa8488e2396c564304e03d1..6bd8877df21591e0b22454790daa89eb3f702fb6 100644 --- a/src/Core.cc +++ b/src/Core.cc @@ -72,6 +72,8 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) // Show splash screen QPixmap splashImage(":images/splash.png"); QSplashScreen* splashScreen = new QSplashScreen(splashImage, Qt::WindowStaysOnTopHint); + // Delete splash screen after mainWindow was displayed + splashScreen->setAttribute(Qt::WA_DeleteOnClose); splashScreen->show(); splashScreen->showMessage(tr("Loading application fonts"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); @@ -79,13 +81,15 @@ Core::Core(int &argc, char* argv[]) : QApplication(argc, argv) // Exit main application when last window is closed connect(this, SIGNAL(lastWindowClosed()), this, SLOT(quit())); - // Set application font + // Load application font QFontDatabase fontDatabase = QFontDatabase(); const QString fontFileName = ":/general/vera.ttf"; ///< Font file is part of the QRC file and compiled into the app const QString fontFamilyName = "Bitstream Vera Sans"; if(!QFile::exists(fontFileName)) printf("ERROR! font file: %s DOES NOT EXIST!\n", fontFileName.toStdString().c_str()); fontDatabase.addApplicationFont(fontFileName); - setFont(fontDatabase.font(fontFamilyName, "Roman", 12)); + // Avoid Using setFont(). In the Qt docu you can read the following: + // "Warning: Do not use this function in conjunction with Qt Style Sheets." + // setFont(fontDatabase.font(fontFamilyName, "Roman", 12)); // Start the comm link manager splashScreen->showMessage(tr("Starting Communication Links"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); diff --git a/src/uas/PxQuadMAV.cc b/src/uas/PxQuadMAV.cc index 422244c65fad2ef446711605eb2fc72e5f7c3e87..5e673514485e4fa9cf9abc8c24164a9b78344197 100644 --- a/src/uas/PxQuadMAV.cc +++ b/src/uas/PxQuadMAV.cc @@ -139,7 +139,6 @@ void PxQuadMAV::receiveMessage(LinkInterface* link, mavlink_message_t message) emit errCountChanged(uasId, "IMU", "SPI0", status.spi0_err_count); emit errCountChanged(uasId, "IMU", "SPI1", status.spi1_err_count); emit errCountChanged(uasId, "IMU", "UART", status.uart_total_err_count); - qDebug() << "System Load:" << status.load; emit UAS::valueChanged(this, "Load", ((float)status.load)/1000.0f, MG::TIME::getGroundTimeNow()); } break; diff --git a/src/uas/UAS.cc b/src/uas/UAS.cc index f0c9f087faf3e431a1f3e8545dfe3a962c2d4cf4..52557914a3615aa6ba84590dd7b8b833a23fac97 100644 --- a/src/uas/UAS.cc +++ b/src/uas/UAS.cc @@ -391,6 +391,7 @@ void UAS::receiveMessage(LinkInterface* link, mavlink_message_t message) { mavlink_rc_channels_t channels; mavlink_msg_rc_channels_decode(&message, &channels); + emit remoteControlRSSIChanged(channels.rssi/255.0f); for (int i = 0; i < 8; i++) { switch (i) @@ -576,6 +577,43 @@ void UAS::setLocalPositionSetpoint(float x, float y, float z, float yaw) #endif } +void UAS::setLocalPositionOffset(float x, float y, float z, float yaw) +{ +#ifdef MAVLINK_ENABLED_PIXHAWK_MESSAGES + mavlink_message_t msg; + mavlink_msg_position_control_offset_set_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, 0, x, y, z, yaw); + sendMessage(msg); +#endif +} + +void UAS::startRadioControlCalibration() +{ + mavlink_message_t msg; + mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, MAV_COMP_ID_IMU, MAV_ACTION_CALIBRATE_RC); + sendMessage(msg); +} + +void UAS::startMagnetometerCalibration() +{ + mavlink_message_t msg; + mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, MAV_COMP_ID_IMU, MAV_ACTION_CALIBRATE_MAG); + sendMessage(msg); +} + +void UAS::startGyroscopeCalibration() +{ + mavlink_message_t msg; + mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, MAV_COMP_ID_IMU, MAV_ACTION_CALIBRATE_GYRO); + sendMessage(msg); +} + +void UAS::startPressureCalibration() +{ + mavlink_message_t msg; + mavlink_msg_action_pack(mavlink->getSystemId(), mavlink->getComponentId(), &msg, uasId, MAV_COMP_ID_IMU, MAV_ACTION_CALIBRATE_PRESSURE); + sendMessage(msg); +} + quint64 UAS::getUnixTime(quint64 time) { if (time == 0) diff --git a/src/uas/UAS.h b/src/uas/UAS.h index 426bebcda190b18a44ce5425f21cc9b8b1fd9e5f..19ded91f702cfb2fb28628f5031024d51403d5ae 100644 --- a/src/uas/UAS.h +++ b/src/uas/UAS.h @@ -221,6 +221,13 @@ public slots: /** @brief Set local position setpoint */ void setLocalPositionSetpoint(float x, float y, float z, float yaw); + /** @brief Add an offset in body frame to the setpoint */ + void setLocalPositionOffset(float x, float y, float z, float yaw); + + void startRadioControlCalibration(); + void startMagnetometerCalibration(); + void startGyroscopeCalibration(); + void startPressureCalibration(); signals: diff --git a/src/uas/UASInterface.h b/src/uas/UASInterface.h index 21e67dc7fab55835c99945fc3933af69ea8ad9f6..fc5dd526b36c32f4dd85a8bfe388b5bba42f333d 100644 --- a/src/uas/UASInterface.h +++ b/src/uas/UASInterface.h @@ -211,6 +211,12 @@ public slots: virtual void enableRawSensorFusionTransmission(bool enabled) = 0; virtual void setLocalPositionSetpoint(float x, float y, float z, float yaw) = 0; + virtual void setLocalPositionOffset(float x, float y, float z, float yaw) = 0; + + virtual void startRadioControlCalibration() = 0; + virtual void startMagnetometerCalibration() = 0; + virtual void startGyroscopeCalibration() = 0; + virtual void startPressureCalibration() = 0; protected: QColor color; @@ -331,6 +337,8 @@ signals: void positionYawControlEnabled(bool enabled); /** @brief Value of a remote control channel */ void remoteControlChannelChanged(int channelId, float raw, float normalized); + /** @brief Remote control RSSI changed */ + void remoteControlRSSIChanged(float rssi); /** * @brief Localization quality changed diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 42c8c1c239eedb640507f3f83899a2f8677d1d6f..ce4160299a8a8c6b274accf034caee52f2e071fa 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -108,6 +108,7 @@ MainWindow::~MainWindow() void MainWindow::buildWidgets() { + //FIXME: memory of acceptList will never be freed again QStringList* acceptList = new QStringList(); acceptList->append("roll IMU"); acceptList->append("pitch IMU"); @@ -116,50 +117,93 @@ void MainWindow::buildWidgets() acceptList->append("pitchspeed IMU"); acceptList->append("yawspeed IMU"); + //FIXME: memory of acceptList2 will never be freed again QStringList* acceptList2 = new QStringList(); acceptList2->append("Battery"); acceptList2->append("Pressure"); - + //TODO: move protocol outside UI mavlink = new MAVLinkProtocol(); - linechart = new Linecharts(this); - control = new UASControlWidget(this); - list = new UASListWidget(this); - waypoints = new WaypointList(this, NULL); - info = new UASInfoWidget(this); - detection = new ObjectDetectionView("images/patterns", this); - hud = new HUD(640, 480, this); - debugConsole= new DebugConsole(this); - map = new MapWidget(this); - protocol = new XMLCommProtocolWidget(this); - parameters = new ParameterInterface(this); - watchdogControl = new WatchdogControl(this); - hsi = new HSIDisplay(this); - headDown1 = new HDDisplay(acceptList, this); - headDown2 = new HDDisplay(acceptList2, this); + + // Center widgets + linechartWidget = new Linecharts(this); + hudWidget = new HUD(640, 480, this); + mapWidget = new MapWidget(this); + protocolWidget = new XMLCommProtocolWidget(this); + dataplotWidget = new QGCDataPlot2D(this); + + // Dock widgets + controlDockWidget = new QDockWidget(tr("Control"), this); + controlDockWidget->setWidget( new UASControlWidget(this) ); + + listDockWidget = new QDockWidget(tr("Unmanned Systems"), this); + listDockWidget->setWidget( new UASListWidget(this) ); + + waypointsDockWidget = new QDockWidget(tr("Waypoint List"), this); + waypointsDockWidget->setWidget( new WaypointList(this, NULL) ); + + infoDockWidget = new QDockWidget(tr("Status Details"), this); + infoDockWidget->setWidget( new UASInfoWidget(this) ); + + detectionDockWidget = new QDockWidget(tr("Object Recognition"), this); + detectionDockWidget->setWidget( new ObjectDetectionView("images/patterns", this) ); + + debugConsoleDockWidget = new QDockWidget(tr("Communication Console"), this); + debugConsoleDockWidget->setWidget( new DebugConsole(this) ); + + parametersDockWidget = new QDockWidget(tr("Onboard Parameters"), this); + parametersDockWidget->setWidget( new ParameterInterface(this) ); + + watchdogControlDockWidget = new QDockWidget(tr("Process Control"), this); + watchdogControlDockWidget->setWidget( new WatchdogControl(this) ); + + hsiDockWidget = new QDockWidget(tr("Horizontal Situation Indicator"), this); + hsiDockWidget->setWidget( new HSIDisplay(this) ); + + headDown1DockWidget = new QDockWidget(tr("Primary Flight Display"), this); + headDown1DockWidget->setWidget( new HDDisplay(acceptList, this) ); + + headDown2DockWidget = new QDockWidget(tr("Payload Status"), this); + headDown2DockWidget->setWidget( new HDDisplay(acceptList2, this) ); + + rcViewDockWidget = new QDockWidget(tr("Radio Control"), this); + rcViewDockWidget->setWidget( new QGCRemoteControlView(this) ); + + // Dialogue widgets + //FIXME: free memory in destructor joystick = new JoystickInput(); - dataplot = new QGCDataPlot2D(this); - rcView = new QGCRemoteControlView(this); + } void MainWindow::connectWidgets() { - connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), linechart, SLOT(addSystem(UASInterface*))); - connect(UASManager::instance(), SIGNAL(activeUASSet(int)), linechart, SLOT(selectSystem(int))); - connect(linechart, SIGNAL(logfileWritten(QString)), this, SLOT(loadDataView(QString))); - connect(mavlink, SIGNAL(receiveLossChanged(int, float)), info, SLOT(updateSendLoss(int, float))); + if (linechartWidget) + { + connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), + linechartWidget, SLOT(addSystem(UASInterface*))); + connect(UASManager::instance(), SIGNAL(activeUASSet(int)), + linechartWidget, SLOT(selectSystem(int))); + connect(linechartWidget, SIGNAL(logfileWritten(QString)), + this, SLOT(loadDataView(QString))); + } + if (infoDockWidget && infoDockWidget->widget()) + { + connect(mavlink, SIGNAL(receiveLossChanged(int, float)), + infoDockWidget->widget(), SLOT(updateSendLoss(int, float))); + } } void MainWindow::arrangeCenterStack() { - centerStack = new QStackedWidget(this); + QStackedWidget *centerStack = new QStackedWidget(this); + if (!centerStack) return; - centerStack->addWidget(linechart); - centerStack->addWidget(protocol); - centerStack->addWidget(map); - centerStack->addWidget(hud); - centerStack->addWidget(dataplot); + if (linechartWidget) centerStack->addWidget(linechartWidget); + if (protocolWidget) centerStack->addWidget(protocolWidget); + if (mapWidget) centerStack->addWidget(mapWidget); + if (hudWidget) centerStack->addWidget(hudWidget); + if (dataplotWidget) centerStack->addWidget(dataplotWidget); setCentralWidget(centerStack); } @@ -425,13 +469,35 @@ void MainWindow::UASCreated(UASInterface* uas) ui.menuConnected_Systems->addAction(icon, tr("Select %1 for control").arg(uas->getUASName()), uas, SLOT(setSelected())); // FIXME Should be not inside the mainwindow - connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), debugConsole, SLOT(receiveTextMessage(int,int,int,QString))); + if (debugConsoleDockWidget) + { + DebugConsole *debugConsole = dynamic_cast(debugConsoleDockWidget->widget()); + if (debugConsole) + { + connect(uas, SIGNAL(textMessageReceived(int,int,int,QString)), + debugConsole, SLOT(receiveTextMessage(int,int,int,QString))); + } + } // Health / System status indicator - info->addUAS(uas); + if (infoDockWidget) + { + UASInfoWidget *infoWidget = dynamic_cast(infoDockWidget->widget()); + if (infoWidget) + { + infoWidget->addUAS(uas); + } + } // UAS List - list->addUAS(uas); + if (listDockWidget) + { + UASListWidget *listWidget = dynamic_cast(listDockWidget->widget()); + if (listWidget) + { + listWidget->addUAS(uas); + } + } // Camera view //camera->addUAS(uas); @@ -455,27 +521,42 @@ void MainWindow::UASCreated(UASInterface* uas) void MainWindow::clearView() { // Halt HUD - hud->stop(); - linechart->setActive(false); - headDown1->stop(); - headDown2->stop(); - hsi->stop(); + if (hudWidget) hudWidget->stop(); + // Disable linechart + if (linechartWidget) linechartWidget->setActive(false); + // Halt HDDs + if (headDown1DockWidget) + { + HDDisplay* hddWidget = dynamic_cast( headDown1DockWidget->widget() ); + if (hddWidget) hddWidget->stop(); + } + if (headDown2DockWidget) + { + HDDisplay* hddWidget = dynamic_cast( headDown2DockWidget->widget() ); + if (hddWidget) hddWidget->stop(); + } + // Halt HSI + if (hsiDockWidget) + { + HSIDisplay* hsi = dynamic_cast( hsiDockWidget->widget() ); + if (hsi) hsi->stop(); + } - // Remove all dock widgets - QList list = this->children(); + // Remove all dock widgets from main window + QObjectList childList( this->children() ); - QList::iterator i; - for (i = list.begin(); i != list.end(); ++i) + QObjectList::iterator i; + QDockWidget* dockWidget; + for (i = childList.begin(); i != childList.end(); ++i) { - QDockWidget* widget = dynamic_cast(*i); - if (widget) + dockWidget = dynamic_cast(*i); + if (dockWidget) { - // Hide widgets - QWidget* childWidget = dynamic_cast(widget->widget()); - if (childWidget) childWidget->setVisible(false); - // Remove dock widget - this->removeDockWidget(widget); - //delete widget; + // Remove dock widget from main window + this->removeDockWidget(dockWidget); + // Deletion of dockWidget would also delete all child + // widgets of dockWidget + // Is there a way to unset a widget from QDockWidget? } } } @@ -486,45 +567,69 @@ void MainWindow::loadSlugsView() // Engineer view, used in EMAV2009 // LINE CHART - linechart->setActive(true); - centerStack->setCurrentWidget(linechart); + if (linechartWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + linechartWidget->setActive(true); + centerStack->setCurrentWidget(linechartWidget); + } + } // UAS CONTROL - QDockWidget* container1 = new QDockWidget(tr("Control"), this); - container1->setWidget(control); - addDockWidget(Qt::LeftDockWidgetArea, container1); + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } // UAS LIST - QDockWidget* container4 = new QDockWidget(tr("Unmanned Systems"), this); - container4->setWidget(list); - addDockWidget(Qt::BottomDockWidgetArea, container4); + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } // UAS STATUS - QDockWidget* container3 = new QDockWidget(tr("Status Details"), this); - container3->setWidget(info); - addDockWidget(Qt::LeftDockWidgetArea, container3); + if (infoDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); + infoDockWidget->show(); + } // HORIZONTAL SITUATION INDICATOR - QDockWidget* container6 = new QDockWidget(tr("Horizontal Situation Indicator"), this); - container6->setWidget(hsi); - hsi->start(); - addDockWidget(Qt::LeftDockWidgetArea, container6); + if (hsiDockWidget) + { + HSIDisplay* hsi = dynamic_cast( hsiDockWidget->widget() ); + if (hsi) + { + hsi->start(); + addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); + hsiDockWidget->show(); + } + } // WAYPOINT LIST - QDockWidget* container5 = new QDockWidget(tr("Waypoint List"), this); - container5->setWidget(waypoints); - addDockWidget(Qt::BottomDockWidgetArea, container5); + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } // DEBUG CONSOLE - QDockWidget* container7 = new QDockWidget(tr("Communication Console"), this); - container7->setWidget(debugConsole); - addDockWidget(Qt::BottomDockWidgetArea, container7); + if (debugConsoleDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); + debugConsoleDockWidget->show(); + } // ONBOARD PARAMETERS - QDockWidget* containerParams = new QDockWidget(tr("Onboard Parameters"), this); - containerParams->setWidget(parameters); - addDockWidget(Qt::RightDockWidgetArea, containerParams); - + if (parametersDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); + parametersDockWidget->show(); + } this->show(); } @@ -535,44 +640,64 @@ void MainWindow::loadPixhawkView() // Engineer view, used in EMAV2009 // LINE CHART - linechart->setActive(true); - centerStack->setCurrentWidget(linechart); + if (linechartWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + linechartWidget->setActive(true); + centerStack->setCurrentWidget(linechartWidget); + } + } // UAS CONTROL - QDockWidget* container1 = new QDockWidget(tr("Control"), this); - container1->setWidget(control); - addDockWidget(Qt::LeftDockWidgetArea, container1); + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } // UAS LIST - QDockWidget* container4 = new QDockWidget(tr("Unmanned Systems"), this); - container4->setWidget(list); - addDockWidget(Qt::BottomDockWidgetArea, container4); + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } // UAS STATUS - QDockWidget* container3 = new QDockWidget(tr("Status Details"), this); - container3->setWidget(info); - addDockWidget(Qt::LeftDockWidgetArea, container3); + if (infoDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); + infoDockWidget->show(); + } // WAYPOINT LIST - QDockWidget* container5 = new QDockWidget(tr("Waypoint List"), this); - container5->setWidget(waypoints); - addDockWidget(Qt::BottomDockWidgetArea, container5); + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } // DEBUG CONSOLE - QDockWidget* container7 = new QDockWidget(tr("Communication Console"), this); - container7->setWidget(debugConsole); - addDockWidget(Qt::BottomDockWidgetArea, container7); + if (debugConsoleDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); + debugConsoleDockWidget->show(); + } // RADIO CONTROL VIEW - QDockWidget* rcContainer = new QDockWidget(tr("Radio Control"), this); - rcContainer->setWidget(rcView); - addDockWidget(Qt::BottomDockWidgetArea, rcContainer); + if (rcViewDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, rcViewDockWidget); + rcViewDockWidget->show(); + } // ONBOARD PARAMETERS - QDockWidget* containerParams = new QDockWidget(tr("Onboard Parameters"), this); - containerParams->setWidget(parameters); - addDockWidget(Qt::RightDockWidgetArea, containerParams); - + if (parametersDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); + parametersDockWidget->show(); + } this->show(); } @@ -580,14 +705,30 @@ void MainWindow::loadPixhawkView() void MainWindow::loadDataView() { clearView(); - centerStack->setCurrentWidget(dataplot); + + // DATAPLOT + if (dataplotWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + centerStack->setCurrentWidget(dataplotWidget); + } } void MainWindow::loadDataView(QString fileName) { clearView(); - centerStack->setCurrentWidget(dataplot); - dataplot->loadFile(fileName); + + // DATAPLOT + if (dataplotWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + centerStack->setCurrentWidget(dataplotWidget); + dataplotWidget->loadFile(fileName); + } + } } void MainWindow::loadPilotView() @@ -595,20 +736,38 @@ void MainWindow::loadPilotView() clearView(); // HEAD UP DISPLAY - centerStack->setCurrentWidget(hud); - hud->start(); + if (hudWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + centerStack->setCurrentWidget(hudWidget); + hudWidget->start(); + } + } //connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), pfd, SLOT(setActiveUAS(UASInterface*))); - QDockWidget* container1 = new QDockWidget(tr("Primary Flight Display"), this); - container1->setWidget(headDown1); - addDockWidget(Qt::RightDockWidgetArea, container1); - - QDockWidget* container2 = new QDockWidget(tr("Payload Status"), this); - container2->setWidget(headDown2); - addDockWidget(Qt::RightDockWidgetArea, container2); - - headDown1->start(); - headDown2->start(); + if (headDown1DockWidget) + { + HDDisplay *hdd = dynamic_cast(headDown1DockWidget->widget()); + if (hdd) + { + addDockWidget(Qt::RightDockWidgetArea, headDown1DockWidget); + headDown1DockWidget->show(); + hdd->start(); + } + + } + if (headDown2DockWidget) + { + HDDisplay *hdd = dynamic_cast(headDown2DockWidget->widget()); + if (hdd) + { + addDockWidget(Qt::RightDockWidgetArea, headDown2DockWidget); + headDown2DockWidget->show(); + hdd->start(); + } + } this->show(); } @@ -618,43 +777,68 @@ void MainWindow::loadOperatorView() clearView(); // MAP - centerStack->setCurrentWidget(map); - + if (mapWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + centerStack->setCurrentWidget(mapWidget); + } + } // UAS CONTROL - QDockWidget* container1 = new QDockWidget(tr("Control"), this); - container1->setWidget(control); - addDockWidget(Qt::LeftDockWidgetArea, container1); + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } // UAS LIST - QDockWidget* container4 = new QDockWidget(tr("Unmanned Systems"), this); - container4->setWidget(list); - addDockWidget(Qt::BottomDockWidgetArea, container4); + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } // UAS STATUS - QDockWidget* container3 = new QDockWidget(tr("Status Details"), this); - container3->setWidget(info); - addDockWidget(Qt::LeftDockWidgetArea, container3); + if (infoDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); + infoDockWidget->show(); + } // WAYPOINT LIST - QDockWidget* container5 = new QDockWidget(tr("Waypoint List"), this); - container5->setWidget(waypoints); - addDockWidget(Qt::BottomDockWidgetArea, container5); + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } // HORIZONTAL SITUATION INDICATOR - QDockWidget* container7 = new QDockWidget(tr("Horizontal Situation Indicator"), this); - container7->setWidget(hsi); - hsi->start(); - addDockWidget(Qt::BottomDockWidgetArea, container7); + if (hsiDockWidget) + { + HSIDisplay* hsi = dynamic_cast( hsiDockWidget->widget() ); + if (hsi) + { + addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget); + hsiDockWidget->show(); + hsi->start(); + } + } // OBJECT DETECTION - QDockWidget* container6 = new QDockWidget(tr("Object Recognition"), this); - container6->setWidget(detection); - addDockWidget(Qt::RightDockWidgetArea, container6); + if (detectionDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, detectionDockWidget); + detectionDockWidget->show(); + } // PROCESS CONTROL - QDockWidget* pControl = new QDockWidget(tr("Process Control"), this); - pControl->setWidget(watchdogControl); - addDockWidget(Qt::RightDockWidgetArea, pControl); + if (watchdogControlDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, watchdogControlDockWidget); + watchdogControlDockWidget->show(); + } + this->show(); } @@ -663,8 +847,15 @@ void MainWindow::loadSettingsView() clearView(); // LINE CHART - linechart->setActive(true); - centerStack->setCurrentWidget(linechart); + if (linechartWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + linechartWidget->setActive(true); + centerStack->setCurrentWidget(linechartWidget); + } + } /* // COMM XML @@ -673,9 +864,12 @@ void MainWindow::loadSettingsView() addDockWidget(Qt::LeftDockWidgetArea, container1);*/ // ONBOARD PARAMETERS - QDockWidget* container6 = new QDockWidget(tr("Onboard Parameters"), this); - container6->setWidget(parameters); - addDockWidget(Qt::RightDockWidgetArea, container6); + if (parametersDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); + parametersDockWidget->show(); + } + this->show(); } @@ -685,39 +879,57 @@ void MainWindow::loadEngineerView() // Engineer view, used in EMAV2009 // LINE CHART - linechart->setActive(true); - centerStack->setCurrentWidget(linechart); + if (linechartWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + linechartWidget->setActive(true); + centerStack->setCurrentWidget(linechartWidget); + } + } // UAS CONTROL - QDockWidget* container1 = new QDockWidget(tr("Control"), this); - container1->setWidget(control); - addDockWidget(Qt::LeftDockWidgetArea, container1); + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } // UAS LIST - QDockWidget* container4 = new QDockWidget(tr("Unmanned Systems"), this); - container4->setWidget(list); - addDockWidget(Qt::BottomDockWidgetArea, container4); + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } // UAS STATUS - QDockWidget* container3 = new QDockWidget(tr("Status Details"), this); - container3->setWidget(info); - addDockWidget(Qt::LeftDockWidgetArea, container3); + if (infoDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); + infoDockWidget->show(); + } // WAYPOINT LIST - QDockWidget* container5 = new QDockWidget(tr("Waypoint List"), this); - container5->setWidget(waypoints); - addDockWidget(Qt::BottomDockWidgetArea, container5); + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } // DEBUG CONSOLE - QDockWidget* container7 = new QDockWidget(tr("Communication Console"), this); - container7->setWidget(debugConsole); - addDockWidget(Qt::BottomDockWidgetArea, container7); + if (debugConsoleDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); + debugConsoleDockWidget->show(); + } // ONBOARD PARAMETERS - QDockWidget* containerParams = new QDockWidget(tr("Onboard Parameters"), this); - containerParams->setWidget(parameters); - addDockWidget(Qt::RightDockWidgetArea, containerParams); - + if (parametersDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); + parametersDockWidget->show(); + } this->show(); } @@ -725,7 +937,16 @@ void MainWindow::loadEngineerView() void MainWindow::loadMAVLinkView() { clearView(); - centerStack->setCurrentWidget(protocol); + + if (protocolWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + centerStack->setCurrentWidget(protocolWidget); + } + } + this->show(); } @@ -733,55 +954,87 @@ void MainWindow::loadAllView() { clearView(); - QDockWidget* containerPFD = new QDockWidget(tr("Primary Flight Display"), this); - containerPFD->setWidget(headDown1); - addDockWidget(Qt::RightDockWidgetArea, containerPFD); - - QDockWidget* containerPayload = new QDockWidget(tr("Payload Status"), this); - containerPayload->setWidget(headDown2); - addDockWidget(Qt::RightDockWidgetArea, containerPayload); - - headDown1->start(); - headDown2->start(); + if (headDown1DockWidget) + { + HDDisplay *hdd = dynamic_cast(headDown1DockWidget->widget()); + if (hdd) + { + addDockWidget(Qt::RightDockWidgetArea, headDown1DockWidget); + headDown1DockWidget->show(); + hdd->start(); + } + + } + if (headDown2DockWidget) + { + HDDisplay *hdd = dynamic_cast(headDown2DockWidget->widget()); + if (hdd) + { + addDockWidget(Qt::RightDockWidgetArea, headDown2DockWidget); + headDown2DockWidget->show(); + hdd->start(); + } + } // UAS CONTROL - QDockWidget* containerControl = new QDockWidget(tr("Control"), this); - containerControl->setWidget(control); - addDockWidget(Qt::LeftDockWidgetArea, containerControl); + if (controlDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); + controlDockWidget->show(); + } // UAS LIST - QDockWidget* containerUASList = new QDockWidget(tr("Unmanned Systems"), this); - containerUASList->setWidget(list); - addDockWidget(Qt::BottomDockWidgetArea, containerUASList); + if (listDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); + listDockWidget->show(); + } // UAS STATUS - QDockWidget* containerStatus = new QDockWidget(tr("Status Details"), this); - containerStatus->setWidget(info); - addDockWidget(Qt::LeftDockWidgetArea, containerStatus); + if (infoDockWidget) + { + addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); + infoDockWidget->show(); + } // WAYPOINT LIST - QDockWidget* containerWaypoints = new QDockWidget(tr("Waypoint List"), this); - containerWaypoints->setWidget(waypoints); - addDockWidget(Qt::BottomDockWidgetArea, containerWaypoints); + if (waypointsDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); + waypointsDockWidget->show(); + } // DEBUG CONSOLE - QDockWidget* containerComm = new QDockWidget(tr("Communication Console"), this); - containerComm->setWidget(debugConsole); - addDockWidget(Qt::BottomDockWidgetArea, containerComm); + if (debugConsoleDockWidget) + { + addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); + debugConsoleDockWidget->show(); + } // OBJECT DETECTION - QDockWidget* containerObjRec = new QDockWidget(tr("Object Recognition"), this); - containerObjRec->setWidget(detection); - addDockWidget(Qt::RightDockWidgetArea, containerObjRec); + if (detectionDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, detectionDockWidget); + detectionDockWidget->show(); + } // LINE CHART - linechart->setActive(true); - centerStack->setCurrentWidget(linechart); + if (linechartWidget) + { + QStackedWidget *centerStack = dynamic_cast(centralWidget()); + if (centerStack) + { + linechartWidget->setActive(true); + centerStack->setCurrentWidget(linechartWidget); + } + } // ONBOARD PARAMETERS - QDockWidget* containerParams = new QDockWidget(tr("Onboard Parameters"), this); - containerParams->setWidget(parameters); - addDockWidget(Qt::RightDockWidgetArea, containerParams); + if (parametersDockWidget) + { + addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); + parametersDockWidget->show(); + } this->show(); } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index cd1b85fe8942136c26eb595effde0ce03c86b212..057390bc66b5ee83671bb97268413c65d2d9d548 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -154,24 +154,26 @@ protected: LinkInterface* udpLink; QSettings settings; - UASControlWidget* control; - Linecharts* linechart; - UASInfoWidget* info; - CameraView* camera; - UASListWidget* list; - WaypointList* waypoints; - ObjectDetectionView* detection; - HUD* hud; - DebugConsole* debugConsole; - MapWidget* map; - ParameterInterface* parameters; - XMLCommProtocolWidget* protocol; - HDDisplay* headDown1; - HDDisplay* headDown2; - WatchdogControl* watchdogControl; - HSIDisplay* hsi; - QGCDataPlot2D* dataplot; - QGCRemoteControlView* rcView; + // Center widgets + QPointer linechartWidget; + QPointer hudWidget; + QPointer mapWidget; + QPointer protocolWidget; + QPointer dataplotWidget; + // Dock widgets + QPointer controlDockWidget; + QPointer infoDockWidget; + QPointer cameraDockWidget; + QPointer listDockWidget; + QPointer waypointsDockWidget; + QPointer detectionDockWidget; + QPointer debugConsoleDockWidget; + QPointer parametersDockWidget; + QPointer headDown1DockWidget; + QPointer headDown2DockWidget; + QPointer watchdogControlDockWidget; + QPointer hsiDockWidget; + QPointer rcViewDockWidget; // Popup widgets JoystickWidget* joystickWidget; @@ -187,9 +189,6 @@ protected: QAction* killUASAct; QAction* simulateUASAct; - QDockWidget* controlDock; - QStackedWidget* centerStack; - LogCompressor* comp; QString screenFileName; QTimer* videoTimer; diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc index f46be42a58c0a13c1bcffe9870db8ca04363c82f..ef4ad51cf4dbb1d4b464d9d7dd2882ab7098cc63 100644 --- a/src/ui/QGCParamWidget.cc +++ b/src/ui/QGCParamWidget.cc @@ -2,9 +2,7 @@ QGroundControl Open Source Ground Control Station -(c) 2009, 2010 QGROUNDCONTROL/PIXHAWK PROJECT - - +(c) 2009, 2010 QGROUNDCONTROL PROJECT This file is part of the QGROUNDCONTROL project @@ -22,7 +20,6 @@ This file is part of the QGROUNDCONTROL project along with QGROUNDCONTROL. If not, see . ======================================================================*/ - /** * @file * @brief Implementation of class QGCParamWidget diff --git a/src/ui/QGCRemoteControlView.cc b/src/ui/QGCRemoteControlView.cc index 78c5416bbefb218c8c6b6e2c753fd56651291f34..1968570750abfd7d71ddcd11e57175d7f3c9cab6 100644 --- a/src/ui/QGCRemoteControlView.cc +++ b/src/ui/QGCRemoteControlView.cc @@ -52,18 +52,21 @@ QGCRemoteControlView::QGCRemoteControlView(QWidget *parent) : nameLabel = new QLabel(this); nameLabel->setText("No MAV selected yet.."); layout->addWidget(nameLabel, 0, 0, 1, 2); - // Add spacer left of button - layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 2, 0); - // Set stretch to maximize spacer, not button - layout->setColumnStretch(0, 100); - layout->setColumnStretch(1, 1); - // Calibrate button - QPushButton* calibrateButton = new QPushButton(this); - calibrateButton->setText(tr("Calibrate")); - // Connect to calibration slot - connect(calibrateButton, SIGNAL(clicked()), this, SLOT(calibrate())); - // Add button - layout->addWidget(calibrateButton, 2, 1); + + // RSSI bar + // Create new layout + QHBoxLayout* rssiLayout = new QHBoxLayout(); + rssiLayout->setSpacing(5); + // Add content + rssiLayout->addWidget(new QLabel(tr("Signal"), this)); + // Append raw label + // Append progress bar + rssiBar = new QProgressBar(this); + rssiBar->setMinimum(0); + rssiBar->setMaximum(100); + rssiBar->setValue(0); + rssiLayout->addWidget(rssiBar); + layout->addItem(rssiLayout, 2, 0, 1, 2); setVisible(false); connect(UASManager::instance(), SIGNAL(activeUASSet(int)), this, SLOT(setUASId(int))); @@ -75,11 +78,6 @@ QGCRemoteControlView::~QGCRemoteControlView() delete channelLayout; } -void QGCRemoteControlView::calibrate() -{ - // Run auto-calibration -} - void QGCRemoteControlView::setUASId(int id) { if (uasId != -1) @@ -89,6 +87,7 @@ void QGCRemoteControlView::setUASId(int id) { // The UAS exists, disconnect any existing connections disconnect(uas, SIGNAL(remoteControlChannelChanged(int,float,float)), this, SLOT(setChannel(int,float,float))); + disconnect(uas, SIGNAL(remoteControlRSSIChanged(float)), this, SLOT(setRemoteRSSI(float))); } } @@ -99,6 +98,7 @@ void QGCRemoteControlView::setUASId(int id) // New UAS exists, connect nameLabel->setText(QString("RC Input of %1").arg(newUAS->getUASName())); connect(newUAS, SIGNAL(remoteControlChannelChanged(int,float,float)), this, SLOT(setChannel(int,float,float))); + connect(newUAS, SIGNAL(remoteControlRSSIChanged(float)), this, SLOT(setRemoteRSSI(float))); } } @@ -132,7 +132,7 @@ void QGCRemoteControlView::setRemoteRSSI(float rssiNormalized) void QGCRemoteControlView::appendChannelWidget(int channelId) { // Create new layout - QHBoxLayout* layout = new QHBoxLayout(this); + QHBoxLayout* layout = new QHBoxLayout(); // Add content layout->addWidget(new QLabel(QString("Channel %1").arg(channelId + 1), this)); QLabel* raw = new QLabel(this); diff --git a/src/ui/QGCRemoteControlView.h b/src/ui/QGCRemoteControlView.h index a3f82a1ede7952a71f7a2fb808d07f575ea0dabe..85c191f9c35c77c614e8f25431fa40c5463ee089 100644 --- a/src/ui/QGCRemoteControlView.h +++ b/src/ui/QGCRemoteControlView.h @@ -51,7 +51,6 @@ public slots: void setUASId(int id); void setChannel(int channelId, float raw, float normalized); void setRemoteRSSI(float rssiNormalized); - void calibrate(); void redraw(); protected slots: @@ -67,6 +66,7 @@ protected: QVector normalized; QVector rawLabels; QVector progressBars; + QProgressBar* rssiBar; QLabel* nameLabel; private: diff --git a/src/ui/QGCSensorSettingsWidget.cc b/src/ui/QGCSensorSettingsWidget.cc index f91defe50cd02d2932ed28a7d617e64b95f0a5a4..756dc3d8beb7e7ae681b4bbc82905e3f18757be4 100644 --- a/src/ui/QGCSensorSettingsWidget.cc +++ b/src/ui/QGCSensorSettingsWidget.cc @@ -46,6 +46,12 @@ QGCSensorSettingsWidget::QGCSensorSettingsWidget(UASInterface* uas, QWidget *par connect(ui->sendExtra1CheckBox, SIGNAL(toggled(bool)), mav, SLOT(enableExtra1Transmission(bool))); connect(ui->sendExtra2CheckBox, SIGNAL(toggled(bool)), mav, SLOT(enableExtra2Transmission(bool))); connect(ui->sendExtra3CheckBox, SIGNAL(toggled(bool)), mav, SLOT(enableExtra3Transmission(bool))); + + // Calibration + connect(ui->rcCalButton, SIGNAL(clicked()), mav, SLOT(startRadioControlCalibration())); + connect(ui->magCalButton, SIGNAL(clicked()), mav, SLOT(startMagnetometerCalibration())); + connect(ui->pressureCalButton, SIGNAL(clicked()), mav, SLOT(startPressureCalibration())); + connect(ui->gyroCalButton, SIGNAL(clicked()), mav, SLOT(startGyroscopeCalibration())); } QGCSensorSettingsWidget::~QGCSensorSettingsWidget() diff --git a/src/ui/QGCSensorSettingsWidget.ui b/src/ui/QGCSensorSettingsWidget.ui index d8977889ed8ccc311dc7fa703cc0151aa3010767..ab8c2583f67048dac3c0d22ca98c3e716d493104 100644 --- a/src/ui/QGCSensorSettingsWidget.ui +++ b/src/ui/QGCSensorSettingsWidget.ui @@ -90,38 +90,51 @@ Calibration Wizards - + 6 - - + + - Start dynamic calibration + Start Mag. Calibration - - + + - Date unknown + Start Gyro Calibration - - + + - Start static calibration + Start RC Calibration - - + + - Date unknown + Start Pressure Calibration + + + + Qt::Horizontal + + + + 0 + 0 + + + + diff --git a/src/ui/uas/UASControlWidget.cc b/src/ui/uas/UASControlWidget.cc index c01fbedcb80f2219d37c9600e8d96a3f91b39e9f..22fd7b5a06f0101635ec83f6e10750c044cb6abc 100644 --- a/src/ui/uas/UASControlWidget.cc +++ b/src/ui/uas/UASControlWidget.cc @@ -51,13 +51,13 @@ This file is part of the PIXHAWK project #define CONTROL_MODE_TEST2 "MODE TEST2" #define CONTROL_MODE_TEST3 "MODE TEST3" -#define CONTROL_MODE_LOCKED_INDEX 2 -#define CONTROL_MODE_MANUAL_INDEX 3 -#define CONTROL_MODE_GUIDED_INDEX 4 -#define CONTROL_MODE_AUTO_INDEX 5 -#define CONTROL_MODE_TEST1_INDEX 6 -#define CONTROL_MODE_TEST2_INDEX 7 -#define CONTROL_MODE_TEST3_INDEX 8 +#define CONTROL_MODE_LOCKED_INDEX 1 +#define CONTROL_MODE_MANUAL_INDEX 2 +#define CONTROL_MODE_GUIDED_INDEX 3 +#define CONTROL_MODE_AUTO_INDEX 4 +#define CONTROL_MODE_TEST1_INDEX 5 +#define CONTROL_MODE_TEST2_INDEX 6 +#define CONTROL_MODE_TEST3_INDEX 7 UASControlWidget::UASControlWidget(QWidget *parent) : QWidget(parent), uas(0),