1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-23 08:15:19 +03:00
This commit is contained in:
Alexander van Saase 2021-04-21 19:16:52 +02:00
commit a31a5ea07b
193 changed files with 10365 additions and 4035 deletions

View file

@ -62,7 +62,8 @@ var CONFIG,
BATTERY_CONFIG,
OUTPUT_MAPPING,
SETTINGS,
BRAKING_CONFIG;
BRAKING_CONFIG,
SAFEHOMES;
var FC = {
MAX_SERVO_RATE: 125,
@ -244,7 +245,7 @@ var FC = {
packetCount: 0
};
MISSION_PLANER = {
/* MISSION_PLANER = {
maxWaypoints: 0,
isValidMission: 0,
countBusyPoints: 0,
@ -255,9 +256,13 @@ var FC = {
lon: 0,
alt: 0,
endMission: 0,
p1: 0
p1: 0,
p2: 0,
p3: 0
}
};
}; */
MISSION_PLANER = new WaypointCollection();
ANALOG = {
voltage: 0,
@ -552,6 +557,8 @@ var FC = {
OUTPUT_MAPPING = new OutputMappingCollection();
SETTINGS = {};
SAFEHOMES = new SafehomeCollection();
},
getOutputUsages: function() {
return {

View file

@ -218,5 +218,14 @@ var MSPCodes = {
MSP2_PID: 0x2030,
MSP2_SET_PID: 0x2031,
MSP2_INAV_OPFLOW_CALIBRATION: 0x2032
MSP2_INAV_OPFLOW_CALIBRATION: 0x2032,
MSP2_INAV_FWUPDT_PREPARE: 0x2033,
MSP2_INAV_FWUPDT_STORE: 0x2034,
MSP2_INAV_FWUPDT_EXEC: 0x2035,
MSP2_INAV_FWUPDT_ROLLBACK_PREPARE: 0x2036,
MSP2_INAV_FWUPDT_ROLLBACK_EXEC: 0x2037,
MSP2_INAV_SAFEHOME: 0x2038,
MSP2_INAV_SET_SAFEHOME: 0x2039
};

View file

@ -43,6 +43,7 @@ var mspHelper = (function (gui) {
'FRSKY_OSD': 20,
'DJI_FPV': 21,
'SMARTPORT_MASTER': 23,
'IMU2': 24,
};
// Required for MSP_DEBUGMSG because console.log() doesn't allow omitting
@ -65,8 +66,7 @@ var mspHelper = (function (gui) {
flags,
colorCount,
color;
if (!dataHandler.unsupported) switch (dataHandler.code) {
if (!dataHandler.unsupported || dataHandler.unsupported) switch (dataHandler.code) {
case MSPCodes.MSP_IDENT:
//FIXME remove this frame when proven not needed
console.log('Using deprecated msp command: MSP_IDENT');
@ -441,13 +441,16 @@ var mspHelper = (function (gui) {
}
break;
case MSPCodes.MSP_WP:
MISSION_PLANER.bufferPoint.number = data.getUint8(0);
MISSION_PLANER.bufferPoint.action = data.getUint8(1);
MISSION_PLANER.bufferPoint.lat = data.getInt32(2, true) / 10000000;
MISSION_PLANER.bufferPoint.lon = data.getInt32(6, true) / 10000000;
MISSION_PLANER.bufferPoint.alt = data.getInt32(10, true);
MISSION_PLANER.bufferPoint.p1 = data.getInt16(14, true);
MISSION_PLANER.put(new Waypoint(
data.getUint8(0),
data.getUint8(1),
data.getInt32(2, true),
data.getInt32(6, true),
data.getInt32(10, true),
data.getInt16(14, true),
data.getInt16(16, true),
data.getInt16(18, true)
));
break;
case MSPCodes.MSP_BOXIDS:
//noinspection JSUndeclaredVariable
@ -1324,10 +1327,11 @@ var mspHelper = (function (gui) {
RTH_AND_LAND_CONFIG.rthAltControlMode = data.getUint8(6);
RTH_AND_LAND_CONFIG.rthAbortThreshold = data.getUint16(7, true);
RTH_AND_LAND_CONFIG.rthAltitude = data.getUint16(9, true);
RTH_AND_LAND_CONFIG.landDescentRate = data.getUint16(11, true);
RTH_AND_LAND_CONFIG.landSlowdownMinAlt = data.getUint16(13, true);
RTH_AND_LAND_CONFIG.landSlowdownMaxAlt = data.getUint16(15, true);
RTH_AND_LAND_CONFIG.emergencyDescentRate = data.getUint16(17, true);
RTH_AND_LAND_CONFIG.landMinAltVspd = data.getUint16(11, true);
RTH_AND_LAND_CONFIG.landMaxAltVspd = data.getUint16(13, true);
RTH_AND_LAND_CONFIG.landSlowdownMinAlt = data.getUint16(15, true);
RTH_AND_LAND_CONFIG.landSlowdownMaxAlt = data.getUint16(17, true);
RTH_AND_LAND_CONFIG.emergencyDescentRate = data.getUint16(19, true);
break;
case MSPCodes.MSP_SET_RTH_AND_LAND_CONFIG:
@ -1411,9 +1415,9 @@ var mspHelper = (function (gui) {
break;
case MSPCodes.MSP_WP_GETINFO:
// Reserved for waypoint capabilities data.getUint8(0);
MISSION_PLANER.maxWaypoints = data.getUint8(1);
MISSION_PLANER.isValidMission = data.getUint8(2);
MISSION_PLANER.countBusyPoints = data.getUint8(3);
MISSION_PLANER.setMaxWaypoints(data.getUint8(1));
MISSION_PLANER.setValidMission(data.getUint8(2));
MISSION_PLANER.setCountBusyPoints(data.getUint8(3));
break;
case MSPCodes.MSP_SET_WP:
console.log('Point saved');
@ -1493,7 +1497,18 @@ var mspHelper = (function (gui) {
SENSOR_DATA.temperature[i] = temp_decidegrees / 10; // °C
}
break;
case MSPCodes.MSP2_INAV_SAFEHOME:
SAFEHOMES.put(new Safehome(
data.getUint8(0),
data.getUint8(1),
data.getInt32(2, true),
data.getInt32(6, true)
));
break;
case MSPCodes.MSP2_INAV_SET_SAFEHOME:
console.log('Safehome points saved');
break;
default:
console.log('Unknown code detected: ' + dataHandler.code);
} else {
@ -1993,8 +2008,11 @@ var mspHelper = (function (gui) {
buffer.push(lowByte(RTH_AND_LAND_CONFIG.rthAltitude));
buffer.push(highByte(RTH_AND_LAND_CONFIG.rthAltitude));
buffer.push(lowByte(RTH_AND_LAND_CONFIG.landDescentRate));
buffer.push(highByte(RTH_AND_LAND_CONFIG.landDescentRate));
buffer.push(lowByte(RTH_AND_LAND_CONFIG.landMinAltVspd));
buffer.push(highByte(RTH_AND_LAND_CONFIG.landMinAltVspd));
buffer.push(lowByte(RTH_AND_LAND_CONFIG.landMaxAltVspd));
buffer.push(highByte(RTH_AND_LAND_CONFIG.landMaxAltVspd));
buffer.push(lowByte(RTH_AND_LAND_CONFIG.landSlowdownMinAlt));
buffer.push(highByte(RTH_AND_LAND_CONFIG.landSlowdownMinAlt));
@ -2101,34 +2119,7 @@ var mspHelper = (function (gui) {
buffer.push(SENSOR_CONFIG.opflow);
break;
case MSPCodes.MSP_SET_WP:
buffer.push(MISSION_PLANER.bufferPoint.number); // sbufReadU8(src); // number
buffer.push(MISSION_PLANER.bufferPoint.action); // sbufReadU8(src); // action
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 0)); // sbufReadU32(src); // lat
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 1));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 2));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lat, 3));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 0)); // sbufReadU32(src); // lon
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 1));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 2));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.lon, 3));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 0)); // sbufReadU32(src); // to set altitude (cm)
buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 1));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 2));
buffer.push(specificByte(MISSION_PLANER.bufferPoint.alt, 3));
buffer.push(lowByte(MISSION_PLANER.bufferPoint.p1)); //sbufReadU16(src); // P1 speed or landing
buffer.push(highByte(MISSION_PLANER.bufferPoint.p1));
buffer.push(lowByte(0)); //sbufReadU16(src); // P2
buffer.push(highByte(0));
buffer.push(lowByte(0)); //sbufReadU16(src); // P3
buffer.push(highByte(0));
buffer.push(MISSION_PLANER.bufferPoint.endMission); //sbufReadU8(src); // future: to set nav flag
break;
case MSPCodes.MSP_WP:
console.log(MISSION_PLANER.bufferPoint.number);
buffer.push(MISSION_PLANER.bufferPoint.number+1);
break;
case MSPCodes.MSP_WP_MISSION_SAVE:
// buffer.push(0);
console.log(buffer);
@ -2194,17 +2185,17 @@ var mspHelper = (function (gui) {
};
self.sendBlackboxConfiguration = function (onDataCallback) {
var buffer = [];
var messageId = MSPCodes.MSP_SET_BLACKBOX_CONFIG;
buffer.push(BLACKBOX.blackboxDevice & 0xFF);
messageId = MSPCodes.MSP2_SET_BLACKBOX_CONFIG;
buffer.push(lowByte(BLACKBOX.blackboxRateNum));
buffer.push(highByte(BLACKBOX.blackboxRateNum));
buffer.push(lowByte(BLACKBOX.blackboxRateDenom));
buffer.push(highByte(BLACKBOX.blackboxRateDenom));
var buffer = [];
var messageId = MSPCodes.MSP_SET_BLACKBOX_CONFIG;
buffer.push(BLACKBOX.blackboxDevice & 0xFF);
messageId = MSPCodes.MSP2_SET_BLACKBOX_CONFIG;
buffer.push(lowByte(BLACKBOX.blackboxRateNum));
buffer.push(highByte(BLACKBOX.blackboxRateNum));
buffer.push(lowByte(BLACKBOX.blackboxRateDenom));
buffer.push(highByte(BLACKBOX.blackboxRateDenom));
//noinspection JSUnusedLocalSymbols
MSP.send_message(messageId, buffer, false, function (response) {
onDataCallback();
onDataCallback();
});
};
@ -2822,7 +2813,7 @@ var mspHelper = (function (gui) {
};
self.loadBatteryConfig = function (callback) {
MSP.send_message(MSPCodes.MSPV2_BATTERY_CONFIG, false, false, callback);
MSP.send_message(MSPCodes.MSPV2_BATTERY_CONFIG, false, false, callback);
};
self.loadArmingConfig = function (callback) {
@ -2988,6 +2979,76 @@ var mspHelper = (function (gui) {
self.getMissionInfo = function (callback) {
MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, callback);
};
self.loadWaypoints = function (callback) {
MISSION_PLANER.reinit();
let waypointId = 1;
MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, getFirstWP);
function getFirstWP() {
MSP.send_message(MSPCodes.MSP_WP, [waypointId], false, nextWaypoint)
};
function nextWaypoint() {
waypointId++;
if (waypointId < MISSION_PLANER.getCountBusyPoints()) {
MSP.send_message(MSPCodes.MSP_WP, [waypointId], false, nextWaypoint);
}
else {
MSP.send_message(MSPCodes.MSP_WP, [waypointId], false, callback);
}
};
};
self.saveWaypoints = function (callback) {
let waypointId = 1;
MSP.send_message(MSPCodes.MSP_SET_WP, MISSION_PLANER.extractBuffer(waypointId), false, nextWaypoint)
function nextWaypoint() {
waypointId++;
if (waypointId < MISSION_PLANER.get().length) {
MSP.send_message(MSPCodes.MSP_SET_WP, MISSION_PLANER.extractBuffer(waypointId), false, nextWaypoint);
}
else {
MSP.send_message(MSPCodes.MSP_SET_WP, MISSION_PLANER.extractBuffer(waypointId), false, endMission);
}
};
function endMission() {
MSP.send_message(MSPCodes.MSP_WP_GETINFO, false, false, callback);
}
};
self.loadSafehomes = function (callback) {
SAFEHOMES.flush();
let safehomeId = 0;
MSP.send_message(MSPCodes.MSP2_INAV_SAFEHOME, [safehomeId], false, nextSafehome);
function nextSafehome() {
safehomeId++;
if (safehomeId < SAFEHOMES.getMaxSafehomeCount()-1) {
MSP.send_message(MSPCodes.MSP2_INAV_SAFEHOME, [safehomeId], false, nextSafehome);
}
else {
MSP.send_message(MSPCodes.MSP2_INAV_SAFEHOME, [safehomeId], false, callback);
}
};
};
self.saveSafehomes = function (callback) {
let safehomeId = 0;
MSP.send_message(MSPCodes.MSP2_INAV_SET_SAFEHOME, SAFEHOMES.extractBuffer(safehomeId), false, nextSendSafehome);
function nextSendSafehome() {
safehomeId++;
if (safehomeId < SAFEHOMES.getMaxSafehomeCount()-1) {
MSP.send_message(MSPCodes.MSP2_INAV_SET_SAFEHOME, SAFEHOMES.extractBuffer(safehomeId), false, nextSendSafehome);
}
else {
MSP.send_message(MSPCodes.MSP2_INAV_SET_SAFEHOME, SAFEHOMES.extractBuffer(safehomeId), false, callback);
}
};
};
self._getSetting = function (name) {
if (SETTINGS[name]) {

61
js/safehome.js Normal file
View file

@ -0,0 +1,61 @@
/*global $*/
'use strict';
let Safehome = function (number, enabled, lat, lon) {
var self = {};
self.getNumber = function () {
return number;
};
self.setNumber = function (data) {
number = data;
};
self.getLon = function () {
return lon;
};
self.setLon = function (data) {
lon = data;
};
self.getLonMap = function () {
return lon / 1e7;
};
self.getLat = function () {
return lat;
};
self.setLat = function (data) {
lat = data;
};
self.getLatMap = function () {
return lat / 1e7;
};
self.isUsed = function () {
return enabled == 1;
};
self.getEnabled = function () {
return enabled;
};
self.setEnabled = function (data) {
enabled = data;
};
self.cleanup = function () {
number = 0;
enabled = 0;
lon = 0;
lat = 0;
};
return self;
};

130
js/safehomeCollection.js Normal file
View file

@ -0,0 +1,130 @@
'use strict';
let SafehomeCollection = function () {
let self = {},
data = [],
maxSafehomeCount = 8;
self.setMaxSafehomeCount = function (value) {
maxSafehomeCount = value;
};
self.getMaxSafehomeCount = function () {
return maxSafehomeCount;
}
self.put = function (element) {
data.push(element);
};
self.get = function () {
return data;
};
self.clean = function (index){
data[index].cleanup();
};
self.flush = function () {
data = [];
};
self.inflate = function () {
while (self.hasFreeSlots()) {
self.put(new Safehome(data.length, 0, 0, 0));
}
};
self.hasFreeSlots = function () {
return data.length < self.getMaxSafehomeCount();
};
self.isSafehomeConfigured = function(safehomeId) {
for (let safehomeIndex in data) {
if (data.hasOwnProperty(safehomeIndex)) {
let safehome = data[safehomeIndex];
if (safehome.getNumber() == safehomeId && safehome.isUsed()) {
return true;
}
}
}
return false;
};
self.getNumberOfConfiguredSafehome = function () {
let count = 0;
for (let i = 0; i < self.getMaxSafehomeCount(); i ++) {
if (self.isSafehomeConfigured(i)) {
count++;
}
}
return count;
};
self.getUsedSafehomeIndexes = function () {
let out = [];
for (let safehomeIndex in data) {
if (data.hasOwnProperty(safehomeIndex)) {
let safehome = data[safehomeIndex];
out.push(safehome.getNumber());
}
}
let unique = [...new Set(out)];
return unique.sort(function(a, b) {
return a-b;
});
}
self.getSafehome = function(safehomeId) {
for (let safehomeIndex in data) {
if (data.hasOwnProperty(safehomeIndex)) {
let safehome = data[safehomeIndex];
if (safehome.getNumber() == safehomeId ) {
return safehome;
}
}
}
};
self.updateSafehome = function(newSafehome) {
data[newSafehome.getNumber()] = newSafehome;
};
self.extractBuffer = function(safehomeId) {
let buffer = [];
let safehome = self.getSafehome(safehomeId);
buffer.push(safehome.getNumber()); // sbufReadU8(src); // number
buffer.push(safehome.getEnabled()); // sbufReadU8(src); // action
buffer.push(specificByte(safehome.getLat(), 0)); // sbufReadU32(src); // lat
buffer.push(specificByte(safehome.getLat(), 1));
buffer.push(specificByte(safehome.getLat(), 2));
buffer.push(specificByte(safehome.getLat(), 3));
buffer.push(specificByte(safehome.getLon(), 0)); // sbufReadU32(src); // lon
buffer.push(specificByte(safehome.getLon(), 1));
buffer.push(specificByte(safehome.getLon(), 2));
buffer.push(specificByte(safehome.getLon(), 3));
return buffer;
}
self.safehomeDisplayDebug = function() {
if (data && data.length != 0) {
data.forEach(function (element) {
console.log("N° : ", element.getNumber(),
"Enabled : ", element.getEnabled(),
"Lon : ", element.getLon(),
"Lat : ", element.getLat(),
);
});
}
}
return self;
};

140
js/waypoint.js Normal file
View file

@ -0,0 +1,140 @@
/*global $*/
'use strict';
let Waypoint = function (number, action, lat, lon, alt=0, p1=0, p2=0, p3=0, endMission=0, isUsed=true, isAttached=false, attachedId="") {
var self = {};
let layerNumber = "undefined";
let attachedNumber = "undefined";
let poiNumber = "undefined";
self.getNumber = function () {
return number;
};
self.setNumber = function (data) {
number = data;
};
self.getLayerNumber = function () {
return layerNumber;
};
self.setLayerNumber = function (data) {
layerNumber = data;
};
self.getPoiNumber = function () {
return poiNumber;
};
self.setPoiNumber = function (data) {
poiNumber = data;
};
self.isUsed = function () {
return isUsed;
};
self.setUsed = function (data) {
isUsed = data;
};
self.isAttached = function () {
return isAttached;
};
self.setAttached = function (data) {
isAttached = data;
};
self.getLon = function () {
return lon;
};
self.getLonMap = function () {
return lon / 10000000;
};
self.setLon = function (data) {
lon = data;
};
self.getLat = function () {
return lat;
};
self.getLatMap = function () {
return lat / 10000000;
};
self.setLat = function (data) {
lat = data;
};
self.getAction = function () {
return action;
};
self.setAction = function (data) {
action = data;
};
self.getAlt = function () {
return alt;
};
self.setAlt = function (data) {
alt = data;
};
self.getP1 = function () {
return p1;
};
self.setP1 = function (data) {
p1 = data;
};
self.getP2 = function () {
return p2;
};
self.setP2 = function (data) {
p2 = data;
};
self.getP3 = function () {
return p3;
};
self.setP3 = function (data) {
p3 = data;
};
self.getEndMission = function () {
return endMission;
};
self.setEndMission = function (data) {
endMission = data;
};
self.getAttachedId = function () {
return attachedId;
};
self.setAttachedId = function (data) {
attachedId = data;
};
self.getAttachedNumber = function () {
return attachedNumber;
};
self.setAttachedNumber = function (data) {
attachedNumber = data;
};
return self;
};

336
js/waypointCollection.js Normal file
View file

@ -0,0 +1,336 @@
'use strict';
let WaypointCollection = function () {
let self = {},
data = [],
maxWaypoints = 60,
isValidMission = 0,
countBusyPoints = 0,
version = 0,
center = {}
self.getMaxWaypoints = function () {
return maxWaypoints;
};
self.setMaxWaypoints = function (data) {
maxWaypoints = data;
};
self.getValidMission = function () {
return isValidMission;
};
self.setValidMission = function (data) {
isValidMission = data;
};
self.getCountBusyPoints = function () {
return countBusyPoints;
};
self.setCountBusyPoints = function (data) {
countBusyPoints = data;
};
self.getVersion = function () {
return version;
};
self.setVersion = function (data) {
version = data;
};
self.getCenter = function () {
return center;
};
self.setCenter = function (data) {
center = data;
};
self.setCenterZoom = function (data) {
center.zoom = data;
};
self.setCenterLon = function (data) {
center.lon = data;
};
self.setCenterLat = function (data) {
center.lat = data;
};
self.put = function (element) {
data.push(element);
};
self.get = function () {
return data;
};
self.isEmpty = function () {
return data == [];
};
self.flush = function () {
data = [];
};
self.reinit = function () {
data = [];
maxWaypoints = 60;
isValidMission = 0;
countBusyPoints = 0;
version = 0;
center = {};
};
self.getWaypoint = function(waypointId) {
for (let waypointIndex in data) {
if (data.hasOwnProperty(waypointIndex)) {
let waypoint = data[waypointIndex];
if (waypoint.getNumber() == waypointId ) {
return waypoint;
}
}
}
};
self.updateWaypoint = function(newWaypoint) {
if (newWaypoint.isUsed()) {
data[newWaypoint.getNumber()] = newWaypoint;
}
};
self.dropWaypoint = function(newWaypoint) {
self.getWaypoint(newWaypoint.getNumber()).setUsed(false);
let indexId = newWaypoint.getNumber()
data.forEach(function (wp) {
if (wp.getNumber() >= indexId) {
wp.setNumber(wp.getNumber()-1);
}
if (wp.getAction() == MWNP.WPTYPE.JUMP && wp.getP1()>=indexId) {
wp.setP1(wp.getP1()-1);
}
});
data.splice(indexId, 1);
};
self.insertWaypoint = function (newWaypoint, indexId) {
data.forEach(function (wp) {
if (wp.getNumber() >= indexId) {
wp.setNumber(wp.getNumber()+1);
}
if (wp.getAction() == MWNP.WPTYPE.JUMP && wp.getP1()>=indexId) {
wp.setP1(wp.getP1()+1);
}
});
data.splice(indexId, 0, newWaypoint);
};
self.drop = function (waypointId) {
self.getWaypoint(waypointId).setUsed(false);
var tmpData = [];
let idx = 0;
data.forEach(function (element) {
if (element.isUsed()) {
element.setNumber(idx)
tmpData.push(element);
idx++;
}
});
data = tmpData;
};
self.update = function (bMWPfile=false, bReverse=false) {
let oldWPNumber = 0;
let optionIdx = 0;
let idx = 0;
data.forEach(function (element) {
if (element.isUsed()) {
if (bMWPfile && !bReverse) {
element.setNumber(element.getNumber()-1);
if (element.getAction() == MWNP.WPTYPE.JUMP) {
element.setP1(element.getP1()-1);
}
}
else if (bMWPfile && bReverse) {
element.setNumber(element.getNumber()+1);
if (element.getAction() == MWNP.WPTYPE.JUMP) {
element.setP1(element.getP1()+1);
}
}
if ([MWNP.WPTYPE.JUMP,MWNP.WPTYPE.SET_HEAD,MWNP.WPTYPE.RTH].includes(element.getAction())) {
element.setAttachedId(oldWPNumber);
element.setAttachedNumber(optionIdx);
element.setAttached(true);
optionIdx++;
}
else {
oldWPNumber = element.getNumber();
element.setLayerNumber(idx);
optionIdx = 0;
idx++;
}
if (element.getNumber() == ((bMWPfile && bReverse) ? self.get().length : self.get().length-1)) {
element.setEndMission(0xA5);
}
else {
element.setEndMission(0);
}
}
});
};
self.getNonAttachedList = function () {
let tmpData = [];
data.forEach(function (element) {
if (!element.isAttached()) {
tmpData.push(element);
}
});
return tmpData;
}
self.getAttachedList = function () {
let tmpData = [];
data.forEach(function (element) {
if (element.isAttached()) {
tmpData.push(element);
}
});
return tmpData;
}
self.getAttachedFromWaypoint = function (waypoint) {
let tmpData = [];
data.forEach(function (element) {
if (element.isAttached() && element.getAttachedId() == waypoint.getNumber()) {
tmpData.push(element);
}
});
return tmpData;
}
self.addAttachedFromWaypoint = function (waypoint) {
let tmpNumber = 0;
let tmpData = self.getAttachedFromWaypoint(waypoint);
if (tmpData != 'undefined' && tmpData.length !=0) {
tmpNumber = tmpData.length;
}
let tempWp = new Waypoint(waypoint.getNumber()+tmpNumber+1, MWNP.WPTYPE.JUMP, 0, 0);
tempWp.setAttached(true);
tempWp.setAttachedId(waypoint.getNumber());
self.insertWaypoint(tempWp, waypoint.getNumber()+tmpNumber+1);
self.update();
}
self.dropAttachedFromWaypoint = function (waypoint, waypointAttachedNumber) {
data.forEach(function (element) {
if (element.isAttached() && element.getAttachedId() == waypoint.getNumber() && element.getAttachedNumber() == waypointAttachedNumber) {
self.dropWaypoint(element);
self.update();
}
});
}
self.extractBuffer = function(waypointId) {
let buffer = [];
let waypoint = self.getWaypoint(waypointId);
buffer.push(waypoint.getNumber()); // sbufReadU8(src); // number
buffer.push(waypoint.getAction()); // sbufReadU8(src); // action
buffer.push(specificByte(waypoint.getLat(), 0)); // sbufReadU32(src); // lat
buffer.push(specificByte(waypoint.getLat(), 1));
buffer.push(specificByte(waypoint.getLat(), 2));
buffer.push(specificByte(waypoint.getLat(), 3));
buffer.push(specificByte(waypoint.getLon(), 0)); // sbufReadU32(src); // lon
buffer.push(specificByte(waypoint.getLon(), 1));
buffer.push(specificByte(waypoint.getLon(), 2));
buffer.push(specificByte(waypoint.getLon(), 3));
buffer.push(specificByte(waypoint.getAlt(), 0)); // sbufReadU32(src); // to set altitude (cm)
buffer.push(specificByte(waypoint.getAlt(), 1));
buffer.push(specificByte(waypoint.getAlt(), 2));
buffer.push(specificByte(waypoint.getAlt(), 3));
buffer.push(lowByte(waypoint.getP1())); //sbufReadU16(src); // P1 speed or landing
buffer.push(highByte(waypoint.getP1()));
buffer.push(lowByte(waypoint.getP2())); //sbufReadU16(src); // P2
buffer.push(highByte(waypoint.getP2()));
buffer.push(lowByte(waypoint.getP3())); //sbufReadU16(src); // P3
buffer.push(highByte(waypoint.getP3()));
buffer.push(waypoint.getEndMission()); //sbufReadU8(src); // future: to set nav flag
return buffer;
}
self.missionDisplayDebug = function() {
if (data && data.length != 0) {
data.forEach(function (element) {
console.log("N° : ", element.getNumber(),
"Action : ", element.getAction(),
"Lon : ", element.getLon(),
"Lat : ", element.getLat(),
"Alt : ", element.getAlt(),
"P1 : ", element.getP1(),
"P2 : ", element.getP2(),
"P3 : ", element.getP3(),
"EndMission : ", element.getEndMission());
});
}
}
self.copy = function(mission){
mission.get().forEach(function (element) {
self.put(element);
});
self.setMaxWaypoints(mission.getMaxWaypoints());
self.setValidMission(mission.getValidMission());
self.setCountBusyPoints(mission.getCountBusyPoints());
self.setVersion(mission.getVersion());
self.setCenter(mission.getCenter());
}
self.convertJumpNumberToWaypoint = function(jumpId) {
let outputNumber = 0;
self.getNonAttachedList().forEach(function (element) {
if (element.getLayerNumber() == jumpId) {
outputNumber = element.getNumber();
}
});
return outputNumber;
}
self.isJumpTargetAttached = function(waypoint) {
let lJumptTargetAttached = [];
data.forEach(function (element) {
if (element.getAction() == MWNP.WPTYPE.JUMP && element.getP1() == waypoint.getNumber()) {
lJumptTargetAttached.push(element.getNumber());
}
});
console.log("lJumptTargetAttached ", lJumptTargetAttached);
return (lJumptTargetAttached.length != 0 && lJumptTargetAttached != 'undefined')
}
self.getPoiList = function() {
let poiList = [];
data.forEach(function (element) {
if (element.getAction() == MWNP.WPTYPE.SET_POI) {
poiList.push(element.getNumber());
}
});
return poiList;
}
return self;
};