1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-15 12:25:13 +03:00

Bug fixes, added active mission setting,

This commit is contained in:
breadoven 2021-10-26 23:21:43 +01:00
parent 7f45ec5d68
commit cc05ab4f44
5 changed files with 103 additions and 57 deletions

View file

@ -3488,6 +3488,9 @@
"missionSafehomeHead": { "missionSafehomeHead": {
"message": "Safe Home manager" "message": "Safe Home manager"
}, },
"missionMultiMissionHead": {
"message": "Multi Missions"
},
"missionTemplateHead": { "missionTemplateHead": {
"message": "Mission template" "message": "Mission template"
}, },
@ -3512,6 +3515,9 @@
"confirm_overwrite_multimission_file_load_option": { "confirm_overwrite_multimission_file_load_option": {
"message": "This will over write current multi mission.\nContinue?" "message": "This will over write current multi mission.\nContinue?"
}, },
"multimission_active_index_saved_eeprom": {
"message": "Mission active index saved"
},
"no_waypoints_to_load": { "no_waypoints_to_load": {
"message": "No waypoints to load !" "message": "No waypoints to load !"
}, },

View file

@ -3213,9 +3213,9 @@ var mspHelper = (function (gui) {
}); });
}; };
self.setSetting = function (name, value) { self.setSetting = function (name, value, callback) {
this.encodeSetting(name, value).then(function (data) { this.encodeSetting(name, value).then(function (data) {
return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data); return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data).then(callback);
}); });
}; };

View file

