pull/1961/head
Scavanger 5 months ago
commit 6fe68a6b73

@ -262,11 +262,8 @@
<li class="tab_failsafe"> <li class="tab_failsafe">
<a href="#" data-i18n="tabFailsafe" class="tabicon ic_failsafe" title="Failsafe"></a> <a href="#" data-i18n="tabFailsafe" class="tabicon ic_failsafe" title="Failsafe"></a>
</li> </li>
<li class="tab_ez_tune">
<a href="#" data-i18n="tabEzTune" class="tabicon ic_wizzard"></a>
</li>
<li class="tab_pid_tuning"> <li class="tab_pid_tuning">
<a href="#" data-i18n="tabPidTuning" class="tabicon ic_pid" title="PID Tuning"></a> <a href="#" data-i18n="tabPidTuning" class="tabicon ic_pid" data-i18n_title="tabPidTuning"></a>
</li> </li>
<li class="tab_advanced_tuning"> <li class="tab_advanced_tuning">
<a href="#" data-i18n="tabAdvancedTuning" class="tabicon ic_advanced" title="Advanced Tuning"></a> <a href="#" data-i18n="tabAdvancedTuning" class="tabicon ic_advanced" title="Advanced Tuning"></a>

File diff suppressed because it is too large Load Diff

@ -62,16 +62,6 @@ var GUI_control = function () {
else if (navigator.appVersion.indexOf("X11") != -1) this.operating_system = "UNIX"; else if (navigator.appVersion.indexOf("X11") != -1) this.operating_system = "UNIX";
else this.operating_system = "Unknown"; else this.operating_system = "Unknown";
this.colorTable = [
"#8ecae6",
"#2a9d8f",
"#e9c46a",
"#f4a261",
"#e76f51",
"#ef476f",
"#ffc300"
];
}; };
// message = string // message = string

