Add support for firmware side sliders
parent
de071bc136
commit
41fb373c94
|
@ -61,7 +61,7 @@
|
|||
},
|
||||
"portOverrideText": {
|
||||
"message": "Port:"
|
||||
},
|
||||
},
|
||||
"autoConnect": {
|
||||
"message": "Auto-Connect"
|
||||
},
|
||||
|
@ -1642,7 +1642,7 @@
|
|||
},
|
||||
"pidTuningDMin": {
|
||||
"message": "D Min",
|
||||
"description": "Table header of the D Min feature in the PIDs tab"
|
||||
"description": "Table header of the D Min feature in the PIDs tab"
|
||||
},
|
||||
"pidTuningDMinDisabledNote": {
|
||||
"message": "<strong>Note:</strong> D Min feature is disabled and its parameters are hidden. To use D Min please enable it in $t(pidTuningPidSettings.message)."
|
||||
|
@ -2099,7 +2099,7 @@
|
|||
"auxiliaryDisabled": {
|
||||
"message": "(DISABLED)",
|
||||
"descripton": "Text to add to the ARM mode (maybe others in the future) in the MODES TAB when it has been disabled for some external reason"
|
||||
},
|
||||
},
|
||||
"auxiliaryAddRange": {
|
||||
"message": "Add Range"
|
||||
},
|
||||
|
@ -2828,7 +2828,7 @@
|
|||
},
|
||||
"dataflashLogsSpace": {
|
||||
"message": "Free space for logs"
|
||||
},
|
||||
},
|
||||
"dataflashNote": {
|
||||
"message": "Flight logs can be recorded to your flight controller's onboard dataflash chip."
|
||||
},
|
||||
|
@ -2883,25 +2883,25 @@
|
|||
"dataflashFileWriteFailed": {
|
||||
"message": "Failed to write to the file you selected, are the permissions on that folder okay?"
|
||||
},
|
||||
|
||||
|
||||
"sdcardStatusNoCard": {
|
||||
"message": "No card inserted"
|
||||
},
|
||||
},
|
||||
"sdcardStatusReboot": {
|
||||
"message": "Fatal error<br>Reboot to retry"
|
||||
},
|
||||
},
|
||||
"sdcardStatusReady": {
|
||||
"message": "Card ready"
|
||||
},
|
||||
},
|
||||
"sdcardStatusStarting": {
|
||||
"message": "Card starting..."
|
||||
},
|
||||
},
|
||||
"sdcardStatusFileSystem": {
|
||||
"message": "Filesystem starting..."
|
||||
},
|
||||
},
|
||||
"sdcardStatusUnknown": {
|
||||
"message": "Unknown state $1"
|
||||
},
|
||||
},
|
||||
|
||||
"firmwareFlasherReleaseSummaryHead": {
|
||||
"message": "Release info"
|
||||
|
@ -3008,7 +3008,7 @@
|
|||
},
|
||||
"firmwareFlasherBaudRate": {
|
||||
"message": "Baud Rate"
|
||||
},
|
||||
},
|
||||
"firmwareFlasherShowDevelopmentReleases":{
|
||||
"message": "Show unstable releases"
|
||||
},
|
||||
|
@ -3594,6 +3594,22 @@
|
|||
"message": "Master Multiplier:",
|
||||
"description": "Master tuning slider label"
|
||||
},
|
||||
"pidTuningRollPitchRatioSlider": {
|
||||
"message": "Roll Pitch Ratio:",
|
||||
"description": "Roll pitch ratio slider label"
|
||||
},
|
||||
"pidTuningRollPitchRatioSliderHelp": {
|
||||
"message": "Roll Pitch Ratio",
|
||||
"description": "This needs a meaningful help text"
|
||||
},
|
||||
"pidTuningIGainSlider": {
|
||||
"message": "I Gain:",
|
||||
"description": "I gain slider label"
|
||||
},
|
||||
"pidTuningIGainSliderHelp": {
|
||||
"message": "I Gain",
|
||||
"description": "This needs a meaningful help text"
|
||||
},
|
||||
"pidTuningPDRatioSlider": {
|
||||
"message": "PD Balance:",
|
||||
"description": "PD balance tuning slider label"
|
||||
|
@ -3602,6 +3618,14 @@
|
|||
"message": "P and D Gain:",
|
||||
"description": "P and D gain tuning slider label"
|
||||
},
|
||||
"pidTuningDMinRatioSlider": {
|
||||
"message": "D Min Ratio:",
|
||||
"description": "D Min ratio slider label"
|
||||
},
|
||||
"pidTuningDMinRatioSliderHelp": {
|
||||
"message": "D Min Ratio",
|
||||
"description": "This needs a meaningful help text"
|
||||
},
|
||||
"pidTuningResponseSlider": {
|
||||
"message": "Stick Response Gain:",
|
||||
"description": "Response tuning slider label"
|
||||
|
@ -3735,7 +3759,7 @@
|
|||
},
|
||||
"pidTuningDTermLowpassFiltersGroup": {
|
||||
"message": "D Term Lowpass Filters"
|
||||
},
|
||||
},
|
||||
"pidTuningDTermLowpassType": {
|
||||
"message": "D Term Lowpass 1 Filter Type"
|
||||
},
|
||||
|
@ -3762,7 +3786,7 @@
|
|||
},
|
||||
"pidTuningDTermNotchFiltersGroup": {
|
||||
"message": "D Term Notch Filters"
|
||||
},
|
||||
},
|
||||
"pidTuningDTermNotchFrequency": {
|
||||
"message": "D Term Notch Filter Center Frequency [Hz]"
|
||||
},
|
||||
|
@ -3771,7 +3795,7 @@
|
|||
},
|
||||
"pidTuningYawLospassFiltersGroup": {
|
||||
"message": "Yaw Lowpass Filters"
|
||||
},
|
||||
},
|
||||
"pidTuningYawLowpassFrequency": {
|
||||
"message": "Yaw Lowpass Cutoff Frequency [Hz]"
|
||||
},
|
||||
|
@ -4462,7 +4486,7 @@
|
|||
"osdSetupUploadingFontEnd": {
|
||||
"message": "Uploaded all {{length}} characters to the OSD"
|
||||
},
|
||||
|
||||
|
||||
"osdSetupSave": {
|
||||
"message": "Save"
|
||||
},
|
||||
|
@ -5618,7 +5642,7 @@
|
|||
"vtxLoadClipboardOk": {
|
||||
"message": "VTX Config info <span class=\"message-positive\">loaded</span> from clipboard",
|
||||
"description": "Message in the GUI log when the VTX Config file is pasted from clipboard"
|
||||
},
|
||||
},
|
||||
"vtxLoadClipboardKo": {
|
||||
"message": "<span class=\"message-negative\">Error</span> while loading the VTX Config info from clipboard. Maybe the contents are not correct",
|
||||
"description": "Message in the GUI log when the VTX Config file is pasted from clipboard"
|
||||
|
|
|
@ -734,7 +734,7 @@
|
|||
height: 15px;
|
||||
}
|
||||
|
||||
.tab-pid_tuning .nonExpertModeSliders.tuningSlider::-webkit-slider-runnable-track {
|
||||
.tab-pid_tuning .nonExpertModeSliders .tuningSlider::-webkit-slider-runnable-track {
|
||||
background: linear-gradient(90deg, rgb(197, 197, 197) -50%, rgb(241, 241, 241) 50%, rgb(255, 84, 14) 150%);
|
||||
background-size: 55%;
|
||||
background-position: 44%;
|
||||
|
|
|
@ -1,19 +1,21 @@
|
|||
'use strict';
|
||||
|
||||
const TuningSliders = {
|
||||
MasterSliderValue: 1,
|
||||
PDRatioSliderValue: 1,
|
||||
PDGainSliderValue: 1,
|
||||
ResponseSliderValue: 1,
|
||||
sliderPidsMode: 0,
|
||||
sliderMasterMultiplier: 1,
|
||||
sliderRollPitchRatio: 1,
|
||||
sliderIGain: 1,
|
||||
sliderPDRatio: 1,
|
||||
sliderPDGain: 1,
|
||||
sliderDMinRatio: 1,
|
||||
sliderFFGain: 1,
|
||||
pidSlidersUnavailable: false,
|
||||
|
||||
gyroFilterSliderValue: 1,
|
||||
dtermFilterSliderValue: 1,
|
||||
filterGyroSliderUnavailable: false,
|
||||
filterDTermSliderUnavailable: false,
|
||||
sliderGyroFilter: 0,
|
||||
sliderGyroFilterMultiplier: 1,
|
||||
sliderDTermFilter: 0,
|
||||
sliderDTermFilterMultiplier: 1,
|
||||
|
||||
dMinFeatureEnabled: true,
|
||||
defaultPDRatio: 0,
|
||||
PID_DEFAULT: [],
|
||||
FILTER_DEFAULT: {},
|
||||
|
||||
|
@ -30,7 +32,6 @@ TuningSliders.initialize = function() {
|
|||
this.PID_DEFAULT = FC.getPidDefaults();
|
||||
this.FILTER_DEFAULT = FC.getFilterDefaults();
|
||||
|
||||
this.setDMinFeatureEnabled($('#dMinSwitch').is(':checked'));
|
||||
this.setExpertMode($('input[name="expertModeCheckbox"]').is(':checked'));
|
||||
|
||||
this.initPidSlidersPosition();
|
||||
|
@ -46,29 +47,18 @@ TuningSliders.initialize = function() {
|
|||
this.updateFilterSlidersDisplay();
|
||||
};
|
||||
|
||||
TuningSliders.setDMinFeatureEnabled = function(dMinFeatureEnabled) {
|
||||
this.dMinFeatureEnabled = dMinFeatureEnabled;
|
||||
if (this.dMinFeatureEnabled) {
|
||||
this.defaultPDRatio = this.PID_DEFAULT[2] / this.PID_DEFAULT[0];
|
||||
} else {
|
||||
this.defaultPDRatio = this.PID_DEFAULT[2] / (this.PID_DEFAULT[0] * (1 / D_MIN_RATIO));
|
||||
}
|
||||
};
|
||||
|
||||
TuningSliders.setExpertMode = function(expertMode) {
|
||||
this.expertMode = expertMode;
|
||||
const allTuningSliderElements = $('#tuningMasterSlider, #tuningPDRatioSlider, #tuningPDGainSlider,\
|
||||
#tuningResponseSlider, #tuningGyroFilterSlider, #tuningDTermFilterSlider');
|
||||
if (this.expertMode) {
|
||||
allTuningSliderElements.removeClass('nonExpertModeSliders');
|
||||
$('#slidersPidsBox, #slidersFilterBox').removeClass('nonExpertModeSliders');
|
||||
} else {
|
||||
allTuningSliderElements.addClass('nonExpertModeSliders');
|
||||
$('#slidersPidsBox, #slidersFilterBox').addClass('nonExpertModeSliders');
|
||||
}
|
||||
};
|
||||
|
||||
TuningSliders.scaleSliderValue = function(value) {
|
||||
if (value > 1) {
|
||||
return Math.round(((value - 1) * 2 + 1) * 10) / 10;
|
||||
return Math.round(((value - 1) * 2 + 1) * 100) / 100;
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
|
@ -83,71 +73,115 @@ TuningSliders.downscaleSliderValue = function(value) {
|
|||
};
|
||||
|
||||
TuningSliders.initPidSlidersPosition = function() {
|
||||
// used to estimate PID slider positions based on PIDF values, and set respective slider position
|
||||
// provides only an estimation due to limitation of feature without firmware support, to be improved in later versions
|
||||
this.MasterSliderValue = Math.round(FC.PIDS[2][1] / this.PID_DEFAULT[11] * 10) / 10;
|
||||
this.PDRatioSliderValue = Math.round(FC.PIDS[0][2] / FC.PIDS[0][0] / this.defaultPDRatio * 10) / 10;
|
||||
if (this.dMinFeatureEnabled) {
|
||||
this.PDGainSliderValue = Math.round(FC.ADVANCED_TUNING.dMinRoll / this.PDRatioSliderValue / this.MasterSliderValue / this.PID_DEFAULT[3] * 10) / 10;
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
// used to estimate PID slider positions based on PIDF values, and set respective slider position
|
||||
// provides only an estimation due to limitation of feature without firmware support, to be improved in later versions
|
||||
this.sliderMasterMultiplier = Math.floor(FC.PIDS[2][1] / this.PID_DEFAULT[11] * 10) / 10;
|
||||
this.sliderPDRatio = Math.floor(FC.PIDS[0][0] / FC.PIDS[0][2] / (this.PID_DEFAULT[0] / this.PID_DEFAULT[2]) * 10) / 10;
|
||||
this.sliderPDGain = Math.floor(FC.ADVANCED_TUNING.dMinRoll / this.sliderMasterMultiplier / this.PID_DEFAULT[3] * 10) / 10;
|
||||
this.sliderFFGain = Math.floor(FC.ADVANCED_TUNING.feedforwardRoll / this.sliderMasterMultiplier / this.PID_DEFAULT[4] * 10) / 10;
|
||||
} else {
|
||||
this.PDGainSliderValue = Math.round(FC.PIDS[0][0] / this.MasterSliderValue / (this.PID_DEFAULT[2] * (1 / D_MIN_RATIO)) * 10) / 10;
|
||||
this.sliderPidsMode = FC.TUNING_SLIDERS.slider_pids_mode;
|
||||
this.sliderMasterMultiplier = FC.TUNING_SLIDERS.slider_master_multiplier / 100;
|
||||
this.sliderRollPitchRatio = FC.TUNING_SLIDERS.slider_roll_pitch_ratio / 100;
|
||||
this.sliderIGain = FC.TUNING_SLIDERS.slider_i_gain / 100;
|
||||
this.sliderPDRatio = FC.TUNING_SLIDERS.slider_pd_ratio / 100;
|
||||
this.sliderPDGain = FC.TUNING_SLIDERS.slider_pd_gain / 100;
|
||||
this.sliderDMinRatio = FC.TUNING_SLIDERS.slider_dmin_ratio / 100;
|
||||
this.sliderFFGain = FC.TUNING_SLIDERS.slider_ff_gain / 100;
|
||||
}
|
||||
this.ResponseSliderValue = Math.round(FC.ADVANCED_TUNING.feedforwardRoll / this.MasterSliderValue / this.PID_DEFAULT[4] * 10) / 10;
|
||||
|
||||
$('output[name="tuningMasterSlider-number"]').val(this.MasterSliderValue);
|
||||
$('output[name="tuningPDRatioSlider-number"]').val(this.PDRatioSliderValue);
|
||||
$('output[name="tuningPDGainSlider-number"]').val(this.PDGainSliderValue);
|
||||
$('output[name="tuningResponseSlider-number"]').val(this.ResponseSliderValue);
|
||||
$('output[name="sliderMasterMultiplier-number"]').val(this.sliderMasterMultiplier);
|
||||
$('output[name="sliderRollPitchRatio-number"]').val(this.sliderRollPitchRatio);
|
||||
$('output[name="sliderIGain-number"]').val(this.sliderIGain);
|
||||
$('output[name="sliderPDRatio-number"]').val(this.sliderPDRatio);
|
||||
$('output[name="sliderPDGain-number"]').val(this.sliderPDGain);
|
||||
$('output[name="sliderDMinRatio-number"]').val(this.sliderDMinRatio);
|
||||
$('output[name="sliderFFGain-number"]').val(this.sliderFFGain);
|
||||
|
||||
$('#tuningMasterSlider').val(this.downscaleSliderValue(this.MasterSliderValue));
|
||||
$('#tuningPDRatioSlider').val(this.downscaleSliderValue(this.PDRatioSliderValue));
|
||||
$('#tuningPDGainSlider').val(this.downscaleSliderValue(this.PDGainSliderValue));
|
||||
$('#tuningResponseSlider').val(this.downscaleSliderValue(this.ResponseSliderValue));
|
||||
$('#sliderMasterMultiplier').val(this.downscaleSliderValue(this.sliderMasterMultiplier));
|
||||
$('#sliderRollPitchRatio').val(this.downscaleSliderValue(this.sliderRollPitchRatio));
|
||||
$('#sliderIGain').val(this.downscaleSliderValue(this.sliderIGain));
|
||||
$('#sliderPDRatio').val(this.downscaleSliderValue(this.sliderPDRatio));
|
||||
$('#sliderPDGain').val(this.downscaleSliderValue(this.sliderPDGain));
|
||||
$('#sliderDMinRatio').val(this.downscaleSliderValue(this.sliderDMinRatio));
|
||||
$('#sliderFFGain').val(this.downscaleSliderValue(this.sliderFFGain));
|
||||
};
|
||||
|
||||
TuningSliders.initGyroFilterSliderPosition = function() {
|
||||
this.gyroFilterSliderValue = Math.round((FC.FILTER_CONFIG.gyro_lowpass_dyn_min_hz + FC.FILTER_CONFIG.gyro_lowpass_dyn_max_hz + FC.FILTER_CONFIG.gyro_lowpass2_hz) /
|
||||
(this.FILTER_DEFAULT.gyro_lowpass_dyn_min_hz + this.FILTER_DEFAULT.gyro_lowpass_dyn_max_hz + this.FILTER_DEFAULT.gyro_lowpass2_hz) * 100) / 100;
|
||||
$('output[name="tuningGyroFilterSlider-number"]').val(this.gyroFilterSliderValue);
|
||||
$('#tuningGyroFilterSlider').val(this.downscaleSliderValue(this.gyroFilterSliderValue));
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
this.sliderGyroFilterMultiplier = Math.floor((FC.FILTER_CONFIG.gyro_lowpass_dyn_min_hz + FC.FILTER_CONFIG.gyro_lowpass_dyn_max_hz + FC.FILTER_CONFIG.gyro_lowpass2_hz) /
|
||||
(this.FILTER_DEFAULT.gyro_lowpass_dyn_min_hz + this.FILTER_DEFAULT.gyro_lowpass_dyn_max_hz + this.FILTER_DEFAULT.gyro_lowpass2_hz) * 100) / 100;
|
||||
} else {
|
||||
this.sliderGyroFilterMultiplier = FC.TUNING_SLIDERS.slider_gyro_filter_multiplier / 100;
|
||||
}
|
||||
|
||||
$('output[name="sliderGyroFilterMultiplier-number"]').val(this.sliderGyroFilterMultiplier);
|
||||
$('#sliderGyroFilterMultiplier').val(this.downscaleSliderValue(this.sliderGyroFilterMultiplier));
|
||||
};
|
||||
|
||||
TuningSliders.initDTermFilterSliderPosition = function() {
|
||||
this.dtermFilterSliderValue = Math.round((FC.FILTER_CONFIG.dterm_lowpass_dyn_min_hz + FC.FILTER_CONFIG.dterm_lowpass_dyn_max_hz + FC.FILTER_CONFIG.dterm_lowpass2_hz) /
|
||||
(this.FILTER_DEFAULT.dterm_lowpass_dyn_min_hz + this.FILTER_DEFAULT.dterm_lowpass_dyn_max_hz + this.FILTER_DEFAULT.dterm_lowpass2_hz) * 100) / 100;
|
||||
$('output[name="tuningDTermFilterSlider-number"]').val(this.dtermFilterSliderValue);
|
||||
$('#tuningDTermFilterSlider').val(this.downscaleSliderValue(this.dtermFilterSliderValue));
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
this.sliderDTermFilterMultiplier = Math.floor((FC.FILTER_CONFIG.dterm_lowpass_dyn_min_hz + FC.FILTER_CONFIG.dterm_lowpass_dyn_max_hz + FC.FILTER_CONFIG.dterm_lowpass2_hz) /
|
||||
(this.FILTER_DEFAULT.dterm_lowpass_dyn_min_hz + this.FILTER_DEFAULT.dterm_lowpass_dyn_max_hz + this.FILTER_DEFAULT.dterm_lowpass2_hz) * 100) / 100;
|
||||
} else {
|
||||
this.sliderDTermFilterMultiplier = FC.TUNING_SLIDERS.slider_dterm_filter_multiplier / 100;
|
||||
}
|
||||
|
||||
$('output[name="sliderDTermFilterMultiplier-number"]').val(this.sliderDTermFilterMultiplier);
|
||||
$('#sliderDTermFilterMultiplier').val(this.downscaleSliderValue(this.sliderDTermFilterMultiplier));
|
||||
};
|
||||
|
||||
TuningSliders.resetPidSliders = function() {
|
||||
if (!this.cachedPidSliderValues) {
|
||||
$('#tuningMasterSlider').val(1);
|
||||
$('#tuningPDRatioSlider').val(1);
|
||||
$('#tuningPDGainSlider').val(1);
|
||||
$('#tuningResponseSlider').val(1);
|
||||
this.MasterSliderValue = 1;
|
||||
this.PDRatioSliderValue = 1;
|
||||
this.PDGainSliderValue = 1;
|
||||
this.ResponseSliderValue = 1;
|
||||
this.sliderMasterMultiplier = 1;
|
||||
this.sliderRollPitchRatio = 1;
|
||||
this.sliderIGain = 1;
|
||||
this.sliderPDRatio = 1;
|
||||
this.sliderPDGain = 1;
|
||||
this.sliderDMinRatio = 1;
|
||||
this.sliderFFGain = 1;
|
||||
}
|
||||
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
$('#sliderMasterMultiplier').val(this.downscaleSliderValue(this.sliderMasterMultiplier));
|
||||
$('#sliderPDRatio').val(this.downscaleSliderValue(this.sliderPDRatio));
|
||||
$('#sliderPDGain').val(this.downscaleSliderValue(this.sliderPDGain));
|
||||
$('#sliderFFGain').val(this.downscaleSliderValue(this.sliderFFGain));
|
||||
} else {
|
||||
this.initPidSlidersPosition();
|
||||
}
|
||||
|
||||
this.calculateNewPids();
|
||||
this.updatePidSlidersDisplay();
|
||||
};
|
||||
|
||||
TuningSliders.resetGyroFilterSlider = function() {
|
||||
if (!this.cachedGyroSliderValues) {
|
||||
$('#tuningGyroFilterSlider').val(1);
|
||||
this.gyroFilterSliderValue = 1;
|
||||
this.sliderGyroFilterMultiplier = 1;
|
||||
}
|
||||
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
$('#sliderGyroFilterMultiplier').val(this.downscaleSliderValue(this.sliderGyroFilterMultiplier));
|
||||
} else {
|
||||
this.initGyroFilterSliderPosition();
|
||||
}
|
||||
|
||||
this.calculateNewGyroFilters();
|
||||
this.updateFilterSlidersDisplay();
|
||||
};
|
||||
|
||||
TuningSliders.resetDTermFilterSlider = function() {
|
||||
if (!this.cachedDTermSliderValues) {
|
||||
$('#tuningDTermFilterSlider').val(1);
|
||||
this.dtermFilterSliderValue = 1;
|
||||
this.sliderDTermFilterMultiplier = 1;
|
||||
}
|
||||
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
$('#sliderDTermFilterMultiplier').val(this.downscaleSliderValue(this.sliderDTermFilterMultiplier));
|
||||
} else {
|
||||
this.initDTermFilterSliderPosition();
|
||||
}
|
||||
|
||||
this.calculateNewDTermFilters();
|
||||
this.updateFilterSlidersDisplay();
|
||||
};
|
||||
|
@ -160,37 +194,37 @@ TuningSliders.updatePidSlidersDisplay = function() {
|
|||
const WARNING_DMAX_GAIN = 60;
|
||||
const WARNING_DMIN_GAIN = 40;
|
||||
|
||||
this.pidSlidersUnavailable = false;
|
||||
let currentPIDs = [];
|
||||
FC.PID_NAMES.forEach(function(elementPid, indexPid) {
|
||||
let searchRow = $('.pid_tuning .' + elementPid + ' input');
|
||||
searchRow.each(function (indexInput) {
|
||||
if (indexPid < 3 && indexInput < 5) {
|
||||
currentPIDs.push($(this).val());
|
||||
}
|
||||
});
|
||||
});
|
||||
this.calculateNewPids();
|
||||
FC.PID_NAMES.forEach(function(elementPid, indexPid) {
|
||||
let searchRow = $('.pid_tuning .' + elementPid + ' input');
|
||||
searchRow.each(function (indexInput) {
|
||||
if (indexPid < 3 && indexInput < 5) {
|
||||
if (currentPIDs[indexPid * 5 + indexInput] != $(this).val()) {
|
||||
TuningSliders.pidSlidersUnavailable = true;
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
this.pidSlidersUnavailable = false;
|
||||
let currentPIDs = [];
|
||||
FC.PID_NAMES.forEach(function(elementPid, indexPid) {
|
||||
const pidElements = $(`.pid_tuning .${elementPid} input`);
|
||||
pidElements.each(function (indexInput) {
|
||||
if (indexPid < 3 && indexInput < 5) {
|
||||
currentPIDs.push($(this).val());
|
||||
}
|
||||
$(this).val(currentPIDs[indexPid * 5 + indexInput]);
|
||||
}
|
||||
});
|
||||
});
|
||||
this.calculateNewPids();
|
||||
FC.PID_NAMES.forEach(function(elementPid, indexPid) {
|
||||
const pidElements = $(`.pid_tuning .${elementPid} input`);
|
||||
pidElements.each(function (indexInput) {
|
||||
if (indexPid < 3 && indexInput < 5) {
|
||||
if (currentPIDs[indexPid * 5 + indexInput] != $(this).val()) {
|
||||
TuningSliders.pidSlidersUnavailable = true;
|
||||
}
|
||||
$(this).val(currentPIDs[indexPid * 5 + indexInput]);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
if ($('input[id="useIntegratedYaw"]').is(':checked')) {
|
||||
this.pidSlidersUnavailable = true;
|
||||
}
|
||||
if ($('input[id="useIntegratedYaw"]').is(':checked')) {
|
||||
this.pidSlidersUnavailable = true;
|
||||
}
|
||||
|
||||
if (this.pidSlidersUnavailable) {
|
||||
TABS.pid_tuning.updatePIDColors(true);
|
||||
} else {
|
||||
this.cachedPidSliderValues = true;
|
||||
if (!this.pidSlidersUnavailable) {
|
||||
this.cachedPidSliderValues = true;
|
||||
}
|
||||
}
|
||||
|
||||
$('.tuningPIDSliders').toggle(!this.pidSlidersUnavailable);
|
||||
|
@ -205,72 +239,78 @@ TuningSliders.updateFilterSlidersDisplay = function() {
|
|||
const WARNING_FILTER_HIGH_GAIN = 1.4;
|
||||
const WARNING_FILTER_LOW_GAIN = 0.7;
|
||||
|
||||
this.filterGyroSliderUnavailable = false;
|
||||
this.filterDTermSliderUnavailable = false;
|
||||
this.sliderGyroFilter = false;
|
||||
this.sliderDTermFilter = false;
|
||||
|
||||
if (parseInt($('.pid_filter input[name="gyroLowpassDynMinFrequency"]').val(), 10) !== Math.round(this.FILTER_DEFAULT.gyro_lowpass_dyn_min_hz * this.gyroFilterSliderValue) ||
|
||||
parseInt($('.pid_filter input[name="gyroLowpassDynMaxFrequency"]').val(), 10) !== Math.round(this.FILTER_DEFAULT.gyro_lowpass_dyn_max_hz * this.gyroFilterSliderValue) ||
|
||||
parseInt($('.pid_filter select[name="gyroLowpassDynType"]').val(), 10) !== this.FILTER_DEFAULT.gyro_lowpass_type ||
|
||||
parseInt($('.pid_filter input[name="gyroLowpass2Frequency"]').val(), 10) !== Math.round(this.FILTER_DEFAULT.gyro_lowpass2_hz * this.gyroFilterSliderValue) ||
|
||||
parseInt($('.pid_filter select[name="gyroLowpass2Type"]').val(), 10) !== this.FILTER_DEFAULT.gyro_lowpass2_type) {
|
||||
if ($('.pid_filter input[name="gyroLowpassDynMinFrequency"]').val() !== Math.floor(this.FILTER_DEFAULT.gyro_lowpass_dyn_min_hz * this.sliderGyroFilterMultiplier) ||
|
||||
$('.pid_filter input[name="gyroLowpassDynMaxFrequency"]').val() !== Math.floor(this.FILTER_DEFAULT.gyro_lowpass_dyn_max_hz * this.sliderGyroFilterMultiplier) ||
|
||||
$('.pid_filter select[name="gyroLowpassDynType"]').val() !== this.FILTER_DEFAULT.gyro_lowpass_type ||
|
||||
$('.pid_filter input[name="gyroLowpass2Frequency"]').val() !== Math.floor(this.FILTER_DEFAULT.gyro_lowpass2_hz * this.sliderGyroFilterMultiplier) ||
|
||||
$('.pid_filter select[name="gyroLowpass2Type"]').val() !== this.FILTER_DEFAULT.gyro_lowpass2_type) {
|
||||
|
||||
$('.tuningFilterSliders .sliderLabels tr:nth-child(2)').hide();
|
||||
this.filterGyroSliderUnavailable = true;
|
||||
$('.tuningFilterSliders .sliderLabels tr:first-child').hide();
|
||||
this.sliderGyroFilter = true;
|
||||
} else {
|
||||
$('.tuningFilterSliders .sliderLabels tr:nth-child(2)').show()
|
||||
this.cachedGyroSliderValues = true;
|
||||
}
|
||||
|
||||
if (parseInt($('.pid_filter input[name="dtermLowpassDynMinFrequency"]').val(), 10) !== Math.round(this.FILTER_DEFAULT.dterm_lowpass_dyn_min_hz * this.dtermFilterSliderValue) ||
|
||||
parseInt($('.pid_filter input[name="dtermLowpassDynMaxFrequency"]').val(), 10) !== Math.round(this.FILTER_DEFAULT.dterm_lowpass_dyn_max_hz * this.dtermFilterSliderValue) ||
|
||||
parseInt($('.pid_filter select[name="dtermLowpassDynType"]').val(), 10) !== this.FILTER_DEFAULT.dterm_lowpass_type ||
|
||||
parseInt($('.pid_filter input[name="dtermLowpass2Frequency"]').val(), 10) !== Math.round(this.FILTER_DEFAULT.dterm_lowpass2_hz * this.dtermFilterSliderValue) ||
|
||||
parseInt($('.pid_filter select[name="dtermLowpass2Type"]').val(), 10) !== this.FILTER_DEFAULT.dterm_lowpass2_type) {
|
||||
if ($('.pid_filter input[name="dtermLowpassDynMinFrequency"]').val() !== Math.floor(this.FILTER_DEFAULT.dterm_lowpass_dyn_min_hz * this.sliderDTermFilterMultiplier) ||
|
||||
$('.pid_filter input[name="dtermLowpassDynMaxFrequency"]').val() !== Math.floor(this.FILTER_DEFAULT.dterm_lowpass_dyn_max_hz * this.sliderDTermFilterMultiplier) ||
|
||||
$('.pid_filter select[name="dtermLowpassDynType"]').val() !== this.FILTER_DEFAULT.dterm_lowpass_type ||
|
||||
$('.pid_filter input[name="dtermLowpass2Frequency"]').val() !== Math.floor(this.FILTER_DEFAULT.dterm_lowpass2_hz * this.sliderDTermFilterMultiplier) ||
|
||||
$('.pid_filter select[name="dtermLowpass2Type"]').val() !== this.FILTER_DEFAULT.dterm_lowpass2_type) {
|
||||
|
||||
$('.tuningFilterSliders .sliderLabels tr:last-child').hide();
|
||||
this.filterDTermSliderUnavailable = true;
|
||||
this.sliderDTermFilter = true;
|
||||
} else {
|
||||
$('.tuningFilterSliders .sliderLabels tr:last-child').show();
|
||||
this.cachedDTermSliderValues = true;
|
||||
}
|
||||
|
||||
$('.tuningFilterSliders').toggle(!(this.filterGyroSliderUnavailable && this.filterDTermSliderUnavailable));
|
||||
$('.subtab-filter .slidersDisabled').toggle(this.filterGyroSliderUnavailable || this.filterDTermSliderUnavailable);
|
||||
$('.subtab-filter .nonExpertModeSlidersNote').toggle((!this.filterGyroSliderUnavailable || !this.filterDTermSliderUnavailable) && !this.expertMode);
|
||||
$('.subtab-filter .slidersWarning').toggle(((this.gyroFilterSliderValue >= WARNING_FILTER_HIGH_GAIN ||
|
||||
this.gyroFilterSliderValue <= WARNING_FILTER_LOW_GAIN) && !this.filterGyroSliderUnavailable) ||
|
||||
((this.dtermFilterSliderValue >= WARNING_FILTER_HIGH_GAIN ||
|
||||
this.dtermFilterSliderValue <= WARNING_FILTER_LOW_GAIN) && !this.filterDTermSliderUnavailable));
|
||||
$('.tuningFilterSliders').toggle(!(this.sliderGyroFilter && this.sliderDTermFilter));
|
||||
$('.subtab-filter .slidersDisabled').toggle(this.sliderGyroFilter || this.sliderDTermFilter);
|
||||
$('.subtab-filter .nonExpertModeSlidersNote').toggle((!this.sliderGyroFilter || !this.sliderDTermFilter) && !this.expertMode);
|
||||
$('.subtab-filter .slidersWarning').toggle(((this.sliderGyroFilterMultiplier >= WARNING_FILTER_HIGH_GAIN ||
|
||||
this.sliderGyroFilterMultiplier <= WARNING_FILTER_LOW_GAIN) && !this.sliderGyroFilter) ||
|
||||
((this.sliderDTermFilterMultiplier >= WARNING_FILTER_HIGH_GAIN ||
|
||||
this.sliderDTermFilterMultiplier <= WARNING_FILTER_LOW_GAIN) && !this.sliderDTermFilter));
|
||||
};
|
||||
|
||||
TuningSliders.calculateNewPids = function() {
|
||||
// this is the main calculation for PID sliders, inputs are in form of slider position values
|
||||
// values get set both into forms and their respective variables
|
||||
TuningSliders.updateFormPids = function() {
|
||||
FC.PID_NAMES.forEach(function(elementPid, indexPid) {
|
||||
const pidElements = $(`.pid_tuning .${elementPid} input`);
|
||||
pidElements.each(function (indexInput) {
|
||||
if (indexPid < 3 && indexInput < 3) {
|
||||
$(this).val(FC.PIDS[indexPid][indexInput]);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
TuningSliders.legacyCalculateNewPids = function() {
|
||||
const MAX_PID_GAIN = 200;
|
||||
const MAX_DMIN_GAIN = 100;
|
||||
const MAX_FF_GAIN = 2000;
|
||||
|
||||
// only used for 4.1 where calculation is not done in firmware
|
||||
if (this.dMinFeatureEnabled) {
|
||||
//dmin
|
||||
FC.ADVANCED_TUNING.dMinRoll = Math.round(this.PID_DEFAULT[3] * this.PDGainSliderValue * this.PDRatioSliderValue);
|
||||
FC.ADVANCED_TUNING.dMinPitch = Math.round(this.PID_DEFAULT[8] * this.PDGainSliderValue * this.PDRatioSliderValue);
|
||||
FC.ADVANCED_TUNING.dMinRoll = Math.floor(this.PID_DEFAULT[3] * this.sliderPDGain);
|
||||
FC.ADVANCED_TUNING.dMinPitch = Math.floor(this.PID_DEFAULT[8] * this.sliderPDGain);
|
||||
// dmax
|
||||
FC.PIDS[0][2] = Math.round(this.PID_DEFAULT[2] * this.PDGainSliderValue * this.PDRatioSliderValue);
|
||||
FC.PIDS[1][2] = Math.round(this.PID_DEFAULT[7] * this.PDGainSliderValue * this.PDRatioSliderValue);
|
||||
FC.PIDS[0][2] = Math.floor(this.PID_DEFAULT[2] * this.sliderPDGain);
|
||||
FC.PIDS[1][2] = Math.floor(this.PID_DEFAULT[7] * this.sliderPDGain);
|
||||
} else {
|
||||
FC.ADVANCED_TUNING.dMinRoll = 0;
|
||||
FC.ADVANCED_TUNING.dMinPitch = 0;
|
||||
FC.PIDS[0][2] = Math.round((this.PID_DEFAULT[2] * D_MIN_RATIO) * this.PDGainSliderValue * this.PDRatioSliderValue);
|
||||
FC.PIDS[1][2] = Math.round((this.PID_DEFAULT[7] * D_MIN_RATIO) * this.PDGainSliderValue * this.PDRatioSliderValue);
|
||||
FC.PIDS[0][2] = Math.floor(this.PID_DEFAULT[3] * this.sliderPDGain);
|
||||
FC.PIDS[1][2] = Math.floor(this.PID_DEFAULT[8] * this.sliderPDGain);
|
||||
}
|
||||
// p
|
||||
FC.PIDS[0][0] = Math.round(this.PID_DEFAULT[0] * this.PDGainSliderValue);
|
||||
FC.PIDS[1][0] = Math.round(this.PID_DEFAULT[5] * this.PDGainSliderValue);
|
||||
FC.PIDS[2][0] = Math.round(this.PID_DEFAULT[10] * this.PDGainSliderValue);
|
||||
// ff
|
||||
FC.ADVANCED_TUNING.feedforwardRoll = Math.round(this.PID_DEFAULT[4] * this.ResponseSliderValue);
|
||||
FC.ADVANCED_TUNING.feedforwardPitch = Math.round(this.PID_DEFAULT[9] * this.ResponseSliderValue);
|
||||
FC.ADVANCED_TUNING.feedforwardYaw = Math.round(this.PID_DEFAULT[14] * this.ResponseSliderValue);
|
||||
|
||||
FC.PIDS[0][0] = Math.floor(FC.PIDS[0][2] * this.PID_DEFAULT[0] / this.PID_DEFAULT[2] * this.sliderPDRatio);
|
||||
FC.PIDS[1][0] = Math.floor(FC.PIDS[1][2] * this.PID_DEFAULT[5] / this.PID_DEFAULT[7] * this.sliderPDRatio);
|
||||
FC.PIDS[2][0] = Math.floor(this.PID_DEFAULT[10] * this.sliderPDGain);
|
||||
|
||||
// master slider part
|
||||
// these are not calculated anywhere other than master slider multiplier therefore set at default before every calculation
|
||||
|
@ -284,32 +324,65 @@ TuningSliders.calculateNewPids = function() {
|
|||
//master slider multiplication, max value 200 for main PID values
|
||||
for (let i = 0; i < 3; i++) {
|
||||
for (let j = 0; j < 3; j++) {
|
||||
FC.PIDS[j][i] = Math.min(Math.round(FC.PIDS[j][i] * this.MasterSliderValue), MAX_PID_GAIN);
|
||||
FC.PIDS[j][i] = Math.min(Math.floor(FC.PIDS[j][i] * this.sliderMasterMultiplier), MAX_PID_GAIN);
|
||||
}
|
||||
}
|
||||
FC.ADVANCED_TUNING.feedforwardRoll = Math.min(Math.round(FC.ADVANCED_TUNING.feedforwardRoll * this.MasterSliderValue), MAX_FF_GAIN);
|
||||
FC.ADVANCED_TUNING.feedforwardPitch = Math.min(Math.round(FC.ADVANCED_TUNING.feedforwardPitch * this.MasterSliderValue), MAX_FF_GAIN);
|
||||
FC.ADVANCED_TUNING.feedforwardYaw = Math.min(Math.round(FC.ADVANCED_TUNING.feedforwardYaw * this.MasterSliderValue), MAX_FF_GAIN);
|
||||
// ff
|
||||
FC.ADVANCED_TUNING.feedforwardRoll = Math.min(Math.floor(this.PID_DEFAULT[4] * this.sliderFFGain * this.sliderMasterMultiplier), MAX_FF_GAIN);
|
||||
FC.ADVANCED_TUNING.feedforwardPitch = Math.min(Math.floor(this.PID_DEFAULT[9] * this.sliderFFGain * this.sliderMasterMultiplier), MAX_FF_GAIN);
|
||||
FC.ADVANCED_TUNING.feedforwardYaw = Math.min(Math.floor(this.PID_DEFAULT[14] * this.sliderFFGain * this.sliderMasterMultiplier), MAX_FF_GAIN);
|
||||
if (this.dMinFeatureEnabled) {
|
||||
FC.ADVANCED_TUNING.dMinRoll = Math.min(Math.round(FC.ADVANCED_TUNING.dMinRoll * this.MasterSliderValue), MAX_DMIN_GAIN);
|
||||
FC.ADVANCED_TUNING.dMinPitch = Math.min(Math.round(FC.ADVANCED_TUNING.dMinPitch * this.MasterSliderValue), MAX_DMIN_GAIN);
|
||||
FC.ADVANCED_TUNING.dMinYaw = Math.min(Math.round(FC.ADVANCED_TUNING.dMinYaw * this.MasterSliderValue), MAX_DMIN_GAIN);
|
||||
FC.ADVANCED_TUNING.dMinRoll = Math.min(Math.floor(FC.ADVANCED_TUNING.dMinRoll * this.sliderMasterMultiplier), MAX_DMIN_GAIN);
|
||||
FC.ADVANCED_TUNING.dMinPitch = Math.min(Math.floor(FC.ADVANCED_TUNING.dMinPitch * this.sliderMasterMultiplier), MAX_DMIN_GAIN);
|
||||
FC.ADVANCED_TUNING.dMinYaw = Math.min(Math.floor(FC.ADVANCED_TUNING.dMinYaw * this.sliderMasterMultiplier), MAX_DMIN_GAIN);
|
||||
}
|
||||
|
||||
$('output[name="tuningMasterSlider-number"]').val(this.MasterSliderValue);
|
||||
$('output[name="tuningPDRatioSlider-number"]').val(this.PDRatioSliderValue);
|
||||
$('output[name="tuningPDGainSlider-number"]').val(this.PDGainSliderValue);
|
||||
$('output[name="tuningResponseSlider-number"]').val(this.ResponseSliderValue);
|
||||
this.updateFormPids();
|
||||
|
||||
$('.pid_tuning input[name="dMinRoll"]').val(FC.ADVANCED_TUNING.dMinRoll);
|
||||
$('.pid_tuning input[name="dMinPitch"]').val(FC.ADVANCED_TUNING.dMinPitch);
|
||||
$('.pid_tuning input[name="dMinYaw"]').val(FC.ADVANCED_TUNING.dMinYaw);
|
||||
$('.pid_tuning .ROLL input[name="f"]').val(FC.ADVANCED_TUNING.feedforwardRoll);
|
||||
$('.pid_tuning .PITCH input[name="f"]').val(FC.ADVANCED_TUNING.feedforwardPitch);
|
||||
$('.pid_tuning .YAW input[name="f"]').val(FC.ADVANCED_TUNING.feedforwardYaw);
|
||||
};
|
||||
|
||||
TuningSliders.calculateNewPids = function() {
|
||||
// this is the main calculation for PID sliders, inputs are in form of slider position values
|
||||
// values get set both into forms and their respective variables
|
||||
if (semver.lte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
this.legacyCalculateNewPids();
|
||||
}
|
||||
|
||||
$('output[name="sliderMasterMultiplier-number"]').val(this.sliderMasterMultiplier);
|
||||
$('output[name="sliderRollPitchRatio-number"]').val(this.sliderRollPitchRatio);
|
||||
$('output[name="sliderIGain-number"]').val(this.sliderIGain);
|
||||
$('output[name="sliderPDRatio-number"]').val(this.sliderPDRatio);
|
||||
$('output[name="sliderPDGain-number"]').val(this.sliderPDGain);
|
||||
$('output[name="sliderDMinRatio-number"]').val(this.sliderDMinRatio);
|
||||
$('output[name="sliderFFGain-number"]').val(this.sliderFFGain);
|
||||
|
||||
FC.TUNING_SLIDERS.slider_pids_mode = parseInt($('#sliderPidsModeSelect').val());
|
||||
FC.TUNING_SLIDERS.slider_master_multiplier = TuningSliders.sliderMasterMultiplier * 100;
|
||||
FC.TUNING_SLIDERS.slider_roll_pitch_ratio = TuningSliders.sliderRollPitchRatio * 100;
|
||||
FC.TUNING_SLIDERS.slider_i_gain = TuningSliders.sliderIGain * 100;
|
||||
FC.TUNING_SLIDERS.slider_pd_ratio = TuningSliders.sliderPDRatio * 100;
|
||||
FC.TUNING_SLIDERS.slider_pd_gain = TuningSliders.sliderPDGain * 100;
|
||||
FC.TUNING_SLIDERS.slider_dmin_ratio = TuningSliders.sliderDMinRatio * 100;
|
||||
FC.TUNING_SLIDERS.slider_ff_gain = TuningSliders.sliderFFGain * 100;
|
||||
|
||||
FC.TUNING_SLIDERS.slider_dterm_filter = TuningSliders.sliderDTermFilter ? 1 : 0;
|
||||
FC.TUNING_SLIDERS.slider_dterm_filter_multiplier = TuningSliders.sliderDTermFilterMultiplier * 100;
|
||||
|
||||
FC.TUNING_SLIDERS.slider_gyro_filter = TuningSliders.sliderGyroFilter ? 1 : 0;
|
||||
FC.TUNING_SLIDERS.slider_gyro_filter_multiplier = TuningSliders.sliderGyroFilterMultiplier * 100;
|
||||
|
||||
MSP.promise(MSPCodes.MSP_SET_TUNING_SLIDERS, mspHelper.crunch(MSPCodes.MSP_SET_TUNING_SLIDERS));
|
||||
MSP.send_message(MSPCodes.MSP_PID);
|
||||
MSP.send_message(MSPCodes.MSP_PID_ADVANCED);
|
||||
|
||||
this.updateFormPids();
|
||||
|
||||
// updates values in forms
|
||||
FC.PID_NAMES.forEach(function(elementPid, indexPid) {
|
||||
let searchRow = $('.pid_tuning .' + elementPid + ' input');
|
||||
searchRow.each(function (indexInput) {
|
||||
if (indexPid < 3 && indexInput < 3) {
|
||||
$(this).val(FC.PIDS[indexPid][indexInput]);
|
||||
}
|
||||
});
|
||||
});
|
||||
$('.pid_tuning input[name="dMinRoll"]').val(FC.ADVANCED_TUNING.dMinRoll);
|
||||
$('.pid_tuning input[name="dMinPitch"]').val(FC.ADVANCED_TUNING.dMinPitch);
|
||||
$('.pid_tuning input[name="dMinYaw"]').val(FC.ADVANCED_TUNING.dMinYaw);
|
||||
|
@ -322,9 +395,9 @@ TuningSliders.calculateNewPids = function() {
|
|||
|
||||
TuningSliders.calculateNewGyroFilters = function() {
|
||||
// calculate, set and display new values in forms based on slider position
|
||||
FC.FILTER_CONFIG.gyro_lowpass_dyn_min_hz = Math.round(this.FILTER_DEFAULT.gyro_lowpass_dyn_min_hz * this.gyroFilterSliderValue);
|
||||
FC.FILTER_CONFIG.gyro_lowpass_dyn_max_hz = Math.round(this.FILTER_DEFAULT.gyro_lowpass_dyn_max_hz * this.gyroFilterSliderValue);
|
||||
FC.FILTER_CONFIG.gyro_lowpass2_hz = Math.round(this.FILTER_DEFAULT.gyro_lowpass2_hz * this.gyroFilterSliderValue);
|
||||
FC.FILTER_CONFIG.gyro_lowpass_dyn_min_hz = Math.floor(this.FILTER_DEFAULT.gyro_lowpass_dyn_min_hz * this.sliderGyroFilterMultiplier);
|
||||
FC.FILTER_CONFIG.gyro_lowpass_dyn_max_hz = Math.floor(this.FILTER_DEFAULT.gyro_lowpass_dyn_max_hz * this.sliderGyroFilterMultiplier);
|
||||
FC.FILTER_CONFIG.gyro_lowpass2_hz = Math.floor(this.FILTER_DEFAULT.gyro_lowpass2_hz * this.sliderGyroFilterMultiplier);
|
||||
FC.FILTER_CONFIG.gyro_lowpass_type = this.FILTER_DEFAULT.gyro_lowpass_type;
|
||||
FC.FILTER_CONFIG.gyro_lowpass2_type = this.FILTER_DEFAULT.gyro_lowpass2_type;
|
||||
|
||||
|
@ -333,14 +406,14 @@ TuningSliders.calculateNewGyroFilters = function() {
|
|||
$('.pid_filter input[name="gyroLowpass2Frequency"]').val(FC.FILTER_CONFIG.gyro_lowpass2_hz);
|
||||
$('.pid_filter select[name="gyroLowpassDynType').val(FC.FILTER_CONFIG.gyro_lowpass_type);
|
||||
$('.pid_filter select[name="gyroLowpass2Type').val(FC.FILTER_CONFIG.gyro_lowpass2_type);
|
||||
$('output[name="tuningGyroFilterSlider-number"]').val(this.gyroFilterSliderValue);
|
||||
$('output[name="sliderGyroFilterMultiplier-number"]').val(this.sliderGyroFilterMultiplier);
|
||||
};
|
||||
|
||||
TuningSliders.calculateNewDTermFilters = function() {
|
||||
// calculate, set and display new values in forms based on slider position
|
||||
FC.FILTER_CONFIG.dterm_lowpass_dyn_min_hz = Math.round(this.FILTER_DEFAULT.dterm_lowpass_dyn_min_hz * this.dtermFilterSliderValue);
|
||||
FC.FILTER_CONFIG.dterm_lowpass_dyn_max_hz = Math.round(this.FILTER_DEFAULT.dterm_lowpass_dyn_max_hz * this.dtermFilterSliderValue);
|
||||
FC.FILTER_CONFIG.dterm_lowpass2_hz = Math.round(this.FILTER_DEFAULT.dterm_lowpass2_hz * this.dtermFilterSliderValue);
|
||||
FC.FILTER_CONFIG.dterm_lowpass_dyn_min_hz = Math.floor(this.FILTER_DEFAULT.dterm_lowpass_dyn_min_hz * this.sliderDTermFilterMultiplier);
|
||||
FC.FILTER_CONFIG.dterm_lowpass_dyn_max_hz = Math.floor(this.FILTER_DEFAULT.dterm_lowpass_dyn_max_hz * this.sliderDTermFilterMultiplier);
|
||||
FC.FILTER_CONFIG.dterm_lowpass2_hz = Math.floor(this.FILTER_DEFAULT.dterm_lowpass2_hz * this.sliderDTermFilterMultiplier);
|
||||
FC.FILTER_CONFIG.dterm_lowpass_type = this.FILTER_DEFAULT.dterm_lowpass_type;
|
||||
FC.FILTER_CONFIG.dterm_lowpass2_type = this.FILTER_DEFAULT.dterm_lowpass2_type;
|
||||
|
||||
|
@ -349,5 +422,5 @@ TuningSliders.calculateNewDTermFilters = function() {
|
|||
$('.pid_filter input[name="dtermLowpass2Frequency"]').val(FC.FILTER_CONFIG.dterm_lowpass2_hz);
|
||||
$('.pid_filter select[name="dtermLowpassDynType').val(FC.FILTER_CONFIG.dterm_lowpass_type);
|
||||
$('.pid_filter select[name="dtermLowpass2Type').val(FC.FILTER_CONFIG.dterm_lowpass2_type);
|
||||
$('output[name="tuningDTermFilterSlider-number"]').val(this.dtermFilterSliderValue);
|
||||
$('output[name="sliderDTermFilterMultiplier-number"]').val(this.sliderDTermFilterMultiplier);
|
||||
};
|
||||
|
|
16
src/js/fc.js
16
src/js/fc.js
|
@ -148,6 +148,7 @@ const FC = {
|
|||
SERVO_DATA: null,
|
||||
SERVO_RULES: null,
|
||||
TRANSPONDER: null,
|
||||
TUNING_SLIDERS: null,
|
||||
VOLTAGE_METERS: null,
|
||||
VOLTAGE_METER_CONFIGS: null,
|
||||
VTXTABLE_BAND: null,
|
||||
|
@ -648,6 +649,21 @@ const FC = {
|
|||
];
|
||||
|
||||
this.VTX_DEVICE_STATUS = null;
|
||||
|
||||
this.TUNING_SLIDERS = {
|
||||
slider_pids_mode: 0,
|
||||
slider_master_multiplier: 0,
|
||||
slider_roll_pitch_ratio: 0,
|
||||
slider_i_gain: 0,
|
||||
slider_pd_ratio: 0,
|
||||
slider_pd_gain: 0,
|
||||
slider_dmin_ratio: 0,
|
||||
slider_ff_gain: 0,
|
||||
slider_dterm_filter: 0,
|
||||
slider_dterm_filter_multiplier: 0,
|
||||
slider_gyro_filter: 0,
|
||||
slider_gyro_filter_multiplier: 0,
|
||||
};
|
||||
},
|
||||
|
||||
getSerialRxTypes: () => {
|
||||
|
|
|
@ -502,6 +502,8 @@ function startProcess() {
|
|||
if (FC.FEATURE_CONFIG && FC.FEATURE_CONFIG.features !== 0) {
|
||||
updateTabList(FC.FEATURE_CONFIG.features);
|
||||
}
|
||||
|
||||
TuningSliders.setExpertMode(checked);
|
||||
}).change();
|
||||
});
|
||||
|
||||
|
|
|
@ -117,6 +117,9 @@ const MSPCodes = {
|
|||
|
||||
MSP_MOTOR_TELEMETRY: 139,
|
||||
|
||||
MSP_TUNING_SLIDERS: 140,
|
||||
MSP_SET_TUNING_SLIDERS: 141,
|
||||
|
||||
MSP_STATUS_EX: 150,
|
||||
|
||||
MSP_UID: 160,
|
||||
|
|
|
@ -1475,6 +1475,26 @@ MspHelper.prototype.process_data = function(dataHandler) {
|
|||
|
||||
break;
|
||||
|
||||
case MSPCodes.MSP_SET_TUNING_SLIDERS:
|
||||
console.log("Tuning Sliders data sent");
|
||||
break;
|
||||
|
||||
case MSPCodes.MSP_TUNING_SLIDERS:
|
||||
FC.TUNING_SLIDERS.slider_pids_mode = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_master_multiplier = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_roll_pitch_ratio = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_i_gain = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_pd_ratio = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_pd_gain = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_dmin_ratio = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_ff_gain = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_dterm_filter = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_dterm_filter_multiplier = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_gyro_filter = data.readU8();
|
||||
FC.TUNING_SLIDERS.slider_gyro_filter_multiplier = data.readU8();
|
||||
|
||||
break;
|
||||
|
||||
case MSPCodes.MSP_SET_VTXTABLE_POWERLEVEL:
|
||||
console.log("VTX powerlevel sent");
|
||||
break;
|
||||
|
@ -2274,6 +2294,22 @@ MspHelper.prototype.crunch = function(code) {
|
|||
buffer.push8(1);
|
||||
break;
|
||||
|
||||
case MSPCodes.MSP_SET_TUNING_SLIDERS:
|
||||
buffer.push8(FC.TUNING_SLIDERS.slider_pids_mode)
|
||||
.push8(FC.TUNING_SLIDERS.slider_master_multiplier)
|
||||
.push8(FC.TUNING_SLIDERS.slider_roll_pitch_ratio)
|
||||
.push8(FC.TUNING_SLIDERS.slider_i_gain)
|
||||
.push8(FC.TUNING_SLIDERS.slider_pd_ratio)
|
||||
.push8(FC.TUNING_SLIDERS.slider_pd_gain)
|
||||
.push8(FC.TUNING_SLIDERS.slider_dmin_ratio)
|
||||
.push8(FC.TUNING_SLIDERS.slider_ff_gain)
|
||||
.push8(FC.TUNING_SLIDERS.slider_dterm_filter)
|
||||
.push8(FC.TUNING_SLIDERS.slider_dterm_filter_multiplier)
|
||||
.push8(FC.TUNING_SLIDERS.slider_gyro_filter)
|
||||
.push8(FC.TUNING_SLIDERS.slider_gyro_filter_multiplier);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
return MSP.promise(MSPCodes.MSP_PID);
|
||||
}).then(function() {
|
||||
if (semver.gte(FC.CONFIG.apiVersion, "1.16.0")) {
|
||||
return MSP.promise(MSPCodes.MSP_PID_ADVANCED);
|
||||
return MSP.promise(MSPCodes.MSP_PID_ADVANCED);
|
||||
}
|
||||
}).then(function() {
|
||||
return MSP.promise(MSPCodes.MSP_RC_TUNING);
|
||||
|
@ -56,6 +56,13 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
return MSP.promise(MSPCodes.MSP_RC_DEADBAND);
|
||||
}).then(function() {
|
||||
return MSP.promise(MSPCodes.MSP_MOTOR_CONFIG);
|
||||
}).then(function() {
|
||||
let promise;
|
||||
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
promise = MSP.promise(MSPCodes.MSP_TUNING_SLIDERS);
|
||||
}
|
||||
|
||||
return promise;
|
||||
}).then(function() {
|
||||
MSP.send_message(MSPCodes.MSP_MIXER_CONFIG, false, false, load_html);
|
||||
});
|
||||
|
@ -973,6 +980,23 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
FC.ADVANCED_TUNING.vbat_sag_compensation = $('input[id="vbatSagCompensation"]').is(':checked') ? parseInt($('input[name="vbatSagValue"]').val()) : 0;
|
||||
FC.ADVANCED_TUNING.thrustLinearization = $('input[id="thrustLinearization"]').is(':checked') ? parseInt($('input[name="thrustLinearValue"]').val()) : 0;
|
||||
}
|
||||
|
||||
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
FC.TUNING_SLIDERS.slider_pids_mode = parseInt($('#sliderPidsModeSelect').val());
|
||||
FC.TUNING_SLIDERS.slider_master_multiplier = TuningSliders.sliderMasterMultiplier * 100;
|
||||
FC.TUNING_SLIDERS.slider_roll_pitch_ratio = TuningSliders.sliderRollPitchRatio * 100;
|
||||
FC.TUNING_SLIDERS.slider_i_gain = TuningSliders.sliderIGain * 100;
|
||||
FC.TUNING_SLIDERS.slider_pd_ratio = TuningSliders.sliderPDRatio * 100;
|
||||
FC.TUNING_SLIDERS.slider_pd_gain = TuningSliders.sliderPDGain * 100;
|
||||
FC.TUNING_SLIDERS.slider_dmin_ratio = TuningSliders.sliderDMinRatio * 100;
|
||||
FC.TUNING_SLIDERS.slider_ff_gain = TuningSliders.sliderFFGain * 100;
|
||||
|
||||
FC.TUNING_SLIDERS.slider_dterm_filter = TuningSliders.sliderDTermFilter ? 1 : 0;
|
||||
FC.TUNING_SLIDERS.slider_dterm_filter_multiplier = TuningSliders.sliderDTermFilterMultiplier * 100;
|
||||
|
||||
FC.TUNING_SLIDERS.slider_gyro_filter = TuningSliders.sliderGyroFilter ? 1 : 0;
|
||||
FC.TUNING_SLIDERS.slider_gyro_filter_multiplier = TuningSliders.sliderGyroFilterMultiplier * 100;
|
||||
}
|
||||
}
|
||||
|
||||
function showAllPids() {
|
||||
|
@ -1774,41 +1798,23 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
const NON_EXPERT_SLIDER_MAX = 1.25;
|
||||
const NON_EXPERT_SLIDER_MIN = 0.7;
|
||||
|
||||
$('input[name="expertModeCheckbox"]').change(function() {
|
||||
if (TuningSliders.expertMode !== $(this).is(':checked')) {
|
||||
TuningSliders.setExpertMode($(this).is(':checked'));
|
||||
TuningSliders.updatePidSlidersDisplay();
|
||||
TuningSliders.updateFilterSlidersDisplay();
|
||||
}
|
||||
});
|
||||
const SLIDER_STEP_LOWER = semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43) ? 0.005 : 0.05;
|
||||
const SLIDER_STEP_UPPER = semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43) ? 0.01 : 0.1;
|
||||
|
||||
$('#sliderPidsModeSelect').val(FC.TUNING_SLIDERS.slider_pids_mode);
|
||||
|
||||
$('#dMinSwitch').change(function() {
|
||||
TuningSliders.setDMinFeatureEnabled($(this).is(':checked'));
|
||||
// switch dmin and dmax values on dmin on/off if sliders available
|
||||
if (!TuningSliders.pidSlidersUnavailable) {
|
||||
if (TuningSliders.dMinFeatureEnabled) {
|
||||
FC.ADVANCED_TUNING.dMinRoll = FC.PIDS[0][2];
|
||||
FC.ADVANCED_TUNING.dMinPitch = FC.PIDS[1][2];
|
||||
FC.ADVANCED_TUNING.dMinYaw = FC.PIDS[2][2];
|
||||
} else {
|
||||
FC.PIDS[0][2] = FC.ADVANCED_TUNING.dMinRoll;
|
||||
FC.PIDS[1][2] = FC.ADVANCED_TUNING.dMinPitch;
|
||||
FC.PIDS[2][2] = FC.ADVANCED_TUNING.dMinYaw;
|
||||
}
|
||||
TuningSliders.calculateNewPids();
|
||||
}
|
||||
});
|
||||
// integrated yaw doesn't work with sliders therefore sliders are disabled
|
||||
$('input[id="useIntegratedYaw"]').change(() => TuningSliders.updatePidSlidersDisplay());
|
||||
|
||||
// pid sliders inputs
|
||||
$('#tuningMasterSlider, #tuningPDRatioSlider, #tuningPDGainSlider, #tuningResponseSlider').on('input', function() {
|
||||
const allPidTuningSliders = $('#sliderMasterMultiplier, #sliderRollPitchRatio, #sliderIGain, #sliderPDRatio, #sliderPDGain, #sliderDMinRatio, #sliderFFGain');
|
||||
|
||||
allPidTuningSliders.on('input', function() {
|
||||
const slider = $(this);
|
||||
// adjust step for more smoothness above 1x
|
||||
if (slider.val() >= 1) {
|
||||
slider.attr('step', 0.05);
|
||||
slider.attr('step', SLIDER_STEP_LOWER);
|
||||
} else {
|
||||
slider.attr('step', 0.1);
|
||||
slider.attr('step', SLIDER_STEP_UPPER);
|
||||
}
|
||||
if (!TuningSliders.expertMode) {
|
||||
if (slider.val() > NON_EXPERT_SLIDER_MAX) {
|
||||
|
@ -1818,28 +1824,25 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
}
|
||||
}
|
||||
const scaledValue = TuningSliders.scaleSliderValue(slider.val());
|
||||
if (slider.is('#tuningMasterSlider')) {
|
||||
TuningSliders.MasterSliderValue = scaledValue;
|
||||
} else if (slider.is('#tuningPDRatioSlider')) {
|
||||
TuningSliders.PDRatioSliderValue = scaledValue;
|
||||
} else if (slider.is('#tuningPDGainSlider')) {
|
||||
TuningSliders.PDGainSliderValue = scaledValue;
|
||||
} else if (slider.is('#tuningResponseSlider')) {
|
||||
TuningSliders.ResponseSliderValue = scaledValue;
|
||||
if (slider.is('#sliderMasterMultiplier')) {
|
||||
TuningSliders.sliderMasterMultiplier = scaledValue;
|
||||
} else if (slider.is('#sliderRollPitchRatio')) {
|
||||
TuningSliders.sliderRollPitchRatio = scaledValue;
|
||||
} else if (slider.is('#sliderIGain')) {
|
||||
TuningSliders.sliderIGain = scaledValue;
|
||||
} else if (slider.is('#sliderPDRatio')) {
|
||||
TuningSliders.sliderPDRatio = scaledValue;
|
||||
} else if (slider.is('#sliderPDGain')) {
|
||||
TuningSliders.sliderPDGain = scaledValue;
|
||||
} else if (slider.is('#sliderDMinRatio')) {
|
||||
TuningSliders.sliderDMinRatio = scaledValue;
|
||||
} else if (slider.is('#sliderFFGain')) {
|
||||
TuningSliders.sliderFFGain = scaledValue;
|
||||
}
|
||||
TuningSliders.calculateNewPids();
|
||||
self.analyticsChanges['PidTuningSliders'] = "On";
|
||||
});
|
||||
$('#tuningMasterSlider, #tuningPDRatioSlider, #tuningPDGainSlider, #tuningResponseSlider').mousedown(function() {
|
||||
// adjust step for more smoothness above 1x on mousedown
|
||||
const slider = $(this);
|
||||
if (slider.val() >= 1) {
|
||||
slider.attr('step', 0.05);
|
||||
} else {
|
||||
slider.attr('step', 0.1);
|
||||
}
|
||||
});
|
||||
$('#tuningMasterSlider, #tuningPDRatioSlider, #tuningPDGainSlider, #tuningResponseSlider').mouseup(function() {
|
||||
allPidTuningSliders.mouseup(function() {
|
||||
// readjust dmin maximums
|
||||
$('.pid_tuning .ROLL input[name="d"]').change();
|
||||
$('.pid_tuning .PITCH input[name="d"]').change();
|
||||
|
@ -1847,17 +1850,23 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
TuningSliders.updatePidSlidersDisplay();
|
||||
});
|
||||
// reset to middle with double click
|
||||
$('#tuningMasterSlider, #tuningPDRatioSlider, #tuningPDGainSlider, #tuningResponseSlider').dblclick(function() {
|
||||
allPidTuningSliders.dblclick(function() {
|
||||
const slider = $(this);
|
||||
slider.val(1);
|
||||
if (slider.is('#tuningMasterSlider')) {
|
||||
TuningSliders.MasterSliderValue = 1;
|
||||
} else if (slider.is('#tuningPDRatioSlider')) {
|
||||
TuningSliders.PDRatioSliderValue = 1;
|
||||
} else if (slider.is('#tuningPDGainSlider')) {
|
||||
TuningSliders.PDGainSliderValue = 1;
|
||||
} else if (slider.is('#tuningResponseSlider')) {
|
||||
TuningSliders.ResponseSliderValue = 1;
|
||||
if (slider.is('#sliderMasterMultiplier')) {
|
||||
TuningSliders.sliderMasterMultiplier = 1;
|
||||
} else if (slider.is('#sliderRollPitchRatio')) {
|
||||
TuningSliders.sliderRollPitchRatio = 1;
|
||||
} else if (slider.is('#sliderIGain')) {
|
||||
TuningSliders.sliderIGain = 1;
|
||||
} else if (slider.is('#sliderPDRatio')) {
|
||||
TuningSliders.sliderPDRatio = 1;
|
||||
} else if (slider.is('#sliderPDGain')) {
|
||||
TuningSliders.sliderPDGain = 1;
|
||||
} else if (slider.is('#sliderDMinRatio')) {
|
||||
TuningSliders.sliderDMinRatio = 1;
|
||||
} else if (slider.is('#sliderFFGain')) {
|
||||
TuningSliders.sliderFFGain = 1;
|
||||
}
|
||||
TuningSliders.calculateNewPids();
|
||||
TuningSliders.updatePidSlidersDisplay();
|
||||
|
@ -1874,8 +1883,15 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
});
|
||||
|
||||
// filter slider inputs
|
||||
$('#tuningGyroFilterSlider, #tuningDTermFilterSlider').on('input', function() {
|
||||
const allFilterTuningSliders = $('#sliderGyroFilterMultiplier, #sliderDTermFilterMultiplier');
|
||||
allFilterTuningSliders.on('input', function() {
|
||||
const slider = $(this);
|
||||
// adjust step for more smoothness above 1x
|
||||
if (slider.val() >= 1) {
|
||||
slider.attr('step', SLIDER_STEP_LOWER);
|
||||
} else {
|
||||
slider.attr('step', SLIDER_STEP_UPPER);
|
||||
}
|
||||
if (!TuningSliders.expertMode) {
|
||||
if (slider.val() > NON_EXPERT_SLIDER_MAX) {
|
||||
slider.val(NON_EXPERT_SLIDER_MAX);
|
||||
|
@ -1884,35 +1900,35 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
}
|
||||
}
|
||||
const scaledValue = TuningSliders.scaleSliderValue(slider.val());
|
||||
if (slider.is('#tuningGyroFilterSlider')) {
|
||||
TuningSliders.gyroFilterSliderValue = scaledValue;
|
||||
if (slider.is('#sliderGyroFilterMultiplier')) {
|
||||
TuningSliders.sliderGyroFilterMultiplier = scaledValue;
|
||||
TuningSliders.calculateNewGyroFilters();
|
||||
self.analyticsChanges['GyroFilterTuningSlider'] = "On";
|
||||
} else if (slider.is('#tuningDTermFilterSlider')) {
|
||||
TuningSliders.dtermFilterSliderValue = scaledValue;
|
||||
} else if (slider.is('#sliderDTermFilterMultiplier')) {
|
||||
TuningSliders.sliderDTermFilterMultiplier = scaledValue;
|
||||
TuningSliders.calculateNewDTermFilters();
|
||||
self.analyticsChanges['DTermFilterTuningSlider'] = "On";
|
||||
}
|
||||
});
|
||||
$('#tuningGyroFilterSlider, #tuningDTermFilterSlider').mouseup(function() {
|
||||
allFilterTuningSliders.mouseup(function() {
|
||||
TuningSliders.updateFilterSlidersDisplay();
|
||||
});
|
||||
// reset to middle with double click
|
||||
$('#tuningGyroFilterSlider, #tuningDTermFilterSlider').dblclick(function() {
|
||||
allFilterTuningSliders.dblclick(function() {
|
||||
const slider = $(this);
|
||||
slider.val(1);
|
||||
if (slider.is('#tuningGyroFilterSlider')) {
|
||||
TuningSliders.gyroFilterSliderValue = 1;
|
||||
if (slider.is('#sliderGyroFilterMultiplier')) {
|
||||
TuningSliders.sliderGyroFilterMultiplier = 1;
|
||||
TuningSliders.calculateNewGyroFilters();
|
||||
} else if (slider.is('#tuningDTermFilterSlider')) {
|
||||
TuningSliders.dtermFilterSliderValue = 1;
|
||||
} else if (slider.is('#sliderDTermFilterMultiplier')) {
|
||||
TuningSliders.sliderDTermFilterMultiplier = 1;
|
||||
TuningSliders.calculateNewDTermFilters();
|
||||
}
|
||||
TuningSliders.updateFilterSlidersDisplay();
|
||||
});
|
||||
// enable PID sliders button
|
||||
$('a.buttonFilterTuningSliders').click(function() {
|
||||
if (TuningSliders.filterGyroSliderUnavailable) {
|
||||
if (TuningSliders.sliderGyroFilter) {
|
||||
// update switchery dynamically based on defaults
|
||||
$('input[id="gyroLowpassDynEnabled"]').prop('checked', false).click();
|
||||
$('input[id="gyroLowpassEnabled"]').prop('checked', true).click();
|
||||
|
@ -1920,7 +1936,7 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
TuningSliders.resetGyroFilterSlider();
|
||||
self.analyticsChanges['GyroFilterTuningSlider'] = "On";
|
||||
}
|
||||
if (TuningSliders.filterDTermSliderUnavailable) {
|
||||
if (TuningSliders.sliderDTermFilter) {
|
||||
$('input[id="dtermLowpassDynEnabled"]').prop('checked', false).click();
|
||||
$('input[id="dtermLowpassEnabled"]').prop('checked', true).click();
|
||||
$('input[id="dtermLowpass2Enabled"]').prop('checked', false).click();
|
||||
|
@ -1937,10 +1953,10 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
// update on filter value or type changes
|
||||
$('.pid_filter tr:not(.newFilter) input, .pid_filter tr:not(.newFilter) select').on('input', function() {
|
||||
TuningSliders.updateFilterSlidersDisplay();
|
||||
if (TuningSliders.filterGyroSliderUnavailable) {
|
||||
if (TuningSliders.sliderGyroFilter) {
|
||||
self.analyticsChanges['GyroFilterTuningSlider'] = "Off";
|
||||
}
|
||||
if (TuningSliders.filterDTermSliderUnavailable) {
|
||||
if (TuningSliders.sliderDTermFilter) {
|
||||
self.analyticsChanges['DTermFilterTuningSlider'] = "Off";
|
||||
}
|
||||
});
|
||||
|
@ -1997,6 +2013,13 @@ TABS.pid_tuning.initialize = function (callback) {
|
|||
return MSP.promise(MSPCodes.MSP_SET_RC_TUNING, mspHelper.crunch(MSPCodes.MSP_SET_RC_TUNING));
|
||||
}).then(function () {
|
||||
return MSP.promise(MSPCodes.MSP_SET_FEATURE_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FEATURE_CONFIG));
|
||||
}).then(function () {
|
||||
let promise;
|
||||
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
|
||||
promise = MSP.promise(MSPCodes.MSP_SET_TUNING_SLIDERS, mspHelper.crunch(MSPCodes.MSP_SET_TUNING_SLIDERS));
|
||||
}
|
||||
|
||||
return promise;
|
||||
}).then(function () {
|
||||
return MSP.promise(MSPCodes.MSP_EEPROM_WRITE);
|
||||
}).then(function () {
|
||||
|
|
|
@ -169,10 +169,16 @@
|
|||
</div>
|
||||
|
||||
<!-- TUNING SLIDERS-->
|
||||
<div class="gui_box grey topspacer tuningPIDSliders">
|
||||
<div id="slidersPidsBox" class="gui_box grey topspacer tuningPIDSliders">
|
||||
<table class="pid_titlebar">
|
||||
<tr>
|
||||
<th scope="col" class="sm-min"></th>
|
||||
<th scope="col" class="sm-min">
|
||||
<select id="sliderPidsModeSelect">
|
||||
<option value="0">OFF</option>
|
||||
<option value="1">RP</option>
|
||||
<option value="2">RPY</option>
|
||||
<select>
|
||||
</th>
|
||||
<th></th>
|
||||
<th i18n="pidTuningSliderLow"></th>
|
||||
<th i18n="pidTuningSliderDefault"></th>
|
||||
|
@ -193,10 +199,10 @@
|
|||
<span i18n="pidTuningMasterSlider"></span>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="tuningMasterSlider-number"></output>
|
||||
<output type="number" name="sliderMasterMultiplier-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="tuningMasterSlider" />
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderMasterMultiplier" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningMasterSliderHelp"></div>
|
||||
|
@ -209,13 +215,41 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td class="sm-min">
|
||||
<span i18n="pidTuningPDRatioSlider"></span>
|
||||
<span i18n="pidTuningRollPitchRatioSlider"/>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="tuningPDRatioSlider-number"></output>
|
||||
<output type="number" name="sliderRollPitchRatio-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="tuningPDRatioSlider" />
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderRollPitchRatio" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningRollPitchRatioSliderHelp"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<span i18n="pidTuningIGainSlider"/>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="sliderIGain-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderIGain" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningIGainSliderHelp"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<span i18n="pidTuningPDRatioSlider"/>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="sliderPDRatio-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderPDRatio" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningPDRatioSliderHelp"></div>
|
||||
|
@ -231,10 +265,10 @@
|
|||
<span i18n="pidTuningPDGainSlider"></span>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="tuningPDGainSlider-number"></output>
|
||||
<output type="number" name="sliderPDGain-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="tuningPDGainSlider" />
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderPDGain" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningPDGainSliderHelp"></div>
|
||||
|
@ -247,13 +281,27 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td class="sm-min">
|
||||
<span i18n="pidTuningResponseSlider"></span>
|
||||
<span i18n="pidTuningDMinRatioSlider"/>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="tuningResponseSlider-number"></output>
|
||||
<output type="number" name="sliderDMinRatio-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="tuningResponseSlider" />
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderDMinRatio" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningDMinRatioSliderHelp"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<span i18n="pidTuningResponseSlider"/>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="sliderFFGain-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderFFGain" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningResponseSliderHelp"></div>
|
||||
|
@ -1016,7 +1064,7 @@
|
|||
</div>
|
||||
|
||||
<!-- Filter Slider -->
|
||||
<div class="gui_box grey topspacer tuningFilterSliders">
|
||||
<div id="slidersFilterBox"class="gui_box grey topspacer tuningFilterSliders">
|
||||
<table class="pid_titlebar">
|
||||
<tr>
|
||||
<th scope="col" class="sm-min"></th>
|
||||
|
@ -1040,10 +1088,10 @@
|
|||
<span i18n="pidTuningGyroFilterSlider"></span>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="tuningGyroFilterSlider-number"></output>
|
||||
<output type="number" name="sliderGyroFilterMultiplier-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="tuningGyroFilterSlider" />
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderGyroFilterMultiplier" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningGyroFilterSliderHelp"></div>
|
||||
|
@ -1059,10 +1107,10 @@
|
|||
<span i18n="pidTuningDTermFilterSlider"></span>
|
||||
</td>
|
||||
<td>
|
||||
<output type="number" name="tuningDTermFilterSlider-number"></output>
|
||||
<output type="number" name="sliderDTermFilterMultiplier-number"></output>
|
||||
</td>
|
||||
<td colspan="3">
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="tuningDTermFilterSlider" />
|
||||
<input type="range" min="0.5" max="1.5" step="0.05" class="tuningSlider" id="sliderDTermFilterMultiplier" />
|
||||
</td>
|
||||
<td>
|
||||
<div class="helpicon cf_tip" i18n_title="pidTuningDTermFilterSliderHelp"></div>
|
||||
|
|
Loading…
Reference in New Issue