You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1097 lines
31 KiB
1097 lines
31 KiB
/*===================================================================== |
|
|
|
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 Implementation of class MainWindow |
|
* @author Lorenz Meier <mail@qgroundcontrol.org> |
|
*/ |
|
|
|
#include <QSettings> |
|
#include <QDockWidget> |
|
#include <QNetworkInterface> |
|
#include <QMessageBox> |
|
#include <QDebug> |
|
#include <QTimer> |
|
#include <QHostInfo> |
|
|
|
#include "MG.h" |
|
#include "MAVLinkSimulationLink.h" |
|
#include "SerialLink.h" |
|
#include "UDPLink.h" |
|
#include "MAVLinkProtocol.h" |
|
#include "CommConfigurationWindow.h" |
|
#include "WaypointList.h" |
|
#include "MainWindow.h" |
|
#include "JoystickWidget.h" |
|
#include "GAudioOutput.h" |
|
#include "QMap3DWidget.h" |
|
|
|
// FIXME Move |
|
#include "PxQuadMAV.h" |
|
#include "SlugsMAV.h" |
|
|
|
|
|
#include "LogCompressor.h" |
|
|
|
/** |
|
* Create new mainwindow. The constructor instantiates all parts of the user |
|
* interface. It does NOT show the mainwindow. To display it, call the show() |
|
* method. |
|
* |
|
* @see QMainWindow::show() |
|
**/ |
|
MainWindow::MainWindow(QWidget *parent) : |
|
QMainWindow(parent), |
|
settings() |
|
{ |
|
this->hide(); |
|
this->setVisible(false); |
|
|
|
// Setup user interface |
|
ui.setupUi(this); |
|
|
|
buildWidgets(); |
|
|
|
connectWidgets(); |
|
|
|
arrangeCenterStack(); |
|
|
|
configureWindowName(); |
|
|
|
// Add status bar |
|
setStatusBar(createStatusBar()); |
|
|
|
// Set the application style (not the same as a style sheet) |
|
// Set the style to Plastique |
|
qApp->setStyle("plastique"); |
|
|
|
// Set style sheet as last step |
|
reloadStylesheet(); |
|
|
|
|
|
// Create actions |
|
connectActions(); |
|
|
|
// Load widgets and show application windowa |
|
loadWidgets(); |
|
|
|
// Adjust the size |
|
adjustSize(); |
|
} |
|
|
|
MainWindow::~MainWindow() |
|
{ |
|
delete statusBar; |
|
statusBar = NULL; |
|
} |
|
|
|
|
|
void MainWindow::buildWidgets() |
|
{ |
|
//FIXME: memory of acceptList will never be freed again |
|
QStringList* acceptList = new QStringList(); |
|
acceptList->append("roll IMU"); |
|
acceptList->append("pitch IMU"); |
|
acceptList->append("yaw IMU"); |
|
acceptList->append("rollspeed IMU"); |
|
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(); |
|
|
|
// Center widgets |
|
linechartWidget = new Linecharts(this); |
|
hudWidget = new HUD(640, 480, this); |
|
mapWidget = new MapWidget(this); |
|
protocolWidget = new XMLCommProtocolWidget(this); |
|
dataplotWidget = new QGCDataPlot2D(this); |
|
map3DWidget = new QMap3DWidget(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(); |
|
|
|
} |
|
|
|
/** |
|
* Connect all signals and slots of the main window widgets |
|
*/ |
|
void MainWindow::connectWidgets() |
|
{ |
|
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))); |
|
} |
|
if (mapWidget && waypointsDockWidget->widget()) |
|
{ |
|
// clear path create on the map |
|
connect(waypointsDockWidget->widget(), SIGNAL(clearPathclicked()), mapWidget, SLOT(clearPath())); |
|
// add Waypoint widget in the WaypointList widget when mouse clicked |
|
connect(mapWidget, SIGNAL(captureMapCoordinateClick(QPointF)), waypointsDockWidget->widget(), SLOT(addWaypointMouse(QPointF))); |
|
// it notifies that a waypoint global goes to do create |
|
connect(mapWidget, SIGNAL(createGlobalWP(bool)), waypointsDockWidget->widget(), SLOT(setIsWPGlobal(bool))); |
|
connect(mapWidget, SIGNAL(sendGeometryEndDrag(QPointF,int)), waypointsDockWidget->widget(), SLOT(waypointGlobalChanged(QPointF,int)) ); |
|
} |
|
} |
|
|
|
void MainWindow::arrangeCenterStack() |
|
{ |
|
|
|
QStackedWidget *centerStack = new QStackedWidget(this); |
|
if (!centerStack) return; |
|
|
|
if (linechartWidget) centerStack->addWidget(linechartWidget); |
|
if (protocolWidget) centerStack->addWidget(protocolWidget); |
|
if (mapWidget) centerStack->addWidget(mapWidget); |
|
if (map3DWidget) centerStack->addWidget(map3DWidget); |
|
if (hudWidget) centerStack->addWidget(hudWidget); |
|
if (dataplotWidget) centerStack->addWidget(dataplotWidget); |
|
|
|
setCentralWidget(centerStack); |
|
} |
|
|
|
void MainWindow::configureWindowName() |
|
{ |
|
QList<QHostAddress> hostAddresses = QNetworkInterface::allAddresses(); |
|
QString windowname = qApp->applicationName() + " " + qApp->applicationVersion(); |
|
bool prevAddr = false; |
|
|
|
windowname.append(" (" + QHostInfo::localHostName() + ": "); |
|
|
|
for (int i = 0; i < hostAddresses.size(); i++) |
|
{ |
|
// Exclude loopback IPv4 and all IPv6 addresses |
|
if (hostAddresses.at(i) != QHostAddress("127.0.0.1") && !hostAddresses.at(i).toString().contains(":")) |
|
{ |
|
if(prevAddr) windowname.append("/"); |
|
windowname.append(hostAddresses.at(i).toString()); |
|
prevAddr = true; |
|
} |
|
} |
|
|
|
windowname.append(")"); |
|
|
|
setWindowTitle(windowname); |
|
|
|
#ifndef Q_WS_MAC |
|
//qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png")); |
|
#endif |
|
} |
|
|
|
QStatusBar* MainWindow::createStatusBar() |
|
{ |
|
QStatusBar* bar = new QStatusBar(); |
|
/* Add status fields and messages */ |
|
/* Enable resize grip in the bottom right corner */ |
|
bar->setSizeGripEnabled(true); |
|
return bar; |
|
} |
|
|
|
void MainWindow::startVideoCapture() |
|
{ |
|
QString format = "bmp"; |
|
QString initialPath = QDir::currentPath() + tr("/untitled.") + format; |
|
|
|
QString screenFileName = QFileDialog::getSaveFileName(this, tr("Save As"), |
|
initialPath, |
|
tr("%1 Files (*.%2);;All Files (*)") |
|
.arg(format.toUpper()) |
|
.arg(format)); |
|
delete videoTimer; |
|
videoTimer = new QTimer(this); |
|
//videoTimer->setInterval(40); |
|
//connect(videoTimer, SIGNAL(timeout()), this, SLOT(saveScreen())); |
|
//videoTimer->stop(); |
|
} |
|
|
|
void MainWindow::stopVideoCapture() |
|
{ |
|
videoTimer->stop(); |
|
|
|
// TODO Convert raw images to PNG |
|
} |
|
|
|
void MainWindow::saveScreen() |
|
{ |
|
QPixmap window = QPixmap::grabWindow(this->winId()); |
|
QString format = "bmp"; |
|
|
|
if (!screenFileName.isEmpty()) |
|
{ |
|
window.save(screenFileName, format.toAscii()); |
|
} |
|
} |
|
|
|
/** |
|
* Reload the style sheet from disk. The function tries to load "qgroundcontrol.css" from the application |
|
* directory (which by default does not exist). If it fails, it will load the bundled default CSS |
|
* from memory. |
|
* To customize the application, just create a qgroundcontrol.css file in the application directory |
|
*/ |
|
void MainWindow::reloadStylesheet() |
|
{ |
|
// Load style sheet |
|
QFile* styleSheet = new QFile(QCoreApplication::applicationDirPath() + "/qgroundcontrol.css"); |
|
if (!styleSheet->exists()) |
|
{ |
|
styleSheet = new QFile(":/images/style-mission.css"); |
|
} |
|
if (styleSheet->open(QIODevice::ReadOnly | QIODevice::Text)) |
|
{ |
|
QString style = QString(styleSheet->readAll()); |
|
style.replace("ICONDIR", QCoreApplication::applicationDirPath()+ "/images/"); |
|
qApp->setStyleSheet(style); |
|
} |
|
else |
|
{ |
|
qDebug() << "Style not set:" << styleSheet->fileName() << "opened: " << styleSheet->isOpen(); |
|
} |
|
delete styleSheet; |
|
} |
|
|
|
void MainWindow::showStatusMessage(const QString& status, int timeout) |
|
{ |
|
statusBar->showMessage(status, timeout); |
|
} |
|
|
|
void MainWindow::showStatusMessage(const QString& status) |
|
{ |
|
statusBar->showMessage(status, 5); |
|
} |
|
|
|
/** |
|
* @brief Create all actions associated to the main window |
|
* |
|
**/ |
|
void MainWindow::connectActions() |
|
{ |
|
// Connect actions from ui |
|
connect(ui.actionAdd_Link, SIGNAL(triggered()), this, SLOT(addLink())); |
|
|
|
// Connect internal actions |
|
connect(UASManager::instance(), SIGNAL(UASCreated(UASInterface*)), this, SLOT(UASCreated(UASInterface*))); |
|
|
|
// Connect user interface controls |
|
connect(ui.actionLiftoff, SIGNAL(triggered()), UASManager::instance(), SLOT(launchActiveUAS())); |
|
connect(ui.actionLand, SIGNAL(triggered()), UASManager::instance(), SLOT(returnActiveUAS())); |
|
connect(ui.actionEmergency_Land, SIGNAL(triggered()), UASManager::instance(), SLOT(stopActiveUAS())); |
|
connect(ui.actionEmergency_Kill, SIGNAL(triggered()), UASManager::instance(), SLOT(killActiveUAS())); |
|
|
|
connect(ui.actionConfiguration, SIGNAL(triggered()), UASManager::instance(), SLOT(configureActiveUAS())); |
|
|
|
// User interface actions |
|
connect(ui.actionPilotView, SIGNAL(triggered()), this, SLOT(loadPilotView())); |
|
connect(ui.actionEngineerView, SIGNAL(triggered()), this, SLOT(loadEngineerView())); |
|
connect(ui.actionOperatorView, SIGNAL(triggered()), this, SLOT(loadOperatorView())); |
|
connect(ui.action3DView, SIGNAL(triggered()), this, SLOT(load3DView())); |
|
connect(ui.actionShow_full_view, SIGNAL(triggered()), this, SLOT(loadAllView())); |
|
connect(ui.actionShow_MAVLink_view, SIGNAL(triggered()), this, SLOT(loadMAVLinkView())); |
|
connect(ui.actionShow_data_analysis_view, SIGNAL(triggered()), this, SLOT(loadDataView())); |
|
connect(ui.actionStyleConfig, SIGNAL(triggered()), this, SLOT(reloadStylesheet())); |
|
|
|
connect(ui.actionOnline_documentation, SIGNAL(triggered()), this, SLOT(showHelp())); |
|
connect(ui.actionCredits_Developers, SIGNAL(triggered()), this, SLOT(showCredits())); |
|
connect(ui.actionProject_Roadmap, SIGNAL(triggered()), this, SLOT(showRoadMap())); |
|
|
|
// Joystick configuration |
|
connect(ui.actionJoystickSettings, SIGNAL(triggered()), this, SLOT(configure())); |
|
|
|
|
|
} |
|
|
|
void MainWindow::showHelp() |
|
{ |
|
if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/user_guide"))) |
|
{ |
|
QMessageBox msgBox; |
|
msgBox.setIcon(QMessageBox::Critical); |
|
msgBox.setText("Could not open help in browser"); |
|
msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/user_guide in a browser."); |
|
msgBox.setStandardButtons(QMessageBox::Ok); |
|
msgBox.setDefaultButton(QMessageBox::Ok); |
|
msgBox.exec(); |
|
} |
|
} |
|
|
|
void MainWindow::showCredits() |
|
{ |
|
if(!QDesktopServices::openUrl(QUrl("http://qgroundcontrol.org/credits"))) |
|
{ |
|
QMessageBox msgBox; |
|
msgBox.setIcon(QMessageBox::Critical); |
|
msgBox.setText("Could not open credits in browser"); |
|
msgBox.setInformativeText("To get to the online help, please open http://qgroundcontrol.org/credits in a browser."); |
|
msgBox.setStandardButtons(QMessageBox::Ok); |
|
msgBox.setDefaultButton(QMessageBox::Ok); |
|
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(); |
|
} |
|
} |
|
|
|
void MainWindow::configure() |
|
{ |
|
joystickWidget = new JoystickWidget(joystick, this); |
|
} |
|
|
|
void MainWindow::addLink() |
|
{ |
|
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(); |
|
|
|
// TODO Implement the link removal! |
|
} |
|
|
|
void MainWindow::addLink(LinkInterface *link) |
|
{ |
|
LinkManager::instance()->addProtocol(link, mavlink); |
|
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))); |
|
connect(ui.actionSimulate, SIGNAL(triggered(bool)), sim, SLOT(connectLink(bool))); |
|
} |
|
} |
|
|
|
void MainWindow::UASCreated(UASInterface* uas) |
|
{ |
|
// 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) |
|
{ |
|
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 |
|
if (infoDockWidget) |
|
{ |
|
UASInfoWidget *infoWidget = dynamic_cast<UASInfoWidget*>(infoDockWidget->widget()); |
|
if (infoWidget) |
|
{ |
|
infoWidget->addUAS(uas); |
|
} |
|
} |
|
|
|
// UAS List |
|
if (listDockWidget) |
|
{ |
|
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(); |
|
|
|
// Check which type this UAS is of |
|
PxQuadMAV* mav = dynamic_cast<PxQuadMAV*>(uas); |
|
if (mav) loadPixhawkView(); |
|
SlugsMAV* mav2 = dynamic_cast<SlugsMAV*>(uas); |
|
if (mav2) loadSlugsView(); |
|
|
|
} |
|
} |
|
|
|
/** |
|
* Clears the current view completely |
|
*/ |
|
void MainWindow::clearView() |
|
{ |
|
// Halt HUD |
|
if (hudWidget) hudWidget->stop(); |
|
// Disable linechart |
|
if (linechartWidget) linechartWidget->setActive(false); |
|
// Halt HDDs |
|
if (headDown1DockWidget) |
|
{ |
|
HDDisplay* hddWidget = dynamic_cast<HDDisplay*>( headDown1DockWidget->widget() ); |
|
if (hddWidget) hddWidget->stop(); |
|
} |
|
if (headDown2DockWidget) |
|
{ |
|
HDDisplay* hddWidget = dynamic_cast<HDDisplay*>( headDown2DockWidget->widget() ); |
|
if (hddWidget) hddWidget->stop(); |
|
} |
|
// Halt HSI |
|
if (hsiDockWidget) |
|
{ |
|
HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); |
|
if (hsi) hsi->stop(); |
|
} |
|
|
|
// Remove all dock widgets from main window |
|
QObjectList childList( this->children() ); |
|
|
|
QObjectList::iterator i; |
|
QDockWidget* dockWidget; |
|
for (i = childList.begin(); i != childList.end(); ++i) |
|
{ |
|
dockWidget = dynamic_cast<QDockWidget*>(*i); |
|
if (dockWidget) |
|
{ |
|
// 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? |
|
} |
|
} |
|
} |
|
|
|
void MainWindow::loadSlugsView() |
|
{ |
|
clearView(); |
|
// Engineer view, used in EMAV2009 |
|
|
|
// LINE CHART |
|
if (linechartWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
linechartWidget->setActive(true); |
|
centerStack->setCurrentWidget(linechartWidget); |
|
} |
|
} |
|
|
|
// UAS CONTROL |
|
if (controlDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); |
|
controlDockWidget->show(); |
|
} |
|
|
|
// UAS LIST |
|
if (listDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); |
|
listDockWidget->show(); |
|
} |
|
|
|
// UAS STATUS |
|
if (infoDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); |
|
infoDockWidget->show(); |
|
} |
|
|
|
// HORIZONTAL SITUATION INDICATOR |
|
if (hsiDockWidget) |
|
{ |
|
HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); |
|
if (hsi) |
|
{ |
|
hsi->start(); |
|
addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); |
|
hsiDockWidget->show(); |
|
} |
|
} |
|
|
|
// WAYPOINT LIST |
|
if (waypointsDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); |
|
waypointsDockWidget->show(); |
|
} |
|
|
|
// DEBUG CONSOLE |
|
if (debugConsoleDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); |
|
debugConsoleDockWidget->show(); |
|
} |
|
|
|
// ONBOARD PARAMETERS |
|
if (parametersDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); |
|
parametersDockWidget->show(); |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadPixhawkView() |
|
{ |
|
clearView(); |
|
// Engineer view, used in EMAV2009 |
|
|
|
// LINE CHART |
|
if (linechartWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
linechartWidget->setActive(true); |
|
centerStack->setCurrentWidget(linechartWidget); |
|
} |
|
} |
|
|
|
// UAS CONTROL |
|
if (controlDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); |
|
controlDockWidget->show(); |
|
} |
|
|
|
// UAS LIST |
|
if (listDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); |
|
listDockWidget->show(); |
|
} |
|
|
|
// UAS STATUS |
|
if (infoDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); |
|
infoDockWidget->show(); |
|
} |
|
|
|
// WAYPOINT LIST |
|
if (waypointsDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); |
|
waypointsDockWidget->show(); |
|
} |
|
|
|
// HORIZONTAL SITUATION INDICATOR |
|
if (hsiDockWidget) |
|
{ |
|
HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); |
|
if (hsi) |
|
{ |
|
hsi->start(); |
|
addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget); |
|
hsiDockWidget->show(); |
|
} |
|
} |
|
|
|
// DEBUG CONSOLE |
|
if (debugConsoleDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); |
|
debugConsoleDockWidget->show(); |
|
} |
|
|
|
// RADIO CONTROL VIEW |
|
if (rcViewDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, rcViewDockWidget); |
|
rcViewDockWidget->show(); |
|
} |
|
|
|
// ONBOARD PARAMETERS |
|
if (parametersDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); |
|
parametersDockWidget->show(); |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadDataView() |
|
{ |
|
clearView(); |
|
|
|
// DATAPLOT |
|
if (dataplotWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
centerStack->setCurrentWidget(dataplotWidget); |
|
} |
|
} |
|
|
|
void MainWindow::loadDataView(QString fileName) |
|
{ |
|
clearView(); |
|
|
|
// DATAPLOT |
|
if (dataplotWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
centerStack->setCurrentWidget(dataplotWidget); |
|
dataplotWidget->loadFile(fileName); |
|
} |
|
} |
|
} |
|
|
|
void MainWindow::loadPilotView() |
|
{ |
|
clearView(); |
|
|
|
// HEAD UP DISPLAY |
|
if (hudWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
centerStack->setCurrentWidget(hudWidget); |
|
hudWidget->start(); |
|
} |
|
} |
|
|
|
//connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)), pfd, SLOT(setActiveUAS(UASInterface*))); |
|
if (headDown1DockWidget) |
|
{ |
|
HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown1DockWidget->widget()); |
|
if (hdd) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, headDown1DockWidget); |
|
headDown1DockWidget->show(); |
|
hdd->start(); |
|
} |
|
|
|
} |
|
if (headDown2DockWidget) |
|
{ |
|
HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown2DockWidget->widget()); |
|
if (hdd) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, headDown2DockWidget); |
|
headDown2DockWidget->show(); |
|
hdd->start(); |
|
} |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadOperatorView() |
|
{ |
|
clearView(); |
|
|
|
// MAP |
|
if (mapWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
centerStack->setCurrentWidget(mapWidget); |
|
} |
|
} |
|
// UAS CONTROL |
|
if (controlDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); |
|
controlDockWidget->show(); |
|
} |
|
|
|
// UAS LIST |
|
if (listDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); |
|
listDockWidget->show(); |
|
} |
|
|
|
// UAS STATUS |
|
if (infoDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); |
|
infoDockWidget->show(); |
|
} |
|
|
|
// WAYPOINT LIST |
|
if (waypointsDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); |
|
waypointsDockWidget->show(); |
|
} |
|
|
|
// HORIZONTAL SITUATION INDICATOR |
|
if (hsiDockWidget) |
|
{ |
|
HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); |
|
if (hsi) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, hsiDockWidget); |
|
hsiDockWidget->show(); |
|
hsi->start(); |
|
} |
|
} |
|
|
|
// OBJECT DETECTION |
|
if (detectionDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, detectionDockWidget); |
|
detectionDockWidget->show(); |
|
} |
|
|
|
// PROCESS CONTROL |
|
if (watchdogControlDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, watchdogControlDockWidget); |
|
watchdogControlDockWidget->show(); |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::load3DView() |
|
{ |
|
clearView(); |
|
|
|
// 3D map |
|
if (map3DWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
//map3DWidget->setActive(true); |
|
centerStack->setCurrentWidget(map3DWidget); |
|
} |
|
} |
|
|
|
// UAS CONTROL |
|
if (controlDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); |
|
controlDockWidget->show(); |
|
} |
|
|
|
// UAS LIST |
|
if (listDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); |
|
listDockWidget->show(); |
|
} |
|
|
|
// WAYPOINT LIST |
|
if (waypointsDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); |
|
waypointsDockWidget->show(); |
|
} |
|
|
|
// HORIZONTAL SITUATION INDICATOR |
|
if (hsiDockWidget) |
|
{ |
|
HSIDisplay* hsi = dynamic_cast<HSIDisplay*>( hsiDockWidget->widget() ); |
|
if (hsi) |
|
{ |
|
hsi->start(); |
|
addDockWidget(Qt::LeftDockWidgetArea, hsiDockWidget); |
|
hsiDockWidget->show(); |
|
} |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadEngineerView() |
|
{ |
|
clearView(); |
|
// Engineer view, used in EMAV2009 |
|
|
|
// LINE CHART |
|
if (linechartWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
linechartWidget->setActive(true); |
|
centerStack->setCurrentWidget(linechartWidget); |
|
} |
|
} |
|
|
|
// UAS CONTROL |
|
if (controlDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); |
|
controlDockWidget->show(); |
|
} |
|
|
|
// UAS LIST |
|
if (listDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); |
|
listDockWidget->show(); |
|
} |
|
|
|
// UAS STATUS |
|
if (infoDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); |
|
infoDockWidget->show(); |
|
} |
|
|
|
// WAYPOINT LIST |
|
if (waypointsDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); |
|
waypointsDockWidget->show(); |
|
} |
|
|
|
// DEBUG CONSOLE |
|
if (debugConsoleDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); |
|
debugConsoleDockWidget->show(); |
|
} |
|
|
|
// ONBOARD PARAMETERS |
|
if (parametersDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); |
|
parametersDockWidget->show(); |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadMAVLinkView() |
|
{ |
|
clearView(); |
|
|
|
if (protocolWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
centerStack->setCurrentWidget(protocolWidget); |
|
} |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadAllView() |
|
{ |
|
clearView(); |
|
|
|
if (headDown1DockWidget) |
|
{ |
|
HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown1DockWidget->widget()); |
|
if (hdd) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, headDown1DockWidget); |
|
headDown1DockWidget->show(); |
|
hdd->start(); |
|
} |
|
|
|
} |
|
if (headDown2DockWidget) |
|
{ |
|
HDDisplay *hdd = dynamic_cast<HDDisplay*>(headDown2DockWidget->widget()); |
|
if (hdd) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, headDown2DockWidget); |
|
headDown2DockWidget->show(); |
|
hdd->start(); |
|
} |
|
} |
|
|
|
// UAS CONTROL |
|
if (controlDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, controlDockWidget); |
|
controlDockWidget->show(); |
|
} |
|
|
|
// UAS LIST |
|
if (listDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, listDockWidget); |
|
listDockWidget->show(); |
|
} |
|
|
|
// UAS STATUS |
|
if (infoDockWidget) |
|
{ |
|
addDockWidget(Qt::LeftDockWidgetArea, infoDockWidget); |
|
infoDockWidget->show(); |
|
} |
|
|
|
// WAYPOINT LIST |
|
if (waypointsDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, waypointsDockWidget); |
|
waypointsDockWidget->show(); |
|
} |
|
|
|
// DEBUG CONSOLE |
|
if (debugConsoleDockWidget) |
|
{ |
|
addDockWidget(Qt::BottomDockWidgetArea, debugConsoleDockWidget); |
|
debugConsoleDockWidget->show(); |
|
} |
|
|
|
// OBJECT DETECTION |
|
if (detectionDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, detectionDockWidget); |
|
detectionDockWidget->show(); |
|
} |
|
|
|
// LINE CHART |
|
if (linechartWidget) |
|
{ |
|
QStackedWidget *centerStack = dynamic_cast<QStackedWidget*>(centralWidget()); |
|
if (centerStack) |
|
{ |
|
linechartWidget->setActive(true); |
|
centerStack->setCurrentWidget(linechartWidget); |
|
} |
|
} |
|
|
|
// ONBOARD PARAMETERS |
|
if (parametersDockWidget) |
|
{ |
|
addDockWidget(Qt::RightDockWidgetArea, parametersDockWidget); |
|
parametersDockWidget->show(); |
|
} |
|
|
|
this->show(); |
|
} |
|
|
|
void MainWindow::loadWidgets() |
|
{ |
|
//loadOperatorView(); |
|
loadEngineerView(); |
|
//loadPilotView(); |
|
}
|
|
|