'use strict'; var Settings = (function () { let self = {}; self.configureInputs = function() { var inputs = []; $('[data-setting!=""][data-setting]').each(function() { inputs.push($(this)); }); return Promise.mapSeries(inputs, function (input, ii) { var settingName = input.data('setting'); var inputUnit = input.data('unit'); if (globalSettings.showProfileParameters) { if (FC.isBatteryProfileParameter(settingName)) { input.css("background-color","#fef2d5"); } if (FC.isControlProfileParameter(settingName)) { input.css("background-color","#d5ebfe"); } } return mspHelper.getSetting(settingName).then(function (s) { // Check if the input declares a parent // to be hidden in case of the setting not being available. // Otherwise, default to hiding its parent var parent = input.parents('.setting-container:first'); if (parent.length == 0) { parent = input.parent(); } if (!s) { // Setting doesn't exist. input.val(null); parent.remove(); return; } parent.show(); if (input.prop('tagName') == 'SELECT' || s.setting.table) { if (input.attr('type') == 'checkbox') { input.prop('checked', s.value > 0); } else { input.empty(); for (var ii = s.setting.min; ii <= s.setting.max; ii++) { var name = (s.setting.table ? s.setting.table.values[ii] : null); if (name) { var localizedName = chrome.i18n.getMessage(name); if (localizedName) { name = localizedName; } } else { // Fallback to the number itself name = ii; } var option = $('').attr('value', ii).text(name); if (ii == s.value) { option.prop('selected', true); } option.appendTo(input); } } } else if (s.setting.type == 'string') { input.val(s.value); } else if (s.setting.type == 'float') { input.attr('type', 'number'); let dataStep = input.data("step"); if (dataStep !== undefined) { input.attr('step', dataStep); } else { input.attr('step', "0.01"); } input.attr('min', s.setting.min); input.attr('max', s.setting.max); input.val(s.value.toFixed(2)); } else { var multiplier = parseFloat(input.data('setting-multiplier') || 1); input.attr('type', 'number'); input.val((s.value / multiplier).toFixed(Math.log10(multiplier))); if (typeof s.setting.min !== 'undefined' && s.setting.min !== null) { input.attr('min', (s.setting.min / multiplier).toFixed(Math.log10(multiplier))); } if (typeof s.setting.max !== 'undefined' && s.setting.max !== null) { input.attr('max', (s.setting.max / multiplier).toFixed(Math.log10(multiplier))); } } // If data is defined, We want to convert this value into // something matching the units self.convertToUnitSetting(input, inputUnit); input.data('setting-info', s.setting); if (input.data('live')) { input.change(function() { self.saveInput(input); }); } }); }); }; /** * * @param {JQuery Element} input * @param {String} inputUnit Unit from HTML Dom input */ self.convertToUnitSetting = function (element, inputUnit) { // One of the following; // none, OSD, imperial, metric const configUnitType = globalSettings.unitType; // Small closure to grab the unit as described by either // the app settings or the app OSD settings, confused? yeah const getUnitDisplayTypeValue = () => { // Try and match the values switch (configUnitType) { case UnitType.imperial: return 0; break; case UnitType.metric: return 1; break; case UnitType.OSD: // Match the OSD value on the UI return globalSettings.osdUnits; break; case UnitType.none: default: return -1; break; } } // Sets the int value of the way we want to display the // units. We use the OSD unit values here for easy const uiUnitValue = getUnitDisplayTypeValue(); const oldValue = element.val(); //display names for the units const unitDisplayDames = { 'us' : "uS", 'deg' : '°', 'cdeg' : 'centi°', 'cmss' : 'cm/s/s', 'cm' : 'cm', 'cms' : 'cm/s', 'm' : 'm', 'ms' : 'ms', 'mps' : 'm/s', 'kmh' : 'Km/h', 'sec' : 's', 'kt' : 'Kt', 'ft' : 'ft', 'mph' : 'mph', 'cw' : 'cW', 'percent' : '%' } // Ensure we can do conversions if (!inputUnit || !oldValue || !element) { return; } //this is used to get the factor in which we multiply //to get the correct conversion, the first index is the from //unit and the second is the too unit //unitConversionTable[toUnit][fromUnit] -> factor const unitRatioTable = { 'cm' : { 'm' : 100, 'ft' : 30.48 }, 'cms' : { 'kmh' : 27.77777777777778, 'kt': 51.44444444444457, 'mph' : 44.704, 'mps' : 100 }, 'ms' : { 'sec' : 1000 }, 'cdeg' : { 'deg' : 10 }, }; //this holds which units get converted in which unit systems const conversionTable = { 0: { //imperial 'cm' : 'ft', 'cms' : 'mph', 'cdeg' : 'deg', 'ms' : 'sec' }, 1: {//metric 'cm': 'm', 'cms' : 'kmh', 'ms' : 'sec', 'cdeg' : 'deg' }, 2: { //metric with MPH 'cm': 'm', 'cms' : 'mph', 'cdeg' : 'deg', 'ms' : 'sec' }, 3:{ //UK 'cm' : 'ft', 'cms' : 'mph', 'cdeg' : 'deg', 'ms' : 'sec' }, 4: { //General aviation 'cm' : 'ft', 'cms': 'kt', 'cdeg' : 'deg', 'ms' : 'sec' }, default:{}//show base units }; //this returns the factor in which to multiply to convert a unit const getUnitMultiplier = () => { if (conversionTable[uiUnitValue]){ const fromUnits = conversionTable[uiUnitValue]; if (fromUnits[inputUnit]){ const multiplier = unitRatioTable[inputUnit][fromUnits[inputUnit]]; return {'multiplier':multiplier, 'unitName':fromUnits[inputUnit]}; } } return {multiplier:1, unitName:inputUnit}; } // Get the default multi obj or the custom const multiObj = getUnitMultiplier(); const multiplier = multiObj.multiplier; const unitName = multiObj.unitName; // Update the step, min, and max; as we have the multiplier here. if (element.attr('type') == 'number') { element.attr('step', ((multiplier != 1) ? '0.01' : '1')); element.attr('min', (element.attr('min') / multiplier).toFixed(2)); element.attr('max', (element.attr('max') / multiplier).toFixed(2)); } // Update the input with a new formatted unit const convertedValue = Number((oldValue / multiplier).toFixed(2)); const newValue = Number.isInteger(convertedValue) ? Math.round(convertedValue) : convertedValue; element.val(newValue); element.data('setting-multiplier', multiplier); // Now wrap the input in a display that shows the unit element.wrap(`
`); } self.saveInput = function(input) { var settingName = input.data('setting'); var setting = input.data('setting-info'); var value; if (typeof setting == 'undefined') { return null; } if (setting.table) { if (input.attr('type') == 'checkbox') { value = input.prop('checked') ? 1 : 0; } else { value = parseInt(input.val()); } } else if(setting.type == 'string') { value = input.val(); } else { var multiplier = parseFloat(input.data('setting-multiplier') || 1); value = parseFloat(input.val()) * multiplier; } return mspHelper.setSetting(settingName, value); }; self.saveInputs = function() { var inputs = []; $('[data-setting!=""][data-setting]').each(function() { inputs.push($(this)); }); return Promise.mapSeries(inputs, function (input, ii) { return self.saveInput(input); }); }; self.processHtml = function(callback) { return function() { self.configureInputs().then(callback); }; }; self.getInputValue = function(settingName) { return $('[data-setting="' + settingName + '"]').val(); }; return self; })();