@ -80,11 +80,9 @@ var MSPCodes = {
MSP_COMP_GPS: 107, MSP_COMP_GPS: 107,
MSP_ATTITUDE: 108, MSP_ATTITUDE: 108,
MSP_ALTITUDE: 109, MSP_ALTITUDE: 109,
MSP_ANALOG: 110,
MSP_RC_TUNING: 111, MSP_RC_TUNING: 111,
MSP_PID: 112, MSP_PID: 112,
MSP_ACTIVEBOXES: 113, MSP_ACTIVEBOXES: 113,
MSP_MISC: 114,
MSP_MOTOR_PINS: 115, MSP_MOTOR_PINS: 115,
MSP_BOXNAMES: 116, MSP_BOXNAMES: 116,
MSP_PIDNAMES: 117, MSP_PIDNAMES: 117,
@ -105,12 +103,10 @@ var MSPCodes = {
MSP_SET_RC_TUNING: 204, MSP_SET_RC_TUNING: 204,
MSP_ACC_CALIBRATION: 205, MSP_ACC_CALIBRATION: 205,
MSP_MAG_CALIBRATION: 206, MSP_MAG_CALIBRATION: 206,
MSP_SET_MISC: 207,
MSP_RESET_CONF: 208, MSP_RESET_CONF: 208,
MSP_SET_WP: 209, MSP_SET_WP: 209,
MSP_SELECT_SETTING: 210, MSP_SELECT_SETTING: 210,
MSP_SET_HEAD: 211, MSP_SET_HEAD: 211,
MSP_SET_SERVO_CONFIGURATION: 212,
MSP_SET_MOTOR: 214, MSP_SET_MOTOR: 214,
MSP_SET_3D: 217, MSP_SET_3D: 217,
MSP_SET_RC_DEADBAND: 218, MSP_SET_RC_DEADBAND: 218,
@ -120,9 +116,6 @@ var MSPCodes = {
// MSP_BIND: 240, // MSP_BIND: 240,
MSP_SERVO_MIX_RULES: 241,
MSP_SET_SERVO_MIX_RULE: 242,
MSP_RTC: 246, MSP_RTC: 246,
MSP_SET_RTC: 247, MSP_SET_RTC: 247,
@ -245,6 +238,9 @@ var MSPCodes = {
MSP2_INAV_CUSTOM_OSD_ELEMENTS: 0x2100, MSP2_INAV_CUSTOM_OSD_ELEMENTS: 0x2100,
MSP2_INAV_SET_CUSTOM_OSD_ELEMENTS: 0x2101, MSP2_INAV_SET_CUSTOM_OSD_ELEMENTS: 0x2101,
MSP2_INAV_SERVO_CONFIG: 0x2200,
MSP2_INAV_SET_SERVO_CONFIG: 0x2201,
}; };
module.exports = MSPCodes; module.exports = MSPCodes;

@ -231,12 +231,6 @@ var mspHelper = (function () {
case MSPCodes.MSPV2_INAV_AIR_SPEED: case MSPCodes.MSPV2_INAV_AIR_SPEED:
FC.SENSOR_DATA.air_speed = data.getInt32(0, true); FC.SENSOR_DATA.air_speed = data.getInt32(0, true);
break; break;
case MSPCodes.MSP_ANALOG:
FC.ANALOG.voltage = data.getUint8(0) / 10.0;
FC.ANALOG.mAhdrawn = data.getUint16(1, true);
FC.ANALOG.rssi = data.getUint16(3, true); // 0-1023
FC.ANALOG.amperage = data.getInt16(5, true) / 100; // A
break;
case MSPCodes.MSPV2_INAV_ANALOG: case MSPCodes.MSPV2_INAV_ANALOG:
let tmp = data.getUint8(offset++); let tmp = data.getUint8(offset++);
FC.ANALOG.battery_full_when_plugged_in = (tmp & 1 ? true : false); FC.ANALOG.battery_full_when_plugged_in = (tmp & 1 ? true : false);
@ -314,30 +308,7 @@ var mspHelper = (function () {
case MSPCodes.MSP_LOOP_TIME: case MSPCodes.MSP_LOOP_TIME:
FC.FC_CONFIG.loopTime = data.getInt16(0, true); FC.FC_CONFIG.loopTime = data.getInt16(0, true);
break; break;
case MSPCodes.MSP_MISC: // 22 bytes
FC.MISC.midrc = data.getInt16(offset, true);
offset += 2;
FC.MISC.minthrottle = data.getUint16(offset, true); // 0-2000
offset += 2;
FC.MISC.maxthrottle = data.getUint16(offset, true); // 0-2000
offset += 2;
FC.MISC.mincommand = data.getUint16(offset, true); // 0-2000
offset += 2;
FC.MISC.failsafe_throttle = data.getUint16(offset, true); // 1000-2000
offset += 2;
FC.MISC.gps_type = data.getUint8(offset++);
FC.MISC.sensors_baudrate = data.getUint8(offset++);
FC.MISC.gps_ubx_sbas = data.getInt8(offset++);
FC.MISC.multiwiicurrentoutput = data.getUint8(offset++);
FC.MISC.rssi_channel = data.getUint8(offset++);
FC.MISC.placeholder2 = data.getUint8(offset++);
FC.MISC.mag_declination = data.getInt16(offset, 1) / 10; // -18000-18000
offset += 2;
FC.MISC.vbatscale = data.getUint8(offset++); // 10-200
FC.MISC.vbatmincellvoltage = data.getUint8(offset++) / 10; // 10-50
FC.MISC.vbatmaxcellvoltage = data.getUint8(offset++) / 10; // 10-50
FC.MISC.vbatwarningcellvoltage = data.getUint8(offset++) / 10; // 10-50
break;
case MSPCodes.MSPV2_INAV_MISC: case MSPCodes.MSPV2_INAV_MISC:
FC.MISC.midrc = data.getInt16(offset, true); FC.MISC.midrc = data.getInt16(offset, true);
offset += 2; offset += 2;
@ -464,21 +435,6 @@ var mspHelper = (function () {
for (let i = 0; i < data.byteLength; i++) { for (let i = 0; i < data.byteLength; i++) {
FC.AUX_CONFIG_IDS.push(data.getUint8(i)); FC.AUX_CONFIG_IDS.push(data.getUint8(i));
} }
break;
case MSPCodes.MSP_SERVO_MIX_RULES:
FC.SERVO_RULES.flush();
if (data.byteLength % 8 === 0) {
for (let i = 0; i < data.byteLength; i += 8) {
FC.SERVO_RULES.put(new ServoMixRule(
data.getInt8(i),
data.getInt8(i + 1),
data.getInt16(i + 2, true),
data.getInt8(i + 4)
));
}
}
FC.SERVO_RULES.cleanup();
break; break;
case MSPCodes.MSP2_INAV_SERVO_MIXER: case MSPCodes.MSP2_INAV_SERVO_MIXER:
FC.SERVO_RULES.flush(); FC.SERVO_RULES.flush();
@ -496,9 +452,6 @@ var mspHelper = (function () {
FC.SERVO_RULES.cleanup(); FC.SERVO_RULES.cleanup();
break; break;
case MSPCodes.MSP_SET_SERVO_MIX_RULE:
console.log("Servo mix saved");
break;
case MSPCodes.MSP2_INAV_SET_SERVO_MIXER: case MSPCodes.MSP2_INAV_SET_SERVO_MIXER:
console.log("Servo mix saved"); console.log("Servo mix saved");
break; break;
@ -615,20 +568,18 @@ var mspHelper = (function () {
console.log("motor mixer saved"); console.log("motor mixer saved");
break; break;
case MSPCodes.MSP_SERVO_CONFIGURATIONS: case MSPCodes.MSP2_INAV_SERVO_CONFIG:
//noinspection JSUndeclaredVariable //noinspection JSUndeclaredVariable
FC.SERVO_CONFIG = []; // empty the array as new data is coming in FC.SERVO_CONFIG = []; // empty the array as new data is coming in
if (data.byteLength % 14 == 0) { if (data.byteLength % 7 == 0) {
for (let i = 0; i < data.byteLength; i += 14) { for (i = 0; i < data.byteLength; i += 7) {
var arr = { var arr = {
'min': data.getInt16(i + 0, true), 'min': data.getInt16(i + 0, true),
'max': data.getInt16(i + 2, true), 'max': data.getInt16(i + 2, true),
'middle': data.getInt16(i + 4, true), 'middle': data.getInt16(i + 4, true),
'rate': data.getInt8(i + 6), 'rate': data.getInt8(i + 6),
'indexOfChannelToForward': data.getInt8(i + 9)
}; };
data.getUint32(i + 10); // Skip 4 bytes that used to be reversed Sources
FC.SERVO_CONFIG.push(arr); FC.SERVO_CONFIG.push(arr);
} }
} }
@ -664,16 +615,13 @@ var mspHelper = (function () {
case MSPCodes.MSP2_INAV_OPFLOW_CALIBRATION: case MSPCodes.MSP2_INAV_OPFLOW_CALIBRATION:
console.log('Optic flow calibration executed'); console.log('Optic flow calibration executed');
break; break;
case MSPCodes.MSP_SET_MISC:
console.log('MISC Configuration saved');
break;
case MSPCodes.MSP_RESET_CONF: case MSPCodes.MSP_RESET_CONF:
console.log('Settings Reset'); console.log('Settings Reset');
break; break;
case MSPCodes.MSP_SELECT_SETTING: case MSPCodes.MSP_SELECT_SETTING:
console.log('Profile selected'); console.log('Profile selected');
break; break;
case MSPCodes.MSP_SET_SERVO_CONFIGURATION: case MSPCodes.MSP2_INAV_SET_SERVO_CONFIG:
console.log('Servo Configuration saved'); console.log('Servo Configuration saved');
break; break;
case MSPCodes.MSP_RTC: case MSPCodes.MSP_RTC:
@ -1788,30 +1736,6 @@ var mspHelper = (function () {
buffer.push(BitHelper.lowByte(FC.FC_CONFIG.loopTime)); buffer.push(BitHelper.lowByte(FC.FC_CONFIG.loopTime));
buffer.push(BitHelper.highByte(FC.FC_CONFIG.loopTime)); buffer.push(BitHelper.highByte(FC.FC_CONFIG.loopTime));
break; break;
case MSPCodes.MSP_SET_MISC:
buffer.push(BitHelper.lowByte(FC.MISC.midrc));
buffer.push(BitHelper.highByte(FC.MISC.midrc));
buffer.push(BitHelper.lowByte(FC.MISC.minthrottle));
buffer.push(BitHelper.highByte(FC.MISC.minthrottle));
buffer.push(BitHelper.lowByte(FC.MISC.maxthrottle));
buffer.push(BitHelper.highByte(FC.MISC.maxthrottle));
buffer.push(BitHelper.lowByte(FC.MISC.mincommand));
buffer.push(BitHelper.highByte(FC.MISC.mincommand));
buffer.push(BitHelper.lowByte(FC.MISC.failsafe_throttle));
buffer.push(BitHelper.highByte(FC.MISC.failsafe_throttle));
buffer.push(FC.MISC.gps_type);
buffer.push(FC.MISC.sensors_baudrate);
buffer.push(FC.MISC.gps_ubx_sbas);
buffer.push(FC.MISC.multiwiicurrentoutput);
buffer.push(FC.MISC.rssi_channel);
buffer.push(FC.MISC.placeholder2);
buffer.push(BitHelper.lowByte(Math.round(FC.MISC.mag_declination * 10)));
buffer.push(BitHelper.highByte(Math.round(FC.MISC.mag_declination * 10)));
buffer.push(FC.MISC.vbatscale);
buffer.push(Math.round(FC.MISC.vbatmincellvoltage * 10));
buffer.push(Math.round(FC.MISC.vbatmaxcellvoltage * 10));
buffer.push(Math.round(FC.MISC.vbatwarningcellvoltage * 10));
break;
case MSPCodes.MSPV2_INAV_SET_MISC: case MSPCodes.MSPV2_INAV_SET_MISC:
buffer.push(BitHelper.lowByte(FC.MISC.midrc)); buffer.push(BitHelper.lowByte(FC.MISC.midrc));
buffer.push(BitHelper.highByte(FC.MISC.midrc)); buffer.push(BitHelper.highByte(FC.MISC.midrc));
@ -2262,7 +2186,6 @@ var mspHelper = (function () {
buffer.push(FC.EZ_TUNE.aggressiveness); buffer.push(FC.EZ_TUNE.aggressiveness);
buffer.push(FC.EZ_TUNE.rate); buffer.push(FC.EZ_TUNE.rate);
buffer.push(FC.EZ_TUNE.expo); buffer.push(FC.EZ_TUNE.expo);
console.log(buffer);
break; break;
@ -2335,29 +2258,14 @@ var mspHelper = (function () {
buffer.push(BitHelper.lowByte(servoConfiguration.middle)); buffer.push(BitHelper.lowByte(servoConfiguration.middle));
buffer.push(BitHelper.highByte(servoConfiguration.middle)); buffer.push(BitHelper.highByte(servoConfiguration.middle));
buffer.push(BitHelper.lowByte(servoConfiguration.rate)); buffer.push(lowByte(servoConfiguration.rate));
buffer.push(0);
buffer.push(0);
var out = servoConfiguration.indexOfChannelToForward;
if (out == undefined) {
out = 255; // Cleanflight defines "CHANNEL_FORWARDING_DISABLED" as "(uint8_t)0xFF"
}
buffer.push(out);
//Mock 4 bytes of servoConfiguration.reversedInputSources
buffer.push(0);
buffer.push(0);
buffer.push(0);
buffer.push(0);
// prepare for next iteration // prepare for next iteration
servoIndex++; servoIndex++;
if (servoIndex == FC.SERVO_CONFIG.length) { if (servoIndex == FC.SERVO_CONFIG.length) {
nextFunction = onCompleteCallback; nextFunction = onCompleteCallback;
} }
MSP.send_message(MSPCodes.MSP_SET_SERVO_CONFIGURATION, buffer, false, nextFunction); MSP.send_message(MSPCodes.MSP2_INAV_SET_SERVO_CONFIG, buffer, false, nextFunction);
} }
}; };
@ -2859,10 +2767,6 @@ var mspHelper = (function () {
MSP.send_message(MSPCodes.MSPV2_INAV_STATUS, false, false, callback); MSP.send_message(MSPCodes.MSPV2_INAV_STATUS, false, false, callback);
}; };
self.loadMisc = function (callback) {
MSP.send_message(MSPCodes.MSP_MISC, false, false, callback);
};
self.loadMiscV2 = function (callback) { self.loadMiscV2 = function (callback) {
MSP.send_message(MSPCodes.MSPV2_INAV_MISC, false, false, callback); MSP.send_message(MSPCodes.MSPV2_INAV_MISC, false, false, callback);
}; };
@ -2904,7 +2808,7 @@ var mspHelper = (function () {
// prepare for next iteration // prepare for next iteration
idIndex++; idIndex++;
if (idIndex == overrideIds.length) { if (idIndex == overrideIds.length) {
nextFunction = callback; nextFunction = onCompleteCallback;
} }
MSP.send_message(MSPCodes.MSP2_INAV_SET_TIMER_OUTPUT_MODE, buffer, false, nextFunction); MSP.send_message(MSPCodes.MSP2_INAV_SET_TIMER_OUTPUT_MODE, buffer, false, nextFunction);
@ -2952,10 +2856,6 @@ var mspHelper = (function () {
MSP.send_message(MSPCodes.MSP_ACC_TRIM, false, false, callback); MSP.send_message(MSPCodes.MSP_ACC_TRIM, false, false, callback);
}; };
self.loadAnalog = function (callback) {
MSP.send_message(MSPCodes.MSP_ANALOG, false, false, callback);
};
self.saveToEeprom = function saveToEeprom(callback) { self.saveToEeprom = function saveToEeprom(callback) {
MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, callback); MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, callback);
}; };
@ -3000,10 +2900,6 @@ var mspHelper = (function () {
MSP.send_message(MSPCodes.MSP_SET_BOARD_ALIGNMENT, mspHelper.crunch(MSPCodes.MSP_SET_BOARD_ALIGNMENT), false, callback); MSP.send_message(MSPCodes.MSP_SET_BOARD_ALIGNMENT, mspHelper.crunch(MSPCodes.MSP_SET_BOARD_ALIGNMENT), false, callback);
}; };
self.saveMisc = function (callback) {
MSP.send_message(MSPCodes.MSP_SET_MISC, mspHelper.crunch(MSPCodes.MSP_SET_MISC), false, callback);
};
self.saveMiscV2 = function (callback) { self.saveMiscV2 = function (callback) {
MSP.send_message(MSPCodes.MSPV2_INAV_SET_MISC, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_MISC), false, callback); MSP.send_message(MSPCodes.MSPV2_INAV_SET_MISC, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_MISC), false, callback);
}; };
@ -3359,7 +3255,7 @@ var mspHelper = (function () {
}; };
self.loadServoConfiguration = function (callback) { self.loadServoConfiguration = function (callback) {
MSP.send_message(MSPCodes.MSP_SERVO_CONFIGURATIONS, false, false, callback); MSP.send_message(MSPCodes.MSP2_INAV_SERVO_CONFIG, false, false, callback);
}; };
self.loadServoMixRules = function (callback) { self.loadServoMixRules = function (callback) {

@ -1,10 +1,22 @@
'use strict'; 'use strict';
const BitHelper = require("./bitHelper");
var OutputMappingCollection = function () { var OutputMappingCollection = function () {
let self = {}, let self = {},
data = [], data = [],
timerOverrides = {}; timerOverrides = {};
const colorTable = [
"#8ecae6",
"#2a9d8f",
"#e9c46a",
"#f4a261",
"#e76f51",
"#ef476f",
"#ffc300"
];
const TIM_USE_ANY = 0; const TIM_USE_ANY = 0;
const TIM_USE_PPM = 0; const TIM_USE_PPM = 0;
const TIM_USE_PWM = 1; const TIM_USE_PWM = 1;
@ -36,13 +48,13 @@ var OutputMappingCollection = function () {
} }
self.getTimerColor = function (timer) { self.getTimerColor = function (timer) {
let timerIndex = OUTPUT_MAPPING.getUsedTimerIds().indexOf(String(timer)); let timerIndex = self.getUsedTimerIds().indexOf(String(timer));
return GUI.colorTable[timerIndex % GUI.colorTable.length]; return colorTable[timerIndex % colorTable.length];
} }
self.getOutputTimerColor = function (output) { self.getOutputTimerColor = function (output) {
let timerId = OUTPUT_MAPPING.getTimerId(output); let timerId = self.getTimerId(output);
return self.getTimerColor(timerId); return self.getTimerColor(timerId);
} }
@ -67,10 +79,10 @@ var OutputMappingCollection = function () {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
timerMap[i] = null; timerMap[i] = null;
if (servosToGo > 0 && bit_check(data[i]['usageFlags'], TIM_USE_SERVO)) { if (servosToGo > 0 && BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_SERVO)) {
servosToGo--; servosToGo--;
timerMap[i] = OUTPUT_TYPE_SERVO; timerMap[i] = OUTPUT_TYPE_SERVO;
} else if (motorsToGo > 0 && bit_check(data[i]['usageFlags'], TIM_USE_MOTOR)) { } else if (motorsToGo > 0 && BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_MOTOR)) {
motorsToGo--; motorsToGo--;
timerMap[i] = OUTPUT_TYPE_MOTOR; timerMap[i] = OUTPUT_TYPE_MOTOR;
} }
@ -117,8 +129,8 @@ var OutputMappingCollection = function () {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
if ( if (
bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) || BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) ||
bit_check(data[i]['usageFlags'], TIM_USE_SERVO) BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_SERVO)
) { ) {
retVal++; retVal++;
}; };
@ -130,8 +142,8 @@ var OutputMappingCollection = function () {
function getFirstOutputOffset() { function getFirstOutputOffset() {
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
if ( if (
bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) || BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_MOTOR) ||
bit_check(data[i]['usageFlags'], TIM_USE_SERVO) BitHelper.bit_check(data[i]['usageFlags'], TIM_USE_SERVO)
) { ) {
return i; return i;
} }
@ -150,7 +162,7 @@ var OutputMappingCollection = function () {
let lastFound = 0; let lastFound = 0;
for (let i = offset; i < data.length; i++) { for (let i = offset; i < data.length; i++) {
if (bit_check(data[i]['usageFlags'], bit)) { if (BitHelper.bit_check(data[i]['usageFlags'], bit)) {
if (lastFound == servoIndex) { if (lastFound == servoIndex) {
return i - offset + 1; return i - offset + 1;
} else { } else {

@ -12,6 +12,8 @@ const mspQueue = require('./serial_queue');
var publicScope = {}, var publicScope = {},
privateScope = {}; privateScope = {};
var stoppped = false;
/** /**
* *
* @param {number=} baudSpeed * @param {number=} baudSpeed
@ -100,21 +102,27 @@ const mspQueue = require('./serial_queue');
display: 'inline-block' display: 'inline-block'
}); });
if (GUI.active_tab != 'cli') { if (!stoppped && GUI.active_tab != 'cli') {
if (mspQueue.shouldDropStatus()) { if (mspQueue.shouldDropStatus()) {
return; return;
} }
MSP.send_message(MSPCodes.MSP_SENSOR_STATUS, false, false); MSP.send_message(MSPCodes.MSP_SENSOR_STATUS, false, false);
MSP.send_message(MSPCodes.MSPV2_INAV_STATUS, false, false); MSP.send_message(MSPCodes.MSPV2_INAV_STATUS, false, false);
MSP.send_message(MSPCodes.MSP_ACTIVEBOXES, false, false); MSP.send_message(MSPCodes.MSP_ACTIVEBOXES, false, false);
MSP.send_message(MSPCodes.MSPV2_INAV_ANALOG, false, false); MSP.send_message(MSPCodes.MSPV2_INAV_ANALOG, false, false);
privateScope.updateView(); privateScope.updateView();
} }
}; };
publicScope.stop = function() {
stoppped = true;
}
return publicScope; return publicScope;
})(); })();

@ -12,6 +12,8 @@ const { GUI } = require('./../gui');
const interval = require('./../intervals'); const interval = require('./../intervals');
const { usbDevices, PortHandler } = require('./../port_handler'); const { usbDevices, PortHandler } = require('./../port_handler');
const ConnectionSerial = require('./../connection/connectionSerial'); const ConnectionSerial = require('./../connection/connectionSerial');
const STM32DFU = require('./stm32usbdfu');
const i18n = require('./../localization');
var STM32_protocol = function () { var STM32_protocol = function () {
this.baud; this.baud;

@ -113,7 +113,7 @@
"message": "Ports" "message": "Ports"
}, },
"tabPidTuning": { "tabPidTuning": {
"message": "PID tuning" "message": "Tuning"
}, },
"tabReceiver": { "tabReceiver": {
"message": "Receiver" "message": "Receiver"
@ -1328,6 +1328,12 @@
"pidTuning_ShowAllPIDs": { "pidTuning_ShowAllPIDs": {
"message": "Show all PIDs" "message": "Show all PIDs"
}, },
"pidTuning_PIDmain": {
"message": "Main PID gains"
},
"pidTuning_PIDother": {
"message": "Additional PID gains"
},
"pidTuning_SelectNewDefaults": { "pidTuning_SelectNewDefaults": {
"message": "Select New Defaults" "message": "Select New Defaults"
}, },
@ -1566,7 +1572,7 @@
"message": "TPA smoothing and delay time constant to reflect non-instant speed/throttle response of the plane." "message": "TPA smoothing and delay time constant to reflect non-instant speed/throttle response of the plane."
}, },
"pidTuning_fwLevelTrimMechanics": { "pidTuning_fwLevelTrimMechanics": {
"message": "Fixed Wing Level Trim" "message": "Fixed Wing mechanics"
}, },
"pidTuning_fw_level_pitch_trim": { "pidTuning_fw_level_pitch_trim": {
"message": "Level Trim [deg]" "message": "Level Trim [deg]"
@ -2185,7 +2191,7 @@
"message": "Save Settings" "message": "Save Settings"
}, },
"cliMscBtn": { "cliMscBtn": {
"message": "MSC" "message": "Blackbox (MSC)"
}, },
"cliDiffAllBtn": { "cliDiffAllBtn": {
"message": "Diff All" "message": "Diff All"
@ -2602,7 +2608,7 @@
"message": "Set this option if you need an alternate failsafe behavior when the craft is close to Home. For example the author of the feature has a plane that failsafes when the wings detach on landing, when the RTH failsafe behavior normally desired in flight is no longer wanted or needed." "message": "Set this option if you need an alternate failsafe behavior when the craft is close to Home. For example the author of the feature has a plane that failsafes when the wings detach on landing, when the RTH failsafe behavior normally desired in flight is no longer wanted or needed."
}, },
"failsafeMinDistanceItem": { "failsafeMinDistanceItem": {
"message": "Failsafe Minimum Distance in centimeters" "message": "Failsafe Minimum Distance"
}, },
"failsafeMinDistanceHelp": { "failsafeMinDistanceHelp": {
"message": "The craft will use the alternate failsafe behavior when it is between 0 and this minimum distance in centimeters away from Home. For example if set to 2000 centimeters (20 meters), and the craft is at 13 meters, the Failsafe Minimum Distance Procedure will be followed. When the craft is at 25 meters, the normal failsafe procedure will be followed. If set to 0, the normal failsafe procedure will be used at all times. " "message": "The craft will use the alternate failsafe behavior when it is between 0 and this minimum distance in centimeters away from Home. For example if set to 2000 centimeters (20 meters), and the craft is at 13 meters, the Failsafe Minimum Distance Procedure will be followed. When the craft is at 25 meters, the normal failsafe procedure will be followed. If set to 0, the normal failsafe procedure will be used at all times. "
@ -4852,6 +4858,15 @@
"save": { "save": {
"message": "Save" "message": "Save"
}, },
"copy": {
"message": "Copy"
},
"paste": {
"message": "Paste"
},
"clear": {
"message": "Clear"
},
"active": { "active": {
"message": "Active" "message": "Active"
}, },
@ -4861,12 +4876,6 @@
"itermRelaxHelp": { "itermRelaxHelp": {
"message": "Defines Iterm relaxation algorithm activation. PR mean it's active on Roll and Pitch axis. PRY is active also on Yaw." "message": "Defines Iterm relaxation algorithm activation. PR mean it's active on Roll and Pitch axis. PRY is active also on Yaw."
}, },
"gyro_main_lpf_type": {
"message": "Gyro LPF type"
},
"gyro_main_lpf_type_help": {
"message": "BIQUAD offers better noise attenuation for a price of higher delay. PT1 has lower attenuation but offers lower delay."
},
"dterm_lpf_type": { "dterm_lpf_type": {
"message": "D-term LPF type" "message": "D-term LPF type"
}, },
@ -5651,6 +5660,15 @@
"osdSettingsSaved": { "osdSettingsSaved": {
"message": "OSD settings saved" "message": "OSD settings saved"
}, },
"osdLayoutInsertedIntoClipboard": {
"message": "Layout has been saved to clipboard"
},
"osdLayoutPasteFromClipboard": {
"message": "Layout has been restored from clipboard"
},
"osdClearLayout": {
"message": "Layout has been cleared"
},
"failedToOpenSerialPort": { "failedToOpenSerialPort": {
"message": "<span style=\"color: red\">Failed</span> to open serial port" "message": "<span style=\"color: red\">Failed</span> to open serial port"
}, },

11
package-lock.json generated

@ -23,14 +23,13 @@
"marked": "^11.2.0", "marked": "^11.2.0",
"minimist": "^1.2.0", "minimist": "^1.2.0",
"openlayers": "^4.6.5", "openlayers": "^4.6.5",
"plotly": "^1.0.6",
"promise-map-series": "^0.3.0", "promise-map-series": "^0.3.0",
"semver": "^7.6.0", "semver": "^7.6.0",
"serialport": "^12.0.0", "serialport": "^12.0.0",
"temp": "^0.8.3", "temp": "^0.8.3",
"three": "0.139.0", "three": "0.139.0",
"usb": "^2.11.0", "usb": "^2.11.0",
"wnumb": "1.2.0", "wnumb": "^1.2.0",
"xml2js": "^0.4.19" "xml2js": "^0.4.19"
}, },
"devDependencies": { "devDependencies": {
@ -6450,14 +6449,6 @@
"node": ">=10.4.0" "node": ">=10.4.0"
} }
}, },
"node_modules/plotly": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/plotly/-/plotly-1.0.6.tgz",
"integrity": "sha512-9DoPWfLJWxqXg6omu1Oj7qkvyOce0Nv+X+2SOoI9lG9mbvA7S/qGVHypwrGMV3r53ruW1Fl1A9a7ZIPt22FrpA==",
"dependencies": {
"mkdirp": "~0.5.0"
}
},
"node_modules/postject": { "node_modules/postject": {
"version": "1.0.0-alpha.6", "version": "1.0.0-alpha.6",
"resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz",

@ -14,19 +14,21 @@
} }
.ez-tune-preview table { .ez-tune-preview table {
width: 100%; width: 100% !important;
float: none !important;
border-collapse: separate !important;
} }
.ez-tune-preview table td, .ez-tune-preview table td,
.ez-tune-preview table th { .ez-tune-preview table th {
padding: 0.5em; padding: 0.5em !important;
text-align: center; text-align: center !important;
} }
.ez-tune-preview table th { .ez-tune-preview table th {
background-color: #3EA5D4; background-color: #3EA5D4 !important;
} }
.ez-tune-preview table td { .ez-tune-preview table td {
background-color: #A8D6EC; background-color: #A8D6EC !important;
} }

@ -733,4 +733,34 @@ button {
.osdCustomElement_main_table select, .osdCustomElement_main_table input{ .osdCustomElement_main_table select, .osdCustomElement_main_table input{
width: 100% !important; width: 100% !important;
}
.settings .btn a{
margin-top: 0;
margin-bottom: 0;
border-radius: 3px;
color: #fff;
font-family: 'open_sansbold', Arial, serif;
font-size: 12px;
text-shadow: 0 1px rgba(0, 0, 0, 0.25);
cursor: pointer;
transition: all ease 0.2s;
padding: 0 9px;
line-height: 22px;
}
.settings .btn_blue a{
background-color: #37a8db;
border: 1px solid #3394b5;
}
.settings .btn_danger a{
background-color: #e2a2a2;
border: 1px solid #e58383;
}
.settings .btn a:hover {
background-color: #3394b5;
transition: all ease 0.2s;
} }

@ -45,7 +45,7 @@
<div id="i2c_speed-info" class="info-box"></div> <div id="i2c_speed-info" class="info-box"></div>
<div class="select"> <div class="select">
<select id="i2c_speed" data-setting="i2c_speed" ></select> <select id="i2c_speed" data-setting="i2c_speed"></select>
<label for="i2c_speed"> <label for="i2c_speed">
<span data-i18n="configurationI2cSpeed"></span> <span data-i18n="configurationI2cSpeed"></span>
</label> </label>

@ -1,175 +0,0 @@
<!--suppress ALL -->
<div id="content-watermark"></div>
<div class="tab-ez_tune toolbar_fixed_bottom">
<div class="content_wrapper">
<div class="tab_title" data-i18n="tabEzTune"></div>
<div class="note spacebottom">
<div class="note_spacer">
<p i18n="ezTuneDisclaimer"></p>
</div>
</div>
<div class="clear-both"></div>
<div style="display: flex;">
<div>
<div class="pid-sliders-axis" style="background-color: #2a9d8f;">
<div style="padding: 1em;" data-i18n="ezTuneEnabledTips"></div>
<div class="pid-switch-row">
<span data-i18n="configurationFeatureEnabled" class="bold label"></span>
<div class="checkbox no-border">
<input id="ez_tune_enabled" type="checkbox" class="ez-element toggle" />
</div>
</div>
<div class="clear-both"></div>
</div>
<div class="pid-sliders-axis" data-axis="roll">
<div style="padding: 1em;" data-i18n="ezTuneFilterHzTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneFilterHz" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_filter_hz" type="number" class="ez-element" />
</div>
</div>
<div class="clear-both"></div>
</div>
<div class="pid-sliders-axis" data-axis="pitch">
<div style="padding: 1em;" data-i18n="ezTuneAxisRatioTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneAxisRatio" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_axis_ratio" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneResponseTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneResponse" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_response" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneDampingTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneDamping" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_damping" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneStabilityTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneStability" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_stability" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneAggressivenessTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneAggressiveness" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_aggressiveness" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
</div>
<div class="pid-sliders-axis" data-axis="yaw">
<div style="padding: 1em;" data-i18n="ezTuneRateTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneRate" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_rate" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneExpoTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneExpo" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_expo" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
</div>
</div>
<div class="ez-tune-preview">
<h2 data-i18n="ezTunePidPreview"></h2>
<table>
<tr>
<th>&nbsp;</th>
<th>P</th>
<th>I</th>
<th>D</th>
<th>FF</th>
</tr>
<tr>
<th data-i18n="axisRoll"></th>
<td id="preview-roll-p"></td>
<td id="preview-roll-i"></td>
<td id="preview-roll-d"></td>
<td id="preview-roll-ff"></td>
</tr>
<tr>
<th data-i18n="axisPitch"></th>
<td id="preview-pitch-p"></td>
<td id="preview-pitch-i"></td>
<td id="preview-pitch-d"></td>
<td id="preview-pitch-ff"></td>
</tr>
<tr>
<th data-i18n="axisYaw"></th>
<td id="preview-yaw-p"></td>
<td id="preview-yaw-i"></td>
<td id="preview-yaw-d"></td>
<td id="preview-yaw-ff"></td>
</tr>
</table>
<h2 data-i18n="ezTuneRatePreview"></h2>
<table>
<tr>
<th data-i18n="ezTuneRatePreviewAxis"></th>
<th data-i18n="ezTuneRatePreviewRate"></th>
<th data-i18n="ezTuneRatePreviewExpo"></th>
</tr>
<tr>
<th data-i18n="axisRoll"></th>
<td id="preview-roll-rate"></td>
<td id="preview-roll-expo"></td>
</tr>
<tr>
<th data-i18n="axisPitch"></th>
<td id="preview-pitch-rate"></td>
<td id="preview-pitch-expo"></td>
</tr>
<tr>
<th data-i18n="axisYaw"></th>
<td id="preview-yaw-rate"></td>
<td id="preview-yaw-expo"></td>
</tr>
</table>
</div>
</div>
<div class="clear-both"></div>
</div>
<div class="clear-both"></div>
<div class="content_toolbar">
<div class="btn save_btn">
<a class="update" href="#" data-i18n="pidTuning_ButtonSave"></a>
</div>
</div>
</div>

@ -1,172 +0,0 @@
'use strict';
const path = require('path');
const MSPChainerClass = require('./../js/msp/MSPchainer');
const mspHelper = require('./../js/msp/MSPHelper');
const MSPCodes = require('./../js/msp/MSPCodes');
const MSP = require('./../js/msp');
const { GUI, TABS } = require('./../js/gui');
const FC = require('./../js/fc');
const Settings = require('./../js/settings');
const i18n = require('./../js/localization');
const tabs = require('./../js/tabs');
const features = require('./../js/feature_framework');
TABS.ez_tune = {
};
TABS.ez_tune.initialize = function (callback) {
let loadChainer = new MSPChainerClass();
let loadChain = [
mspHelper.loadEzTune,
];
let EZ_TUNE_PID_RP_DEFAULT = [40, 75, 23, 100];
let EZ_TUNE_PID_YAW_DEFAULT = [45, 80, 0, 100];
loadChain.push(mspHelper.loadRateProfileData);
loadChainer.setChain(loadChain);
loadChainer.setExitPoint(load_html);
loadChainer.execute();
var saveChainer = new MSPChainerClass();
var saveChain = [
mspHelper.saveEzTune,
mspHelper.saveToEeprom
];
saveChainer.setChain(saveChain);
saveChainer.setExitPoint(reboot);
function reboot() {
//noinspection JSUnresolvedVariable
GUI.log(i18n.getMessage('configurationEepromSaved'));
GUI.tab_switch_cleanup(function () {
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, reinitialize);
});
}
function reinitialize() {
GUI.log(i18n.getMessage('deviceRebooting'));
GUI.handleReconnect($('.tab_ez_tune a'));
}
if (GUI.active_tab != 'ez_tune') {
GUI.active_tab = 'ez_tune';
}
function load_html() {
GUI.load(path.join(__dirname, "ez_tune.html"), Settings.processHtml(process_html));
}
function getYawPidScale(input) {
const normalized = (input - 100) * 0.01;
return 1.0 + (normalized * 0.5);
}
function scaleRange(x, srcMin, srcMax, destMin, destMax) {
let a = (destMax - destMin) * (x - srcMin);
let b = srcMax - srcMin;
return ((a / b) + destMin);
}
function updatePreview() {
let axisRatio = $('#ez_tune_axis_ratio').val() / 100;
let response = $('#ez_tune_response').val();
let damping = $('#ez_tune_damping').val();
let stability = $('#ez_tune_stability').val();
let aggressiveness = $('#ez_tune_aggressiveness').val();
let rate = $('#ez_tune_rate').val();
let expo = $('#ez_tune_expo').val();
$('#preview-roll-p').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[0] * response / 100));
$('#preview-roll-i').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[1] * stability / 100));
$('#preview-roll-d').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[2] * damping / 100));
$('#preview-roll-ff').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[3] * aggressiveness / 100));
$('#preview-pitch-p').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[0] * response / 100));
$('#preview-pitch-i').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[1] * stability / 100));
$('#preview-pitch-d').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[2] * damping / 100));
$('#preview-pitch-ff').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[3] * aggressiveness / 100));
$('#preview-yaw-p').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[0] * getYawPidScale(response)));
$('#preview-yaw-i').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[1] * getYawPidScale(stability)));
$('#preview-yaw-d').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[2] * getYawPidScale(damping)));
$('#preview-yaw-ff').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[3] * getYawPidScale(aggressiveness)));
$('#preview-roll-rate').html(Math.floor(scaleRange(rate, 0, 200, 30, 90)) * 10 + " dps");
$('#preview-pitch-rate').html(Math.floor(scaleRange(rate, 0, 200, 30, 90)) * 10 + " dps");
$('#preview-yaw-rate').html((Math.floor(scaleRange(rate, 0, 200, 30, 90)) - 10) * 10 + " dps");
$('#preview-roll-expo').html(Math.floor(scaleRange(expo, 0, 200, 40, 100)) + "%");
$('#preview-pitch-expo').html(Math.floor(scaleRange(expo, 0, 200, 40, 100)) + "%");
$('#preview-yaw-expo').html(Math.floor(scaleRange(expo, 0, 200, 40, 100)) + "%");
}
function process_html() {
i18n.localize();;
tabs.init($('.tab-ez_tune'));
features.updateUI($('.tab-ez_tune'), FC.FEATURES);
$("#ez_tune_enabled").prop('checked', FC.EZ_TUNE.enabled);
GUI.sliderize($('#ez_tune_filter_hz'), FC.EZ_TUNE.filterHz, 10, 300);
GUI.sliderize($('#ez_tune_axis_ratio'), FC.EZ_TUNE.axisRatio, 25, 175);
GUI.sliderize($('#ez_tune_response'), FC.EZ_TUNE.response, 0, 200);
GUI.sliderize($('#ez_tune_damping'), FC.EZ_TUNE.damping, 0, 200);
GUI.sliderize($('#ez_tune_stability'), FC.EZ_TUNE.stability, 0, 200);
GUI.sliderize($('#ez_tune_aggressiveness'), FC.EZ_TUNE.aggressiveness, 0, 200);
GUI.sliderize($('#ez_tune_rate'), FC.EZ_TUNE.rate, 0, 200);
GUI.sliderize($('#ez_tune_expo'), FC.EZ_TUNE.expo, 0, 200);
$('.ez-element').on('updated', function () {
updatePreview();
});
updatePreview();
GUI.simpleBind();
GUI.content_ready(callback);
$('a.update').on('click', function () {
if ($("#ez_tune_enabled").is(":checked")) {
FC.EZ_TUNE.enabled = 1;
} else {
FC.EZ_TUNE.enabled = 0;
}
FC.EZ_TUNE.filterHz = $('#ez_tune_filter_hz').val();
FC.EZ_TUNE.axisRatio = $('#ez_tune_axis_ratio').val();
FC.EZ_TUNE.response = $('#ez_tune_response').val();
FC.EZ_TUNE.damping = $('#ez_tune_damping').val();
FC.EZ_TUNE.stability = $('#ez_tune_stability').val();
FC.EZ_TUNE.aggressiveness = $('#ez_tune_aggressiveness').val();
FC.EZ_TUNE.rate = $('#ez_tune_rate').val();
FC.EZ_TUNE.expo = $('#ez_tune_expo').val();
saveChainer.execute();
});
}
};
TABS.ez_tune.cleanup = function (callback) {
if (callback) {
callback();
}
};

@ -209,7 +209,7 @@ TABS.magnetometer.initialize = function (callback) {
var magRotation = new THREE.Euler(-THREE.Math.degToRad(degree[0]-180), THREE.Math.degToRad(-180 - degree[2]), THREE.Math.degToRad(degree[1]), 'YXZ'); var magRotation = new THREE.Euler(-THREE.Math.degToRad(degree[0]-180), THREE.Math.degToRad(-180 - degree[2]), THREE.Math.degToRad(degree[1]), 'YXZ');
var matrix = (new THREE.Matrix4()).makeRotationFromEuler(magRotation); var matrix = (new THREE.Matrix4()).makeRotationFromEuler(magRotation);
var boardRotation = new THREE.Euler( THREE.Math.degToRad( -self.boardAlignmentConfig.pitch ), THREE.Math.degToRad( -self.boardAlignmentConfig.yaw ), THREE.Math.degToRad( -self.boardAlignmentConfig.roll ), 'YXZ'); var boardRotation = new THREE.Euler( THREE.Math.degToRad( self.boardAlignmentConfig.pitch ), THREE.Math.degToRad( -self.boardAlignmentConfig.yaw ), THREE.Math.degToRad( self.boardAlignmentConfig.roll ), 'YXZ');
var matrix1 = (new THREE.Matrix4()).makeRotationFromEuler(boardRotation); var matrix1 = (new THREE.Matrix4()).makeRotationFromEuler(boardRotation);
matrix.premultiply(matrix1); matrix.premultiply(matrix1);
@ -611,7 +611,7 @@ TABS.magnetometer.initialize3D = function () {
var magRotation = new THREE.Euler(-THREE.Math.degToRad(self.alignmentConfig.pitch-180), THREE.Math.degToRad(-180 - self.alignmentConfig.yaw), THREE.Math.degToRad(self.alignmentConfig.roll), 'YXZ'); var magRotation = new THREE.Euler(-THREE.Math.degToRad(self.alignmentConfig.pitch-180), THREE.Math.degToRad(-180 - self.alignmentConfig.yaw), THREE.Math.degToRad(self.alignmentConfig.roll), 'YXZ');
var matrix = (new THREE.Matrix4()).makeRotationFromEuler(magRotation); var matrix = (new THREE.Matrix4()).makeRotationFromEuler(magRotation);
var boardRotation = new THREE.Euler( THREE.Math.degToRad( -self.boardAlignmentConfig.pitch ), THREE.Math.degToRad( -self.boardAlignmentConfig.yaw ), THREE.Math.degToRad( -self.boardAlignmentConfig.roll ), 'YXZ'); var boardRotation = new THREE.Euler( THREE.Math.degToRad( self.boardAlignmentConfig.pitch), THREE.Math.degToRad( -self.boardAlignmentConfig.yaw ), THREE.Math.degToRad( self.boardAlignmentConfig.roll ), 'YXZ');
var matrix1 = (new THREE.Matrix4()).makeRotationFromEuler(boardRotation); var matrix1 = (new THREE.Matrix4()).makeRotationFromEuler(boardRotation);
/* /*

@ -446,7 +446,9 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
} }
if (currentMixerPreset.image != 'quad_x') { if (currentMixerPreset.image != 'quad_x') {
return; for (let i = 1; i < 5; i++) {
$("#motorNumber"+i).css("visibility", "hidden");
}
} }
for (const i in rules) { for (const i in rules) {
@ -454,6 +456,10 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
const rule = rules[i]; const rule = rules[i];
index++; index++;
if (currentMixerPreset.image != 'quad_x') {
continue;
}
let top_px = 30; let top_px = 30;
let left_px = 28; let left_px = 28;
if (rule.getRoll() < -0.5) { if (rule.getRoll() < -0.5) {

@ -145,13 +145,14 @@
<div class="require-sdcard-ready"> <div class="require-sdcard-ready">
<ul class="sdcard-contents"> <ul class="sdcard-contents">
<li class="sdcard-other"> <li class="sdcard-free">
<div class="legend"></div> <div class="legend"></div>
</li> </li>
<li class="sdcard-free"> <li class="sdcard-other">
<div class="legend"></div> <div class="legend"></div>
</li> </li>
</ul> </ul><bbr />
<a class="require-msc-ready regular-button onboardLoggingRebootMsc" href="#" i18n="cliMscBtn"></a>
</div> </div>
</div> </div>
</div> </div>

@ -10,6 +10,15 @@
<div class="settings spacer_right"> <div class="settings spacer_right">
<select class="osd_layouts"> <select class="osd_layouts">
</select> </select>
<span class="btn btn_blue">
<a class="active osd_copy" href="#" data-i18n="copy"></a>
</span>
<span class="btn btn_blue">
<a class="active osd_paste" href="#" data-i18n="paste"></a>
</span>
<span class="btn btn_danger">
<a class="active osd_clear" href="#" data-i18n="clear"></a>
</span>
<input class="osd_search" placeholder="Search..."> <input class="osd_search" placeholder="Search...">
</div> </div>
<div class="spacer_right"> <div class="spacer_right">

@ -157,6 +157,8 @@ var video_type = null;
var isGuidesChecked = false; var isGuidesChecked = false;
var FONT = FONT || {}; var FONT = FONT || {};
var layout_clipboard = {layout: [], filled: false};
var FONT = FONT || {}; var FONT = FONT || {};
FONT.initData = function () { FONT.initData = function () {
if (FONT.data) { if (FONT.data) {
@ -1708,13 +1710,13 @@ OSD.constants = {
}, },
{ {
name: 'ADSB_WARNING_MESSAGE', name: 'ADSB_WARNING_MESSAGE',
id: 147, id: 150,
min_version: '7.1.0', min_version: '7.1.0',
preview: FONT.symbol(SYM.ADSB) + '19.25' + FONT.symbol(SYM.DIR_TO_HOME+1) + '2.75', preview: FONT.symbol(SYM.ADSB) + '19.25' + FONT.symbol(SYM.DIR_TO_HOME+1) + '2.75',
}, },
{ {
name: 'ADSB_INFO', name: 'ADSB_INFO',
id: 148, id: 151,
min_version: '7.1.0', min_version: '7.1.0',
preview: FONT.symbol(SYM.ADSB) + '2', preview: FONT.symbol(SYM.ADSB) + '2',
}, },
@ -3137,6 +3139,9 @@ OSD.GUI.updateAll = function() {
return; return;
} }
var layouts = $('.osd_layouts'); var layouts = $('.osd_layouts');
var copy = $('.osd_copy');
var paste = $('.osd_paste').hide();
var clear = $('.osd_clear');
if (OSD.data.layout_count > 1) { if (OSD.data.layout_count > 1) {
layouts.empty(); layouts.empty();
for (var ii = 0; ii < OSD.data.layout_count; ii++) { for (var ii = 0; ii < OSD.data.layout_count; ii++) {
@ -3152,9 +3157,63 @@ OSD.GUI.updateAll = function() {
OSD.GUI.updateDjiView($('#djiUnsupportedElements').find('input').is(':checked')); OSD.GUI.updateDjiView($('#djiUnsupportedElements').find('input').is(':checked'));
OSD.GUI.updatePreviews(); OSD.GUI.updatePreviews();
}); });
copy.on('click', function() {
if(OSD.data.selected_layout >= 0 && OSD.data.selected_layout < OSD.data.layout_count){
layout_clipboard = {layout: JSON.parse(JSON.stringify(OSD.data.layouts[OSD.data.selected_layout])), filled: true};
paste.show();
GUI.log(chrome.i18n.getMessage('osdLayoutInsertedIntoClipboard'));
}
});
paste.on('click', function() {
if(layout_clipboard.filled == true){
var oldLayout = JSON.parse(JSON.stringify(OSD.data.layouts[OSD.data.selected_layout]))
OSD.data.layouts[OSD.data.selected_layout] = JSON.parse(JSON.stringify(layout_clipboard.layout));
layouts.trigger('change');
OSD.data.layouts[OSD.data.selected_layout].forEach(function(item, index){
if(!(item.isVisible === false && oldLayout[index].isVisible === false) && (oldLayout[index].x !== item.x || oldLayout[index].y !== item.y || oldLayout[index].position !== item.position || oldLayout[index].isVisible !== item.isVisible)){
OSD.saveItem({id: index});
}
});
GUI.log(chrome.i18n.getMessage('osdLayoutPasteFromClipboard'));
}
});
clear.on('click', function() {
var oldLayout = JSON.parse(JSON.stringify(OSD.data.layouts[OSD.data.selected_layout]));
var clearedLayout = [];
oldLayout.forEach(function(item, index){
var itemCopy = JSON.parse(JSON.stringify(item));
itemCopy.isVisible = false;
clearedLayout[index] = itemCopy;
})
OSD.data.layouts[OSD.data.selected_layout] = clearedLayout;
layouts.trigger('change');
OSD.data.layouts[OSD.data.selected_layout].forEach(function(item, index){
if(oldLayout[index].isVisible === true){
OSD.saveItem({id: index});
}
});
GUI.log(chrome.i18n.getMessage('osdClearLayout'));
});
} else { } else {
layouts.hide(); layouts.hide();
layouts.off('change'); layouts.off('change');
copy.hide();
copy.off('change');
paste.hide();
paste.off('change');
clear.hide();
clear.off('change');
} }
$('.osd_search').on('input', function() { $('.osd_search').on('input', function() {

@ -288,11 +288,6 @@ TABS.outputs.initialize = function (callback) {
let $currentRow = $servoConfigTable.find('tr:last'); let $currentRow = $servoConfigTable.find('tr:last');
//This routine is pre 2.0 only
if (FC.SERVO_CONFIG[obj].indexOfChannelToForward >= 0) {
$currentRow.find('td.channel input').eq(FC.SERVO_CONFIG[obj].indexOfChannelToForward).prop('checked', true);
}
// adding select box and generating options // adding select box and generating options
$currentRow.find('td.rate').append( $currentRow.find('td.rate').append(
'<input class="rate-input" type="number" min="' + FC.MIN_SERVO_RATE + '" max="' + FC.MAX_SERVO_RATE + '" value="' + Math.abs(FC.SERVO_CONFIG[obj].rate) + '" />' '<input class="rate-input" type="number" min="' + FC.MIN_SERVO_RATE + '" max="' + FC.MAX_SERVO_RATE + '" value="' + Math.abs(FC.SERVO_CONFIG[obj].rate) + '" />'
@ -340,8 +335,6 @@ TABS.outputs.initialize = function (callback) {
channelIndex = undefined; channelIndex = undefined;
} }
FC.SERVO_CONFIG[info.obj].indexOfChannelToForward = channelIndex;
FC.SERVO_CONFIG[info.obj].middle = parseInt($('.middle input', this).val()); FC.SERVO_CONFIG[info.obj].middle = parseInt($('.middle input', this).val());
FC.SERVO_CONFIG[info.obj].min = parseInt($('.min input', this).val()); FC.SERVO_CONFIG[info.obj].min = parseInt($('.min input', this).val());
FC.SERVO_CONFIG[info.obj].max = parseInt($('.max input', this).val()); FC.SERVO_CONFIG[info.obj].max = parseInt($('.max input', this).val());

@ -1,36 +1,186 @@
<!--suppress ALL --> <!--suppress ALL -->
<div id="content-watermark"></div> <div id="content-watermark"></div>
<div class="tab-pid_tuning toolbar_fixed_bottom"> <div class="tab-pid_tuning toolbar_fixed_bottom">
<div id="note-wrapper" class="content_wrapper">
<div class="note spacebottom">
<div class="note_spacer">
<p i18n="ezTuneNote"></p>
</div>
</div>
</div>
<div id="tuning-wrapper" class="content_wrapper"> <div id="tuning-wrapper" class="content_wrapper">
<div class="tab_title subtab__header"> <div class="tab_title subtab__header">
<span class="subtab__header_label subtab__header_label--current" for="subtab-pid" data-i18n="pidTuning_PIDgains"></span> <span class="subtab__header_label subtab__header_label--current" for="subtab-pid" data-i18n="pidTuning_PIDmain"></span>
<span class="subtab__header_label" for="subtab-pid-other" data-i18n="pidTuning_PIDother"></span>
<span class="subtab__header_label" for="subtab-rates" data-i18n="pidTuning_RatesAndExpo"></span> <span class="subtab__header_label" for="subtab-rates" data-i18n="pidTuning_RatesAndExpo"></span>
<span class="subtab__header_label" for="subtab-filters" data-i18n="pidTuning_Filters"></span> <span class="subtab__header_label" for="subtab-filters" data-i18n="pidTuning_Filters"></span>
<span class="subtab__header_label" for="subtab-mechanics" data-i18n="pidTuning_Mechanics"></span> <span class="subtab__header_label" for="subtab-mechanics" data-i18n="pidTuning_Mechanics"></span>
</div> </div>
<div id="subtab-pid" class="subtab__content subtab__content--current"> <div id="subtab-pid" class="subtab__content subtab__content--current">
<div class="cf_column right" style="margin-top: -6px;"> <div class="cf_column right" style="margin-top: -6px;">
<div class="default_btn show">
<a href="#" id="showAllPids" data-i18n="pidTuning_ShowAllPIDs"></a>
</div>
<div class="default_btn resetbt"> <div class="default_btn resetbt">
<a href="#" id="resetDefaults" data-i18n="pidTuning_SelectNewDefaults"></a> <a href="#" class="action-resetDefaults" data-i18n="pidTuning_SelectNewDefaults"></a>
</div> </div>
<div class="default_btn resetbt"> <div class="default_btn resetbt">
<a href="#" id="resetPIDs" data-i18n="pidTuning_ResetPIDController"></a> <a href="#" class="action-resetPIDs" data-i18n="pidTuning_ResetPIDController"></a>
</div> </div>
</div> </div>
<div class="tab_subtitle" style="margin-top: 1em;" data-i18n="pidTuning_PIDgains"></div>
<div class="clear-both"></div> <div class="clear-both"></div>
<div class="cf_column" id="pid-sliders"> <div id="" class="cf_column">
<div class="pid-sliders-axis" style="background-color: #2a9d8f;">
<div style="padding: 1em;" data-i18n="ezTuneEnabledTips"></div>
<div class="pid-switch-row">
<span data-i18n="configurationFeatureEnabled" class="bold label"></span>
<div class="checkbox no-border">
<input id="ez_tune_enabled" type="checkbox" class="ez-element toggle" />
</div>
</div>
<div class="clear-both"></div>
</div>
</div>
<div class="for-ez-tune">
<div style="display: flex;">
<div>
<div class="pid-sliders-axis" data-axis="roll">
<div style="padding: 1em;" data-i18n="ezTuneFilterHzTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneFilterHz" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_filter_hz" type="number" class="ez-element" />
</div>
</div>
<div class="clear-both"></div>
</div>
<div class="pid-sliders-axis" data-axis="pitch">
<div style="padding: 1em;" data-i18n="ezTuneAxisRatioTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneAxisRatio" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_axis_ratio" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneResponseTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneResponse" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_response" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneDampingTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneDamping" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_damping" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneStabilityTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneStability" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_stability" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneAggressivenessTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneAggressiveness" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_aggressiveness" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
</div>
<div class="pid-sliders-axis" data-axis="yaw">
<div style="padding: 1em;" data-i18n="ezTuneRateTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneRate" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_rate" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
<div style="padding: 1em;" data-i18n="ezTuneExpoTips"></div>
<div class="pid-slider-row">
<span data-i18n="ezTuneExpo" class="bold"></span>
<div class="number no-border">
<input id="ez_tune_expo" type="number" class="ez-element" />
</div>
<div class="clear-both"></div>
</div>
</div>
</div>
<div class="ez-tune-preview">
<h2 data-i18n="ezTunePidPreview"></h2>
<table>
<tr>
<th>&nbsp;</th>
<th>P</th>
<th>I</th>
<th>D</th>
<th>FF</th>
</tr>
<tr>
<th data-i18n="axisRoll"></th>
<td id="preview-roll-p"></td>
<td id="preview-roll-i"></td>
<td id="preview-roll-d"></td>
<td id="preview-roll-ff"></td>
</tr>
<tr>
<th data-i18n="axisPitch"></th>
<td id="preview-pitch-p"></td>
<td id="preview-pitch-i"></td>
<td id="preview-pitch-d"></td>
<td id="preview-pitch-ff"></td>
</tr>
<tr>
<th data-i18n="axisYaw"></th>
<td id="preview-yaw-p"></td>
<td id="preview-yaw-i"></td>
<td id="preview-yaw-d"></td>
<td id="preview-yaw-ff"></td>
</tr>
</table>
<h2 data-i18n="ezTuneRatePreview"></h2>
<table>
<tr>
<th data-i18n="ezTuneRatePreviewAxis"></th>
<th data-i18n="ezTuneRatePreviewRate"></th>
<th data-i18n="ezTuneRatePreviewExpo"></th>
</tr>
<tr>
<th data-i18n="axisRoll"></th>
<td id="preview-roll-rate"></td>
<td id="preview-roll-expo"></td>
</tr>
<tr>
<th data-i18n="axisPitch"></th>
<td id="preview-pitch-rate"></td>
<td id="preview-pitch-expo"></td>
</tr>
<tr>
<th data-i18n="axisYaw"></th>
<td id="preview-yaw-rate"></td>
<td id="preview-yaw-expo"></td>
</tr>
</table>
</div>
</div>
</div>
<div class="cf_column not-for-ez-tune" id="pid-sliders">
<div class="pid-sliders-axis" data-axis="roll"> <div class="pid-sliders-axis" data-axis="roll">
<h3 data-i18n="axisRoll"></h3> <h3 data-i18n="axisRoll"></h3>
<div class="pid-slider-row"> <div class="pid-slider-row">
@ -115,13 +265,20 @@
</div> </div>
</div> </div>
</div>
<div class="toolbox" style="margin-bottom: 1em;"> <div id="subtab-pid-other" class="subtab__content">
<input type="checkbox" id="show-advanced-pids" class="toggle" /> <div class="cf_column right" style="margin-top: -6px;">
<label data-i18n="showAdvancedPIDs" for="show-advanced-pids"></label> <div class="default_btn resetbt">
<a href="#" id="resetDefaults" class="action-resetDefaults" data-i18n="pidTuning_SelectNewDefaults"></a>
</div>
<div class="default_btn resetbt">
<a href="#" class="action-resetPIDs" data-i18n="pidTuning_ResetPIDController"></a>
</div>
</div> </div>
<div class="clear-both"></div>
<div class="cf_column pid-section is-hidden" id="the-other-pids"> <div class="cf_column pid-section" id="the-other-pids">
<div class="gui_box grey"> <div class="gui_box grey">
<table class="pid_titlebar"> <table class="pid_titlebar">
<tr> <tr>
@ -274,31 +431,31 @@
<div class="cf_column"> <div class="cf_column">
<table class="settings-table settings-table--inav"> <table class="settings-table settings-table--inav">
<tbody> <tbody>
<tr> <tr class="not-for-ez-tune">
<th class="roll" data-i18n="pidTuning_RollRate"></th> <th class="roll" data-i18n="pidTuning_RollRate"></th>
<td class="roll"> <td class="roll">
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="roll_rate" data-unit="decadegps" /></div> <div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="roll_rate" data-unit="decadegps" /></div>
</td> </td>
</tr> </tr>
<tr> <tr class="not-for-ez-tune">
<th class="pitch" data-i18n="pidTuning_PitchRate"></th> <th class="pitch" data-i18n="pidTuning_PitchRate"></th>
<td class="pitch"> <td class="pitch">
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="pitch_rate" data-unit="decadegps" /></div> <div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="pitch_rate" data-unit="decadegps" /></div>
</td> </td>
</tr> </tr>
<tr> <tr class="not-for-ez-tune">
<th class="yaw" data-i18n="pidTuning_YawRate"></th> <th class="yaw" data-i18n="pidTuning_YawRate"></th>
<td class="yaw"> <td class="yaw">
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="yaw_rate" data-unit="decadegps" /></div> <div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="yaw_rate" data-unit="decadegps" /></div>
</td> </td>
</tr> </tr>
<tr> <tr class="not-for-ez-tune">
<th data-i18n="pidTuning_RollAndPitchExpo"></th> <th data-i18n="pidTuning_RollAndPitchExpo"></th>
<td> <td>
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="rc_expo" data-unit="percent" /></div> <div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="rc_expo" data-unit="percent" /></div>
</td> </td>
</tr> </tr>
<tr> <tr class="not-for-ez-tune">
<th data-i18n="pidTuning_YawExpo"></th> <th data-i18n="pidTuning_YawExpo"></th>
<td> <td>
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="rc_yaw_expo" data-unit="percent" /></div> <div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="rc_yaw_expo" data-unit="percent" /></div>
@ -415,10 +572,10 @@
</div> </div>
<div id="subtab-filters" class="subtab__content"> <div id="subtab-filters" class="subtab__content">
<div class="tab_subtitle" data-i18n="pidTuning_mainFilters" style="margin-top: 1em;"></div> <div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_mainFilters" style="margin-top: 1em;"></div>
<div class="clear-both"></div> <div class="clear-both not-for-ez-tune"></div>
<div class="cf_column"> <div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering"> <table class="settings-table settings-table--filtering not-for-ez-tune">
<tbody> <tbody>
<tr> <tr>
<th data-i18n="pidTuning_gyro_use_dyn_lpf" style="height: 24px;"></th> <th data-i18n="pidTuning_gyro_use_dyn_lpf" style="height: 24px;"></th>
@ -469,10 +626,10 @@
</table> </table>
</div> </div>
<div class="clear-both"></div> <div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle" data-i18n="pidTuning_advancedFilters" style="margin-top: 1em;"></div> <div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_advancedFilters" style="margin-top: 1em;"></div>
<div class="clear-both"></div> <div class="clear-both not-for-ez-tune"></div>
<div class="cf_column"> <div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering"> <table class="settings-table settings-table--filtering">
<tbody> <tbody>
<tr> <tr>
@ -514,9 +671,9 @@
</table> </table>
</div> </div>
<div class="clear-both"></div> <div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle" data-i18n="pidTuning_dtermFilters" style="margin-top: 1em;"></div> <div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_dtermFilters" style="margin-top: 1em;"></div>
<div class="cf_column"> <div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering"> <table class="settings-table settings-table--filtering">
<tbody> <tbody>
<tr> <tr>
@ -557,9 +714,9 @@
</div> </div>
<div id="subtab-mechanics" class="subtab__content"> <div id="subtab-mechanics" class="subtab__content">
<div class="clear-both"></div> <div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle" data-i18n="pidTuning_ITermMechanics" style="margin-top: 1em;"></div> <div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_ITermMechanics" style="margin-top: 1em;"></div>
<div class="cf_column"> <div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering"> <table class="settings-table settings-table--filtering">
<tbody> <tbody>
<tr> <tr>
@ -589,22 +746,13 @@
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="antigravity_cutoff_lpf_hz" /></div> <div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="antigravity_cutoff_lpf_hz" /></div>
</td> </td>
</tr> </tr>
<tr>
<th data-i18n="pidTuning_itermBankAngleFreeze"></th>
<td>
<div class="pidTuning_number">
<input id="fwYawItermFreeze" type="number" class="rate-tpa_input" data-setting="fw_yaw_iterm_freeze_bank_angle" data-presentation="range" />
<div for="fwYawItermFreeze" class="helpicon cf_tip" data-i18n_title="pidTuning_itermBankAngleFreezeHelp"></div>
</div>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="clear-both"></div> <div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle" data-i18n="pidTuning_dTermMechanics" style="margin-top: 1em;"></div> <div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_dTermMechanics" style="margin-top: 1em;"></div>
<div class="cf_column"> <div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering"> <table class="settings-table settings-table--filtering">
<tbody> <tbody>
<tr> <tr>
@ -684,6 +832,15 @@
<div for="fwLevelTrim" class="helpicon cf_tip" data-i18n_title="pidTuning_fw_level_pitch_trim_help"></div> <div for="fwLevelTrim" class="helpicon cf_tip" data-i18n_title="pidTuning_fw_level_pitch_trim_help"></div>
</td> </td>
</tr> </tr>
<tr>
<th data-i18n="pidTuning_itermBankAngleFreeze"></th>
<td>
<div class="pidTuning_number">
<input id="fwYawItermFreeze" type="number" class="rate-tpa_input" data-setting="fw_yaw_iterm_freeze_bank_angle" data-presentation="range" />
<div for="fwYawItermFreeze" class="helpicon cf_tip" data-i18n_title="pidTuning_itermBankAngleFreezeHelp"></div>
</div>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

@ -26,15 +26,14 @@ TABS.pid_tuning.initialize = function (callback) {
var loadChainer = new MSPChainerClass(); var loadChainer = new MSPChainerClass();
let EZ_TUNE_PID_RP_DEFAULT = [40, 75, 23, 100];
let EZ_TUNE_PID_YAW_DEFAULT = [45, 80, 0, 100];
var loadChain = [ var loadChain = [
mspHelper.loadPidNames,
mspHelper.loadPidData, mspHelper.loadPidData,
mspHelper.loadINAVPidConfig,
mspHelper.loadPidAdvanced,
mspHelper.loadFilterConfig,
mspHelper.loadFeatures,
mspHelper.loadRateDynamics, mspHelper.loadRateDynamics,
mspHelper.loadEzTune mspHelper.loadEzTune,
mspHelper.loadMixerConfig,
]; ];
loadChain.push(mspHelper.loadRateProfileData); loadChain.push(mspHelper.loadRateProfileData);
@ -120,57 +119,99 @@ TABS.pid_tuning.initialize = function (callback) {
FC.RATE_DYNAMICS.weightEnd = parseInt($('#rate_dynamics_end_weight').val()); FC.RATE_DYNAMICS.weightEnd = parseInt($('#rate_dynamics_end_weight').val());
} }
function hideUnusedPids(sensors_detected) {
$('.tab-pid_tuning table.pid_tuning').hide(); function getYawPidScale(input) {
$('#pid_main').show(); const normalized = (input - 100) * 0.01;
if (SerialBackend.have_sensor(sensors_detected, 'acc')) { return 1.0 + (normalized * 0.5);
$('#pid_accel').show(); }
}
if (SerialBackend.have_sensor(sensors_detected, 'baro')) { function scaleRange(x, srcMin, srcMax, destMin, destMax) {
$('#pid_baro').show(); let a = (destMax - destMin) * (x - srcMin);
} let b = srcMax - srcMin;
if (SerialBackend.have_sensor(sensors_detected, 'mag')) { return ((a / b) + destMin);
$('#pid_mag').show(); }
}
if (BitHelper.bit_check(FC.FEATURES, 7)) { function updatePreview() {
$('#pid_gps').show();
} let axisRatio = $('#ez_tune_axis_ratio').val() / 100;
if (SerialBackend.have_sensor(sensors_detected, 'sonar')) { let response = $('#ez_tune_response').val();
$('#pid_baro').show(); let damping = $('#ez_tune_damping').val();
} let stability = $('#ez_tune_stability').val();
let aggressiveness = $('#ez_tune_aggressiveness').val();
let rate = $('#ez_tune_rate').val();
let expo = $('#ez_tune_expo').val();
$('#preview-roll-p').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[0] * response / 100));
$('#preview-roll-i').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[1] * stability / 100));
$('#preview-roll-d').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[2] * damping / 100));
$('#preview-roll-ff').html(Math.floor(EZ_TUNE_PID_RP_DEFAULT[3] * aggressiveness / 100));
$('#preview-pitch-p').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[0] * response / 100));
$('#preview-pitch-i').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[1] * stability / 100));
$('#preview-pitch-d').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[2] * damping / 100));
$('#preview-pitch-ff').html(Math.floor(axisRatio * EZ_TUNE_PID_RP_DEFAULT[3] * aggressiveness / 100));
$('#preview-yaw-p').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[0] * getYawPidScale(response)));
$('#preview-yaw-i').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[1] * getYawPidScale(stability)));
$('#preview-yaw-d').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[2] * getYawPidScale(damping)));
$('#preview-yaw-ff').html(Math.floor(EZ_TUNE_PID_YAW_DEFAULT[3] * getYawPidScale(aggressiveness)));
$('#preview-roll-rate').html(Math.floor(scaleRange(rate, 0, 200, 30, 90)) * 10 + " dps");
$('#preview-pitch-rate').html(Math.floor(scaleRange(rate, 0, 200, 30, 90)) * 10 + " dps");
$('#preview-yaw-rate').html((Math.floor(scaleRange(rate, 0, 200, 30, 90)) - 10) * 10 + " dps");
$('#preview-roll-expo').html(Math.floor(scaleRange(expo, 0, 200, 40, 100)) + "%");
$('#preview-pitch-expo').html(Math.floor(scaleRange(expo, 0, 200, 40, 100)) + "%");
$('#preview-yaw-expo').html(Math.floor(scaleRange(expo, 0, 200, 40, 100)) + "%");
} }
function process_html() { function process_html() {
// translate to user-selected language // translate to user-selected language
i18n.localize();
$('#ez_tune_enabled').on('change', function () {
if ($(this).is(":checked")) {
FC.EZ_TUNE.enabled = 1;
} else {
FC.EZ_TUNE.enabled = 0;
}
if (FC.EZ_TUNE.enabled) {
$('.for-ez-tune').show();
$('.not-for-ez-tune').hide();
} else {
$('.for-ez-tune').hide();
$('.not-for-ez-tune').show();
}
});
if (FC.EZ_TUNE.enabled) { if (!FC.isMultirotor()) {
$("#tuning-wrapper").remove(); $('#ez-tune-switch').hide();
$("#tuning-footer").remove();
$('#note-wrapper').show();
} else {
$("#note-wrapper").remove();
} }
i18n.localize();; $("#ez_tune_enabled").prop('checked', FC.EZ_TUNE.enabled).trigger('change');
tabs.init($('.tab-pid_tuning')); GUI.sliderize($('#ez_tune_filter_hz'), FC.EZ_TUNE.filterHz, 10, 300);
features.updateUI($('.tab-pid_tuning'), FC.FEATURES); GUI.sliderize($('#ez_tune_axis_ratio'), FC.EZ_TUNE.axisRatio, 25, 175);
GUI.sliderize($('#ez_tune_response'), FC.EZ_TUNE.response, 0, 200);
hideUnusedPids(FC.CONFIG.activeSensors); GUI.sliderize($('#ez_tune_damping'), FC.EZ_TUNE.damping, 0, 200);
GUI.sliderize($('#ez_tune_stability'), FC.EZ_TUNE.stability, 0, 200);
$('#showAllPids').on('click', function(){ GUI.sliderize($('#ez_tune_aggressiveness'), FC.EZ_TUNE.aggressiveness, 0, 200);
if($(this).text() == "Show all PIDs") {
$('.tab-pid_tuning table.pid_tuning').show(); GUI.sliderize($('#ez_tune_rate'), FC.EZ_TUNE.rate, 0, 200);
$(this).text('Hide unused PIDs'); GUI.sliderize($('#ez_tune_expo'), FC.EZ_TUNE.expo, 0, 200);
$('.show').addClass('unusedPIDsHidden');
} else { $('.ez-element').on('updated', function () {
hideUnusedPids(FC.CONFIG.activeSensors); updatePreview();
$(this).text('Show all PIDs');
$('.show').removeClass('unusedPIDsHidden');
}
}); });
$('#resetPIDs').on('click', function() { updatePreview();
tabs.init($('.tab-pid_tuning'));
$('.action-resetPIDs').on('click', function() {
if (confirm(i18n.getMessage('confirm_reset_pid'))) { if (confirm(i18n.getMessage('confirm_reset_pid'))) {
MSP.send_message(MSPCodes.MSP_SET_RESET_CURR_PID, false, false, false); MSP.send_message(MSPCodes.MSP_SET_RESET_CURR_PID, false, false, false);
@ -178,7 +219,7 @@ TABS.pid_tuning.initialize = function (callback) {
} }
}); });
$('#resetDefaults').on('click', function() { $('.action-resetDefaults').on('click', function() {
if (confirm(i18n.getMessage('confirm_select_defaults'))) { if (confirm(i18n.getMessage('confirm_select_defaults'))) {
mspHelper.setSetting("applied_defaults", 0, function() { mspHelper.setSetting("applied_defaults", 0, function() {
@ -198,29 +239,6 @@ TABS.pid_tuning.initialize = function (callback) {
pid_and_rc_to_form(); pid_and_rc_to_form();
let $theOtherPids = $('#the-other-pids');
let $showAdvancedPids = $('#show-advanced-pids');
if (store.get('showOtherPids', false) ) {
$theOtherPids.removeClass("is-hidden");
$showAdvancedPids.prop('checked', true);
} else {
$theOtherPids.addClass("is-hidden");
$showAdvancedPids.prop('checked', false);
}
$showAdvancedPids.trigger('change');
$showAdvancedPids.on('change', function() {
if ($showAdvancedPids.is(':checked')) {
$theOtherPids.removeClass("is-hidden");
store.set('showOtherPids', true);
} else {
$theOtherPids.addClass("is-hidden");
store.set('showOtherPids', false);
}
});
$(".pid-slider-row [name='value-slider']").on('input', function () { $(".pid-slider-row [name='value-slider']").on('input', function () {
let val = $(this).val(); let val = $(this).val();
let normalMax = parseInt($(this).data('normal-max')); let normalMax = parseInt($(this).data('normal-max'));
@ -301,24 +319,31 @@ TABS.pid_tuning.initialize = function (callback) {
$('a.update').on('click', function () { $('a.update').on('click', function () {
form_to_pid_and_rc(); form_to_pid_and_rc();
function send_rc_tuning_changes() { if ($("#ez_tune_enabled").is(":checked")) {
MSP.send_message(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE), false, saveINAVPidConfig); FC.EZ_TUNE.enabled = 1;
} else {
FC.EZ_TUNE.enabled = 0;
} }
function saveINAVPidConfig() { FC.EZ_TUNE.filterHz = $('#ez_tune_filter_hz').val();
MSP.send_message(MSPCodes.MSP_SET_INAV_PID, mspHelper.crunch(MSPCodes.MSP_SET_INAV_PID), false, savePidAdvanced); FC.EZ_TUNE.axisRatio = $('#ez_tune_axis_ratio').val();
} FC.EZ_TUNE.response = $('#ez_tune_response').val();
FC.EZ_TUNE.damping = $('#ez_tune_damping').val();
FC.EZ_TUNE.stability = $('#ez_tune_stability').val();
FC.EZ_TUNE.aggressiveness = $('#ez_tune_aggressiveness').val();
FC.EZ_TUNE.rate = $('#ez_tune_rate').val();
FC.EZ_TUNE.expo = $('#ez_tune_expo').val();
function savePidAdvanced() { function send_rc_tuning_changes() {
MSP.send_message(MSPCodes.MSP_SET_PID_ADVANCED, mspHelper.crunch(MSPCodes.MSP_SET_PID_ADVANCED), false, saveFilterConfig); MSP.send_message(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE), false, saveRateDynamics);
} }
function saveFilterConfig() { function saveRateDynamics() {
MSP.send_message(MSPCodes.MSP_SET_FILTER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FILTER_CONFIG), false, saveRateDynamics); mspHelper.saveRateDynamics(saveEzTune);
} }
function saveRateDynamics() { function saveEzTune() {
mspHelper.saveRateDynamics(saveSettings); mspHelper.saveEzTune(saveSettings)
} }
function saveSettings() { function saveSettings() {
@ -331,11 +356,7 @@ TABS.pid_tuning.initialize = function (callback) {
}); });
} }
features.reset(); mspHelper.savePidData(send_rc_tuning_changes);
features.fromUI($('.tab-pid_tuning'));
features.execute(function () {
mspHelper.savePidData(send_rc_tuning_changes);
});
}); });
$('#gyro_use_dyn_lpf').on('change', function () { $('#gyro_use_dyn_lpf').on('change', function () {

@ -28,7 +28,7 @@ TABS.receiver.initialize = function (callback) {
var loadChainer = new MSPChainerClass(); var loadChainer = new MSPChainerClass();
var loadChain = [ var loadChain = [
mspHelper.loadMisc, mspHelper.loadMiscV2,
mspHelper.loadRcData, mspHelper.loadRcData,
mspHelper.loadRcMap, mspHelper.loadRcMap,
mspHelper.loadRxConfig, mspHelper.loadRxConfig,
@ -322,7 +322,7 @@ TABS.receiver.initialize = function (callback) {
} }
function save_misc() { function save_misc() {
MSP.send_message(MSPCodes.MSP_SET_MISC, mspHelper.crunch(MSPCodes.MSP_SET_MISC), false, save_rc_configs); MSP.send_message(MSPCodes.MSPV2_INAV_SET_MISC, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_MISC), false, save_rc_configs);
} }
function save_rc_configs() { function save_rc_configs() {

Loading…
Cancel
Save