1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-14 11:59:51 +03:00

Rate dynamics sliders

This commit is contained in:
Pawel Spychalski (DzikuVx) 2023-10-04 16:17:11 +02:00
parent 6b27637214
commit a4aa4ee6f4
6 changed files with 190 additions and 82 deletions

View file

@ -1353,6 +1353,24 @@
"pidTuning_RatesAndExpo": { "pidTuning_RatesAndExpo": {
"message": "Rates & Expo" "message": "Rates & Expo"
}, },
"pidTuning_RateDynamics": {
"message": "Rate Dynamics"
},
"pidTuning_RateDynamics_Sensitivity": {
"message": "Sensitivity"
},
"pidTuning_RateDynamics_Correction": {
"message": "Correction"
},
"pidTuning_RateDynamics_Weight": {
"message": "Weight"
},
"pidTuning_RateDynamics_Center": {
"message": "Center"
},
"pidTuning_RateDynamics_End": {
"message": "End"
},
"pidTuning_RollPitchRate": { "pidTuning_RollPitchRate": {
"message": "ROLL & PITCH rate" "message": "ROLL & PITCH rate"
}, },

View file

@ -394,5 +394,89 @@ GUI_control.prototype.renderLogicConditionSelect = function ($container, logicCo
$select.val(current).change(onChange); $select.val(current).change(onChange);
} }
GUI_control.prototype.sliderize = function ($input, value, min, max) {
let scaledMax;
let scaledMin;
let scalingThreshold;
if ($input.data('normal-max')) {
scaledMax = max * 2;
scalingThreshold = Math.round(scaledMax * 0.8);
scaledMin = min *2;
} else {
scaledMax = max;
scaledMin = min;
scalingThreshold = scaledMax;
}
let $range = $('<input type="range" min="' + scaledMin + '" max="' + scaledMax + '" value="' + value + '"/>');
if ($input.data('step')) {
$range.attr('step', $input.data('step'));
}
$range.css({
'display': 'block',
'flex-grow': 100,
'margin-left': '1em',
'margin-right': '1em',
});
$input.attr('min', min);
$input.attr('max', max);
$input.val(parseInt(value));
$input.css({
'width': 'auto',
'min-width': '75px',
});
$input.parent().css({
'display': 'flex',
'width': '100%'
});
$range.insertAfter($input);
$input.parent().find('.helpicon').css({
'top': '5px',
'left': '-10px'
});
/*
* Update slider to input
*/
$range.on('input', function() {
let val = $(this).val();
let normalMax = parseInt($input.data('normal-max'));
if (normalMax) {
if (val <= scalingThreshold) {
val = scaleRangeInt(val, scaledMin, scalingThreshold, min, normalMax);
} else {
val = scaleRangeInt(val, scalingThreshold + 1, scaledMax, normalMax + 1, max);
}
}
$input.val(val);
});
$input.on('change', function() {
let val = $(this).val();
let newVal;
let normalMax = parseInt($input.data('normal-max'));
if (normalMax) {
if (val <= normalMax) {
newVal = scaleRangeInt(val, min, normalMax, scaledMin, scalingThreshold);
} else {
newVal = scaleRangeInt(val, normalMax + 1, max, scalingThreshold + 1, scaledMax);
}
} else {
newVal = val;
}
$range.val(newVal);
});
$input.trigger('change');
};
// initialize object into GUI variable // initialize object into GUI variable
var GUI = new GUI_control(); var GUI = new GUI_control();

View file

