Commit 33220de0 authored by Don Gagne's avatar Don Gagne

Saved files location support

- Also renamed QGCCore->QGCApplication to better reflect usage.
- New global qgcApp api to access main QHCApplication singleton
parent 75b4bd0a
/*=====================================================================
QGroundControl Open Source Ground Control Station
QGroundControl Open Source Ground Control Station
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -19,11 +19,11 @@ This file is part of the QGROUNDCONTROL project
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
======================================================================*/
/**
* @file
* @brief Implementation of class QGCCore
* @brief Implementation of class QGCApplication
*
* @author Lorenz Meier <mavteam@student.ethz.ch>
*
......@@ -55,8 +55,14 @@ This file is part of the QGROUNDCONTROL project
#include "MAVLinkSimulationLink.h"
#include "SerialLink.h"
const char* QGCCore::deleteAllSettingsKey = "DeleteAllSettingsNextBoot";
const char* QGCCore::_settingsVersionKey = "SettingsVersion";
const char* QGCApplication::_deleteAllSettingsKey = "DeleteAllSettingsNextBoot";
const char* QGCApplication::_settingsVersionKey = "SettingsVersion";
const char* QGCApplication::_savedFilesLocationKey = "SavedFilesLocation";
const char* QGCApplication::_promptFlightDataSave = "PromptFLightDataSave";
const char* QGCApplication::_defaultSavedFileDirectoryName = "QGroundControl";
const char* QGCApplication::_savedFileMavlinkLogDirectoryName = "FlightData";
const char* QGCApplication::_savedFileParameterDirectoryName = "SavedParameters";
/**
* @brief Constructor for the main application.
......@@ -69,9 +75,9 @@ const char* QGCCore::_settingsVersionKey = "SettingsVersion";
**/
QGCCore::QGCCore(int &argc, char* argv[]) :
QApplication(argc, argv),
_mainWindow(NULL)
QGCApplication::QGCApplication(int &argc, char* argv[]) :
QApplication(argc, argv),
_mainWindow(NULL)
{
// Set application information
this->setApplicationName(QGC_APPLICATION_NAME);
......@@ -101,7 +107,7 @@ QGCCore::QGCCore(int &argc, char* argv[]) :
QSettings settings;
// The setting will delete all settings on this boot
fClearSettingsOptions |= settings.contains(deleteAllSettingsKey);
fClearSettingsOptions |= settings.contains(_deleteAllSettingsKey);
if (fClearSettingsOptions) {
// User requested settings to be cleared on command line
......@@ -112,7 +118,7 @@ QGCCore::QGCCore(int &argc, char* argv[]) :
}
bool QGCCore::init(void)
bool QGCApplication::init(void)
{
QSettings settings;
......@@ -136,6 +142,40 @@ bool QGCCore::init(void)
settings.setValue(_settingsVersionKey, QGC_SETTINGS_VERSION);
}
// Load saved files location and validate
QString savedFilesLocation;
if (settings.contains(_savedFilesLocationKey)) {
savedFilesLocation = settings.value(_savedFilesLocationKey).toString();
} else {
// No location set. Create a default one in Documents standard location.
QString documentsLocation = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
QDir documentsDir(documentsLocation);
Q_ASSERT(documentsDir.exists());
if (documentsDir.mkpath(_defaultSavedFileDirectoryName)) {
savedFilesLocation = documentsDir.filePath(_defaultSavedFileDirectoryName);
}
}
if (!savedFilesLocation.isEmpty()) {
if (!validatePossibleSavedFilesLocation(savedFilesLocation)) {
savedFilesLocation.clear();
}
}
// If we made it this far and we still don't have a location. Either the specfied location was invalid
// or we coudn't create a default location. Either way, we need to let the user know and prompt for a new
/// settings.
if (savedFilesLocation.isEmpty()) {
QMessageBox::warning(MainWindow::instance(),
tr("Bad save location"),
tr("The location to save files to is invalid, or cannot be written to. Please provide a new one."));
MainWindow::instance()->showSettings();
}
mode = (enum MainWindow::CUSTOM_MODE) settings.value("QGC_CUSTOM_MODE", (int)MainWindow::CUSTOM_MODE_PX4).toInt();
settings.sync();
......@@ -169,9 +209,7 @@ bool QGCCore::init(void)
// Start the user interface
splashScreen->showMessage(tr("Starting user interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141));
// The first call to instance() creates the MainWindow, so make sure it's passed the splashScreen.
_mainWindow = MainWindow::instance_mode(splashScreen, mode);
_mainWindow = MainWindow::_create(splashScreen, mode);
UDPLink* udpLink = NULL;
......@@ -196,6 +234,7 @@ bool QGCCore::init(void)
// Remove splash screen
splashScreen->finish(_mainWindow);
_mainWindow->splashScreenFinished();
if (settingsUpgraded) {
_mainWindow->showInfoMessage(tr("Settings Cleared"),
......@@ -204,7 +243,7 @@ bool QGCCore::init(void)
}
// Check if link could be connected
if (udpLink && !udpLink->connect())
if (udpLink && !LinkManager::instance()->connectLink(udpLink))
{
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Critical);
......@@ -232,7 +271,7 @@ bool QGCCore::init(void)
* @brief Destructor for the groundstation. It destroys all loaded instances.
*
**/
QGCCore::~QGCCore()
QGCApplication::~QGCApplication()
{
delete UASManager::instance();
delete LinkManager::instance();
......@@ -244,7 +283,7 @@ QGCCore::~QGCCore()
* The link manager keeps track of all communication links and provides the global
* packet queue. It is the main communication hub
**/
void QGCCore::startLinkManager()
void QGCApplication::startLinkManager()
{
LinkManager::instance();
}
......@@ -253,7 +292,7 @@ void QGCCore::startLinkManager()
* @brief Start the Unmanned Air System Manager
*
**/
void QGCCore::startUASManager()
void QGCApplication::startUASManager()
{
// Load UAS plugins
QDir pluginsDir = QDir(qApp->applicationDirPath());
......@@ -289,3 +328,98 @@ void QGCCore::startUASManager()
}
}
}
void QGCApplication::deleteAllSettingsNextBoot(void)
{
QSettings settings;
settings.setValue(_deleteAllSettingsKey, true);
}
void QGCApplication::clearDeleteAllSettingsNextBoot(void)
{
QSettings settings;
settings.remove(_deleteAllSettingsKey);
}
void QGCApplication::setSavedFilesLocation(QString& location)
{
QSettings settings;
settings.setValue(_savedFilesLocationKey, location);
}
bool QGCApplication::validatePossibleSavedFilesLocation(QString& location)
{
// Make sure we can write to the directory
QString filename = QDir(location).filePath("QGCTempXXXXXXXX.tmp");
QTemporaryFile tempFile(filename);
if (!tempFile.open()) {
return false;
}
return true;
}
QString QGCApplication::savedFilesLocation(void)
{
QSettings settings;
Q_ASSERT(settings.contains(_savedFilesLocationKey));
return settings.value(_savedFilesLocationKey).toString();
}
QString QGCApplication::savedParameterFilesLocation(void)
{
QString location;
QDir parentDir(savedFilesLocation());
location = parentDir.filePath(_savedFileParameterDirectoryName);
if (!QDir(location).exists()) {
// If directory doesn't exist, try to create it
if (!parentDir.mkpath(_savedFileParameterDirectoryName)) {
// Return an error
location.clear();
}
}
return location;
}
QString QGCApplication::mavlinkLogFilesLocation(void)
{
QString location;
QDir parentDir(savedFilesLocation());
location = parentDir.filePath(_savedFileMavlinkLogDirectoryName);
if (!QDir(location).exists()) {
// If directory doesn't exist, try to create it
if (!parentDir.mkpath(_savedFileMavlinkLogDirectoryName)) {
// Return an error
location.clear();
}
}
return location;
}
bool QGCApplication::promptFlightDataSave(void)
{
QSettings settings;
return settings.value(_promptFlightDataSave, true).toBool();
}
void QGCApplication::setPromptFlightDataSave(bool promptForSave)
{
QSettings settings;
settings.setValue(_promptFlightDataSave, promptForSave);
}
/// @brief Returns the QGCApplication object singleton.
QGCApplication* qgcApp(void)
{
QGCApplication* app = dynamic_cast<QGCApplication*>(qApp);
Q_ASSERT(app);
return app;
}
/*=====================================================================
PIXHAWK Micro Air Vehicle Flying Robotics Toolkit
QGroundControl Open Source Ground Control Station
(c) 2009, 2010 PIXHAWK PROJECT <http://pixhawk.ethz.ch>
(c) 2009 - 2015 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the PIXHAWK project
This file is part of the QGROUNDCONTROL project
PIXHAWK is free software: you can redistribute it and/or modify
QGROUNDCONTROL 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,
QGROUNDCONTROL 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/>.
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
======================================================================*/
/**
* @file
......@@ -30,8 +30,8 @@ This file is part of the PIXHAWK project
*/
#ifndef QGC_CORE_H
#define QGC_CORE_H
#ifndef QGCAPPLICATION_H
#define QGCAPPLICATION_H
#include <QApplication>
......@@ -42,6 +42,7 @@ This file is part of the PIXHAWK project
#include "OpalLink.h"
#endif
/**
* @brief The main application and management class.
*
......@@ -49,19 +50,44 @@ This file is part of the PIXHAWK project
* the central management unit of the groundstation application.
*
**/
class QGCCore : public QApplication
class QGCApplication : public QApplication
{
Q_OBJECT
public:
QGCCore(int &argc, char* argv[]);
~QGCCore();
QGCApplication(int &argc, char* argv[]);
~QGCApplication();
/// @brief Initialize the applicaation.
/// @return false: init failed, app should exit
bool init(void);
static const char* deleteAllSettingsKey;
/// @brief Sets the persistent flag to delete all settings the next time QGroundControl is started.
void deleteAllSettingsNextBoot(void);
/// @brief Clears the persistent flag to delete all settings the next time QGroundControl is started.
void clearDeleteAllSettingsNextBoot(void);
/// @brief Returns the location of user visible saved file associated with QGroundControl
QString savedFilesLocation(void);
/// @brief Sets the location of user visible saved file associated with QGroundControl
void setSavedFilesLocation(QString& location);
/// @brief Location to save and load parameter files from.
QString savedParameterFilesLocation(void);
/// @brief Location to save and load mavlink log files from
QString mavlinkLogFilesLocation(void);
/// @brief Validates that the specified location will work for the saved files location.
bool validatePossibleSavedFilesLocation(QString& location);
/// @brief Returns true is all mavlink connections should be logged
bool promptFlightDataSave(void);
/// @brief Sets the flag to log all mavlink connections
void setPromptFlightDataSave(bool promptForSave);
protected:
void startLinkManager();
......@@ -75,7 +101,18 @@ protected:
private:
MainWindow* _mainWindow;
static const char* _settingsVersionKey;
static const char* _settingsVersionKey; ///< Settings key which hold settings version
static const char* _deleteAllSettingsKey; ///< If this settings key is set on boot, all settings will be deleted
static const char* _savedFilesLocationKey; ///< Settings key for user visible saved files location
static const char* _promptFlightDataSave; ///< Settings key to prompt for saving Flight Data Log for all flights
static const char* _defaultSavedFileDirectoryName; ///< Default name for user visible save file directory
static const char* _savedFileMavlinkLogDirectoryName; ///< Name of mavlink log subdirectory
static const char* _savedFileParameterDirectoryName; ///< Name of parameter subdirectory
};
#endif /* _CORE_H_ */
/// @brief Returns the QGCApplication object singleton.
QGCApplication* qgcApp(void);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment