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

waypoint OOP version 1.4

This commit is contained in:
ArnoTlse 2021-04-07 00:28:51 +02:00
parent 84de6011c9
commit 26f21b2880
4 changed files with 92 additions and 264 deletions

View file

@ -15,22 +15,22 @@
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="cf_icon_position.svg"
inkscape:export-filename="C:\Users\arnau\Documents\GitHub\inav-configurator\images\icons\cf_icon_safehome_used.png"
inkscape:export-filename="C:\Users\arnau\Documents\GitHub\inav-configurator\images\icons\cf_icon_safehome.png"
inkscape:export-xdpi="74.705879"
inkscape:export-ydpi="74.705879">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient2690">
id="linearGradient1488">
<stop
style="stop-color:#808080;stop-opacity:1;"
style="stop-color:#b3b3b3;stop-opacity:1;"
offset="0"
id="stop1479" />
id="stop1484" />
<stop
style="stop-color:#808080;stop-opacity:0;"
style="stop-color:#b3b3b3;stop-opacity:0;"
offset="1"
id="stop1481" />
id="stop1486" />
</linearGradient>
<linearGradient
inkscape:collect="always"
@ -171,13 +171,13 @@
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2690"
id="linearGradient1472"
gradientUnits="userSpaceOnUse"
x1="33.759918"
y1="20.197287"
x2="33.759918"
y2="53.721268" />
xlink:href="#linearGradient1488"
id="linearGradient1490"
x1="21.733617"
y1="37.017226"
x2="45.786218"
y2="37.017226"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
@ -367,7 +367,7 @@
transform="translate(-18.709808,-20.180163)">
<path
id="path1464"
style="fill:url(#linearGradient1472);fill-opacity:1.0;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0"
style="fill:url(#linearGradient1490);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0"
d="m 33.759918,20.312455 c -2.337999,0 -5.082476,0.475277 -8.084778,3.140377 -4.086081,3.627155 -3.911291,8.043803 -3.741891,10.624157 0.156873,2.389534 1.246556,4.650933 2.271696,6.815087 1.375534,2.903871 4.383434,7.604098 6.420798,10.08879 2.163382,2.638385 3.134175,2.740403 3.134175,2.740403 0,0 0.970793,-0.102018 3.134175,-2.740403 2.037363,-2.484692 5.045262,-7.184919 6.420797,-10.08879 1.025138,-2.164154 2.114822,-4.425553 2.271696,-6.815087 0.1694,-2.580354 0.344192,-6.997002 -3.741891,-10.624157 -3.002301,-2.6651 -5.746781,-3.140377 -8.084777,-3.140377 z"
inkscape:export-xdpi="300"
inkscape:export-ydpi="300" />

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Before After
Before After

View file

@ -1,40 +0,0 @@
'use strict';
// MultiWii NAV Protocol
exports.MWNP = MWNP || {};
// WayPoint type
MWNP.WPTYPE = {
WAYPOINT: 1,
PH_UNLIM: 2,
PH_TIME: 3,
RTH: 4,
SET_POI: 5,
JUMP: 6,
SET_HEAD: 7,
LAND: 8
};
// Reverse WayPoint type dictionary
function swap(dict) {
let rev_dict = {};
for (let key in dict) {
rev_dict[dict[key]] = key;
}
return rev_dict;
}
MWNP.WPTYPE.REV = swap(MWNP.WPTYPE);
// Dictionary of Parameter1,2,3 definition depending on type of action selected (refer to MWNP.WPTYPE)
exports.dictOfLabelParameterPoint = {
1: {parameter1: 'Speed (cm/s)', parameter2: '', parameter3: ''},
2: {parameter1: '', parameter2: '', parameter3: ''},
3: {parameter1: 'Wait time (s)', parameter2: 'Speed (cm/s)', parameter3: ''},
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: ''}
};

View file