@ -85,88 +85,7 @@ var Settings = (function () {
input.attr('maxlength', s.setting.max); input.attr('maxlength', s.setting.max);
} else if (input.data('presentation') == 'range') { } else if (input.data('presentation') == 'range') {
let scaledMax; GUI.sliderize(input, s.value, s.setting.min, s.setting.max);
let scaledMin;
let scalingThreshold;
if (input.data('normal-max')) {
scaledMax = s.setting.max * 2;
scalingThreshold = Math.round(scaledMax * 0.8);
scaledMin = s.setting.min *2;
} else {
scaledMax = s.setting.max;
scaledMin = s.setting.min;
scalingThreshold = scaledMax;
}
let $range = $('<input type="range" min="' + scaledMin + '" max="' + scaledMax + '" value="' + s.value + '"/>');
if (input.data('step')) {
$range.attr('step', input.data('step'));
}
$range.css({
'display': 'block',
'flex-grow': 100,
'margin-left': '1em',
'margin-right': '1em',
});
input.attr('min', s.setting.min);
input.attr('max', s.setting.max);
input.val(parseInt(s.value));
input.css({
'width': 'auto',
'min-width': '75px',
});
input.parent().css({
'display': 'flex',
'width': '100%'
});
$range.insertAfter(input);
input.parent().find('.helpicon').css({
'top': '5px',
'left': '-10px'
});
/*
* Update slider to input
*/
$range.on('input', function() {
let val = $(this).val();
let normalMax = parseInt(input.data('normal-max'));
if (normalMax) {
if (val <= scalingThreshold) {
val = scaleRangeInt(val, scaledMin, scalingThreshold, s.setting.min, normalMax);
} else {
val = scaleRangeInt(val, scalingThreshold + 1, scaledMax, normalMax + 1, s.setting.max);
}
}
input.val(val);
});
input.on('change', function() {
let val = $(this).val();
let newVal;
let normalMax = parseInt(input.data('normal-max'));
if (normalMax) {
if (val <= normalMax) {
newVal = scaleRangeInt(val, s.setting.min, normalMax, scaledMin, scalingThreshold);
} else {
newVal = scaleRangeInt(val, normalMax + 1, s.setting.max, scalingThreshold + 1, scaledMax);
}
} else {
newVal = val;
}
$range.val(newVal);
});
input.trigger('change');
} else if (s.setting.type == 'float') { } else if (s.setting.type == 'float') {
input.attr('type', 'number'); input.attr('type', 'number');

View file

@ -2275,3 +2275,7 @@ ol li {
.controlProfileHighlightActive { .controlProfileHighlightActive {
background-color: #d5ebfe !important ; background-color: #d5ebfe !important ;
} }
.no-border {
border: none !important;
}

View file

@ -339,6 +339,71 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="clear-both"></div>
<div class="tab_subtitle" style="margin-top: 1em;" data-i18n="pidTuning_RateDynamics"></div>
<div class="clear-both"></div>
<div class="pid-sliders-axis" data-axis="roll">
<h3 data-i18n="pidTuning_RateDynamics_Sensitivity"></h3>
<div class="pid-slider-row">
<span data-i18n="pidTuning_RateDynamics_Center"></span>
<div class="number no-border">
<input id="rate_dynamics_center_sensitivity" type="number"/>
</div>
<div class="clear-both"></div>
</div>
<div class="pid-slider-row">
<span data-i18n="pidTuning_RateDynamics_End"></span>
<div class="number no-border">
<input id="rate_dynamics_end_sensitivity" type="number"/>
</div>
<div class="clear-both"></div>
</div>
</div>
<div class="pid-sliders-axis" data-axis="pitch">
<h3 data-i18n="pidTuning_RateDynamics_Correction"></h3>
<div class="pid-slider-row">
<span data-i18n="pidTuning_RateDynamics_Center"></span>
<div class="number no-border">
<input id="rate_dynamics_center_correction" type="number"/>
</div>
<div class="clear-both"></div>
</div>
<div class="pid-slider-row">
<span data-i18n="pidTuning_RateDynamics_End"></span>
<div class="number no-border">
<input id="rate_dynamics_end_correction" type="number"/>
</div>
<div class="clear-both"></div>
</div>
</div>
<div class="pid-sliders-axis" data-axis="yaw">
<h3 data-i18n="pidTuning_RateDynamics_Weight"></h3>
<div class="pid-slider-row">
<span data-i18n="pidTuning_RateDynamics_Center"></span>
<div class="number no-border">
<input id="rate_dynamics_center_weight" type="number"/>
</div>
<div class="clear-both"></div>
</div>
<div class="pid-slider-row">
<span data-i18n="pidTuning_RateDynamics_End"></span>
<div class="number no-border">
<input id="rate_dynamics_end_weight" type="number"/>
</div>
<div class="clear-both"></div>
</div>
</div>
</div> </div>
<div id="subtab-filters" class="subtab__content"> <div id="subtab-filters" class="subtab__content">

View file

@ -93,6 +93,15 @@ TABS.pid_tuning.initialize = function (callback) {
RC_tuning.manual_roll_rate = $('#rate-manual-roll').val(); RC_tuning.manual_roll_rate = $('#rate-manual-roll').val();
RC_tuning.manual_pitch_rate = $('#rate-manual-pitch').val(); RC_tuning.manual_pitch_rate = $('#rate-manual-pitch').val();
RC_tuning.manual_yaw_rate = $('#rate-manual-yaw').val(); RC_tuning.manual_yaw_rate = $('#rate-manual-yaw').val();
// Rate Dynamics
RATE_DYNAMICS.sensitivityCenter = parseInt($('#rate_dynamics_center_sensitivity').val());
RATE_DYNAMICS.sensitivityEnd = parseInt($('#rate_dynamics_end_sensitivity').val());
RATE_DYNAMICS.correctionCenter = parseInt($('#rate_dynamics_center_correction').val());
RATE_DYNAMICS.correctionEnd = parseInt($('#rate_dynamics_end_correction').val());
RATE_DYNAMICS.weightCenter = parseInt($('#rate_dynamics_center_weight').val());
RATE_DYNAMICS.weightEnd = parseInt($('#rate_dynamics_end_weight').val());
} }
function hideUnusedPids(sensors_detected) { function hideUnusedPids(sensors_detected) {
$('.tab-pid_tuning table.pid_tuning').hide(); $('.tab-pid_tuning table.pid_tuning').hide();
@ -233,6 +242,15 @@ TABS.pid_tuning.initialize = function (callback) {
axis++; axis++;
}); });
GUI.sliderize($('#rate_dynamics_center_sensitivity'), RATE_DYNAMICS.sensitivityCenter, 25, 175);
GUI.sliderize($('#rate_dynamics_end_sensitivity'), RATE_DYNAMICS.sensitivityEnd, 25, 175);
GUI.sliderize($('#rate_dynamics_center_correction'), RATE_DYNAMICS.correctionCenter, 10, 95);
GUI.sliderize($('#rate_dynamics_end_correction'), RATE_DYNAMICS.correctionEnd, 10, 95);
GUI.sliderize($('#rate_dynamics_center_weight'), RATE_DYNAMICS.weightCenter, 0, 95);
GUI.sliderize($('#rate_dynamics_end_weight'), RATE_DYNAMICS.weightEnd, 0, 95);
if (!FC.isRpyFfComponentUsed()) { if (!FC.isRpyFfComponentUsed()) {
$('.rpy_ff').prop('disabled', 'disabled'); $('.rpy_ff').prop('disabled', 'disabled');
} }