Commit 8890d874 authored by Don Gagne's avatar Don Gagne

Merge pull request #2697 from DonLakeFlyer/MissionEdit

Mission editor fixes
parents 46392201 251bbf80
...@@ -91,6 +91,53 @@ QGCView { ...@@ -91,6 +91,53 @@ QGCView {
} }
} }
function loadFromVehicle() {
controller.getMissionItems()
}
function loadFromFile() {
controller.loadMissionFromFile()
fitViewportToMissionItems()
}
function normalizeLat(lat) {
// Normalize latitude to range: 0 to 180, S to N
return lat + 90.0
}
function normalizeLon(lon) {
// Normalize longitude to range: 0 to 360, W to E
return lon + 180.0
}
/// Fix the map viewport to the current mission items. We don't fit the home position in this process.
function fitViewportToMissionItems() {
if (_missionItems.count <= 1) {
return
}
var missionItem = _missionItems.get(1)
var north = normalizeLat(missionItem.coordinate.latitude)
var south = north
var east = normalizeLon(missionItem.coordinate.longitude)
var west = east
for (var i=2; i<_missionItems.count; i++) {
missionItem = _missionItems.get(i)
var lat = normalizeLat(missionItem.coordinate.latitude)
var lon = normalizeLon(missionItem.coordinate.longitude)
north = Math.max(north, lat)
south = Math.min(south, lat)
east = Math.max(east, lon)
west = Math.min(west, lon)
}
editorMap.visibleRegion = QtPositioning.rectangle(QtPositioning.coordinate(north - 90.0, west - 180.0), QtPositioning.coordinate(south - 90.0, east - 180.0))
}
MissionController { MissionController {
id: controller id: controller
...@@ -107,6 +154,7 @@ QGCView { ...@@ -107,6 +154,7 @@ QGCView {
*/ */
onMissionItemsChanged: itemDragger.clearItem() onMissionItemsChanged: itemDragger.clearItem()
onNewItemsFromVehicle: fitViewportToMissionItems()
} }
QGCPalette { id: qgcPal; colorGroupEnabled: enabled } QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
...@@ -261,11 +309,11 @@ QGCView { ...@@ -261,11 +309,11 @@ QGCView {
// Add the mission items to the map // Add the mission items to the map
MapItemView { MapItemView {
model: controller.missionItems model: controller.missionItems
delegate: delegateComponent delegate: missionItemComponent
} }
Component { Component {
id: delegateComponent id: missionItemComponent
MissionItemIndicator { MissionItemIndicator {
id: itemIndicator id: itemIndicator
...@@ -550,7 +598,7 @@ QGCView { ...@@ -550,7 +598,7 @@ QGCView {
function accept() { function accept() {
hideDialog() hideDialog()
controller.getMissionItems() loadFromVehicle()
} }
} }
} }
...@@ -564,7 +612,7 @@ QGCView { ...@@ -564,7 +612,7 @@ QGCView {
function accept() { function accept() {
hideDialog() hideDialog()
controller.loadMissionFromFile() loadFromFile()
} }
} }
} }
...@@ -607,7 +655,7 @@ QGCView { ...@@ -607,7 +655,7 @@ QGCView {
if (syncNeeded) { if (syncNeeded) {
_root.showDialog(syncLoadFromVehicleOverwrite, "Mission overwrite", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel) _root.showDialog(syncLoadFromVehicleOverwrite, "Mission overwrite", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel)
} else { } else {
controller.getMissionItems() loadFromVehicle()
} }
} }
} }
...@@ -634,7 +682,7 @@ QGCView { ...@@ -634,7 +682,7 @@ QGCView {
if (syncNeeded) { if (syncNeeded) {
_root.showDialog(syncLoadFromFileOverwrite, "Mission overwrite", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel) _root.showDialog(syncLoadFromFileOverwrite, "Mission overwrite", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel)
} else { } else {
controller.loadMissionFromFile() loadFromFile()
} }
} }
} }
......
...@@ -130,12 +130,13 @@ void MissionController::_setupMissionItems(bool loadFromVehicle, bool forceLoad) ...@@ -130,12 +130,13 @@ void MissionController::_setupMissionItems(bool loadFromVehicle, bool forceLoad)
if (!missionManager || !loadFromVehicle || missionManager->inProgress()) { if (!missionManager || !loadFromVehicle || missionManager->inProgress()) {
_missionItems = new QmlObjectListModel(this); _missionItems = new QmlObjectListModel(this);
qCDebug(MissionControllerLog) << "creating empty set"; qCDebug(MissionControllerLog) << "creating empty set";
_initAllMissionItems();
} else { } else {
_missionItems = missionManager->copyMissionItems(); _missionItems = missionManager->copyMissionItems();
qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count(); qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count();
_initAllMissionItems();
emit newItemsFromVehicle();
} }
_initAllMissionItems();
} }
void MissionController::getMissionItems(void) void MissionController::getMissionItems(void)
...@@ -222,6 +223,7 @@ void MissionController::loadMissionFromFile(void) ...@@ -222,6 +223,7 @@ void MissionController::loadMissionFromFile(void)
#ifndef __mobile__ #ifndef __mobile__
QString errorString; QString errorString;
QString filename = QGCFileDialog::getOpenFileName(NULL, "Select Mission File to load"); QString filename = QGCFileDialog::getOpenFileName(NULL, "Select Mission File to load");
bool versionAPM = false;
if (filename.isEmpty()) { if (filename.isEmpty()) {
return; return;
...@@ -244,9 +246,17 @@ void MissionController::loadMissionFromFile(void) ...@@ -244,9 +246,17 @@ void MissionController::loadMissionFromFile(void)
const QStringList& version = in.readLine().split(" "); const QStringList& version = in.readLine().split(" ");
if (!(version.size() == 3 && version[0] == "QGC" && version[1] == "WPL" && version[2] == "120")) { bool versionOk = false;
errorString = "The mission file is not compatible with the current version of QGroundControl."; if (version.size() == 3 && version[0] == "QGC" && version[1] == "WPL") {
} else { if (version[2] == "120") {
versionOk = true;
} else if (version[2] == "110") {
versionOk = true;
versionAPM = true;
}
}
if (versionOk) {
while (!in.atEnd()) { while (!in.atEnd()) {
MissionItem* item = new MissionItem(); MissionItem* item = new MissionItem();
...@@ -257,12 +267,19 @@ void MissionController::loadMissionFromFile(void) ...@@ -257,12 +267,19 @@ void MissionController::loadMissionFromFile(void)
break; break;
} }
} }
} else {
errorString = "The mission file is not compatible with this version of QGroundControl.";
} }
} }
if (!errorString.isEmpty()) { if (errorString.isEmpty()) {
if (versionAPM) {
// Remove fake home position from APM files
_missionItems->removeAt(0);
}
} else {
_missionItems->clear(); _missionItems->clear();
qgcApp()->showMessage(errorString);
} }
_initAllMissionItems(); _initAllMissionItems();
...@@ -272,7 +289,6 @@ void MissionController::loadMissionFromFile(void) ...@@ -272,7 +289,6 @@ void MissionController::loadMissionFromFile(void)
void MissionController::saveMissionToFile(void) void MissionController::saveMissionToFile(void)
{ {
#ifndef __mobile__ #ifndef __mobile__
QString errorString;
QString filename = QGCFileDialog::getSaveFileName(NULL, "Select file to save mission to"); QString filename = QGCFileDialog::getSaveFileName(NULL, "Select file to save mission to");
if (filename.isEmpty()) { if (filename.isEmpty()) {
...@@ -282,7 +298,7 @@ void MissionController::saveMissionToFile(void) ...@@ -282,7 +298,7 @@ void MissionController::saveMissionToFile(void)
QFile file(filename); QFile file(filename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
errorString = file.errorString(); qgcApp()->showMessage(file.errorString());
} else { } else {
QTextStream out(&file); QTextStream out(&file);
......
...@@ -72,6 +72,7 @@ signals: ...@@ -72,6 +72,7 @@ signals:
void liveHomePositionAvailableChanged(bool homePositionAvailable); void liveHomePositionAvailableChanged(bool homePositionAvailable);
void liveHomePositionChanged(const QGeoCoordinate& homePosition); void liveHomePositionChanged(const QGeoCoordinate& homePosition);
void autoSyncChanged(bool autoSync); void autoSyncChanged(bool autoSync);
void newItemsFromVehicle(void);
private slots: private slots:
void _newMissionItemsAvailableFromVehicle(); void _newMissionItemsAvailableFromVehicle();
......
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