'use strict'; TABS.configuration = {}; TABS.configuration.initialize = function (callback) { var self = this; GUI.active_tab_ref = this; GUI.active_tab = 'configuration'; googleAnalytics.sendAppView('Configuration'); function check_compatibility() { if (bit_check(CONFIG.capability, 30)) { // new stuff supported, continue fetching configuration data load_config(); } else { // old version, deny access $('#content').text('We are sorry, but advanced configuration is only available for boards with latest firmware, please update'); if (callback) callback(); } } function load_config() { MSP.send_message(MSP_codes.MSP_CONFIG, false, false, load_rc_map); } function load_rc_map() { MSP.send_message(MSP_codes.MSP_RCMAP, false, false, load_misc); } function load_misc() { MSP.send_message(MSP_codes.MSP_MISC, false, false, load_acc_trim); } function load_acc_trim() { MSP.send_message(MSP_codes.MSP_ACC_TRIM, false, false, load_html); } function load_html() { $('#content').load("./tabs/configuration.html", process_html); } MSP.send_message(MSP_codes.MSP_IDENT, false, false, check_compatibility); function process_html() { // translate to user-selected language localize(); // index references var RCMAPlLetters = ['A', 'E', 'R', 'T', '1', '2', '3', '4']; // generate mixer var mixerList = [ {name: 'Tricopter', image: 'tri'}, {name: 'Quad +', image: 'quadp'}, {name: 'Quad X', image: 'quadx'}, {name: 'Bicopter', image: 'custom'}, {name: 'Gimbal', image: 'custom'}, {name: 'Y 6', image: 'y6'}, {name: 'HEX 6', image: 'hex6p'}, {name: 'Flying Wing', image: 'custom'}, {name: 'Y 4', image: 'y4'}, {name: 'HEX 6 X', image: 'hex6x'}, {name: 'OCTO X8', image: 'octox'}, {name: 'OCTO Flat +', image: 'octox'}, {name: 'OCTO Flat X', image: 'octox'}, {name: 'Airplane', image: 'airplane'}, {name: 'Heli 120', image: 'custom'}, {name: 'Heli 90', image: 'custom'}, {name: 'Vtail 4', image: 'vtail'}, {name: 'Hex 6 H', image: 'custom'}, {name: 'PPM to SERVO', image: 'custom'}, {name: 'Dualcopter', image: 'custom'}, {name: 'Singlecopter', image: 'custom'}, {name: 'Custom', image: 'custom'} ]; var mixer_list_e = $('select.mixerList'); for (var i = 0; i < mixerList.length; i++) { mixer_list_e.append(''); } mixer_list_e.change(function () { var val = parseInt($(this).val()); BF_CONFIG.mixerConfiguration = val; $('.mixerPreview img').attr('src', './images/motor_order/' + mixerList[val - 1].image + '.svg'); }); // select current mixer configuration mixer_list_e.val(BF_CONFIG.mixerConfiguration).change(); // generate features var featureNames = [ 'Enable PPM input (and disable PWM input)', 'Enable Battery voltage monitoring', 'Enable in-flight level calibration', 'Enable Serial-based receiver (SPEKSAT, SBUS, SUMD)', 'Don\'t spin the motors when armed', 'Enable servo gimbal', 'Enable 3rd serial port', 'Enable LED ring support', 'Enable GPS (PPM or 3rd serial port required)', 'Enable failsafe settings on PPM/PWM signal loss', 'Enable sonar', 'Enable FrSky- compatible telemetry output', 'Enable battery current monitoring', 'Enable VARIO', 'Enable 3D mode (for use with reversible ESCs)' ]; var features_e = $('.features'); for (var i = 0; i < featureNames.length; i++) { var element = $('
'); element.find('input').attr('checked', bit_check(BF_CONFIG.features, i)); features_e.append(element); } // generate GPS var gpsTypes = [ 'NMEA', 'UBLOX', 'MTK_NMEA', 'MTK_BINARY', 'MAG_BINARY' ]; var gpsBauds = [ '115200', '57600', '38400', '19200', '9600' ]; var gpsSbas = [ 'Auto-detect', 'European EGNOS', 'North American WAAS', 'Japanese MSAS', 'Indian GAGAN' ]; var gps_type_e = $('select.gps_type'); for (var i = 0; i < gpsTypes.length; i++) { gps_type_e.append(''); } gps_type_e.change(function () { var val = parseInt($(this).val()); MISC.gps_type = val; }); var gps_baudrate_e = $('select.gps_baudrate'); for (var i = 0; i < gpsBauds.length; i++) { gps_baudrate_e.append(''); } gps_baudrate_e.change(function () { var val = parseInt($(this).val()); MISC.gps_baudrate = val; }); var gps_ubx_sbas_e = $('select.gps_ubx_sbas'); for (var i = 0; i < gpsSbas.length; i++) { gps_ubx_sbas_e.append(''); } gps_ubx_sbas_e.change(function () { var val = parseInt($(this).val()); MISC.gps_ubx_sbas = val; }); // select current gps configuration gps_type_e.val(MISC.gps_type); gps_baudrate_e.val(MISC.gps_baudrate); gps_ubx_sbas_e.val(MISC.gps_ubx_sbas); // generate serial RX var serialRXtypes = [ 'SPEKTRUM1024', 'SPEKTRUM2048', 'SBUS', 'SUMD' ]; var serialRX_e = $('select.serialRX'); for (var i = 0; i < serialRXtypes.length; i++) { serialRX_e.append(''); } serialRX_e.change(function () { var val = parseInt($(this).val()); BF_CONFIG.serialrx_type = val; }); // select current serial RX type serialRX_e.val(BF_CONFIG.serialrx_type); // fill board alignment $('input[name="board_align_roll"]').val(BF_CONFIG.board_align_roll); $('input[name="board_align_pitch"]').val(BF_CONFIG.board_align_pitch); $('input[name="board_align_yaw"]').val(BF_CONFIG.board_align_yaw); // fill accel trims $('input[name="roll"]').val(CONFIG.accelerometerTrims[1]); $('input[name="pitch"]').val(CONFIG.accelerometerTrims[0]); // fill magnetometer $('input[name="mag_declination"]').val(MISC.mag_declination / 10); // fill throttle $('input[name="minthrottle"]').val(MISC.minthrottle); $('input[name="midthrottle"]').val(MISC.midrc); $('input[name="maxthrottle"]').val(MISC.maxthrottle); $('input[name="failsafe_throttle"]').val(MISC.failsafe_throttle); $('input[name="mincommand"]').val(MISC.mincommand); // fill battery $('input[name="mincellvoltage"]').val(MISC.vbatmincellvoltage); $('input[name="maxcellvoltage"]').val(MISC.vbatmaxcellvoltage); $('input[name="voltagescale"]').val(MISC.vbatscale); // UI hooks $('input', features_e).change(function () { var element = $(this), index = $('input', features_e).index(element), state = element.is(':checked'); if (state) { BF_CONFIG.features = bit_set(BF_CONFIG.features, index); } else { BF_CONFIG.features = bit_clear(BF_CONFIG.features, index); } }); $('a.save').click(function () { // gather data that doesn't have automatic change event bound BF_CONFIG.board_align_roll = parseInt($('input[name="board_align_roll"]').val()); BF_CONFIG.board_align_pitch = parseInt($('input[name="board_align_pitch"]').val()); BF_CONFIG.board_align_yaw = parseInt($('input[name="board_align_yaw"]').val()); CONFIG.accelerometerTrims[1] = parseInt($('input[name="roll"]').val()); CONFIG.accelerometerTrims[0] = parseInt($('input[name="pitch"]').val()); MISC.mag_declination = parseFloat($('input[name="mag_declination"]').val()) * 10; MISC.minthrottle = parseInt($('input[name="minthrottle"]').val()); MISC.midrc = parseInt($('input[name="midthrottle"]').val()); MISC.maxthrottle = parseInt($('input[name="maxthrottle"]').val()); MISC.failsafe_throttle = parseInt($('input[name="failsafe_throttle"]').val()); MISC.mincommand = parseInt($('input[name="mincommand"]').val()); MISC.vbatmincellvoltage = parseFloat($('input[name="mincellvoltage"]').val()) * 10; MISC.vbatmaxcellvoltage = parseFloat($('input[name="maxcellvoltage"]').val()) * 10; MISC.vbatscale = parseInt($('input[name="voltagescale"]').val()); function save_misc() { MSP.send_message(MSP_codes.MSP_SET_MISC, MSP.crunch(MSP_codes.MSP_SET_MISC), false, save_acc_trim); } function save_acc_trim() { MSP.send_message(MSP_codes.MSP_SET_ACC_TRIM, MSP.crunch(MSP_codes.MSP_SET_ACC_TRIM), false, save_to_eeprom); } function save_to_eeprom() { MSP.send_message(MSP_codes.MSP_EEPROM_WRITE, false, false, reboot); } function reboot() { GUI.log(chrome.i18n.getMessage('configurationEepromSaved')); GUI.tab_switch_cleanup(function() { MSP.send_message(MSP_codes.MSP_SET_REBOOT, false, false, reinitialize); }); } function reinitialize() { GUI.log(chrome.i18n.getMessage('deviceRebooting')); MSP.send_message(MSP_codes.MSP_IDENT, false, false, function () { GUI.log(chrome.i18n.getMessage('deviceReady')); TABS.configuration.initialize(); }); } MSP.send_message(MSP_codes.MSP_SET_CONFIG, MSP.crunch(MSP_codes.MSP_SET_CONFIG), false, save_misc); }); // status data pulled via separate timer with static speed GUI.interval_add('status_pull', function status_pull () { MSP.send_message(MSP_codes.MSP_STATUS); }, 250, true); if (callback) callback(); } }; TABS.configuration.cleanup = function (callback) { if (callback) callback(); };