Core.cc 6.54 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
26
 *   @brief Implementation of class Core
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
    // 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?");
118
        msgBox.setInformativeText("You will not be able to receive data via UDP. Please check that you're running the right executable and then re-start " + qAppName() + ". Do you want to close the application?");
pixhawk's avatar
pixhawk committed
119 120 121 122 123 124 125 126 127 128
        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)
        {
129 130
            //mainWindow->close();
            QTimer::singleShot(200, mainWindow, SLOT(close()));
pixhawk's avatar
pixhawk committed
131 132 133
        }
    }

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

/**
 * @brief Destructor for the groundstation. It destroys all loaded instances.
 *
 **/
pixhawk's avatar
pixhawk committed
143
Core::~Core()
pixhawk's avatar
pixhawk committed
144 145 146 147 148 149 150 151 152 153 154 155
{
    // 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
156
void Core::startLinkManager()
pixhawk's avatar
pixhawk committed
157 158 159 160 161 162 163 164
{
    LinkManager::instance();
}

/**
 * @brief Start the Unmanned Air System Manager
 *
 **/
pixhawk's avatar
pixhawk committed
165
void Core::startUASManager()
pixhawk's avatar
pixhawk committed
166
{
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
    // Load UAS plugins
    QDir pluginsDir = QDir(qApp->applicationDirPath());

#if defined(Q_OS_WIN)
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
        pluginsDir.cdUp();
#elif defined(Q_OS_LINUX)
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
        pluginsDir.cdUp();
#elif defined(Q_OS_MAC)
    if (pluginsDir.dirName() == "MacOS")
    {
        pluginsDir.cdUp();
        pluginsDir.cdUp();
        pluginsDir.cdUp();
    }
#endif
    pluginsDir.cd("plugins");

    UASManager* m = UASManager::instance();

    // Load plugins

    QStringList pluginFileNames;

    foreach (QString fileName, pluginsDir.entryList(QDir::Files))
    {
        QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
        QObject *plugin = loader.instance();
        if (plugin)
        {
            //populateMenus(plugin);
            pluginFileNames += fileName;
            printf(QString("Loaded plugin from " + fileName + "\n").toStdString().c_str());
        }
    }
pixhawk's avatar
pixhawk committed
203 204 205
}