diff --git a/.gitignore b/.gitignore index 0637d11b3b6eeec8db06d147c1f82a186f2db6c8..15d9c7e7df97da1d4e0d1cff1cdf787f3db9740c 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ qgroundcontrol qgroundcontrol.xcodeproj/** doc/html doc/doxy.log +deploy/mac +deploy/linux diff --git a/deploy/linux_create_debian_packet.sh b/deploy/linux_create_debian_packet.sh new file mode 100644 index 0000000000000000000000000000000000000000..8bd436bbd622ca8bc1d0574d71b64a22a17be768 --- /dev/null +++ b/deploy/linux_create_debian_packet.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# Clean build directories +rm -rf linux +mkdir -p linux +# Change to build directory and compile application +cd .. +make -j4 +# Copy and build the application bundle +cd deploy +cp -r qgroundcontrol linux/. +cp -r ../audio linux/. +# FIXME Create debian packet +echo -e '\n QGroundControl Debian packet is now ready for publishing\n' diff --git a/deploy/mac_create_dmg.sh b/deploy/mac_create_dmg.sh new file mode 100644 index 0000000000000000000000000000000000000000..1994ed0714cffcecc7c86c29dc4d13cd35a68b53 --- /dev/null +++ b/deploy/mac_create_dmg.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# Clean build directories +rm -rf mac +mkdir -p mac +# Change to build directory and compile application +cd .. +make -j4 +# Copy and build the application bundle +cd deploy +cp -r ../bin/mac/qgroundcontrol.app mac/. +cp -r ../audio mac/qgroundcontrol.app/Contents/MacOs/. +macdeployqt qgroundcontrol.app --bundle +echo -e '\n QGroundControl .DMG file is now ready for publishing\n' diff --git a/mac_audiotest.sh b/mac_audiotest.sh new file mode 100644 index 0000000000000000000000000000000000000000..12cd0fa3431c28d03f859a803e9a19a723339930 --- /dev/null +++ b/mac_audiotest.sh @@ -0,0 +1,2 @@ +#!/bin/sh +cp -r audio bin/mac/qgroundcontrol.app/Contents/MacOs/. diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 6259ceb009ca4e6e28ba89d329477011b1d6afcf..65f7c533bfaa961c7720f8f6f05f18c1d9984390 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -216,18 +216,28 @@ void MainWindow::saveScreen() } } +/** + * 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(MG::DIR::getSupportFilesDirectory() + "/images/style-mission.css"); - QFile styleSheet(":/images/style-mission.css"); - if (styleSheet.open(QIODevice::ReadOnly | QIODevice::Text)) { - QString style = QString(styleSheet.readAll()); - style.replace("ICONDIR", MG::DIR::getIconDirectory()); + 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(); + qDebug() << "Style not set:" << styleSheet->fileName() << "opened: " << styleSheet->isOpen(); } + delete styleSheet; } void MainWindow::showStatusMessage(const QString& status, int timeout) @@ -235,14 +245,9 @@ void MainWindow::showStatusMessage(const QString& status, int timeout) statusBar->showMessage(status, timeout); } -void MainWindow::setLastAction(QString status) -{ - showStatusMessage(status, 5); -} - -void MainWindow::setLinkStatus(QString status) +void MainWindow::showStatusMessage(const QString& status) { - showStatusMessage(status, 15); + statusBar->showMessage(status, 5); } /** @@ -270,6 +275,7 @@ void MainWindow::connectActions() connect(ui.actionEngineerView, SIGNAL(triggered()), this, SLOT(loadEngineerView())); connect(ui.actionOperatorView, SIGNAL(triggered()), this, SLOT(loadOperatorView())); connect(ui.actionSettingsView, SIGNAL(triggered()), this, SLOT(loadSettingsView())); + connect(ui.actionShow_full_view, SIGNAL(triggered()), this, SLOT(loadAllView())); connect(ui.actionStyleConfig, SIGNAL(triggered()), this, SLOT(reloadStylesheet())); // Joystick configuration @@ -501,28 +507,65 @@ void MainWindow::loadEngineerView() void MainWindow::loadAllView() { + clearView(); + GAudioOutput::instance()->say("Loaded complete view"); + + 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(); + + // UAS CONTROL + QDockWidget* containerControl = new QDockWidget(tr("Control"), this); + containerControl->setWidget(control); + addDockWidget(Qt::LeftDockWidgetArea, containerControl); + + // UAS LIST + QDockWidget* containerUASList = new QDockWidget(tr("Unmanned Systems"), this); + containerUASList->setWidget(list); + addDockWidget(Qt::BottomDockWidgetArea, containerUASList); + + // UAS STATUS + QDockWidget* containerStatus = new QDockWidget(tr("Status Details"), this); + containerStatus->setWidget(info); + addDockWidget(Qt::LeftDockWidgetArea, containerStatus); + + // WAYPOINT LIST + QDockWidget* containerWaypoints = new QDockWidget(tr("Waypoint List"), this); + containerWaypoints->setWidget(waypoints); + addDockWidget(Qt::BottomDockWidgetArea, containerWaypoints); + + // DEBUG CONSOLE + QDockWidget* containerComm = new QDockWidget(tr("Communication Console"), this); + containerComm->setWidget(debugConsole); + addDockWidget(Qt::BottomDockWidgetArea, containerComm); + + // OBJECT DETECTION + QDockWidget* containerObjRec = new QDockWidget(tr("Object Recognition"), this); + containerObjRec->setWidget(detection); + addDockWidget(Qt::RightDockWidgetArea, containerObjRec); + + // LINE CHART + linechart->setActive(true); + centerStack->setCurrentWidget(linechart); + + // ONBOARD PARAMETERS + QDockWidget* containerParams = new QDockWidget(tr("Onboard Parameters"), this); + containerParams->setWidget(parameters); + addDockWidget(Qt::RightDockWidgetArea, containerParams); + + this->show(); } void MainWindow::loadWidgets() { - loadOperatorView(); - //loadEngineerView(); + //loadOperatorView(); + loadEngineerView(); //loadPilotView(); } - -/* -void MainWindow::removeCommConfAct(QAction* action) -{ - ui.menuNetwork->removeAction(action); -}*/ - -void MainWindow::runTests() -{ - // TODO Remove after debugging: Add fake data - static double testvalue = 0.0f; - testvalue += 0.01f; - linechart->appendData(126, "test data", testvalue, MG::TIME::getGroundTimeNow()); -} - - diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 8418eeed9a2bce5c5d9a7e47ed296d71b81b5a97..9e0a43e696a04e03ec12f679cc0f394872900ad7 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -76,32 +76,6 @@ public: MainWindow(QWidget *parent = 0); ~MainWindow(); - QSettings settings; - UASControlWidget* control; - LinechartWidget* linechart; - UASInfoWidget* info; - CameraView* camera; - UASListWidget* list; - WaypointList* waypoints; - ObjectDetectionView* detection; - HUD* hud; - PFD* pfd; - GaugePanel* gaugePanel; - - // Popup widgets - JoystickWidget* joystickWidget; - - JoystickInput* joystick; - - /** User interface actions **/ - QAction* connectUASAct; - QAction* disconnectUASAct; - QAction* startUASAct; - QAction* returnUASAct; - QAction* stopUASAct; - QAction* killUASAct; - QAction* simulateUASAct; - public slots: /** * @brief Shows a status message on the bottom status bar @@ -112,8 +86,15 @@ public slots: * @param timeout how long the status should be displayed */ void showStatusMessage(const QString& status, int timeout); - void setLastAction(QString status); - void setLinkStatus(QString status); + /** + * @brief Shows a status message on the bottom status bar + * + * The status message will be overwritten if a new message is posted to this function. + * it will be automatically hidden after 5 seconds. + * + * @param status message text + */ + void showStatusMessage(const QString& status); void addLink(); void addLink(LinkInterface* link); void configure(); @@ -133,10 +114,8 @@ public slots: /** @brief Load view with all widgets */ void loadAllView(); + /** @brief Reload the CSS style sheet */ void reloadStylesheet(); - - void runTests(); - protected: QStatusBar* statusBar; QStatusBar* createStatusBar(); @@ -151,16 +130,39 @@ protected: MAVLinkSimulationLink* simulationLink; LinkInterface* udpLink; - QDockWidget* controlDock; - QStackedWidget* centerStack; - + QSettings settings; + UASControlWidget* control; + LinechartWidget* 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; + GaugePanel* gaugePanel; + // Popup widgets + JoystickWidget* joystickWidget; + + JoystickInput* joystick; + + /** User interface actions **/ + QAction* connectUASAct; + QAction* disconnectUASAct; + QAction* startUASAct; + QAction* returnUASAct; + QAction* stopUASAct; + QAction* killUASAct; + QAction* simulateUASAct; + + QDockWidget* controlDock; + QStackedWidget* centerStack; LogCompressor* comp; QString screenFileName; diff --git a/src/ui/MainWindow.ui b/src/ui/MainWindow.ui index 8176b97ceb882832fc13f3e533bfc4d4c4c8fb6b..d77e4f297c5eced3d9e0484f34d9a234fa6fe96e 100644 --- a/src/ui/MainWindow.ui +++ b/src/ui/MainWindow.ui @@ -74,6 +74,7 @@ + @@ -243,6 +244,15 @@ Simulate one vehicle to test and evaluate this application + + + + :/images/status/network-transmit-receive.svg:/images/status/network-transmit-receive.svg + + + Show full view + +