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

@ -262,11 +262,8 @@
<li class="tab_failsafe">
<a href="#" data-i18n="tabFailsafe" class="tabicon ic_failsafe" title="Failsafe"></a>
</li>
<li class="tab_ez_tune">
<a href="#" data-i18n="tabEzTune" class="tabicon ic_wizzard"></a>
</li>
<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 class="tab_advanced_tuning">
<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 this.operating_system = "Unknown";
this.colorTable = [
"#8ecae6",
"#2a9d8f",
"#e9c46a",
"#f4a261",
"#e76f51",
"#ef476f",
"#ffc300"
];
};
// message = string

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

@ -231,12 +231,6 @@ var mspHelper = (function () {
case MSPCodes.MSPV2_INAV_AIR_SPEED:
FC.SENSOR_DATA.air_speed = data.getInt32(0, true);
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:
let tmp = data.getUint8(offset++);
FC.ANALOG.battery_full_when_plugged_in = (tmp & 1 ? true : false);
@ -314,30 +308,7 @@ var mspHelper = (function () {
case MSPCodes.MSP_LOOP_TIME:
FC.FC_CONFIG.loopTime = data.getInt16(0, true);
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:
FC.MISC.midrc = data.getInt16(offset, true);
offset += 2;
@ -464,21 +435,6 @@ var mspHelper = (function () {
for (let i = 0; i < data.byteLength; 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;
case MSPCodes.MSP2_INAV_SERVO_MIXER:
FC.SERVO_RULES.flush();
@ -496,9 +452,6 @@ var mspHelper = (function () {
FC.SERVO_RULES.cleanup();
break;
case MSPCodes.MSP_SET_SERVO_MIX_RULE:
console.log("Servo mix saved");
break;
case MSPCodes.MSP2_INAV_SET_SERVO_MIXER:
console.log("Servo mix saved");
break;
@ -615,20 +568,18 @@ var mspHelper = (function () {
console.log("motor mixer saved");
break;
case MSPCodes.MSP_SERVO_CONFIGURATIONS:
case MSPCodes.MSP2_INAV_SERVO_CONFIG:
//noinspection JSUndeclaredVariable
FC.SERVO_CONFIG = []; // empty the array as new data is coming in
if (data.byteLength % 14 == 0) {
for (let i = 0; i < data.byteLength; i += 14) {
if (data.byteLength % 7 == 0) {
for (i = 0; i < data.byteLength; i += 7) {
var arr = {
'min': data.getInt16(i + 0, true),
'max': data.getInt16(i + 2, true),
'middle': data.getInt16(i + 4, true),
'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);
}
}
@ -664,16 +615,13 @@ var mspHelper = (function () {
case MSPCodes.MSP2_INAV_OPFLOW_CALIBRATION:
console.log('Optic flow calibration executed');
break;
case MSPCodes.MSP_SET_MISC:
console.log('MISC Configuration saved');
break;
case MSPCodes.MSP_RESET_CONF:
console.log('Settings Reset');
break;
case MSPCodes.MSP_SELECT_SETTING:
console.log('Profile selected');
break;
case MSPCodes.MSP_SET_SERVO_CONFIGURATION:
case MSPCodes.MSP2_INAV_SET_SERVO_CONFIG:
console.log('Servo Configuration saved');
break;
case MSPCodes.MSP_RTC:
@ -1788,30 +1736,6 @@ var mspHelper = (function () {
buffer.push(BitHelper.lowByte(FC.FC_CONFIG.loopTime));
buffer.push(BitHelper.highByte(FC.FC_CONFIG.loopTime));
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:
buffer.push(BitHelper.lowByte(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.rate);
buffer.push(FC.EZ_TUNE.expo);
console.log(buffer);
break;
@ -2335,29 +2258,14 @@ var mspHelper = (function () {
buffer.push(BitHelper.lowByte(servoConfiguration.middle));
buffer.push(BitHelper.highByte(servoConfiguration.middle));
buffer.push(BitHelper.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);
buffer.push(lowByte(servoConfiguration.rate));
// prepare for next iteration
servoIndex++;
if (servoIndex == FC.SERVO_CONFIG.length) {
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);
};
self.loadMisc = function (callback) {
MSP.send_message(MSPCodes.MSP_MISC, false, false, callback);
};
self.loadMiscV2 = function (callback) {
MSP.send_message(MSPCodes.MSPV2_INAV_MISC, false, false, callback);
};
@ -2904,7 +2808,7 @@ var mspHelper = (function () {
// prepare for next iteration
idIndex++;
if (idIndex == overrideIds.length) {
nextFunction = callback;
nextFunction = onCompleteCallback;
}
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);
};
self.loadAnalog = function (callback) {
MSP.send_message(MSPCodes.MSP_ANALOG, false, false, callback);
};
self.saveToEeprom = function saveToEeprom(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);
};
self.saveMisc = function (callback) {
MSP.send_message(MSPCodes.MSP_SET_MISC, mspHelper.crunch(MSPCodes.MSP_SET_MISC), false, callback);
};
self.saveMiscV2 = function (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) {
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) {

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

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

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

@ -113,7 +113,7 @@
"message": "Ports"
},
"tabPidTuning": {
"message": "PID tuning"
"message": "Tuning"
},
"tabReceiver": {
"message": "Receiver"
@ -1328,6 +1328,12 @@
"pidTuning_ShowAllPIDs": {
"message": "Show all PIDs"
},
"pidTuning_PIDmain": {
"message": "Main PID gains"
},
"pidTuning_PIDother": {
"message": "Additional PID gains"
},
"pidTuning_SelectNewDefaults": {
"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."
},
"pidTuning_fwLevelTrimMechanics": {
"message": "Fixed Wing Level Trim"
"message": "Fixed Wing mechanics"
},
"pidTuning_fw_level_pitch_trim": {
"message": "Level Trim [deg]"
@ -2185,7 +2191,7 @@
"message": "Save Settings"
},
"cliMscBtn": {
"message": "MSC"
"message": "Blackbox (MSC)"
},
"cliDiffAllBtn": {
"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."
},
"failsafeMinDistanceItem": {
"message": "Failsafe Minimum Distance in centimeters"
"message": "Failsafe Minimum Distance"
},
"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. "
@ -4852,6 +4858,15 @@
"save": {
"message": "Save"
},
"copy": {
"message": "Copy"
},
"paste": {
"message": "Paste"
},
"clear": {
"message": "Clear"
},
"active": {
"message": "Active"
},
@ -4861,12 +4876,6 @@
"itermRelaxHelp": {
"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": {
"message": "D-term LPF type"
},
@ -5651,6 +5660,15 @@
"osdSettingsSaved": {
"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": {
"message": "<span style=\"color: red\">Failed</span> to open serial port"
},

11
package-lock.json generated

@ -23,14 +23,13 @@
"marked": "^11.2.0",
"minimist": "^1.2.0",
"openlayers": "^4.6.5",
"plotly": "^1.0.6",
"promise-map-series": "^0.3.0",
"semver": "^7.6.0",
"serialport": "^12.0.0",
"temp": "^0.8.3",
"three": "0.139.0",
"usb": "^2.11.0",
"wnumb": "1.2.0",
"wnumb": "^1.2.0",
"xml2js": "^0.4.19"
},
"devDependencies": {
@ -6450,14 +6449,6 @@
"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": {
"version": "1.0.0-alpha.6",
"resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz",

@ -14,19 +14,21 @@
}
.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 th {
padding: 0.5em;
text-align: center;
padding: 0.5em !important;
text-align: center !important;
}
.ez-tune-preview table th {
background-color: #3EA5D4;
background-color: #3EA5D4 !important;
}
.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{
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 class="select">
<select id="i2c_speed" data-setting="i2c_speed" ></select>
<select id="i2c_speed" data-setting="i2c_speed"></select>
<label for="i2c_speed">
<span data-i18n="configurationI2cSpeed"></span>
</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 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);
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 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);
/*

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

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

@ -10,6 +10,15 @@
<div class="settings spacer_right">
<select class="osd_layouts">
</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...">
</div>
<div class="spacer_right">

@ -157,6 +157,8 @@ var video_type = null;
var isGuidesChecked = false;
var FONT = FONT || {};
var layout_clipboard = {layout: [], filled: false};
var FONT = FONT || {};
FONT.initData = function () {
if (FONT.data) {
@ -1708,13 +1710,13 @@ OSD.constants = {
},
{
name: 'ADSB_WARNING_MESSAGE',
id: 147,
id: 150,
min_version: '7.1.0',
preview: FONT.symbol(SYM.ADSB) + '19.25' + FONT.symbol(SYM.DIR_TO_HOME+1) + '2.75',
},
{
name: 'ADSB_INFO',
id: 148,
id: 151,
min_version: '7.1.0',
preview: FONT.symbol(SYM.ADSB) + '2',
},
@ -3137,6 +3139,9 @@ OSD.GUI.updateAll = function() {
return;
}
var layouts = $('.osd_layouts');
var copy = $('.osd_copy');
var paste = $('.osd_paste').hide();
var clear = $('.osd_clear');
if (OSD.data.layout_count > 1) {
layouts.empty();
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.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 {
layouts.hide();
layouts.off('change');
copy.hide();
copy.off('change');
paste.hide();
paste.off('change');
clear.hide();
clear.off('change');
}
$('.osd_search').on('input', function() {

@ -288,11 +288,6 @@ TABS.outputs.initialize = function (callback) {
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
$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) + '" />'
@ -340,8 +335,6 @@ TABS.outputs.initialize = function (callback) {
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].min = parseInt($('.min input', this).val());
FC.SERVO_CONFIG[info.obj].max = parseInt($('.max input', this).val());

@ -1,36 +1,186 @@
<!--suppress ALL -->
<div id="content-watermark"></div>
<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 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-filters" data-i18n="pidTuning_Filters"></span>
<span class="subtab__header_label" for="subtab-mechanics" data-i18n="pidTuning_Mechanics"></span>
</div>
<div id="subtab-pid" class="subtab__content subtab__content--current">
<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">
<a href="#" id="resetDefaults" data-i18n="pidTuning_SelectNewDefaults"></a>
<a href="#" class="action-resetDefaults" data-i18n="pidTuning_SelectNewDefaults"></a>
</div>
<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 class="tab_subtitle" style="margin-top: 1em;" data-i18n="pidTuning_PIDgains"></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">
<h3 data-i18n="axisRoll"></h3>
<div class="pid-slider-row">
@ -115,13 +265,20 @@
</div>
</div>
</div>
<div class="toolbox" style="margin-bottom: 1em;">
<input type="checkbox" id="show-advanced-pids" class="toggle" />
<label data-i18n="showAdvancedPIDs" for="show-advanced-pids"></label>
<div id="subtab-pid-other" class="subtab__content">
<div class="cf_column right" style="margin-top: -6px;">
<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 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">
<table class="pid_titlebar">
<tr>
@ -274,31 +431,31 @@
<div class="cf_column">
<table class="settings-table settings-table--inav">
<tbody>
<tr>
<tr class="not-for-ez-tune">
<th class="roll" data-i18n="pidTuning_RollRate"></th>
<td class="roll">
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="roll_rate" data-unit="decadegps" /></div>
</td>
</tr>
<tr>
<tr class="not-for-ez-tune">
<th class="pitch" data-i18n="pidTuning_PitchRate"></th>
<td class="pitch">
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="pitch_rate" data-unit="decadegps" /></div>
</td>
</tr>
<tr>
<tr class="not-for-ez-tune">
<th class="yaw" data-i18n="pidTuning_YawRate"></th>
<td class="yaw">
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="yaw_rate" data-unit="decadegps" /></div>
</td>
</tr>
<tr>
<tr class="not-for-ez-tune">
<th data-i18n="pidTuning_RollAndPitchExpo"></th>
<td>
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="rc_expo" data-unit="percent" /></div>
</td>
</tr>
<tr>
<tr class="not-for-ez-tune">
<th data-i18n="pidTuning_YawExpo"></th>
<td>
<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 id="subtab-filters" class="subtab__content">
<div class="tab_subtitle" data-i18n="pidTuning_mainFilters" style="margin-top: 1em;"></div>
<div class="clear-both"></div>
<div class="cf_column">
<table class="settings-table settings-table--filtering">
<div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_mainFilters" style="margin-top: 1em;"></div>
<div class="clear-both not-for-ez-tune"></div>
<div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering not-for-ez-tune">
<tbody>
<tr>
<th data-i18n="pidTuning_gyro_use_dyn_lpf" style="height: 24px;"></th>
@ -469,10 +626,10 @@
</table>
</div>
<div class="clear-both"></div>
<div class="tab_subtitle" data-i18n="pidTuning_advancedFilters" style="margin-top: 1em;"></div>
<div class="clear-both"></div>
<div class="cf_column">
<div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_advancedFilters" style="margin-top: 1em;"></div>
<div class="clear-both not-for-ez-tune"></div>
<div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering">
<tbody>
<tr>
@ -514,9 +671,9 @@
</table>
</div>
<div class="clear-both"></div>
<div class="tab_subtitle" data-i18n="pidTuning_dtermFilters" style="margin-top: 1em;"></div>
<div class="cf_column">
<div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_dtermFilters" style="margin-top: 1em;"></div>
<div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering">
<tbody>
<tr>
@ -557,9 +714,9 @@
</div>
<div id="subtab-mechanics" class="subtab__content">
<div class="clear-both"></div>
<div class="tab_subtitle" data-i18n="pidTuning_ITermMechanics" style="margin-top: 1em;"></div>
<div class="cf_column">
<div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_ITermMechanics" style="margin-top: 1em;"></div>
<div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering">
<tbody>
<tr>
@ -589,22 +746,13 @@
<div class="pidTuning_number"><input type="number" class="rate-tpa_input" data-setting="antigravity_cutoff_lpf_hz" /></div>
</td>
</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>
</table>
</div>
<div class="clear-both"></div>
<div class="tab_subtitle" data-i18n="pidTuning_dTermMechanics" style="margin-top: 1em;"></div>
<div class="cf_column">
<div class="clear-both not-for-ez-tune"></div>
<div class="tab_subtitle not-for-ez-tune" data-i18n="pidTuning_dTermMechanics" style="margin-top: 1em;"></div>
<div class="cf_column not-for-ez-tune">
<table class="settings-table settings-table--filtering">
<tbody>
<tr>
@ -684,6 +832,15 @@
<div for="fwLevelTrim" class="helpicon cf_tip" data-i18n_title="pidTuning_fw_level_pitch_trim_help"></div>
</td>
</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>
</table>
</div>

@ -26,15 +26,14 @@ TABS.pid_tuning.initialize = function (callback) {
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 = [
mspHelper.loadPidNames,
mspHelper.loadPidData,
mspHelper.loadINAVPidConfig,
mspHelper.loadPidAdvanced,
mspHelper.loadFilterConfig,
mspHelper.loadFeatures,
mspHelper.loadRateDynamics,
mspHelper.loadEzTune
mspHelper.loadEzTune,
mspHelper.loadMixerConfig,
];
loadChain.push(mspHelper.loadRateProfileData);
@ -120,57 +119,99 @@ TABS.pid_tuning.initialize = function (callback) {
FC.RATE_DYNAMICS.weightEnd = parseInt($('#rate_dynamics_end_weight').val());
}
function hideUnusedPids(sensors_detected) {
$('.tab-pid_tuning table.pid_tuning').hide();
$('#pid_main').show();
if (SerialBackend.have_sensor(sensors_detected, 'acc')) {
$('#pid_accel').show();
}
if (SerialBackend.have_sensor(sensors_detected, 'baro')) {
$('#pid_baro').show();
}
if (SerialBackend.have_sensor(sensors_detected, 'mag')) {
$('#pid_mag').show();
}
if (BitHelper.bit_check(FC.FEATURES, 7)) {
$('#pid_gps').show();
}
if (SerialBackend.have_sensor(sensors_detected, 'sonar')) {
$('#pid_baro').show();
}
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() {
// 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) {
$("#tuning-wrapper").remove();
$("#tuning-footer").remove();
$('#note-wrapper').show();
} else {
$("#note-wrapper").remove();
if (!FC.isMultirotor()) {
$('#ez-tune-switch').hide();
}
i18n.localize();;
$("#ez_tune_enabled").prop('checked', FC.EZ_TUNE.enabled).trigger('change');
tabs.init($('.tab-pid_tuning'));
features.updateUI($('.tab-pid_tuning'), FC.FEATURES);
hideUnusedPids(FC.CONFIG.activeSensors);
$('#showAllPids').on('click', function(){
if($(this).text() == "Show all PIDs") {
$('.tab-pid_tuning table.pid_tuning').show();
$(this).text('Hide unused PIDs');
$('.show').addClass('unusedPIDsHidden');
} else {
hideUnusedPids(FC.CONFIG.activeSensors);
$(this).text('Show all PIDs');
$('.show').removeClass('unusedPIDsHidden');
}
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();
});
$('#resetPIDs').on('click', function() {
updatePreview();
tabs.init($('.tab-pid_tuning'));
$('.action-resetPIDs').on('click', function() {
if (confirm(i18n.getMessage('confirm_reset_pid'))) {
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'))) {
mspHelper.setSetting("applied_defaults", 0, function() {
@ -198,29 +239,6 @@ TABS.pid_tuning.initialize = function (callback) {
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 () {
let val = $(this).val();
let normalMax = parseInt($(this).data('normal-max'));
@ -301,24 +319,31 @@ TABS.pid_tuning.initialize = function (callback) {
$('a.update').on('click', function () {
form_to_pid_and_rc();
function send_rc_tuning_changes() {
MSP.send_message(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE), false, saveINAVPidConfig);
if ($("#ez_tune_enabled").is(":checked")) {
FC.EZ_TUNE.enabled = 1;
} else {
FC.EZ_TUNE.enabled = 0;
}
function saveINAVPidConfig() {
MSP.send_message(MSPCodes.MSP_SET_INAV_PID, mspHelper.crunch(MSPCodes.MSP_SET_INAV_PID), false, savePidAdvanced);
}
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();
function savePidAdvanced() {
MSP.send_message(MSPCodes.MSP_SET_PID_ADVANCED, mspHelper.crunch(MSPCodes.MSP_SET_PID_ADVANCED), false, saveFilterConfig);
function send_rc_tuning_changes() {
MSP.send_message(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE, mspHelper.crunch(MSPCodes.MSPV2_INAV_SET_RATE_PROFILE), false, saveRateDynamics);
}
function saveFilterConfig() {
MSP.send_message(MSPCodes.MSP_SET_FILTER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FILTER_CONFIG), false, saveRateDynamics);
function saveRateDynamics() {
mspHelper.saveRateDynamics(saveEzTune);
}
function saveRateDynamics() {
mspHelper.saveRateDynamics(saveSettings);
function saveEzTune() {
mspHelper.saveEzTune(saveSettings)
}
function saveSettings() {
@ -331,11 +356,7 @@ TABS.pid_tuning.initialize = function (callback) {
});
}
features.reset();
features.fromUI($('.tab-pid_tuning'));
features.execute(function () {
mspHelper.savePidData(send_rc_tuning_changes);
});
mspHelper.savePidData(send_rc_tuning_changes);
});
$('#gyro_use_dyn_lpf').on('change', function () {

@ -28,7 +28,7 @@ TABS.receiver.initialize = function (callback) {
var loadChainer = new MSPChainerClass();
var loadChain = [
mspHelper.loadMisc,
mspHelper.loadMiscV2,
mspHelper.loadRcData,
mspHelper.loadRcMap,
mspHelper.loadRxConfig,
@ -322,7 +322,7 @@ TABS.receiver.initialize = function (callback) {
}
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() {

Loading…
Cancel
Save