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
\ -
\ -
\ - \ -
\ -
\ -
\ -
\ -
\ - \ - \ -
\ -
\ - \ - \ -
\ -
\ - Fixed Wing landing settings: \ -
\ -
\ - \ - \ -
\ -
\ - \ - \ - \ -
\ -
\ - \ - \ - \ -
\ -
\ - \ - \ -
\ -
\ - \ - \ -
\ -
\ - \ - \ - Excl. \ -
\ -
\ - \ - \ - Excl. \ -
\ -
\ -
\ - '); - - 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(); }