\
');
}
function process_servos(name, alternate, obj) {
$servoConfigTable.append('\
\
' + name + '
\
\
\
\
' + servoCheckbox + '\
\
\
\
\
');
let $currentRow = $servoConfigTable.find('tr:last');
//This routine is pre 2.0 only
if (SERVO_CONFIG[obj].indexOfChannelToForward >= 0) {
$currentRow.find('td.channel input').eq(SERVO_CONFIG[obj].indexOfChannelToForward).prop('checked', true);
}
// adding select box and generating options
$currentRow.find('td.rate').append(
''
);
$currentRow.find('td.reverse').append(
''
);
$currentRow.data('info', { 'obj': obj });
if (semver.lt(CONFIG.flightControllerVersion, "2.0.0")) {
// only one checkbox for indicating a channel to forward can be selected at a time, perhaps a radio group would be best here.
$currentRow.find('td.channel input').click(function () {
if ($(this).is(':checked')) {
$(this).parent().parent().find('.channel input').not($(this)).prop('checked', false);
}
});
} else {
$currentRow.append('
');
let output,
outputString;
if (MIXER_CONFIG.platformType == PLATFORM_MULTIROTOR || MIXER_CONFIG.platformType == PLATFORM_TRICOPTER) {
output = OUTPUT_MAPPING.getMrServoOutput(usedServoIndex);
} else {
output = OUTPUT_MAPPING.getFwServoOutput(usedServoIndex);
}
if (output === null) {
outputString = "-";
} else {
outputString = "S" + output;
}
$currentRow.find('.output').html(outputString);
//For 2.0 and above hide a row when servo is not configured
if (!SERVO_RULES.isServoConfigured(obj)) {
$currentRow.hide();
} else {
usedServoIndex++;
}
}
}
function servos_update(save_configuration_to_eeprom) {
$servoConfigTable.find('tr:not(".main")').each(function () {
var info = $(this).data('info');
var selection = $('.channel input', this);
var channelIndex = parseInt(selection.index(selection.filter(':checked')));
if (channelIndex == -1) {
channelIndex = undefined;
}
SERVO_CONFIG[info.obj].indexOfChannelToForward = channelIndex;
SERVO_CONFIG[info.obj].middle = parseInt($('.middle input', this).val());
SERVO_CONFIG[info.obj].min = parseInt($('.min input', this).val());
SERVO_CONFIG[info.obj].max = parseInt($('.max input', this).val());
var rate = parseInt($('.rate-input', this).val());
if ($('.reverse-input', this).is(':checked')) {
rate = -rate;
}
SERVO_CONFIG[info.obj].rate = rate;
});
//Save configuration to FC
saveChainer.execute();
}
// drop previous table
$servoConfigTable.find('tr:not(:first)').remove();
let usedServoIndex = 0;
for (let servoIndex = 0; servoIndex < 8; servoIndex++) {
process_servos('Servo ' + servoIndex, '', servoIndex);
}
if (usedServoIndex == 0) {
// No servos configured
$servoEmptyTableInfo.show();
$servoConfigTableContainer.hide();
} else {
$servoEmptyTableInfo.hide();
$servoConfigTableContainer.show();
}
// UI hooks for dynamically generated elements
$('table.directions select, table.directions input, #servo-config-table select, #servo-config-table input').change(function () {
if ($('div.live input').is(':checked')) {
// apply small delay as there seems to be some funky update business going wrong
helper.timeout.add('servos_update', servos_update, 10);
}
});
$('a.update').click(function () {
servos_update(true);
});
}
function process_html() {
update_ui();
// translate to user-selected language
localize();
GUI.content_ready(callback);
}
};
TABS.servos.cleanup = function (callback) {
if (callback) callback();
};