mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-23 08:15:19 +03:00
Merge branch 'master' of https://github.com/iNavFlight/inav-configurator
This commit is contained in:
commit
a31a5ea07b
193 changed files with 10365 additions and 4035 deletions
15
js/fc.js
15
js/fc.js
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
61
js/safehome.js
Normal 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
130
js/safehomeCollection.js
Normal 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
140
js/waypoint.js
Normal 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
336
js/waypointCollection.js
Normal 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;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue