/*global fc*/ 'use strict'; TABS.servos = {}; TABS.servos.initialize = function (callback) { if (GUI.active_tab != 'servos') { GUI.active_tab = 'servos'; googleAnalytics.sendAppView('Servos'); } let loadChainer = new MSPChainerClass(); loadChainer.setChain([ mspHelper.loadServoConfiguration, mspHelper.loadRcData, mspHelper.loadBfConfig, ]); loadChainer.setExitPoint(load_html); loadChainer.execute(); let saveChainer = new MSPChainerClass(); saveChainer.setChain([ mspHelper.sendServoConfigurations, mspHelper.saveToEeprom ]); saveChainer.setExitPoint(function () { GUI.log(chrome.i18n.getMessage('servosEepromSave')); }); function load_html() { $('#content').load("./tabs/servos.html", process_html); } function update_ui() { let i, $tabServos = $(".tab-servos"), $servoConfigTable = $('#servo-config-table'), $servoMixTable = $('#servo-mix-table'), $servoMixTableBody = $servoMixTable.find('tbody'); if (SERVO_CONFIG.length == 0) { $tabServos.addClass("is-hidden"); return; } let servoCheckbox = '', servoHeader = ''; for (i = 0; i < RC.active_channels - 4; i++) { servoHeader = servoHeader + 'CH' + (i + 5) + ''; } servoHeader = servoHeader + ''; for (i = 0; i < RC.active_channels; i++) { servoCheckbox = servoCheckbox + ''; } $servoConfigTable.find('tr.main').append(servoHeader); function process_servos(name, alternate, obj) { $servoConfigTable.append('\ \ ' + name + '\ \ \ \ ' + servoCheckbox + '\ \ \ \ '); if (SERVO_CONFIG[obj].indexOfChannelToForward >= 0) { $servoConfigTable.find('tr:last td.channel input').eq(SERVO_CONFIG[obj].indexOfChannelToForward).prop('checked', true); } // adding select box and generating options $servoConfigTable.find('tr:last td.direction').append(''); var select = $servoConfigTable.find('tr:last td.direction select'); for (var i = FC.MAX_SERVO_RATE; i >= FC.MIN_SERVO_RATE; i--) { select.append(''); } // select current rate select.val(SERVO_CONFIG[obj].rate); $servoConfigTable.find('tr:last').data('info', { 'obj': obj }); // UI hooks // only one checkbox for indicating a channel to forward can be selected at a time, perhaps a radio group would be best here. $servoConfigTable.find('tr:last td.channel input').click(function () { if ($(this).is(':checked')) { $(this).parent().parent().find('.channel input').not($(this)).prop('checked', false); } }); } 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()); SERVO_CONFIG[info.obj].rate = parseInt($('.direction select', this).val()); }); //Save configuration to FC saveChainer.execute(); } // drop previous table $servoConfigTable.find('tr:not(:first)').remove(); for (let servoIndex = 0; servoIndex < 8; servoIndex++) { process_servos('Servo ' + servoIndex, '', servoIndex, false); } // 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(); };