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.
267 lines
8.9 KiB
267 lines
8.9 KiB
15 years ago
|
/*=====================================================================
|
||
|
|
||
15 years ago
|
QGroundControl Open Source Ground Control Station
|
||
15 years ago
|
|
||
15 years ago
|
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||
15 years ago
|
|
||
15 years ago
|
This file is part of the QGROUNDCONTROL project
|
||
15 years ago
|
|
||
15 years ago
|
QGROUNDCONTROL is free software: you can redistribute it and/or modify
|
||
15 years ago
|
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.
|
||
|
|
||
15 years ago
|
QGROUNDCONTROL is distributed in the hope that it will be useful,
|
||
15 years ago
|
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
|
||
15 years ago
|
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||
15 years ago
|
|
||
|
======================================================================*/
|
||
|
|
||
|
/**
|
||
|
* @file
|
||
14 years ago
|
* @brief Implementation of class QGCCore
|
||
15 years ago
|
*
|
||
|
* @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>
|
||
|
|
||
15 years ago
|
#include <QDebug>
|
||
|
|
||
15 years ago
|
#include "configuration.h"
|
||
15 years ago
|
#include "QGC.h"
|
||
14 years ago
|
#include "QGCCore.h"
|
||
15 years ago
|
#include "MG.h"
|
||
|
#include "MainWindow.h"
|
||
15 years ago
|
#include "GAudioOutput.h"
|
||
15 years ago
|
|
||
15 years ago
|
#ifdef OPAL_RT
|
||
|
#include "OpalLink.h"
|
||
|
#endif
|
||
15 years ago
|
#include "UDPLink.h"
|
||
|
#include "MAVLinkSimulationLink.h"
|
||
|
|
||
15 years ago
|
|
||
|
/**
|
||
|
* @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
|
||
|
**/
|
||
|
|
||
15 years ago
|
|
||
14 years ago
|
QGCCore::QGCCore(int &argc, char* argv[]) : QApplication(argc, argv)
|
||
15 years ago
|
{
|
||
15 years ago
|
|
||
|
|
||
15 years ago
|
// Set application name
|
||
15 years ago
|
this->setApplicationName(QGC_APPLICATION_NAME);
|
||
|
this->setApplicationVersion(QGC_APPLICATION_VERSION);
|
||
15 years ago
|
this->setOrganizationName(QLatin1String("OPENMAV"));
|
||
15 years ago
|
this->setOrganizationDomain("org.qgroundcontrol");
|
||
|
|
||
|
// Set settings format
|
||
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||
15 years ago
|
|
||
15 years ago
|
// Check application settings
|
||
|
// clear them if they mismatch
|
||
|
// QGC then falls back to default
|
||
|
QSettings settings;
|
||
15 years ago
|
|
||
15 years ago
|
// Show user an upgrade message if QGC got upgraded (see code below, after splash screen)
|
||
15 years ago
|
bool upgraded = false;
|
||
|
QString lastApplicationVersion("");
|
||
14 years ago
|
if (settings.contains("QGC_APPLICATION_VERSION")) {
|
||
15 years ago
|
QString qgcVersion = settings.value("QGC_APPLICATION_VERSION").toString();
|
||
14 years ago
|
if (qgcVersion != QGC_APPLICATION_VERSION) {
|
||
15 years ago
|
lastApplicationVersion = qgcVersion;
|
||
15 years ago
|
settings.clear();
|
||
15 years ago
|
// Write current application version
|
||
|
settings.setValue("QGC_APPLICATION_VERSION", QGC_APPLICATION_VERSION);
|
||
15 years ago
|
upgraded = true;
|
||
15 years ago
|
}
|
||
14 years ago
|
} else {
|
||
15 years ago
|
// If application version is not set, clear settings anyway
|
||
|
settings.clear();
|
||
15 years ago
|
// Write current application version
|
||
|
settings.setValue("QGC_APPLICATION_VERSION", QGC_APPLICATION_VERSION);
|
||
15 years ago
|
}
|
||
15 years ago
|
|
||
15 years ago
|
settings.sync();
|
||
|
|
||
15 years ago
|
// Show splash screen
|
||
|
QPixmap splashImage(":images/splash.png");
|
||
|
QSplashScreen* splashScreen = new QSplashScreen(splashImage, Qt::WindowStaysOnTopHint);
|
||
15 years ago
|
// Delete splash screen after mainWindow was displayed
|
||
|
splashScreen->setAttribute(Qt::WA_DeleteOnClose);
|
||
15 years ago
|
splashScreen->show();
|
||
|
splashScreen->showMessage(tr("Loading application fonts"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
|
||
|
|
||
15 years ago
|
// Exit main application when last window is closed
|
||
|
connect(this, SIGNAL(lastWindowClosed()), this, SLOT(quit()));
|
||
|
|
||
15 years ago
|
// Load application font
|
||
15 years ago
|
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";
|
||
15 years ago
|
if(!QFile::exists(fontFileName)) printf("ERROR! font file: %s DOES NOT EXIST!\n", fontFileName.toStdString().c_str());
|
||
15 years ago
|
fontDatabase.addApplicationFont(fontFileName);
|
||
15 years ago
|
// 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));
|
||
15 years ago
|
|
||
|
// Start the comm link manager
|
||
15 years ago
|
splashScreen->showMessage(tr("Starting Communication Links"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
|
||
15 years ago
|
startLinkManager();
|
||
|
|
||
|
// Start the UAS Manager
|
||
15 years ago
|
splashScreen->showMessage(tr("Starting UAS Manager"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
|
||
15 years ago
|
startUASManager();
|
||
|
|
||
15 years ago
|
//tarsus = new ViconTarsusProtocol();
|
||
|
//tarsus->start();
|
||
15 years ago
|
|
||
|
// Start the user interface
|
||
15 years ago
|
splashScreen->showMessage(tr("Starting User Interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
|
||
15 years ago
|
// Start UI
|
||
15 years ago
|
|
||
15 years ago
|
// Connect links
|
||
|
// to make sure that all components are initialized when the
|
||
|
// first messages arrive
|
||
|
UDPLink* udpLink = new UDPLink(QHostAddress::Any, 14550);
|
||
15 years ago
|
// 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);
|
||
15 years ago
|
//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");
|
||
15 years ago
|
simulationLink->disconnect();
|
||
15 years ago
|
//mainWindow->addLink(simulationLink);
|
||
|
|
||
15 years ago
|
mainWindow = MainWindow::instance();
|
||
15 years ago
|
|
||
|
// Remove splash screen
|
||
15 years ago
|
splashScreen->finish(mainWindow);
|
||
|
|
||
15 years ago
|
if (upgraded) mainWindow->showInfoMessage(tr("Default Settings Loaded"), tr("QGroundControl has been upgraded from version %1 to version %2. Some of your user preferences have been reset to defaults for safety reasons. Please adjust them where needed.").arg(lastApplicationVersion).arg(QGC_APPLICATION_VERSION));
|
||
|
|
||
15 years ago
|
// Check if link could be connected
|
||
14 years ago
|
if (!udpLink->connect()) {
|
||
15 years ago
|
QMessageBox msgBox;
|
||
|
msgBox.setIcon(QMessageBox::Critical);
|
||
15 years ago
|
msgBox.setText("Could not connect UDP port. Is an instance of " + qAppName() + "already running?");
|
||
15 years ago
|
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?");
|
||
15 years ago
|
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
|
||
|
msgBox.setDefaultButton(QMessageBox::No);
|
||
15 years ago
|
int ret = msgBox.exec();
|
||
|
|
||
|
// Close the message box shortly after the click to prevent accidental clicks
|
||
|
QTimer::singleShot(5000, &msgBox, SLOT(reject()));
|
||
|
|
||
|
// Exit application
|
||
14 years ago
|
if (ret == QMessageBox::Yes) {
|
||
15 years ago
|
//mainWindow->close();
|
||
|
QTimer::singleShot(200, mainWindow, SLOT(close()));
|
||
15 years ago
|
}
|
||
|
}
|
||
15 years ago
|
|
||
|
// forever
|
||
|
// {
|
||
|
// QGC::SLEEP::msleep(5000);
|
||
|
// }
|
||
|
|
||
|
// mainWindow->close();
|
||
|
// mainWindow->deleteLater();
|
||
|
// QGC::SLEEP::msleep(200);
|
||
15 years ago
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Destructor for the groundstation. It destroys all loaded instances.
|
||
|
*
|
||
|
**/
|
||
14 years ago
|
QGCCore::~QGCCore()
|
||
15 years ago
|
{
|
||
15 years ago
|
//mainWindow->storeSettings();
|
||
15 years ago
|
mainWindow->hide();
|
||
|
mainWindow->deleteLater();
|
||
15 years ago
|
// 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
|
||
|
**/
|
||
14 years ago
|
void QGCCore::startLinkManager()
|
||
15 years ago
|
{
|
||
|
LinkManager::instance();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Start the Unmanned Air System Manager
|
||
|
*
|
||
|
**/
|
||
14 years ago
|
void QGCCore::startUASManager()
|
||
15 years ago
|
{
|
||
15 years ago
|
// 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)
|
||
14 years ago
|
if (pluginsDir.dirName() == "MacOS") {
|
||
15 years ago
|
pluginsDir.cdUp();
|
||
|
pluginsDir.cdUp();
|
||
|
pluginsDir.cdUp();
|
||
|
}
|
||
|
#endif
|
||
|
pluginsDir.cd("plugins");
|
||
|
|
||
15 years ago
|
UASManager::instance();
|
||
15 years ago
|
|
||
|
// Load plugins
|
||
|
|
||
|
QStringList pluginFileNames;
|
||
|
|
||
14 years ago
|
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
|
||
15 years ago
|
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
|
||
|
QObject *plugin = loader.instance();
|
||
14 years ago
|
if (plugin) {
|
||
15 years ago
|
//populateMenus(plugin);
|
||
|
pluginFileNames += fileName;
|
||
15 years ago
|
//printf(QString("Loaded plugin from " + fileName + "\n").toStdString().c_str());
|
||
15 years ago
|
}
|
||
|
}
|
||
15 years ago
|
}
|
||
|
|
||
|
|