diff --git a/src/css/tabs/mission_planer.css b/src/css/tabs/mission_planer.css index 563b0d89..2759a143 100644 --- a/src/css/tabs/mission_planer.css +++ b/src/css/tabs/mission_planer.css @@ -522,3 +522,7 @@ .tab-mission-control .valueLegend{ float:right; } + +.tab-mission-control .userActionContainer { + display: inline-block; +} \ No newline at end of file diff --git a/tabs/mission_control.html b/tabs/mission_control.html index 508da5d2..8dfeb1c8 100644 --- a/tabs/mission_control.html +++ b/tabs/mission_control.html @@ -259,8 +259,8 @@ +
diff --git a/tabs/mission_control.js b/tabs/mission_control.js index 882018b4..b62d820f 100644 --- a/tabs/mission_control.js +++ b/tabs/mission_control.js @@ -33,19 +33,20 @@ function swap(dict) { MWNP.WPTYPE.REV = swap(MWNP.WPTYPE); -// Dictionary of Parameter1,2,3 definition depending on type of action selected (refer to MWNP.WPTYPE) +// Dictionary of Parameter 1,2,3 definition depending on type of action selected (refer to MWNP.WPTYPE) var dictOfLabelParameterPoint = { - 1: {parameter1: 'Speed (cm/s)', parameter2: '', parameter3: 'Sea level Ref'}, - 2: {parameter1: '', parameter2: '', parameter3: ''}, - 3: {parameter1: 'Wait time (s)', parameter2: 'Speed (cm/s)', parameter3: 'Sea level Ref'}, - 4: {parameter1: 'Force land (non zero)', parameter2: '', parameter3: ''}, - 5: {parameter1: '', parameter2: '', parameter3: ''}, - 6: {parameter1: 'Target WP number', parameter2: 'Number of repeat (-1: infinite)', parameter3: ''}, - 7: {parameter1: 'Heading (deg)', parameter2: '', parameter3: ''}, - 8: {parameter1: '', parameter2: '', parameter3: 'Sea level Ref'} + 1: {parameter1: 'Speed (cm/s)', parameter2: '', parameter3: 'Sea level Ref'}, + 2: {parameter1: '', parameter2: '', parameter3: ''}, + 3: {parameter1: 'Wait time (s)', parameter2: 'Speed (cm/s)', parameter3: 'Sea level Ref'}, + 4: {parameter1: 'Force land (non zero)', parameter2: '', parameter3: ''}, + 5: {parameter1: '', parameter2: '', parameter3: ''}, + 6: {parameter1: 'Target WP number', parameter2: 'Number of repeat (-1: infinite)', parameter3: ''}, + 7: {parameter1: 'Heading (deg)', parameter2: '', parameter3: ''}, + 8: {parameter1: '', parameter2: '', parameter3: 'Sea level Ref'} }; var waypointOptions = ['JUMP','SET_HEAD','RTH']; +var initParam3 = 0; //////////////////////////////////// // @@ -152,7 +153,6 @@ TABS.mission_control.initialize = function (callback) { if (!cursorInitialized) { cursorInitialized = true; - ///////////////////////////////////// //create layer for current position curPosStyle = new ol.style.Style({ @@ -206,7 +206,6 @@ TABS.mission_control.initialize = function (callback) { source: rthVector }); - ////////////////////////////// //create layer for bread crumbs breadCrumbLS = new ol.geom.LineString([ol.proj.fromLonLat([lon, lat]), ol.proj.fromLonLat([lon, lat])]); @@ -232,7 +231,6 @@ TABS.mission_control.initialize = function (callback) { source: breadCrumbSource }); - ///////////////////////////// //create layer for heading, alt, groundspeed textGeom = new ol.geom.Point([0,0]); @@ -252,7 +250,6 @@ TABS.mission_control.initialize = function (callback) { }) }); - textFeature = new ol.Feature({ geometry: textGeom }); @@ -271,7 +268,6 @@ TABS.mission_control.initialize = function (callback) { map.addLayer(breadCrumbVector); map.addLayer(currentPositionLayer); map.addControl(textVector); - } let gpsPos = ol.proj.fromLonLat([lon, lat]); @@ -297,7 +293,6 @@ TABS.mission_control.initialize = function (callback) { 'm\nSpeed: ' + GPS_DATA.speed + 'cm/s\n' + 'Dist: ' + GPS_DATA.distanceToHome + 'm'); - //update RTH every 5th GPS update since it really shouldn't change if(rthUpdateInterval >= 5) { @@ -312,7 +307,7 @@ TABS.mission_control.initialize = function (callback) { } } - /* + /* * enable data pulling if not offline * Refreshing data at 5Hz... Could slow this down if we have performance issues */ @@ -418,7 +413,7 @@ TABS.mission_control.initialize = function (callback) { $('#pointAlt').val(''); $('#pointP1').val(''); $('#pointP2').val(''); - $('#pointP3').val(''); + $('#pointP3Alt').val(''); $('#missionDistance').text(0); $('#MPeditPoint').fadeOut(300); } @@ -735,7 +730,6 @@ TABS.mission_control.initialize = function (callback) { }); } - function updateHome() { renderHomeTable(); cleanHomeLayers(); @@ -982,7 +976,6 @@ TABS.mission_control.initialize = function (callback) { } } - ///////////////////////////////////////////// // // Manage Waypoint @@ -998,7 +991,6 @@ TABS.mission_control.initialize = function (callback) { } function addWaypointMarker(waypoint, isEdit=false) { - let coord = ol.proj.fromLonLat([waypoint.getLonMap(), waypoint.getLatMap()]); var iconFeature = new ol.Feature({ geometry: new ol.geom.Point(coord), @@ -1055,7 +1047,6 @@ TABS.mission_control.initialize = function (callback) { }); } - function repaintLine4Waypoints(mission) { let oldPos, oldAction, @@ -1206,7 +1197,6 @@ TABS.mission_control.initialize = function (callback) { source: vectorSource }); - vectorLayer.kind = "line"; vectorLayer.selection = selection; vectorLayer.number = pos2ID; @@ -1261,7 +1251,6 @@ TABS.mission_control.initialize = function (callback) { repaintLine4Waypoints(mission); } - function renderWaypointOptionsTable(waypoint) { /* * Process Waypoint Options table UI @@ -1275,8 +1264,8 @@ TABS.mission_control.initialize = function (callback) { \ \ \ - \ - \ + \ + \ \ \ '); @@ -1286,9 +1275,11 @@ TABS.mission_control.initialize = function (callback) { for (var i = 1; i <= 3; i++) { if (dictOfLabelParameterPoint[element.getAction()]['parameter'+String(i)] != '') { $row.find(".waypointOptions-p"+String(i)).prop("disabled", false); + $row.find(".waypointOptions-p"+String(i)).prop("title", dictOfLabelParameterPoint[element.getAction()]['parameter'+String(i)]); } else { $row.find(".waypointOptions-p"+String(i)).prop("disabled", true); + $row.find(".waypointOptions-p"+String(i)).prop("title", ""); } } @@ -1299,9 +1290,11 @@ TABS.mission_control.initialize = function (callback) { for (var i = 1; i <= 3; i++) { if (dictOfLabelParameterPoint[element.getAction()]['parameter'+String(i)] != '') { $row.find(".waypointOptions-p"+String(i)).prop("disabled", false); + $row.find(".waypointOptions-p"+String(i)).prop("title", dictOfLabelParameterPoint[element.getAction()]['parameter'+String(i)]); } else { $row.find(".waypointOptions-p"+String(i)).prop("disabled", true); + $row.find(".waypointOptions-p"+String(i)).prop("title", ""); } } mission.updateWaypoint(element); @@ -1311,7 +1304,6 @@ TABS.mission_control.initialize = function (callback) { $row.find(".waypointOptions-number").text(element.getAttachedNumber()+1); - $row.find(".waypointOptions-p1").val((MWNP.WPTYPE.REV[element.getAction()] == "JUMP" ? element.getP1()+1 : element.getP1())).change(function () { if (MWNP.WPTYPE.REV[element.getAction()] == "SET_HEAD") { if ($(this).val() >= 360 || ($(this).val() < 0 && $(this).val() != -1)) @@ -1462,7 +1454,6 @@ TABS.mission_control.initialize = function (callback) { }; ol.inherits(app.PlannerSettingsControl, ol.control.Control); - /** * @constructor * @extends {ol.control.Control} @@ -1840,8 +1831,17 @@ TABS.mission_control.initialize = function (callback) { // Change SpeedValue to Parameter1, 2, 3 $('#pointP1').val(selectedMarker.getP1()); $('#pointP2').val(selectedMarker.getP2()); - changeSwitchery($('#pointP3'), selectedMarker.getP3() == 1); + let P3Value = selectedMarker.getP3(); + initParam3 = 0; // Reset init bits for P3 before setting up checkboxes + + changeSwitchery($('#pointP3Alt'), TABS.mission_control.isBitSet(P3Value, 0)); + changeSwitchery($('#pointP3UserAction1'), TABS.mission_control.isBitSet(P3Value, 1)); + changeSwitchery($('#pointP3UserAction2'), TABS.mission_control.isBitSet(P3Value, 2)); + changeSwitchery($('#pointP3UserAction3'), TABS.mission_control.isBitSet(P3Value, 3)); + changeSwitchery($('#pointP3UserAction4'), TABS.mission_control.isBitSet(P3Value, 4)); + initParam3 = 31; // Set all bits for above P3 params to true, after setting checkboxes + // Selection box update depending on choice of type of waypoint for (var j in dictOfLabelParameterPoint[selectedMarker.getAction()]) { if (dictOfLabelParameterPoint[selectedMarker.getAction()][j] != '') { @@ -1853,6 +1853,7 @@ TABS.mission_control.initialize = function (callback) { selectedMarker = renderWaypointOptionsTable(selectedMarker); $('#EditPointNumber').text("Edit point "+String(selectedMarker.getLayerNumber()+1)); $('#MPeditPoint').fadeIn(300); + $('#pointP3UserActionClass').fadeIn(); redrawLayer(); } else if (selectedFeature && tempMarker.kind == "line" && tempMarker.selection && !disableMarkerEdit) { @@ -2104,20 +2105,25 @@ TABS.mission_control.initialize = function (callback) { } }); - $('#pointP3').on('change', function (event) { - if (disableMarkerEdit) { - changeSwitchery($('#pointP3'), selectedMarker.getP3() == 1); - } - + $('#pointP3Alt').on('change', function (event) { if (selectedMarker) { - const P3Value = selectedMarker.getP3(); - selectedMarker.setP3( $('#pointP3').prop("checked") ? 1.0 : 0.0); + P3Value = selectedMarker.getP3(); + + if (disableMarkerEdit) { + changeSwitchery($('#pointP3Alt'), TABS.mission_control.isBitSet(P3Value, 0)); + } + + P3Value = TABS.mission_control.setBit(P3Value, 0, $('#pointP3Alt').prop("checked")); + selectedMarker.setP3(P3Value); + + P3Value = TABS.mission_control.setBit(P3Value, 0, $('#pointP3Alt').prop("checked")); + selectedMarker.setP3(P3Value); (async () => { const elevationAtWP = await selectedMarker.getElevation(globalSettings); $('#elevationValueAtWP').text(elevationAtWP); var altitude = Number($('#pointAlt').val()); if (P3Value != selectedMarker.getP3()) { - if ($('#pointP3').prop("checked")) { + if ($('#pointP3Alt').prop("checked")) { if (altitude < 0) { altitude = settings.alt; } @@ -2140,6 +2146,66 @@ TABS.mission_control.initialize = function (callback) { } }); + $('#pointP3UserAction1').on('change', function(event){ + if (selectedMarker) { + if (disableMarkerEdit) { + changeSwitchery($('#pointP3UserAction1'), TABS.mission_control.isBitSet(selectedMarker.getP3(), 1)); + } + + P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), 1, $('#pointP3UserAction1').prop("checked")); + selectedMarker.setP3(P3Value); + + mission.updateWaypoint(selectedMarker); + mission.update(singleMissionActive()); + redrawLayer(); + } + }); + + $('#pointP3UserAction2').on('change', function(event){ + if (selectedMarker) { + if (disableMarkerEdit) { + changeSwitchery($('#pointP3UserAction2'), TABS.mission_control.isBitSet(selectedMarker.getP3(), 2)); + } + + P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), 2, $('#pointP3UserAction2').prop("checked")); + selectedMarker.setP3(P3Value); + + mission.updateWaypoint(selectedMarker); + mission.update(singleMissionActive()); + redrawLayer(); + } + }); + + $('#pointP3UserAction3').on('change', function(event){ + if (selectedMarker) { + if (disableMarkerEdit) { + changeSwitchery($('#pointP3UserAction3'), TABS.mission_control.isBitSet(selectedMarker.getP3(), 3)); + } + + P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), 3, $('#pointP3UserAction3').prop("checked")); + selectedMarker.setP3(P3Value); + + mission.updateWaypoint(selectedMarker); + mission.update(singleMissionActive()); + redrawLayer(); + } + }); + + $('#pointP3UserAction4').on('change', function(event){ + if (selectedMarker) { + if (disableMarkerEdit) { + changeSwitchery($('#pointP3UserAction4'), TABS.mission_control.isBitSet(selectedMarker.getP3(), 4)); + } + + P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), 4, $('#pointP3UserAction4').prop("checked")); + selectedMarker.setP3(P3Value); + + mission.updateWaypoint(selectedMarker); + mission.update(singleMissionActive()); + redrawLayer(); + } + }); + ///////////////////////////////////////////// // Callback for Waypoint Options Table ///////////////////////////////////////////// @@ -2417,7 +2483,6 @@ TABS.mission_control.initialize = function (callback) { updateTotalInfo(); } - ///////////////////////////////////////////// // // Load/Save MWP File Toolbox @@ -2634,7 +2699,6 @@ TABS.mission_control.initialize = function (callback) { } ///////////////////////////////////////////// - // // Load/Save FC mission Toolbox // mission = configurator store, WP number indexed from 0, MISSION_PLANNER = FC NVM store, WP number indexed from 1 ///////////////////////////////////////////// @@ -2735,9 +2799,9 @@ TABS.mission_control.initialize = function (callback) { } function changeSwitchery(element, checked) { - if ( ( element.is(':checked') && checked == false ) || ( !element.is(':checked') && checked == true ) ) { - element.parent().find('.switcherymid').trigger('click'); - } + if ( ( element.is(':checked') && checked == false ) || ( !element.is(':checked') && checked == true ) ) { + element.parent().find('.switcherymid').trigger('click'); + } } /* resetAltitude = true : For selected WPs only. Changes WP Altitude value back to previous value if setting below ground level. @@ -2868,9 +2932,22 @@ TABS.mission_control.initialize = function (callback) { } } } - }; +TABS.mission_control.isBitSet = function(bits, testBit) { + let isTrue = ((bits & (1 << testBit)) != 0); + + return isTrue; +} + +TABS.mission_control.setBit = function(bits, bit, value) { + if ((initParam3 & (1 << bit)) != 0) { + bits &= ~(0 << bit); + bits |= (value << bit); + } + return bits; +} + // window.addEventListener("error", handleError, true); // function handleError(evt) {