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 {
}
}
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 {
id: controller
......@@ -107,6 +154,7 @@ QGCView {
*/
onMissionItemsChanged: itemDragger.clearItem()
onNewItemsFromVehicle: fitViewportToMissionItems()
}
QGCPalette { id: qgcPal; colorGroupEnabled: enabled }
......@@ -261,11 +309,11 @@ QGCView {
// Add the mission items to the map
MapItemView {
model: controller.missionItems
delegate: delegateComponent
delegate: missionItemComponent
}
Component {
id: delegateComponent
id: missionItemComponent
MissionItemIndicator {
id: itemIndicator
......@@ -550,7 +598,7 @@ QGCView {
function accept() {
hideDialog()
controller.getMissionItems()
loadFromVehicle()
}
}
}
......@@ -564,7 +612,7 @@ QGCView {
function accept() {
hideDialog()
controller.loadMissionFromFile()
loadFromFile()
}
}
}
......@@ -607,7 +655,7 @@ QGCView {
if (syncNeeded) {
_root.showDialog(syncLoadFromVehicleOverwrite, "Mission overwrite", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel)
} else {
controller.getMissionItems()
loadFromVehicle()
}
}
}
......@@ -634,7 +682,7 @@ QGCView {
if (syncNeeded) {
_root.showDialog(syncLoadFromFileOverwrite, "Mission overwrite", _root.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel)
} else {
controller.loadMissionFromFile()
loadFromFile()
}
}
}
......
......@@ -130,12 +130,13 @@ void MissionController::_setupMissionItems(bool loadFromVehicle, bool forceLoad)
if (!missionManager || !loadFromVehicle || missionManager->inProgress()) {
_missionItems = new QmlObjectListModel(this);
qCDebug(MissionControllerLog) << "creating empty set";
_initAllMissionItems();
} else {
_missionItems = missionManager->copyMissionItems();
qCDebug(MissionControllerLog) << "loading from vehicle count"<< _missionItems->count();
_initAllMissionItems();
emit newItemsFromVehicle();
}
_initAllMissionItems();
}
void MissionController::getMissionItems(void)
......@@ -222,6 +223,7 @@ void MissionController::loadMissionFromFile(void)
#ifndef __mobile__
QString errorString;
QString filename = QGCFileDialog::getOpenFileName(NULL, "Select Mission File to load");
bool versionAPM = false;
if (filename.isEmpty()) {
return;
......@@ -244,9 +246,17 @@ void MissionController::loadMissionFromFile(void)
const QStringList& version = in.readLine().split(" ");
if (!(version.size() == 3 && version[0] == "QGC" && version[1] == "WPL" && version[2] == "120")) {
errorString = "The mission file is not compatible with the current version of QGroundControl.";
} else {
bool versionOk = false;
if (version.size() == 3 && version[0] == "QGC" && version[1] == "WPL") {
if (version[2] == "120") {
versionOk = true;
} else if (version[2] == "110") {
versionOk = true;
versionAPM = true;
}
}
if (versionOk) {
while (!in.atEnd()) {
MissionItem* item = new MissionItem();
......@@ -257,12 +267,19 @@ void MissionController::loadMissionFromFile(void)
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();
qgcApp()->showMessage(errorString);
}
_initAllMissionItems();
......@@ -272,7 +289,6 @@ void MissionController::loadMissionFromFile(void)
void MissionController::saveMissionToFile(void)
{
#ifndef __mobile__
QString errorString;
QString filename = QGCFileDialog::getSaveFileName(NULL, "Select file to save mission to");
if (filename.isEmpty()) {
......@@ -282,7 +298,7 @@ void MissionController::saveMissionToFile(void)
QFile file(filename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
errorString = file.errorString();
qgcApp()->showMessage(file.errorString());
} else {
QTextStream out(&file);
......
......@@ -72,6 +72,7 @@ signals:
void liveHomePositionAvailableChanged(bool homePositionAvailable);
void liveHomePositionChanged(const QGeoCoordinate& homePosition);
void autoSyncChanged(bool autoSync);
void newItemsFromVehicle(void);
private slots:
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