@ -149,7 +149,7 @@ let WaypointCollection = function () {
data = tmpData; data = tmpData;
}; };
self.update = function (bMWPfile=false, bReverse=false) { self.update = function (singleMission = true, bMWPfile=false, bReverse=false) {
let oldWPNumber = 0; let oldWPNumber = 0;
let optionIdx = 0; let optionIdx = 0;
let idx = 0; let idx = 0;
@ -180,7 +180,8 @@ let WaypointCollection = function () {
optionIdx = 0; optionIdx = 0;
idx++; idx++;
} }
if (!(bMWPfile && bReverse)) {
if (singleMission) {
if (element.getNumber() == self.get().length - 1) { if (element.getNumber() == self.get().length - 1) {
element.setEndMission(0xA5); element.setEndMission(0xA5);
} }

View file

@ -91,7 +91,7 @@
<div id="missionPlannerMultiMission" class="gui_box grey" style="display: none"> <div id="missionPlannerMultiMission" class="gui_box grey" style="display: none">
<div class="gui_box_titlebar"> <div class="gui_box_titlebar">
<div class="spacer_box_title i18n-replaced" data-i18n="missionSafehomeHead">Multi Mission Manager</div> <div class="spacer_box_title i18n-replaced" data-i18n="missionMultiMissionHead">Multi Missions</div>
<div class="btnMenu btnMenuIcon save_btn"> <div class="btnMenu btnMenuIcon save_btn">
<div id="showHideMultimissionButton"> <div id="showHideMultimissionButton">
<a class="ic_hide" href="#" title="Hide"></a> <a class="ic_hide" href="#" title="Hide"></a>
@ -100,24 +100,34 @@
</div> </div>
</div> </div>
<div class="spacer" id="multimissionContent"> <div class="spacer" id="multimissionContent">
<div style="display: inline-block"> <div class="btn btnTable btnTableIcon save_btn">
<label>Missions Info: </label> <div>
<span>Missions Info:</span>
<span id="multimissionInfo">None</span> <span id="multimissionInfo">None</span>
</div> </div>
<div style="margin-top: 5px">
<span>Active Mission:</span>
<span id="activeNissionIndex">1</span>
<a class="ic_save disabled" id="setActiveMissionButton" href="#" title="Set Active"></a>
</div>
<hr> <hr>
<div class="btn btnTable btnTableIcon save_btn" style="display: inline-block"> <div style="display: inline-block">
<label for="multimissionOptionList">Mission Number </label> <label for="multimissionOptionList">Mission No.</label>
<select name="Number" id="multimissionOptionList"> <select name="Number" id="multimissionOptionList" style="width: 50px">
<option value="0">ALL</option> <option value="0">ALL</option>
</select> </select>
<a class="ic_save disabled" id="updateMultimissionButton" href="#" title="Update All" style="float: right"></a> <div style="float: right">
<span>Update All</span>
<a class="ic_save disabled" id="updateMultimissionButton" href="#" title="Update All"></a>
</div> </div>
<div class="btn btnTable btnTableIcon save_btn" style="padding-top: 4px; float: left"> <div style="margin-bottom: 5px; margin-top: 5px">
<label for="addMultimissionButton">Add New Mission</label> <label for="addMultimissionButton">Add New Mission</label>
<a class="ic_add disabled" id="addMultimissionButton" href="#" title="Add"></a> <a class="ic_add disabled" id="addMultimissionButton" href="#" title="Add"></a>
</div> </div>
</div> </div>
</div> </div>
</div>
</div>
<div id="missionPlanerHome" class="gui_box grey" style="display: none"> <div id="missionPlanerHome" class="gui_box grey" style="display: none">
<div class="gui_box_titlebar"> <div class="gui_box_titlebar">

View file

@ -767,11 +767,12 @@ TABS.mission_control.initialize = function (callback) {
$('#multimissionOptionList').append($('<option>', {value: i, text: i})); $('#multimissionOptionList').append($('<option>', {value: i, text: i}));
} }
updateMultimissionState(); updateMultimissionState();
$('#activeNissionIndex').text(1);
} }
function updateMultimissionState() { function updateMultimissionState() {
if (!mission.isEmpty() || multimissionCount) { if (!mission.isEmpty() || multimissionCount) {
if (multimissionCount < maxMultimissionCount) { if ((!multimissionCount || (multimissionCount && !mission.isEmpty())) && multimissionCount < maxMultimissionCount) {
$("#addMultimissionButton").removeClass('disabled'); $("#addMultimissionButton").removeClass('disabled');
} else { } else {
$("#addMultimissionButton").addClass('disabled'); $("#addMultimissionButton").addClass('disabled');
@ -781,26 +782,38 @@ TABS.mission_control.initialize = function (callback) {
if (multimissionAllWPLoaded()) { if (multimissionAllWPLoaded()) {
$('#missionDistance').text('N/A'); $('#missionDistance').text('N/A');
totalmultimissionWPs = mission.get().length; totalmultimissionWPs = mission.get().length;
$("#updateMultimissionButton").addClass('disabled');
$("#editMission").show(); $("#editMission").show();
$("#updateMultimissionButton").addClass('disabled');
$("#setActiveMissionButton").addClass('disabled');
} else { } else {
totalmultimissionWPs = multimission.get().length + mission.get().length; totalmultimissionWPs = multimission.get().length + mission.get().length;
$("#updateMultimissionButton").removeClass('disabled'); $("#updateMultimissionButton").removeClass('disabled');
$("#setActiveMissionButton").removeClass('disabled');
} }
$('#multimissionInfo').text(multimissionCount + ' missions (' + totalmultimissionWPs + '/' + mission.getMaxWaypoints() + ' WPs)'); $('#multimissionInfo').text(multimissionCount + ' missions (' + totalmultimissionWPs + '/' + mission.getMaxWaypoints() + ' WPs)');
document.getElementById('multimissionInfo').style.color = totalmultimissionWPs > mission.getMaxWaypoints() ? "#FF0000" : "#303030"; document.getElementById('multimissionInfo').style.color = totalmultimissionWPs > mission.getMaxWaypoints() ? "#FF0000" : "#303030";
} else { } else {
$('#multimissionInfo').text('No multi missions loaded');
$('#cancelMultimission').trigger('click'); $('#cancelMultimission').trigger('click');
$('#multimissionInfo').text('No multi missions loaded');
$("#updateMultimissionButton").addClass('disabled'); $("#updateMultimissionButton").addClass('disabled');
$("#setActiveMissionButton").addClass('disabled');
} }
} else { } else {
$("#addMultimissionButton").addClass('disabled'); $("#addMultimissionButton").addClass('disabled');
$("#setActiveMissionButton").addClass('disabled');
} }
} }
function isSingleMission() {
return !multimissionCount || !multimissionAllWPLoaded();
}
function multimissionAllWPLoaded() {
return multimissionCount && Number($('#multimissionOptionList').val()) == 0;
}
function updateAllMultimission(missionDelete = false) { function updateAllMultimission(missionDelete = false) {
// flag if new MM mission empty at update // flag if new MM mission empty on update
let missionIsEmptyOnUpdate = mission.isEmpty() ? true : false; let missionIsEmptyOnUpdate = mission.isEmpty() ? true : false;
/* copy active single mission into MM on update so MM contains all missions. /* copy active single mission into MM on update so MM contains all missions.
@ -818,12 +831,12 @@ TABS.mission_control.initialize = function (callback) {
element.setNumber(i); element.setNumber(i);
i++; i++;
}); });
multimission.update(); multimission.update(false);
// multimission.missionDisplayDebug(); // multimission.missionDisplayDebug();
mission.reinit(); mission.reinit();
mission.copy(multimission); mission.copy(multimission);
mission.update(); mission.update(false);
// mission.missionDisplayDebug(); // mission.missionDisplayDebug();
/* Remove empty missions on update. /* Remove empty missions on update.
@ -866,7 +879,7 @@ TABS.mission_control.initialize = function (callback) {
mission.reinit(); mission.reinit();
tempMissionData = multimission.get().slice(startWPCount, endWPCount + 1); // copy selected single mission from MM tempMissionData = multimission.get().slice(startWPCount, endWPCount + 1); // copy selected single mission from MM
let i = 0; let i = 0;
tempMissionData.forEach(function (element) { // write copied mission to active map mission tempMissionData.forEach(function (element) { // write mission copy to active map mission
mission.put(element); mission.put(element);
mission.get()[i].setNumber(i); mission.get()[i].setNumber(i);
i++; i++;
@ -950,10 +963,6 @@ TABS.mission_control.initialize = function (callback) {
return false; return false;
} }
function multimissionAllWPLoaded() {
return multimissionCount && Number($('#multimissionOptionList').val()) == 0;
}
/* disable mission/WP edit when all missions displayed on map, true = edit disabled */ /* disable mission/WP edit when all missions displayed on map, true = edit disabled */
function setMultimissionEditControl(enabled = true) { function setMultimissionEditControl(enabled = true) {
disableMarkerEdit = enabled; disableMarkerEdit = enabled;
@ -1857,13 +1866,13 @@ TABS.mission_control.initialize = function (callback) {
tempWp.setAlt(checkAltElevSanity(false, settings.alt, elevationAtWP, 0)); tempWp.setAlt(checkAltElevSanity(false, settings.alt, elevationAtWP, 0));
mission.insertWaypoint(tempWp, tempMarker.number); mission.insertWaypoint(tempWp, tempMarker.number);
mission.update(); mission.update(isSingleMission());
refreshLayers(); refreshLayers();
plotElevation(); plotElevation();
})() })()
} else { } else {
mission.insertWaypoint(tempWp, tempMarker.number); mission.insertWaypoint(tempWp, tempMarker.number);
mission.update(); mission.update(isSingleMission());
refreshLayers(); refreshLayers();
plotElevation(); plotElevation();
} }
@ -1892,13 +1901,13 @@ TABS.mission_control.initialize = function (callback) {
tempWp.setAlt(checkAltElevSanity(false, settings.alt, elevationAtWP, 0)); tempWp.setAlt(checkAltElevSanity(false, settings.alt, elevationAtWP, 0));
mission.put(tempWp); mission.put(tempWp);
mission.update(); mission.update(isSingleMission());
refreshLayers(); refreshLayers();
plotElevation(); plotElevation();
})() })()
} else { } else {
mission.put(tempWp); mission.put(tempWp);
mission.update(); mission.update(isSingleMission());
refreshLayers(); refreshLayers();
plotElevation(); plotElevation();
} }
@ -2038,7 +2047,7 @@ TABS.mission_control.initialize = function (callback) {
else {$('#pointP'+String(j).slice(-1)+'class').fadeOut(300);} else {$('#pointP'+String(j).slice(-1)+'class').fadeOut(300);}
} }
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
redrawLayer(); redrawLayer();
} }
}); });
@ -2047,7 +2056,7 @@ TABS.mission_control.initialize = function (callback) {
if (selectedMarker) { if (selectedMarker) {
selectedMarker.setLat(Math.round(Number($('#pointLat').val()) * 10000000)); selectedMarker.setLat(Math.round(Number($('#pointLat').val()) * 10000000));
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
refreshLayers(); refreshLayers();
selectedFeature = markers[selectedMarker.getLayerNumber()].getSource().getFeatures()[0]; selectedFeature = markers[selectedMarker.getLayerNumber()].getSource().getFeatures()[0];
selectedFeature.setStyle(getWaypointIcon(selectedMarker, true)); selectedFeature.setStyle(getWaypointIcon(selectedMarker, true));
@ -2059,7 +2068,7 @@ TABS.mission_control.initialize = function (callback) {
if (selectedMarker) { if (selectedMarker) {
selectedMarker.setLon(Math.round(Number($('#pointLon').val()) * 10000000)); selectedMarker.setLon(Math.round(Number($('#pointLon').val()) * 10000000));
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
refreshLayers(); refreshLayers();
selectedFeature = markers[selectedMarker.getLayerNumber()].getSource().getFeatures()[0]; selectedFeature = markers[selectedMarker.getLayerNumber()].getSource().getFeatures()[0];
selectedFeature.setStyle(getWaypointIcon(selectedMarker, true)); selectedFeature.setStyle(getWaypointIcon(selectedMarker, true));
@ -2073,7 +2082,7 @@ TABS.mission_control.initialize = function (callback) {
const returnAltitude = checkAltElevSanity(true, Number($('#pointAlt').val()), elevationAtWP, selectedMarker.getP3()); const returnAltitude = checkAltElevSanity(true, Number($('#pointAlt').val()), elevationAtWP, selectedMarker.getP3());
selectedMarker.setAlt(returnAltitude); selectedMarker.setAlt(returnAltitude);
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
redrawLayer(); redrawLayer();
plotElevation(); plotElevation();
} }
@ -2083,7 +2092,7 @@ TABS.mission_control.initialize = function (callback) {
if (selectedMarker) { if (selectedMarker) {
selectedMarker.setP1(Number($('#pointP1').val())); selectedMarker.setP1(Number($('#pointP1').val()));
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
redrawLayer(); redrawLayer();
} }
}); });
@ -2092,7 +2101,7 @@ TABS.mission_control.initialize = function (callback) {
if (selectedMarker) { if (selectedMarker) {
selectedMarker.setP2(Number($('#pointP2').val())); selectedMarker.setP2(Number($('#pointP2').val()));
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
redrawLayer(); redrawLayer();
} }
}); });
@ -2126,7 +2135,7 @@ TABS.mission_control.initialize = function (callback) {
$('#altitudeInMeters').text(` ${altitudeMeters}m`); $('#altitudeInMeters').text(` ${altitudeMeters}m`);
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
mission.update(); mission.update(isSingleMission());
redrawLayer(); redrawLayer();
plotElevation(); plotElevation();
})() })()
@ -2241,7 +2250,6 @@ TABS.mission_control.initialize = function (callback) {
mission.updateWaypoint(selectedMarker); mission.updateWaypoint(selectedMarker);
} }
mission.update();
redrawLayer(); redrawLayer();
plotElevation(); plotElevation();
})() })()
@ -2255,23 +2263,28 @@ TABS.mission_control.initialize = function (callback) {
if (multimissionAllWPLoaded()) { if (multimissionAllWPLoaded()) {
updateAllMultimission(); updateAllMultimission();
$("#updateMultimissionButton").addClass('disabled');
setMultimissionEditControl(multimissionCount ? true : false); setMultimissionEditControl(multimissionCount ? true : false);
updateMultimissionState(); updateMultimissionState();
return; return;
} else { } else {
// only update all missions when a single mission is loaded on map // updateAllMultimission when a single mission is loaded on map
var missions = 0; // or new mission is empty.
if (mission.isEmpty()) {
updateAllMultimission();
setMultimissionEditControl(true);
return;
}
let missions = 0;
mission.get().forEach(function (element) { mission.get().forEach(function (element) {
missions += element.getEndMission() == 0xA5 ? 1 : 0; missions += element.getEndMission() == 0xA5 ? 1 : 0;
}); });
if (missions == 1) updateAllMultimission(); if (missions == 1) updateAllMultimission();
$("#updateMultimissionButton").removeClass('disabled');
setMultimissionEditControl(false); setMultimissionEditControl(false);
} }
editMultimission(); editMultimission();
updateMultimissionState();
}); });
$('#addMultimissionButton').on('click', function () { $('#addMultimissionButton').on('click', function () {
@ -2286,6 +2299,10 @@ TABS.mission_control.initialize = function (callback) {
$('#missionPlannerMultiMission').fadeOut(300); $('#missionPlannerMultiMission').fadeOut(300);
}); });
$('#setActiveMissionButton').on('click', function () {
$('#activeNissionIndex').text(Number($('#multimissionOptionList').val()));
});
///////////////////////////////////////////// /////////////////////////////////////////////
// Callback for Remove buttons // Callback for Remove buttons
///////////////////////////////////////////// /////////////////////////////////////////////
@ -2309,11 +2326,11 @@ TABS.mission_control.initialize = function (callback) {
if (confirm(chrome.i18n.getMessage('confirm_delete_point_with_options'))) { if (confirm(chrome.i18n.getMessage('confirm_delete_point_with_options'))) {
mission.getAttachedFromWaypoint(selectedMarker).forEach(function (element) { mission.getAttachedFromWaypoint(selectedMarker).forEach(function (element) {
mission.dropWaypoint(element); mission.dropWaypoint(element);
mission.update(); mission.update(isSingleMission());
}); });
mission.dropWaypoint(selectedMarker); mission.dropWaypoint(selectedMarker);
selectedMarker = null; selectedMarker = null;
mission.update(); mission.update(isSingleMission());
clearEditForm(); clearEditForm();
refreshLayers(); refreshLayers();
plotElevation(); plotElevation();
@ -2322,7 +2339,7 @@ TABS.mission_control.initialize = function (callback) {
else { else {
mission.dropWaypoint(selectedMarker); mission.dropWaypoint(selectedMarker);
selectedMarker = null; selectedMarker = null;
mission.update(); mission.update(isSingleMission());
clearEditForm(); clearEditForm();
refreshLayers(); refreshLayers();
plotElevation(); plotElevation();
@ -2413,7 +2430,6 @@ TABS.mission_control.initialize = function (callback) {
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// //
// Load/Save MWP File Toolbox // Load/Save MWP File Toolbox
@ -2517,14 +2533,14 @@ TABS.mission_control.initialize = function (callback) {
} }
} }
} }
// update Attached Waypoints (i.e non Map Markers)
mission.update(true);
if (missionEndFlagCount > 1) { if (missionEndFlagCount > 1) {
if (multimissionCount && !confirm(chrome.i18n.getMessage('confirm_multimission_file_load'))) { if (multimissionCount && !confirm(chrome.i18n.getMessage('confirm_multimission_file_load'))) {
mission.flush(); mission.flush();
return; return;
} else { } else {
// update Attached Waypoints (i.e non Map Markers)
mission.update(false, true);
multimissionCount = missionEndFlagCount; multimissionCount = missionEndFlagCount;
multimission.reinit(); multimission.reinit();
multimission.copy(mission); multimission.copy(mission);
@ -2532,6 +2548,10 @@ TABS.mission_control.initialize = function (callback) {
$('#missionPlannerMultiMission').fadeIn(300); $('#missionPlannerMultiMission').fadeIn(300);
setMultimissionEditControl(true); setMultimissionEditControl(true);
} }
} else {
// update Attached Waypoints (i.e non Map Markers)
mission.update(true, true);
setMultimissionEditControl(false);
} }
updateMultimissionState(); updateMultimissionState();
@ -2633,8 +2653,9 @@ TABS.mission_control.initialize = function (callback) {
} }
mission.reinit(); mission.reinit();
mission.copy(MISSION_PLANER); mission.copy(MISSION_PLANER);
mission.update(true); mission.update(false, true);
setMultimissionEditControl(false);
multimissionCount = 0; multimissionCount = 0;
let missionEndFlagCount = 0; let missionEndFlagCount = 0;
mission.get().forEach(function (element) { mission.get().forEach(function (element) {
@ -2662,13 +2683,13 @@ TABS.mission_control.initialize = function (callback) {
function sendWaypointsToFC(saveEeprom) { function sendWaypointsToFC(saveEeprom) {
MISSION_PLANER.reinit(); MISSION_PLANER.reinit();
MISSION_PLANER.copy(mission); MISSION_PLANER.copy(mission);
MISSION_PLANER.update(true, true); MISSION_PLANER.update(false, true, true);
mspHelper.saveWaypoints(function() { mspHelper.saveWaypoints(function() {
GUI.log('End send point'); GUI.log('End send point');
if (saveEeprom) { if (saveEeprom) {
$('#saveEepromMissionButton').removeClass('disabled'); $('#saveEepromMissionButton').removeClass('disabled');
GUI.log(chrome.i18n.getMessage('eeprom_saved_ok')); GUI.log(chrome.i18n.getMessage('eeprom_saved_ok'));
MSP.send_message(MSPCodes.MSP_WP_MISSION_SAVE, [0], false); MSP.send_message(MSPCodes.MSP_WP_MISSION_SAVE, [0], false, setMissionIndex);
} else { } else {
$('#saveMissionButton').removeClass('disabled'); $('#saveMissionButton').removeClass('disabled');
} }
@ -2678,10 +2699,18 @@ TABS.mission_control.initialize = function (callback) {
updateTotalInfo(); updateTotalInfo();
mission.reinit(); mission.reinit();
mission.copy(MISSION_PLANER); mission.copy(MISSION_PLANER);
mission.update(true); mission.update(false, true);
refreshLayers(); refreshLayers();
$('#MPeditPoint').fadeOut(300); $('#MPeditPoint').fadeOut(300);
}); });
function setMissionIndex() {
let activeIndex = multimissionAllWPLoaded() ? $('#activeNissionIndex').text() : 1;
mspHelper.setSetting("nav_wp_multi_mission_index", activeIndex, function () {
MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, function () {
GUI.log(chrome.i18n.getMessage('multimission_active_index_saved_eeprom'));
});
});
}
} }
function updateTotalInfo() { function updateTotalInfo() {