diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 1ab2b0a5..d4c2b51b 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -4355,6 +4355,12 @@
"SafehomeSafeRadius": {
"message": "Safe Radius (m):"
},
+ "SafehomeFwAppraoch": {
+ "message": "FW Approach:"
+ },
+ "safehomeEdit": {
+ "message": "Edit Safehome"
+ },
"missionTitleHide": {
"message": "Hide"
},
@@ -4396,7 +4402,7 @@
},
"missionTitleAdd": {
"message": "Add"
- },
+ },
"missionTitleMoveToCenterView": {
"message": "move to center view"
},
@@ -4409,6 +4415,60 @@
"missionTitlEditMission": {
"message": "Edit Mission"
},
+ "MissionPlannerFwLAndingAltitudeChangeReset": {
+ "message": "Altitude below min land altitude. Change ignored"
+ },
+ "missionWpType": {
+ "message": "Type:"
+ },
+ "missionWpLat": {
+ "message": "Lat:"
+ },
+ "missionWpLon": {
+ "message": "Lon:"
+ },
+ "missionSeaLevelRef": {
+ "message": "Sea level Ref: "
+ },
+ "missionElevation": {
+ "message": "Elevation (m):"
+ },
+ "missionNA": {
+ "message": "N/A"
+ },
+ "missionGroundDist": {
+ "message": "Grd Dist (m):"
+ },
+ "missionParameter1": {
+ "message": "Parameter 1:"
+ },
+ "missionParameter2": {
+ "message": "Parameter 2:"
+ },
+ "missionUserActions": {
+ "message": "User Actions:"
+ },
+ "missionFwLandingSettings": {
+ "message": "Fixed Wing landing settings:"
+ },
+ "missionFwApproachAlt": {
+ "message": "Approach Alt: (cm):"
+ },
+ "missionFwLandAlt": {
+ "message": "Land Alt: (cm):"
+ },
+ "missionFwApproachDir": {
+ "message": "Approach direction:"
+ },
+ "missionFwLandHeading1": {
+ "message": "Heading 1: (deg):"
+ },
+ "missionFwLandHeading2": {
+ "message": "Heading 2: (deg):"
+ },
+ "missionExclusive": {
+ "message": "Excl."
+ },
"missionRTHsettingsTitle": {
"message": "RTH settings"
},
diff --git a/js/fc.js b/js/fc.js
index 48578b01..bc8057f0 100644
--- a/js/fc.js
+++ b/js/fc.js
@@ -1303,8 +1303,8 @@ var FC = {
37: "Rangefinder [cm]",
38: "Active MixerProfile",
39: "MixerTransition Active",
- 40: "Yaw [deg]"
- 38: "FW Land State"
+ 40: "Yaw [deg]",
+ 41: "FW Land State"
}
},
3: {
diff --git a/js/msp/MSPCodes.js b/js/msp/MSPCodes.js
index 32f977bf..2b233af1 100644
--- a/js/msp/MSPCodes.js
+++ b/js/msp/MSPCodes.js
@@ -245,7 +245,7 @@ var MSPCodes = {
MSP2_INAV_EZ_TUNE: 0x2070,
MSP2_INAV_EZ_TUNE_SET: 0x2071,
- MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080
+ MSP2_INAV_SELECT_MIXER_PROFILE: 0x2080,
MSP2_INAV_SET_LED_STRIP_CONFIG_EX: 0x2049,
MSP2_INAV_FW_APPROACH: 0x204A,
diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js
index d3849fbe..e533ca10 100644
--- a/js/msp/MSPHelper.js
+++ b/js/msp/MSPHelper.js
@@ -2944,7 +2944,7 @@ var mspHelper = (function (gui) {
MSP.send_message(MSPCodes.MSP2_INAV_TIMER_OUTPUT_MODE, false, false, callback);
}
- self.sendTimerOutputModes = function(callback) {
+ self.sendTimerOutputModes = function(onCompleteCallback) {
var nextFunction = send_next_output_mode;
var idIndex = 0;
diff --git a/js/safehomeCollection.js b/js/safehomeCollection.js
index c0147098..edddb6a7 100644
--- a/js/safehomeCollection.js
+++ b/js/safehomeCollection.js
@@ -76,7 +76,7 @@ let SafehomeCollection = function () {
buffer.push(specificByte(safehome.getLon(), 2));
buffer.push(specificByte(safehome.getLon(), 3));
} else {
- buffer = Array(24).fill(0);
+ buffer = Array(10).fill(0);
buffer[0] = safehomeId;
}
diff --git a/resources/sitl/windows/inav_SITL.exe b/resources/sitl/windows/inav_SITL.exe
index 4930cebb..85521d69 100755
Binary files a/resources/sitl/windows/inav_SITL.exe and b/resources/sitl/windows/inav_SITL.exe differ
diff --git a/src/css/tabs/mission_planer.css b/src/css/tabs/mission_planer.css
index 5dfe4b8f..a844d152 100644
--- a/src/css/tabs/mission_planer.css
+++ b/src/css/tabs/mission_planer.css
@@ -525,9 +525,6 @@
.tab-mission-control .textLegend{
margin:2px;
}
-.tab-mission-control .valueLegend{
- float:right;
-}
.tab-mission-control .userActionContainer {
display: inline-block;
diff --git a/tabs/mission_control.html b/tabs/mission_control.html
index 2834a8ad..138dbf5c 100644
--- a/tabs/mission_control.html
+++ b/tabs/mission_control.html
@@ -187,45 +187,97 @@
+
-
-
- Available Safehomes:
+
-
+
-
-
-
- Max distance (m):
+
-
-
-
- Safe Radius (m):
+
- FW Approach
+
-
@@ -247,7 +299,7 @@
-
-
diff --git a/tabs/mission_control.js b/tabs/mission_control.js
index d131637a..28f2eb25 100644
--- a/tabs/mission_control.js
+++ b/tabs/mission_control.js
@@ -10,6 +10,8 @@
// MultiWii NAV Protocol
var MWNP = MWNP || {};
+var MAX_NEG_FW_LAND_ALT = -2000; // cm
+
// WayPoint type
MWNP.WPTYPE = {
WAYPOINT: 1,
@@ -78,8 +80,7 @@ TABS.mission_control.initialize = function (callback) {
let textFeature;
var textGeom;
let isOffline = false;
- let rthUpdateInterval = 0;
- let selectedSafehome = -1;
+ let rthUpdateInterval = 0;
let settings = { speed: 0, alt: 5000, safeRadiusSH : 50, maxDistSH : 0, fwApproachLength: 0, fwApproachAlt: 60, fwLandAlt: 5};
if (GUI.active_tab != 'mission_control') {
@@ -150,9 +151,10 @@ TABS.mission_control.initialize = function (callback) {
if (!isOffline) {
setTimeout(() => {
if (SAFEHOMES.safehomeCount() >= 1) {
- selectedSafehome = 0;
+ updateSelectedShAndFwAp(0);
} else {
- selectedSafehome = -1;
+ selectedSafehome = null;
+ selectedFwApproachSh = null;
}
renderSafehomesOnMap();
updateSafehomeInfo();
@@ -397,6 +399,8 @@ TABS.mission_control.initialize = function (callback) {
var tempMarker = null;
var disableMarkerEdit = false;
var selectedFwApproachWp = null;
+ var selectedFwApproachSh = null;
+
//////////////////////////////////////////////////////////////////////////////////////////////
// define & init parameters for default Settings
@@ -490,257 +494,23 @@ TABS.mission_control.initialize = function (callback) {
cleanSafehomeLayers();
}
- function renderSafehomesTable() {
-
- $safehomeContentBox.find("*").remove();
-
- if (selectedSafehome < 0) {
- return;
+ function checkApproachAltitude(altitude, isSeaLevelRef, sealevel) {
+
+ if (altitude - (isSeaLevelRef ? sealevel * 100 : 0 ) < 0) {
+ alert(chrome.i18n.getMessage('MissionPlannerAltitudeChangeReset'));
+ return false;
}
- if (!$("#missionPlannerSafehome").is(":visible")) {
- $("#missionPlannerSafehome").fadeIn(300);
- $('#safeHomeMaxDistance').text(settings.maxDistSH);
- $('#SafeHomeSafeDistance').text(settings.safeRadiusSH);
- }
-
- const safehome = SAFEHOMES.get()[selectedSafehome];
- const fwApproach = FW_APPROACH.get()[selectedSafehome];
-
- if (fwApproach.getLandHeading1() == 0 && fwApproach.getLandHeading1() == 0 && fwApproach.getApproachAltAsl() == 0 && fwApproach.getLandAltAsl() == 0) {
- fwApproach.setApproachAltAsl(settings.fwApproachAlt * 100);
- fwApproach.setLandAltAsl(settings.fwLandAlt * 100);
- }
-
- $safehomeContentBox.append('\
- \
-
\
-
Edit Safehome
\
- \
-
\
-
\
-
\
- ');
-
- if (fwApproach.getElevation() == 0) {
- (async () => {
- const elevation = await fwApproach.getElevationFromServer(safehome.getLonMap(), safehome.getLatMap(), globalSettings) * 100;
- fwApproach.setElevation(elevation);
- $('#safehomeElevation').text(fwApproach.getElevation() / 100 + " m");
- })();
- }
-
- const $safehomeBox = $safehomeContentBox.find('.missionPlannerSafehomeBox:last-child');
- $safehomeBox.find('.spacer_box_title').append(safehome.getNumber() + 1);
-
- $safehomeBox.find('#deleteSafehome').on('click', () => {
- var shNum = safehome.getNumber();
- SAFEHOMES.drop(shNum);
- FW_APPROACH.clean(shNum);
- selectedSafehome = SAFEHOMES.safehomeCount() - 1;
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- renderSafehomesTable();
- updateSafehomeInfo();
- });
-
- $safehomeBox.find('#safehomeLatitude').val(safehome.getLatMap()).on('change', event => {
- safehome.setLat(Math.round(Number($(event.currentTarget).val()) * 1e7));
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
-
- $safehomeBox.find('#safehomeLongitude').val(safehome.getLonMap()).on('change', event => {
- safehome.setLon(Math.round(Number($(event.currentTarget).val()) * 1e7));
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
- $safehomeBox.find($('#safehomeSeaLevelRef')).prop('checked', fwApproach.getIsSeaLevelRef()).change(event => {
-
- let isChecked = $(event.currentTarget).prop('checked') ? 1 : 0;
- fwApproach.setIsSeaLevelRef(isChecked);
-
- (async () => {
- const elevation = await fwApproach.getElevationFromServer(safehome.getLonMap(), safehome.getLatMap(), globalSettings) * 100;
- fwApproach.setElevation(elevation);
-
- $('#safehomeElevation').text(elevation / 100);
- $approachAlt = $safehomeBox.find('#safehomeApproachAlt');
- $landAlt = $safehomeBox.find('#safehomeLandAlt');
-
- if (isChecked) {
- fwApproach.setApproachAltAsl(fwApproach.getApproachAltAsl() + elevation);
- fwApproach.setLandAltAsl(fwApproach.getLandAltAsl() + elevation);
- } else {
- fwApproach.setApproachAltAsl(fwApproach.getApproachAltAsl() - elevation);
- fwApproach.setLandAltAsl(fwApproach.getLandAltAsl() - elevation);
-
- }
- $approachAlt.val(fwApproach.getApproachAltAsl());
- $landAlt.val(fwApproach.getLandAltAsl());
-
- $('#safehomeLandAltM').text(fwApproach.getLandAltAsl() / 100 + " m");
- $('#safehomeApproachAltM').text( fwApproach.getApproachAltAsl() / 100 + " m");
-
- })();
-
- });
-
- $safehomeBox.find('#safehomeApproachAlt').val(fwApproach.getApproachAltAsl()).on('change', event => {
-
- let altitude = Number($(event.currentTarget).val());
- if (checkLandingAltitude(altitude, $safehomeBox.find('#safehomeSeaLevelRef').prop('checked'), Number($('#safehomeElevation').text()))) {
- fwApproach.setApproachAltAsl(Number($(event.currentTarget).val()));
- $('#safehomeApproachAltM').text( fwApproach.getApproachAltAsl() / 100 + " m");
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- renderHomeTable();
- }
- $safehomeBox.find('#safehomeApproachAlt').val(fwApproach.getApproachAltAsl());
-
- });
-
- $safehomeBox.find('#safehomeLandAlt').val(fwApproach.getLandAltAsl()).on('change', event => {
-
- let altitude = Number($(event.currentTarget).val());
- if (checkLandingAltitude(altitude, $safehomeBox.find('#safehomeSeaLevelRef').prop('checked'), Number($('#safehomeElevation').text()))) {
- fwApproach.setLandAltAsl(altitude);
- $('#safehomeLandAltM').text(fwApproach.getLandAltAsl() / 100 + " m");
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- renderHomeTable();
- } else {
- $safehomeBox.find('#safehomeLandAlt').val(fwApproach.getLandAltAsl());
- }
- });
-
- $safehomeBox.find('#geozoneApproachDirection').val(fwApproach.getApproachDirection()).on('change', event => {
- fwApproach.setApproachDirection($(event.currentTarget).val());
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
- $safehomeBox.find('#safehomeLandHeading1Excl').prop('checked', fwApproach.getLandHeading1() < 0).change(event => {
- fwApproach.setLandHeading1(fwApproach.getLandHeading1() * -1);
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
- $safehomeBox.find('#safehomeLandHeading1').val(Math.abs(fwApproach.getLandHeading1())).on('change', event => {
- let val = Number($(event.currentTarget).val());
- if (val < 0) {
- val = 360;
- $safehomeBox.find('#safehomeLandHeading1').val(360);
- }
- if (val > 360) {
- val = 0;
- $safehomeBox.find('#safehomeLandHeading1').val(0);
- }
-
- if ($safehomeBox.find('#safehomeLandHeading1Excl').prop('checked')) {
- val *= -1;
- }
-
- fwApproach.setLandHeading1(val);
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
- $safehomeBox.find('#safehomeLandHeading2Excl').prop('checked', fwApproach.getLandHeading2() < 0).change(event => {
- fwApproach.setLandHeading2(fwApproach.getLandHeading2() * -1);
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
- $safehomeBox.find('#safehomeLandHeading2').val(Math.abs(fwApproach.getLandHeading2())).on('change', event => {
- let val = Number($(event.currentTarget).val());
- if (val < 0) {
- val = 360;
- $safehomeBox.find('#safehomeLandHeading2').val(360);
- }
- if (val > 360) {
- val = 0;
- $safehomeBox.find('#safehomeLandHeading2').val(0);
- }
-
- if ($safehomeBox.find('#safehomeLandHeading2Excl').prop('checked')) {
- val *= -1;
- }
-
- fwApproach.setLandHeading2(val);
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
-
- $('#safehomeLandAltM').text(fwApproach.getLandAltAsl() / 100 + " m");
- $('#safehomeApproachAltM').text(fwApproach.getApproachAltAsl() / 100 + " m");
-
- if (fwApproach.getElevation() != NaN)
- $('#safehomeElevation').text(fwApproach.getElevation() / 100 + " m");
-
- GUI.switchery();
- localize();
+ return true;
}
function checkLandingAltitude(altitude, isSeaLevelRef, sealevel) {
- if (isSeaLevelRef && altitude - sealevel < 0) {
- alert(chrome.i18n.getMessage('MissionPlannerAltitudeChangeReset'));
+ if (altitude - (isSeaLevelRef ? sealevel * 100 : 0 ) < MAX_NEG_FW_LAND_ALT) {
+ alert(chrome.i18n.getMessage('MissionPlannerFwLAndingAltitudeChangeReset'));
return false;
}
+
return true;
}
@@ -749,40 +519,20 @@ TABS.mission_control.initialize = function (callback) {
$('#availableSafehomes').text(freeSamehomes + '/' + SAFEHOMES.getMaxSafehomeCount());
}
- function addSafehome(){
- if (SAFEHOMES.safehomeCount() + 1 > SAFEHOMES.getMaxSafehomeCount()){
- alert(chrome.i18n.getMessage('missionSafehomeMaxSafehomesReached'));
- return;
- }
-
- let mapCenter = map.getView().getCenter();
- let midLon = Math.round(ol.proj.toLonLat(mapCenter)[0] * 1e7);
- let midLat = Math.round(ol.proj.toLonLat(mapCenter)[1] * 1e7);
- SAFEHOMES.put(new Safehome(SAFEHOMES.safehomeCount(), 1, midLat, midLon));
- selectedSafehome = SAFEHOMES.safehomeCount() - 1;
-
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- renderSafehomesTable();
- updateSafehomeInfo();
- }
-
function renderSafehomesOnMap() {
/*
* Process safehome on Map
*/
-
+ SAFEHOMES.get().forEach(safehome => {
+ addFwApproach(safehome.getLonMap(), safehome.getLatMap(), FW_APPROACH.get()[safehome.getNumber()], safehomeMarkers);
+ });
SAFEHOMES.get().forEach(safehome => {
addSafehomeCircles(safehome);
addSafeHomeMarker(safehome);
});
- SAFEHOMES.get().forEach(safehome => {
- addFwApproach(safehome.getLonMap(), safehome.getLatMap(), FW_APPROACH.get()[safehome.getNumber()], safehomeMarkers);
- });
}
-
function cleanSafehomeLayers() {
for (var i in safehomeMarkers) {
map.removeLayer(safehomeMarkers[i]);
@@ -1621,20 +1371,63 @@ TABS.mission_control.initialize = function (callback) {
function redrawLayers() {
if (!mission.isEmpty()) {
+ repaintLine4Waypoints(mission);
mission.get().forEach(function (element) {
if (!element.isAttached()) {
map.addLayer(addWaypointMarker(element));
}
});
- repaintLine4Waypoints(mission);
+
}
}
function redrawLayer() {
+ repaintLine4Waypoints(mission);
if (selectedFeature && selectedMarker) {
selectedFeature.setStyle(getWaypointIcon(selectedMarker, true));
}
- repaintLine4Waypoints(mission);
+ }
+
+ function renderSafeHomeOptions() {
+ if (selectedSafehome && selectedFwApproachSh) {
+
+ if (!$('#missionPlannerSafehome').is(':visible')) {
+ $('#missionPlannerSafehome').fadeIn(300);
+ }
+
+ $('#SafehomeContentBox').show();
+
+ if (selectedFwApproachSh.getLandHeading1() == 0 && selectedFwApproachSh.getLandHeading1() == 0 && selectedFwApproachSh.getApproachAltAsl() == 0 && selectedFwApproachSh.getLandAltAsl() == 0) {
+ selectedFwApproachSh.setApproachAltAsl(settings.fwApproachAlt * 100);
+ selectedFwApproachSh.setLandAltAsl(settings.fwLandAlt * 100);
+ }
+
+ if (selectedFwApproachSh.getElevation() == 0) {
+ (async () => {
+ const elevation = await selectedFwApproachSh.getElevationFromServer(selectedSafehome.getLonMap(), selectedSafehome.getLatMap(), globalSettings) * 100;
+ selectedFwApproachSh.setElevation(elevation);
+ $('#safehomeElevation').text(selectedFwApproachSh.getElevation() / 100 + " m");
+ })();
+ }
+
+ const $safehomeBox = $safehomeContentBox.find('.missionPlannerSafehomeBox:last-child');
+ $safehomeBox.find('.spacer_box_title').text(chrome.i18n.getMessage('safehomeEdit') + ' ' + (selectedSafehome.getNumber() + 1));
+
+ $('#safehomeLatitude').val(selectedSafehome.getLatMap());
+ $('#safehomeLongitude').val(selectedSafehome.getLonMap());
+ changeSwitchery($('#safehomeSeaLevelRef'), selectedFwApproachSh.getIsSeaLevelRef());
+ $('#safehomeApproachAlt').val(selectedFwApproachSh.getApproachAltAsl());
+ $('#safehomeLandAlt').val(selectedFwApproachSh.getLandAltAsl());
+ $('#geozoneApproachDirection').val(selectedFwApproachSh.getApproachDirection());
+ $('#safehomeLandHeading1').val(Math.abs(selectedFwApproachSh.getLandHeading1()));
+ changeSwitchery($('#safehomeLandHeading1Excl'), selectedFwApproachSh.getLandHeading1() < 0);
+ $('#safehomeLandHeading2').val(Math.abs(selectedFwApproachSh.getLandHeading2()));
+ changeSwitchery($('#safehomeLandHeading2Excl'), selectedFwApproachSh.getLandHeading2() < 0);
+ $('#safehomeLandAltM').text(selectedFwApproachSh.getLandAltAsl() / 100 + " m");
+ $('#safehomeApproachAltM').text(selectedFwApproachSh.getApproachAltAsl() / 100 + " m");
+ } else {
+ $('#SafehomeContentBox').hide();
+ }
}
function renderWaypointOptionsTable(waypoint) {
@@ -1854,10 +1647,7 @@ TABS.mission_control.initialize = function (callback) {
var handleShowSafehome = function () {
$('#missionPlannerSafehome').fadeIn(300);
- //SAFEHOMES.flush();
- //mspHelper.loadSafehomes();
cleanSafehomeLayers();
- renderSafehomesTable();
renderSafehomesOnMap();
$('#safeHomeMaxDistance').text(settings.maxDistSH);
$('#SafeHomeSafeDistance').text(settings.safeRadiusSH);
@@ -2019,11 +1809,10 @@ TABS.mission_control.initialize = function (callback) {
$('#safeHomeLongitude').val(Math.round(coord[0] * 1e7));
$('#safeHomeLatitude').val(Math.round(coord[1] * 1e7));
- selectedSafehome = tempMarker.number;
-
+ updateSelectedShAndFwAp(tempMarker.number);
+ renderSafeHomeOptions();
cleanSafehomeLayers();
renderSafehomesOnMap();
- renderSafehomesTable();
}
else if (tempMarker.kind == "home") {
HOME.setLon(Math.round(coord[0] * 10000000));
@@ -2108,8 +1897,8 @@ TABS.mission_control.initialize = function (callback) {
approach.setLandAltAsl(approach.getLandAltAsl() - approach.getElevation() + elevation);
}
approach.setElevation(elevation);
- renderSafehomesTable();
- }
+ }
+ renderSafeHomeOptions();
})()
}
this.coordinate_ = null;
@@ -2343,8 +2132,8 @@ TABS.mission_control.initialize = function (callback) {
}
}
else if (selectedFeature && tempMarker.kind == "safehome" && tempMarker.selection) {
- selectedSafehome = tempMarker.number;
- renderSafehomesTable();
+ updateSelectedShAndFwAp(tempMarker.number);
+ renderSafeHomeOptions();
}
else if (selectedFeature && tempMarker.kind == "home" && tempMarker.selection) {
selectedMarker = HOME;
@@ -2724,7 +2513,7 @@ TABS.mission_control.initialize = function (callback) {
$('#wpApproachAlt').on('change', (event) => {
if (selectedMarker && selectedFwApproachWp) {
let altitude = Number($(event.currentTarget).val());
- if (checkLandingAltitude(altitude, $('#pointP3Alt').prop('checked'), Number($('#elevationValueAtWP').text()))) {
+ if (checkApproachAltitude(altitude, $('#pointP3Alt').prop('checked'), Number($('#elevationValueAtWP').text()))) {
selectedFwApproachWp.setApproachAltAsl(Number($(event.currentTarget).val()));
$('#wpApproachAltM').text(selectedFwApproachWp.getApproachAltAsl() / 100 + " m");
}
@@ -2854,23 +2643,25 @@ TABS.mission_control.initialize = function (callback) {
});
/////////////////////////////////////////////
- // Callback for SAFEHOMES Table
+ // Callback for SAFEHOMES
/////////////////////////////////////////////
- /*
- $safehomesTableBody.on('click', "[data-role='safehome-center']", function (event) {
- let mapCenter = map.getView().getCenter();
- let tmpSH = SAFEHOMES.getSafehome($(event.currentTarget).attr("data-index"));
- tmpSH.setLon(Math.round(ol.proj.toLonLat(mapCenter)[0] * 1e7));
- tmpSH.setLat(Math.round(ol.proj.toLonLat(mapCenter)[1] * 1e7));
- SAFEHOMES.updateSafehome(tmpSH);
- renderSafehomesTable();
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- });
- */
+
$('#addSafehome').on('click', () => {
- addSafehome();
+ if (SAFEHOMES.safehomeCount() + 1 > SAFEHOMES.getMaxSafehomeCount()){
+ alert(chrome.i18n.getMessage('missionSafehomeMaxSafehomesReached'));
+ return;
+ }
+
+ let mapCenter = map.getView().getCenter();
+ let midLon = Math.round(ol.proj.toLonLat(mapCenter)[0] * 1e7);
+ let midLat = Math.round(ol.proj.toLonLat(mapCenter)[1] * 1e7);
+ SAFEHOMES.put(new Safehome(SAFEHOMES.safehomeCount(), 1, midLat, midLon));
+ updateSelectedShAndFwAp(SAFEHOMES.safehomeCount() - 1);
+ renderSafeHomeOptions();
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ updateSafehomeInfo();
});
$('#cancelSafehome').on('click', function () {
@@ -2880,16 +2671,26 @@ TABS.mission_control.initialize = function (callback) {
$('#loadEepromSafehomeButton').on('click', function () {
$(this).addClass('disabled');
GUI.log('Start of getting Safehome points');
- mspHelper.loadSafehomes(mspHelper.loadFwApproach);
- setTimeout(function(){
- renderSafehomesTable();
- cleanSafehomeLayers();
- renderSafehomesOnMap();
- updateSafehomeInfo();
- GUI.log(chrome.i18n.getMessage('endGettingSafehomePoints'));
- $('#loadEepromSafehomeButton').removeClass('disabled');
- }, 500);
-
+ var loadChainer = new MSPChainerClass();
+ loadChainer.setChain([
+ mspHelper.loadSafehomes,
+ mspHelper.loadFwApproach,
+ function() {
+ if (SAFEHOMES.safehomeCount() >= 1) {
+ updateSelectedShAndFwAp(0);
+ } else {
+ selectedSafehome = null;
+ selectedFwApproachSh = null;
+ }
+ renderSafeHomeOptions();
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ updateSafehomeInfo();
+ GUI.log(chrome.i18n.getMessage('endGettingSafehomePoints'));
+ $('#loadEepromSafehomeButton').removeClass('disabled');
+ }
+ ]);
+ loadChainer.execute();
});
$('#saveEepromSafehomeButton').on('click', function() {
@@ -2909,6 +2710,176 @@ TABS.mission_control.initialize = function (callback) {
saveChainer.execute();
});
+ $('#deleteSafehome').on('click', () => {
+ if (selectedSafehome && selectedFwApproachSh) {
+ var shNum = selectedSafehome.getNumber();
+ SAFEHOMES.drop(shNum);
+ FW_APPROACH.clean(shNum);
+
+ if (SAFEHOMES.safehomeCount() > 0) {
+ updateSelectedShAndFwAp(SAFEHOMES.safehomeCount() - 1);
+ } else {
+ selectedSafehome = null;
+ selectedFwApproachSh = null;
+ }
+ renderSafeHomeOptions();
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ updateSafehomeInfo();
+ }
+ });
+
+ $('#safehomeLatitude').on('change', event => {
+ if (selectedFwApproachSh) {
+ selectedFwApproachSh.setLat(Math.round(Number($(event.currentTarget).val()) * 1e7));
+ renderSafeHomeOptions();
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
+
+ $('#safehomeLongitude').on('change', event => {
+ if (selectedFwApproachSh) {
+ selectedFwApproachSh.setLon(Math.round(Number($(event.currentTarget).val()) * 1e7));
+ renderSafeHomeOptions();
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
+ $('#safehomeSeaLevelRef').on('change', event => {
+
+ let isChecked = $(event.currentTarget).prop('checked') ? 1 : 0;
+ if (selectedSafehome && selectedFwApproachSh && isChecked != selectedFwApproachSh.getIsSeaLevelRef()) {
+ selectedFwApproachSh.setIsSeaLevelRef(isChecked);
+
+ (async () => {
+ const elevation = await selectedFwApproachSh.getElevationFromServer(selectedSafehome.getLonMap(), selectedSafehome.getLatMap(), globalSettings) * 100;
+ selectedFwApproachSh.setElevation(elevation);
+
+ if (isChecked) {
+ selectedFwApproachSh.setApproachAltAsl(selectedFwApproachSh.getApproachAltAsl() + elevation);
+ selectedFwApproachSh.setLandAltAsl(selectedFwApproachSh.getLandAltAsl() + elevation);
+ } else {
+ selectedFwApproachSh.setApproachAltAsl(selectedFwApproachSh.getApproachAltAsl() - elevation);
+ selectedFwApproachSh.setLandAltAsl(selectedFwApproachSh.getLandAltAsl() - elevation);
+
+ }
+
+ $('#safehomeElevation').text(elevation / 100);
+ $('#safehomeApproachAlt').val(selectedFwApproachSh.getApproachAltAsl());
+ $('#safehomeLandAlt').val(selectedFwApproachSh.getLandAltAsl());
+ $('#safehomeLandAltM').text(selectedFwApproachSh.getLandAltAsl() / 100 + " m");
+ $('#safehomeApproachAltM').text(selectedFwApproachSh.getApproachAltAsl() / 100 + " m");
+
+ renderSafeHomeOptions();
+ })();
+ }
+ });
+
+ $('#safehomeApproachAlt').on('change', event => {
+
+ if (selectedFwApproachSh) {
+ let altitude = Number($(event.currentTarget).val());
+ if (checkApproachAltitude(altitude, $('#safehomeSeaLevelRef').prop('checked'), Number($('#safehomeElevation').text()))) {
+ selectedFwApproachSh.setApproachAltAsl(Number($(event.currentTarget).val()));
+ $('#safehomeApproachAltM').text(selectedFwApproachSh.getApproachAltAsl() / 100 + " m");
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ renderHomeTable();
+ }
+ $('#safehomeApproachAlt').val(selectedFwApproachSh.getApproachAltAsl());
+ }
+
+ });
+
+ $('#safehomeLandAlt').on('change', event => {
+
+ if (selectedFwApproachSh) {
+ let altitude = Number($(event.currentTarget).val());
+ if (checkLandingAltitude(altitude, $('#safehomeSeaLevelRef').prop('checked'), Number($('#safehomeElevation').text()))) {
+ selectedFwApproachSh.setLandAltAsl(altitude);
+ $('#safehomeLandAltM').text(selectedFwApproachSh.getLandAltAsl() / 100 + " m");
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ renderHomeTable();
+ } else {
+ $('#safehomeLandAlt').val(selectedFwApproachSh.getLandAltAsl());
+ }
+ }
+ });
+
+ $('#geozoneApproachDirection').on('change', event => {
+ if (selectedFwApproachSh) {
+ selectedFwApproachSh.setApproachDirection($(event.currentTarget).val());
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
+ $('#safehomeLandHeading1Excl').on('change', event => {
+ if (selectedFwApproachSh) {
+ selectedFwApproachSh.setLandHeading1(selectedFwApproachSh.getLandHeading1() * -1);
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
+ $('#safehomeLandHeading1').on('change', event => {
+ if (selectedFwApproachSh) {
+ let val = Number($(event.currentTarget).val());
+ if (val < 0) {
+ val = 360;
+ $('#safehomeLandHeading1').val(360);
+ }
+ if (val > 360) {
+ val = 0;
+ $('#safehomeLandHeading1').val(0);
+ }
+
+ if ($('#safehomeLandHeading1Excl').prop('checked')) {
+ val *= -1;
+ }
+
+ selectedFwApproachSh.setLandHeading1(val);
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
+
+ $('#safehomeLandHeading2Excl').on('change', event => {
+ if (selectedFwApproachSh) {
+ selectedFwApproachSh.setLandHeading2(selectedFwApproachSh.getLandHeading2() * -1);
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
+
+ $('#safehomeLandHeading2').on('change', event => {
+ if (selectedFwApproachSh) {
+ let val = Number($(event.currentTarget).val());
+ if (val < 0) {
+ val = 360;
+ $('#safehomeLandHeading2').val(360);
+ }
+ if (val > 360) {
+ val = 0;
+ $('#safehomeLandHeading2').val(0);
+ }
+
+ if ($('#safehomeLandHeading2Excl').prop('checked')) {
+ val *= -1;
+ }
+
+ selectedFwApproachSh.setLandHeading2(val);
+ cleanSafehomeLayers();
+ renderSafehomesOnMap();
+ }
+ });
+
/////////////////////////////////////////////
// Callback for HOME Table
/////////////////////////////////////////////
@@ -3396,57 +3367,53 @@ TABS.mission_control.initialize = function (callback) {
// mission = configurator store, WP number indexed from 0, MISSION_PLANNER = FC NVM store, WP number indexed from 1
/////////////////////////////////////////////
function getWaypointsFromFC(loadEeprom) {
+
+ var loadChainer = new MSPChainerClass();
+ var chain = [mspHelper.loadFwApproach];
if (loadEeprom) {
- MSP.send_message(MSPCodes.MSP_WP_MISSION_LOAD, [0], getFwApproach);
- } else {
- getFwApproach();
- }
-
- function getFwApproach()
- {
- mspHelper.loadFwApproach(getWaypointData);
- }
-
- function getWaypointData() {
-
- mspHelper.loadWaypoints(function() {
- GUI.log(chrome.i18n.getMessage('endGetPoint'));
- if (loadEeprom) {
- GUI.log(chrome.i18n.getMessage('eeprom_load_ok'));
- $('#loadEepromMissionButton').removeClass('disabled');
- } else {
- $('#loadMissionButton').removeClass('disabled');
- }
- if (!MISSION_PLANNER.getCountBusyPoints()) {
- alert(chrome.i18n.getMessage('no_waypoints_to_load'));
- return;
- }
- mission.reinit();
- mission.copy(MISSION_PLANNER);
- mission.update(false, true);
-
- /* check multimissions */
- multimissionCount = 0;
- mission.get().forEach(function (element) {
- if (element.getEndMission() == 0xA5) {
- element.setMultiMissionIdx(multimissionCount);
- multimissionCount ++;
- }
- });
- multimissionCount = multimissionCount > 1 ? multimissionCount : 0;
- multimission.reinit();
- if (multimissionCount > 1) {
- multimission.copy(mission);
- $('#missionPlannerMultiMission').fadeIn(300);
- }
- renderMultimissionTable();
-
- setView(16);
- redrawLayers();
- updateTotalInfo();
+ chain.push(function(callback) {
+ MSP.send_message(MSPCodes.MSP_WP_MISSION_LOAD, [0], callback);
});
-
- };
+ }
+ chain.push(mspHelper.loadWaypoints);
+ chain.push(function() {
+ GUI.log(chrome.i18n.getMessage('endGetPoint'));
+ if (loadEeprom) {
+ GUI.log(chrome.i18n.getMessage('eeprom_load_ok'));
+ $('#loadEepromMissionButton').removeClass('disabled');
+ } else {
+ $('#loadMissionButton').removeClass('disabled');
+ }
+ if (!MISSION_PLANNER.getCountBusyPoints()) {
+ alert(chrome.i18n.getMessage('no_waypoints_to_load'));
+ return;
+ }
+ mission.reinit();
+ mission.copy(MISSION_PLANNER);
+ mission.update(false, true);
+
+ /* check multimissions */
+ multimissionCount = 0;
+ mission.get().forEach(function (element) {
+ if (element.getEndMission() == 0xA5) {
+ element.setMultiMissionIdx(multimissionCount);
+ multimissionCount++;
+ }
+ });
+ multimissionCount = multimissionCount > 1 ? multimissionCount : 0;
+ multimission.reinit();
+ if (multimissionCount > 1) {
+ multimission.copy(mission);
+ $('#missionPlannerMultiMission').fadeIn(300);
+ }
+ renderMultimissionTable();
+ setView(16);
+ redrawLayers();
+ updateTotalInfo();
+ });
+
+ loadChainer.setChain(chain);
+ loadChainer.execute();
}
function sendWaypointsToFC(saveEeprom) {
@@ -3512,6 +3479,11 @@ TABS.mission_control.initialize = function (callback) {
}
}
+ function updateSelectedShAndFwAp(index) {
+ selectedSafehome = SAFEHOMES.get()[index];
+ selectedFwApproachSh = FW_APPROACH.get()[index];
+ }
+
/* resetAltitude = true : For selected WPs only. Changes WP Altitude value back to previous value if setting below ground level.
^ resetAltitude = false : changes WP Altitude to value required to give ground clearance = default Altitude setting
^ AbsAltCheck : check value for whether or not to use absolute altitude. This can be the P3 bitset or excplicitly set to true or false */
diff --git a/tabs/mixer.js b/tabs/mixer.js
index d0cbb368..7c687510 100644
--- a/tabs/mixer.js
+++ b/tabs/mixer.js
@@ -668,7 +668,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
$('#platform-type').parent('.select').addClass('no-bottom-border');
}
- if (!updateEzTuneTabVisibility(false)) {
+ if (updateEzTuneTabVisibility(false)) {
EZ_TUNE.enabled = 0;
mspHelper.saveEzTune();
}