betaflight-configurator/tabs/configuration.js

306 lines
11 KiB
JavaScript

'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('<option value="' + (i + 1) + '">' + mixerList[i].name + '</option>');
}
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 = $('<dt><input id="feature-' + i + '" type="checkbox" /></dt><dd><label for="feature-' + i + '">' + featureNames[i] + '</label></dd>');
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('<option value="' + i + '">' + gpsTypes[i] + '</option>');
}
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('<option value="' + i + '">' + gpsBauds[i] + '</option>');
}
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('<option value="' + i + '">' + gpsSbas[i] + '</option>');
}
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('<option value="' + i + '">' + serialRXtypes[i] + '</option>');
}
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="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.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();
};