Core.cc 5.43 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*=====================================================================

PIXHAWK Micro Air Vehicle Flying Robotics Toolkit

(c) 2009, 2010 PIXHAWK PROJECT  <http://pixhawk.ethz.ch>

This file is part of the PIXHAWK project

    PIXHAWK 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.

    PIXHAWK 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 PIXHAWK. If not, see <http://www.gnu.org/licenses/>.

======================================================================*/

/**
 * @file
pixhawk's avatar
pixhawk committed
26
 *   @brief Implementation of main class
pixhawk's avatar
pixhawk committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
 *
 *   @author Lorenz Meier <mavteam@student.ethz.ch>
 *
 */


#include <QFile>
#include <QFlags>
#include <QThread>
#include <QSplashScreen>
#include <QPixmap>
#include <QDesktopWidget>
#include <QPainter>
#include <QStyleFactory>
#include <QAction>

pixhawk's avatar
pixhawk committed
43 44 45
#include "Core.h"
#include "MG.h"
#include "MainWindow.h"
pixhawk's avatar
pixhawk committed
46
#include "GAudioOutput.h"
pixhawk's avatar
pixhawk committed
47

pixhawk's avatar
pixhawk committed
48 49 50
#include "UDPLink.h"
#include "MAVLinkSimulationLink.h"

pixhawk's avatar
pixhawk committed
51 52 53 54 55 56 57 58 59 60 61

/**
 * @brief Constructor for the main application.
 *
 * This constructor initializes and starts the whole application. It takes standard
 * command-line parameters
 *
 * @param argc The number of command-line parameters
 * @param argv The string array of parameters
 **/

pixhawk's avatar
pixhawk committed
62
Core::Core(int &argc, char* argv[]) : QApplication(argc, argv)
pixhawk's avatar
pixhawk committed
63
{
pixhawk's avatar
pixhawk committed
64
    this->setApplicationName("QGroundControl");
65
    this->setApplicationVersion("v. 0.7.0 (Beta)");
pixhawk's avatar
pixhawk committed
66
    this->setOrganizationName(QLatin1String("OpenMAV Association"));
67 68 69 70 71 72 73 74
    this->setOrganizationDomain("http://qgroundcontrol.org");

    // Show splash screen
    QPixmap splashImage(":images/splash.png");
    QSplashScreen* splashScreen = new QSplashScreen(splashImage, Qt::WindowStaysOnTopHint);
    splashScreen->show();
    splashScreen->showMessage(tr("Loading application fonts"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));

pixhawk's avatar
pixhawk committed
75 76 77 78 79 80 81 82
    QSettings::setDefaultFormat(QSettings::IniFormat);
    // Exit main application when last window is closed
    connect(this, SIGNAL(lastWindowClosed()), this, SLOT(quit()));

    // Set 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";
Hugo Vincent's avatar
Hugo Vincent committed
83
    if(!QFile::exists(fontFileName)) printf("ERROR! font file: %s DOES NOT EXIST!\n", fontFileName.toStdString().c_str());
pixhawk's avatar
pixhawk committed
84 85 86 87
    fontDatabase.addApplicationFont(fontFileName);
    setFont(fontDatabase.font(fontFamilyName, "Roman", 12));

    // Start the comm link manager
88
    splashScreen->showMessage(tr("Starting Communication Links"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
pixhawk's avatar
pixhawk committed
89 90 91
    startLinkManager();

    // Start the UAS Manager
92
    splashScreen->showMessage(tr("Starting UAS Manager"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
pixhawk's avatar
pixhawk committed
93 94
    startUASManager();

pixhawk's avatar
pixhawk committed
95 96
    //tarsus = new ViconTarsusProtocol();
    //tarsus->start();
pixhawk's avatar
pixhawk committed
97 98

    // Start the user interface
99
    splashScreen->showMessage(tr("Starting User Interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
100 101
    // Start UI
    mainWindow = new MainWindow();
pixhawk's avatar
pixhawk committed
102 103 104 105

    // Remove splash screen
    splashScreen->finish(mainWindow);

pixhawk's avatar
pixhawk committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
    // Connect links
    // to make sure that all components are initialized when the
    // first messages arrive
    UDPLink* udpLink = new UDPLink(QHostAddress::Any, 14550);
    mainWindow->addLink(udpLink);

    // Check if link could be connected
    if (!udpLink->connect())
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Critical);
        msgBox.setText("Could not connect UDP port. Is already an instance of " + qAppName() + " running?");
        msgBox.setInformativeText("You will not be able to receive data via UDP. Do you want to close the application?");
        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
        msgBox.setDefaultButton(QMessageBox::Cancel);
        int ret = msgBox.exec();

        // Close the message box shortly after the click to prevent accidental clicks
        QTimer::singleShot(5000, &msgBox, SLOT(reject()));

        // Exit application
        if (ret == QMessageBox::Yes)
        {
            qDebug() << "EXITING";
            mainWindow->close();
            this->exit(EXIT_SUCCESS);
        }
    }

135 136
   // MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(MG::DIR::getSupportFilesDirectory() + "/demo-log.txt");
    MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt");
pixhawk's avatar
pixhawk committed
137
    mainWindow->addLink(simulationLink);
pixhawk's avatar
pixhawk committed
138 139 140 141 142 143
}

/**
 * @brief Destructor for the groundstation. It destroys all loaded instances.
 *
 **/
pixhawk's avatar
pixhawk committed
144
Core::~Core()
pixhawk's avatar
pixhawk committed
145 146 147 148 149 150 151 152 153 154 155 156
{
    // Delete singletons
    delete LinkManager::instance();
    delete UASManager::instance();
}

/**
 * @brief Start the link managing component.
 *
 * The link manager keeps track of all communication links and provides the global
 * packet queue. It is the main communication hub
 **/
pixhawk's avatar
pixhawk committed
157
void Core::startLinkManager()
pixhawk's avatar
pixhawk committed
158 159 160 161 162 163 164 165
{
    LinkManager::instance();
}

/**
 * @brief Start the Unmanned Air System Manager
 *
 **/
pixhawk's avatar
pixhawk committed
166
void Core::startUASManager()
pixhawk's avatar
pixhawk committed
167 168 169 170 171
{
    UASManager::instance();
}