Skip to content
Snippets Groups Projects
Core.cc 7.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • pixhawk's avatar
    pixhawk committed
    /*=====================================================================
    
    
    pixhawk's avatar
    pixhawk committed
    QGroundControl Open Source Ground Control Station
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
    (c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
    This file is part of the QGROUNDCONTROL project
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        QGROUNDCONTROL is free software: you can redistribute it and/or modify
    
    pixhawk's avatar
    pixhawk committed
        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's avatar
    pixhawk committed
        QGROUNDCONTROL is distributed in the hope that it will be useful,
    
    pixhawk's avatar
    pixhawk committed
        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
    
    pixhawk's avatar
    pixhawk committed
        along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
    
    pixhawk's avatar
    pixhawk committed
    
    ======================================================================*/
    
    /**
     * @file
    
     *   @brief Implementation of class Core
    
    pixhawk's avatar
    pixhawk committed
     *
     *   @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>
    
    
    lm's avatar
    lm committed
    #include "configuration.h"
    
    pixhawk's avatar
    pixhawk committed
    #include "Core.h"
    #include "MG.h"
    #include "MainWindow.h"
    
    pixhawk's avatar
    pixhawk committed
    #include "GAudioOutput.h"
    
    pixhawk's avatar
    pixhawk committed
    
    
    #ifdef OPAL_RT
    #include "OpalLink.h"
    #endif
    
    pixhawk's avatar
    pixhawk committed
    #include "UDPLink.h"
    #include "MAVLinkSimulationLink.h"
    
    
    pixhawk's avatar
    pixhawk committed
    
    /**
     * @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
    Core::Core(int &argc, char* argv[]) : QApplication(argc, argv)
    
    pixhawk's avatar
    pixhawk committed
    {
    
    lm's avatar
    lm committed
        this->setApplicationName(QGC_APPLICATION_NAME);
        this->setApplicationVersion(QGC_APPLICATION_VERSION);
    
        this->setOrganizationName(QLatin1String("OPENMAV"));
    
        this->setOrganizationDomain("http://qgroundcontrol.org");
    
    
        // Check application settings
        // clear them if they mismatch
        // QGC then falls back to default
        QSettings settings;
    
        if (settings.contains("QGC_APPLICATION_VERSION_INT"))
        {
            QString qgcVersion = settings.value("QGC_APPLICATION_VERSION").toString();
            if (qgcVersion != QGC_APPLICATION_VERSION)
            {
                settings.clear();
            }
        }
        else
        {
            // If application version is not set, clear settings anyway
            settings.clear();
        }
        settings.sync();
    
    
        // 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));
    
    
    pixhawk's avatar
    pixhawk committed
        QSettings::setDefaultFormat(QSettings::IniFormat);
        // Exit main application when last window is closed
        connect(this, SIGNAL(lastWindowClosed()), this, SLOT(quit()));
    
    
        // Load application font
    
    pixhawk's avatar
    pixhawk committed
        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
        if(!QFile::exists(fontFileName)) printf("ERROR! font file: %s DOES NOT EXIST!\n", fontFileName.toStdString().c_str());
    
    pixhawk's avatar
    pixhawk committed
        fontDatabase.addApplicationFont(fontFileName);
    
        // 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));
    
    pixhawk's avatar
    pixhawk committed
    
        // Start the comm link manager
    
        splashScreen->showMessage(tr("Starting Communication Links"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
    
    pixhawk's avatar
    pixhawk committed
        startLinkManager();
    
        // Start the UAS Manager
    
        splashScreen->showMessage(tr("Starting UAS Manager"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
    
    pixhawk's avatar
    pixhawk committed
        startUASManager();
    
    
    pixhawk's avatar
    pixhawk committed
        //tarsus = new ViconTarsusProtocol();
        //tarsus->start();
    
    pixhawk's avatar
    pixhawk committed
    
        // Start the user interface
    
        splashScreen->showMessage(tr("Starting User Interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
    
        // Start UI
    
    pixhawk's avatar
    pixhawk committed
    
    
    pixhawk's avatar
    pixhawk committed
        // Connect links
        // to make sure that all components are initialized when the
        // first messages arrive
        UDPLink* udpLink = new UDPLink(QHostAddress::Any, 14550);
    
    pixhawk's avatar
    pixhawk committed
        // Listen on Multicast-Address 239.255.77.77, Port 14550
        //QHostAddress * multicast_udp = new QHostAddress("239.255.77.77");
        //UDPLink* udpLink = new UDPLink(*multicast_udp, 14550);
    
        //mainWindow->addLink(udpLink);
    
    #ifdef OPAL_RT
        // Add OpalRT Link, but do not connect
        OpalLink* opalLink = new OpalLink();
        //mainWindow->addLink(opalLink);
    #endif
        // MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(MG::DIR::getSupportFilesDirectory() + "/demo-log.txt");
        MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt");
    
        simulationLink->disconnect();
    
        //mainWindow->addLink(simulationLink);
    
    
    lm's avatar
    lm committed
        mainWindow = MainWindow::instance();
            // Remove splash screen
        splashScreen->finish(mainWindow);
    
    
    pixhawk's avatar
    pixhawk committed
        // Check if link could be connected
        if (!udpLink->connect())
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Critical);
    
            msgBox.setText("Could not connect UDP port. Is an instance of " + qAppName() + "already running?");
    
            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?");
    
    lm's avatar
    lm committed
            msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
            msgBox.setDefaultButton(QMessageBox::No);
    
    pixhawk's avatar
    pixhawk committed
            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)
            {
    
                //mainWindow->close();
                QTimer::singleShot(200, mainWindow, SLOT(close()));
    
    pixhawk's avatar
    pixhawk committed
    }
    
    /**
     * @brief Destructor for the groundstation. It destroys all loaded instances.
     *
     **/
    
    pixhawk's avatar
    pixhawk committed
    Core::~Core()
    
    pixhawk's avatar
    pixhawk committed
    {
    
    lm's avatar
    lm committed
        //mainWindow->storeSettings();
    
        mainWindow->hide();
        mainWindow->deleteLater();
    
    pixhawk's avatar
    pixhawk committed
        // 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
    void Core::startLinkManager()
    
    pixhawk's avatar
    pixhawk committed
    {
        LinkManager::instance();
    }
    
    /**
     * @brief Start the Unmanned Air System Manager
     *
     **/
    
    pixhawk's avatar
    pixhawk committed
    void Core::startUASManager()
    
    pixhawk's avatar
    pixhawk committed
    {
    
        // 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");
    
    
    lm's avatar
    lm committed
        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;
    
    lm's avatar
    lm committed
                //printf(QString("Loaded plugin from " + fileName + "\n").toStdString().c_str());
    
    pixhawk's avatar
    pixhawk committed
    }