@ -1,6 +1,4 @@
'use strict';
//import { MWNP.WPTYPE, MWNP.WPTYPE.REV } from '/js/mission_control_module.mjs';
//const { MWNP } = require('./js/mission_control_module.mjs')
let WaypointCollection = function () {

View file

@ -1,6 +1,4 @@
'use strict';
//import { MWNP.WPTYPE, MWNP.WPTYPE.REV } from './js/mission_control_module.mjs';
//const { MWNP } = require('./js/mission_control_module.mjs')
// MultiWii NAV Protocol
var MWNP = MWNP || {};
@ -333,6 +331,8 @@ TABS.mission_control.initialize = function (callback) {
var map;
var selectedMarker = null;
var selectedFeature = null;
var tempMarker = null;
var nonMarkerPoint = [];
var nonMarkerPointListRead = [];
var isOptions = false;
@ -361,12 +361,6 @@ TABS.mission_control.initialize = function (callback) {
$('#pointP2').val('');
$('#pointP3').val('');
$('#missionDistance').text(0);
/* $('[name=Options]').filter('[value=None]').prop('checked', true);
$('#Options_LandRTH').prop('checked', false);
$('#Options_TargetJUMP').val(0);
$('#Options_NumberJUMP').val(0);
$('#Options_HeadingHead').val(-1);
$('[name=pointNumber]').val(''); */
$('#MPeditPoint').fadeOut(300);
}
@ -525,7 +519,7 @@ TABS.mission_control.initialize = function (callback) {
var circleFeature = new ol.Feature({
geometry: new ol.geom.Circle(coord, safehomeRangeRadius),
name: 'Null Island',
name: 'circleFeature',
population: 4000,
rainfall: 500
});
@ -543,7 +537,7 @@ TABS.mission_control.initialize = function (callback) {
var circleSafeFeature = new ol.Feature({
geometry: new ol.geom.Circle(coord, safehomeSafeRadius),
name: 'Null Island',
name: 'circleSafeFeature',
population: 4000,
rainfall: 500
});
@ -615,13 +609,6 @@ TABS.mission_control.initialize = function (callback) {
vectorLayer.kind = "waypoint";
vectorLayer.number = waypoint.getNumber();
vectorLayer.layerNumber = waypoint.getLayerNumber();
/* vectorLayer.alt = _alt;
vectorLayer.number = markers.length;
vectorLayer.action = _action;
vectorLayer.parameter1 = _parameter1;
vectorLayer.parameter2 = _parameter2;
vectorLayer.parameter3 = _parameter3;
vectorLayer.options = _options;*/
markers.push(vectorLayer);
@ -765,7 +752,6 @@ TABS.mission_control.initialize = function (callback) {
vectorLayer.kind = "line";
vectorLayer.selection = selection;
vectorLayer.number = pos2ID;
//console.log("pos2ID : ",pos2ID);
lines.push(vectorLayer);
@ -1046,10 +1032,15 @@ TABS.mission_control.initialize = function (callback) {
function (feature, layer) {
return feature;
});
tempMarker = map.forEachFeatureAtPixel(evt.pixel,
function (feature, layer) {
return layer;
});
if (feature) {
this.coordinate_ = evt.coordinate;
this.feature_ = feature;
this.layer_ = tempMarker;
}
return !!feature;
@ -1065,21 +1056,25 @@ TABS.mission_control.initialize = function (callback) {
function (feature, layer) {
return feature;
});
var tempMarker = map.forEachFeatureAtPixel(evt.pixel,
/* tempMarker = map.forEachFeatureAtPixel(evt.pixel,
function (feature, layer) {
return layer;
});
}); */
var deltaX = evt.coordinate[0] - this.coordinate_[0];
var deltaY = evt.coordinate[1] - this.coordinate_[1];
var geometry = /** @type {ol.geom.SimpleGeometry} */
(this.feature_.getGeometry());
geometry.translate(deltaX, deltaY);
this.coordinate_[0] = evt.coordinate[0];
this.coordinate_[1] = evt.coordinate[1];
let coord = ol.proj.toLonLat(geometry.getCoordinates());
if (tempMarker.kind == "waypoint") {
let tempWp = mission.getWaypoint(tempMarker.number);
@ -1095,9 +1090,10 @@ TABS.mission_control.initialize = function (callback) {
tempSH.setLon(coord[0]);
tempSH.setLat(coord[1]);
SAFEHOMES.updateSafehome(tempSH);
//renderSafehomesTable();
/* cleanSafehomeLayers();
renderSafehomesOnMap(); */
if (tempSH.isUsed()) {
this.layer_.getSource().getFeatures()[1].getGeometry().translate(deltaX, deltaY);
this.layer_.getSource().getFeatures()[0].getGeometry().translate(deltaX, deltaY);
}
$safehomesTableBody.find('tr:nth-child('+String(tempMarker.number+1)+') > td > .safehome-lon').val(Math.round(coord[0] * 10000000) / 10000000);
$safehomesTableBody.find('tr:nth-child('+String(tempMarker.number+1)+') > td > .safehome-lat').val(Math.round(coord[1] * 10000000) / 10000000);
}
@ -1169,6 +1165,8 @@ TABS.mission_control.initialize = function (callback) {
new app.PlannerSafehomeControl() // TO DELETE FOR RELEASE SAFEHOMES
]
}
map = new ol.Map({
controls: ol.control.defaults({
attributionOptions: {
@ -1211,6 +1209,7 @@ TABS.mission_control.initialize = function (callback) {
});
map.on('click', function (evt) {
console.log("click");
if (selectedMarker != null && selectedFeature != null) {
try {
selectedFeature.setStyle(getWaypointIcon(selectedMarker, false));
@ -1225,7 +1224,7 @@ TABS.mission_control.initialize = function (callback) {
function (feature, layer) {
return feature;
});
var tempMarker = map.forEachFeatureAtPixel(evt.pixel,
tempMarker = map.forEachFeatureAtPixel(evt.pixel,
function (feature, layer) {
return layer;
});
@ -1286,83 +1285,6 @@ TABS.mission_control.initialize = function (callback) {
});
/* map.on('click', function (evt) {
if (selectedMarker != null) {
try {
selectedMarker.getSource().getFeatures()[0].setStyle(getPointIcon(selectedMarker.action, false, selectedMarker.number));
selectedMarker = null;
clearEditForm();
} catch (e) {
GUI.log(e);
}
}
var selectedFeature = map.forEachFeatureAtPixel(evt.pixel,
function (feature, layer) {
return feature;
});
var tempMarker = map.forEachFeatureAtPixel(evt.pixel,
function (feature, layer) {
return layer;
});
if (selectedFeature) {
for (var i in markers) {
if (markers[i] == tempMarker) {
selectedMarker = tempMarker;
var geometry = selectedFeature.getGeometry();
var coord = ol.proj.toLonLat(geometry.getCoordinates());
selectedFeature.setStyle(getPointIcon(selectedMarker.action, true, selectedMarker.number));
var altitudeMeters = app.ConvertCentimetersToMeters(selectedMarker.alt);
$('#altitudeInMeters').text(` ${altitudeMeters}m`);
$('#pointLon').val(Math.round(coord[0] * 10000000) / 10000000);
$('#pointLat').val(Math.round(coord[1] * 10000000) / 10000000);
$('#pointAlt').val(selectedMarker.alt);
$('#pointType').val(selectedMarker.action);
// Change SpeedValue to Parameter1, 2, 3
$('#pointP1').val(selectedMarker.parameter1);
$('#pointP2').val(selectedMarker.parameter2);
$('#pointP3').val(selectedMarker.parameter3);
$('[name=Options]').filter('[value='+selectedMarker.options['key']+']').prop('checked', true);
// Manage RTH, JUMP, SET_HEAD options for WP
if (selectedMarker.options.key == "RTH") {
$('#Options_LandRTH').prop('checked', selectedMarker.options.landAfter);
}
else if (selectedMarker.options.key == "JUMP") {
$('#Options_TargetJUMP').val(selectedMarker.options.targetWP);
$('#Options_NumberJUMP').val(selectedMarker.options.numRepeat);
}
else if (selectedMarker.options.key == "SET_HEAD") {
$('#Options_HeadingHead').val(selectedMarker.options.heading);
}
// Selection box update depending on choice of type of waypoint
for (var j in dictOfLabelParameterPoint[selectedMarker.action]) {
if (dictOfLabelParameterPoint[selectedMarker.action][j] != '') {
$('#pointP'+String(j).slice(-1)+'class').fadeIn(300);
$('label[for=pointP'+String(j).slice(-1)+']').html(dictOfLabelParameterPoint[selectedMarker.action][j]);
}
else {$('#pointP'+String(j).slice(-1)+'class').fadeOut(300);}
}
if ([1,2,3,8].includes(selectedMarker.action) || ['1','2','3','8'].includes(selectedMarker.action)) {
$('#pointOptionclass').fadeIn(300);
}
else {$('#pointOptionclass').fadeOut(300);}
$('#MPeditPoint').fadeIn(300);
}
}
}
else {
map.addLayer(addMarker(evt.coordinate, settings.alt, MWNP.WPTYPE.WAYPOINT, settings.speed));
repaint();
}
}); */
// change mouse cursor when over marker
$(map.getViewport()).on('mousemove', function (e) {
var pixel = map.getEventPixel(e.originalEvent);
@ -1391,7 +1313,6 @@ TABS.mission_control.initialize = function (callback) {
/////////////////////////////////////////////
// Callback to show/hide menu boxes
/////////////////////////////////////////////
$('#showHideActionButton').on('click', function () {
var src = ($(this).children().attr('class') === 'ic_hide')
? 'ic_show'
@ -1438,9 +1359,9 @@ TABS.mission_control.initialize = function (callback) {
if (selectedMarker) {
selectedMarker.setAction($('#pointType').val());
if ([MWNP.WPTYPE.SET_POI,MWNP.WPTYPE.PH_UNLIM,MWNP.WPTYPE.LAND].includes(selectedMarker.getAction())) {
selectedMarker.setP1(0);
selectedMarker.setP2(0);
selectedMarker.setP3(0);
selectedMarker.setP1(0.0);
selectedMarker.setP2(0.0);
selectedMarker.setP3(0.0);
}
mission.updateWaypoint(selectedMarker);
mission.update();
@ -1452,7 +1373,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointLat').on('keypress', function (event) {
if (selectedMarker && event.which == 13) {
selectedMarker.setLat($('#pointLat').val());
selectedMarker.setLat(Number($('#pointLat').val()));
mission.updateWaypoint(selectedMarker);
mission.update();
redrawLayer();
@ -1463,7 +1384,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointLon').on('keypress', function (event) {
if (selectedMarker && event.which == 13) {
selectedMarker.setLon($('#pointLon').val());
selectedMarker.setLon(Number($('#pointLon').val()));
mission.updateWaypoint(selectedMarker);
mission.update();
redrawLayer();
@ -1474,7 +1395,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointAlt').on('keypress', function (event) {
if (selectedMarker && event.which == 13) {
selectedMarker.setAlt($('#pointAlt').val());
selectedMarker.setAlt(Number($('#pointAlt').val()));
mission.updateWaypoint(selectedMarker);
mission.update();
redrawLayer();
@ -1485,7 +1406,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointP1').on('keypress', function (event) {
if (selectedMarker && event.which == 13) {
selectedMarker.setP1($('#pointP1').val());
selectedMarker.setP1(Number($('#pointP1').val()));
mission.updateWaypoint(selectedMarker);
mission.update();
redrawLayer();
@ -1496,7 +1417,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointP2').on('keypress', function (event) {
if (selectedMarker && event.which == 13) {
selectedMarker.setP2($('#pointP2').val());
selectedMarker.setP2(Number($('#pointP2').val()));
mission.updateWaypoint(selectedMarker);
mission.update();
redrawLayer();
@ -1507,7 +1428,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointP3').on('keypress', function (event) {
if (selectedMarker && event.which == 13) {
selectedMarker.setP3($('#pointP3').val());
selectedMarker.setP3(Number($('#pointP3').val()));
mission.updateWaypoint(selectedMarker);
mission.update();
redrawLayer();
@ -1520,7 +1441,6 @@ TABS.mission_control.initialize = function (callback) {
// Callback for Waypoint Options Table
/////////////////////////////////////////////
$waypointOptionsTableBody.on('click', "[data-role='waypointOptions-delete']", function (event) {
//console.log($(event.currentTarget).attr("data-index"));
if (selectedMarker) {
mission.dropAttachedFromWaypoint(selectedMarker, $(event.currentTarget).attr("data-index")-1);
renderWaypointOptionsTable(selectedMarker);
@ -1584,98 +1504,9 @@ TABS.mission_control.initialize = function (callback) {
});
// SavePoint function updated to take into account P1 to P3 parameter and JUMP,RTH, SET_HEAD options for WP
$('#savePoint').on('click', function () {
if (selectedMarker) {
selectedMarker.setAction($('#pointType').val());
selectedMarker.setAlt($('#pointAlt').val());
if ([MWNP.WPTYPE.SET_POI,MWNP.WPTYPE.PH_UNLIM,MWNP.WPTYPE.LAND].includes(selectedMarker.getAction())) {
selectedMarker.setP1(0);
selectedMarker.setP2(0);
selectedMarker.setP3(0);
}
else {
selectedMarker.setP1($('#pointP1').val());
selectedMarker.setP2($('#pointP2').val());
selectedMarker.setP3($('#pointP3').val());
}
mission.updateWaypoint(selectedMarker);
mission.update();
selectedFeature.setStyle(getWaypointIcon(selectedMarker, false));
selectedMarker = null;
selectedFeature = null;
clearEditForm();
cleanLayers();
redrawLayers();
}
/* if (selectedMarker) {
map.getLayers().forEach(function (t) {
if (t === selectedMarker) {
var geometry = t.getSource().getFeatures()[0].getGeometry();
geometry.setCoordinates(ol.proj.fromLonLat([parseFloat($('#pointLon').val()), parseFloat($('#pointLat').val())]));
t.alt = $('#pointAlt').val();
t.action = $('#pointType').val();
// if action is Set_POI, PH_UNLIM, LAND, set parameter_i to 0
if (t.action == '5' || t.action == '2' || t.action == '8') {
t.parameter1 = 0;
t.parameter2 = 0;
t.parameter3 = 0;
}
// else for other kind of waypoints, set parameter_i to pointP_i value
else {
console.log("$('#pointP1').val() : ",$('#pointP1').val());
t.parameter1 = $('#pointP1').val();
t.parameter2 = $('#pointP2').val();
t.parameter3 = $('#pointP3').val();
}
// Manage Options
// if RTH options selected, store GUI value in t.options
if ($('input[name=Options]:checked').val() == "RTH") {
t.options = {key: $('input[name=Options]:checked').val(),
landAfter: $('#Options_LandRTH').prop('checked')
};
}
// if JUMP options selected, store GUI value in t.options
else if ($('input[name=Options]:checked').val() == "JUMP") {
// check if users input values verify the condition i an integer btw [0,99] and within length of Markers
if (!Array.from({length: markers.length}, (v, i) => i+1).includes(Number($('#Options_TargetJUMP').val())) || (Number($('#Options_NumberJUMP').val())<0 || Number($('#Options_NumberJUMP').val())>99)) {
alert(chrome.i18n.getMessage('MissionPlannerJumpSettingsCheck'))
t.options = {key: 'None'}
}
else {
t.options = {key: $('input[name=Options]:checked').val(),
targetWP: $('#Options_TargetJUMP').val(),
numRepeat: $('#Options_NumberJUMP').val()
};
}
}
// if SET_HEAD options selected, store GUI value in t.options
else if ($('input[name=Options]:checked').val() == "SET_HEAD") {
// Check if Heading is btw [0, 360°] or = -1
if ($('#Options_HeadingHead').val()>360 || ($('#Options_HeadingHead').val()<0 && $('#Options_HeadingHead').val() !=-1)) {
alert(chrome.i18n.getMessage('MissionPlannerHeadSettingsCheck'))
t.options = {key: 'None'}
}
else {
t.options = {key: $('input[name=Options]:checked').val(),
heading: $('#Options_HeadingHead').val()
};
}
}
else {
t.options = {key: $('input[name=Options]:checked').val()}
}
}
});
selectedMarker.getSource().getFeatures()[0].setStyle(getPointIcon(selectedMarker.action, false, selectedMarker.number));
selectedMarker = null;
clearEditForm();
repaint();
} */
});
/////////////////////////////////////////////
// Callback for Save/load buttons
/////////////////////////////////////////////
$('#loadFileMissionButton').on('click', function () {
if (markers.length && !confirm(chrome.i18n.getMessage('confirm_delete_all_points'))) return;
removeAllWaypoints();
@ -1952,6 +1783,45 @@ TABS.mission_control.initialize = function (callback) {
var center = ol.proj.toLonLat(map.getView().getCenter());
var zoom = map.getView().getZoom();
var data = {
'version': { $: { 'value': '2.3-pre8' } },
'mwp': { $: { 'cx': (Math.round(center[0] * 10000000) / 10000000), 'cy': (Math.round(center[1] * 10000000) / 10000000), 'zoom': zoom } },
'missionitem': []
};
mission.get().forEach(function (waypoint) {
var point = { $: {
'no': waypoint.getNumber()+1,
'action': MWNP.WPTYPE.REV[waypoint.getAction()],
'lat': (Math.round(waypoint.getLat() * 10000000) / 10000000),
'lon': (Math.round(waypoint.getLon() * 10000000) / 10000000),
'alt': (waypoint.getAlt() / 100),
'parameter1': (MWNP.WPTYPE.REV[waypoint.getAction()] == "JUMP" ? waypoint.getP1()+1 : waypoint.getP1()),
'parameter2': waypoint.getP2(),
'parameter3': waypoint.getP3(),
} };
data.missionitem.push(point);
});
var builder = new window.xml2js.Builder({ 'rootName': 'mission', 'renderOpts': { 'pretty': true, 'indent': '\t', 'newline': '\n' } });
var xml = builder.buildObject(data);
fs.writeFile(filename, xml, (err) => {
if (err) {
GUI.log('<span style="color: red">Error writing file</span>');
return console.error(err);
}
GUI.log('File saved');
});
}
/* function saveMissionFile(filename) {
const fs = require('fs');
if (!window.xml2js) return GUI.log('<span style="color: red">Error writing file (xml2js not found)</span>');
var center = ol.proj.toLonLat(map.getView().getCenter());
var zoom = map.getView().getZoom();
var data = {
'version': { $: { 'value': '2.3-pre8' } },
'mwp': { $: { 'cx': (Math.round(center[0] * 10000000) / 10000000), 'cy': (Math.round(center[1] * 10000000) / 10000000), 'zoom': zoom } },
@ -2054,7 +1924,7 @@ TABS.mission_control.initialize = function (callback) {
}
GUI.log('File saved');
});
}
} */
// New: function to get number of Non Marker points such as JUMP, SET_HEAD and RTH
function getNumberOfNonMarkerForJump2(nonMarkerPointList, numTargetMarker) {