mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-15 12:25:13 +03:00
1. Fixed rounding error. 2. Added conversions for: a) vertical speed b) metres c) temperature 3. Added support on Failsafe and OSD pages. 4. Sorted out alignment issues, due to different implementations.
386 lines
13 KiB
JavaScript
386 lines
13 KiB
JavaScript
'use strict';
|
|
|
|
const GulpClient = require("gulp");
|
|
|
|
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');
|
|
|
|
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();
|
|
|
|
input.prop('title', 'CLI: ' + input.data('setting'));
|
|
|
|
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 = $('<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.val((s.value / multiplier).toFixed(Math.log10(multiplier)));
|
|
input.attr('type', 'number');
|
|
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 = {
|
|
// Misc
|
|
'us' : "uS",
|
|
'cw' : 'cW',
|
|
'percent' : '%',
|
|
'cmss' : 'cm/s/s',
|
|
// Time
|
|
'msec' : 'ms',
|
|
'dsec' : 'ds',
|
|
'sec' : 's',
|
|
// Angles
|
|
'deg' : '°',
|
|
'decideg' : 'deci°',
|
|
// Temperature
|
|
'decidegc' : 'deci°C',
|
|
'degc' : '°C',
|
|
'degf' : '°F',
|
|
// Speed
|
|
'cms' : 'cm/s',
|
|
'v-cms' : 'cm/s',
|
|
'ms' : 'm/s',
|
|
'kmh' : 'Km/h',
|
|
'mph' : 'mph',
|
|
'hftmin' : 'x100 ft/min',
|
|
'fts' : 'ft/s',
|
|
'kt' : 'Kt',
|
|
// Distance
|
|
'cm' : 'cm',
|
|
'm' : 'm',
|
|
'km' : 'Km',
|
|
'm-lrg' : 'm', // Metres, but converted to larger units
|
|
'ft' : 'ft',
|
|
'mi' : 'mi',
|
|
'nm' : 'NM'
|
|
}
|
|
|
|
|
|
// 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
|
|
},
|
|
'm' : {
|
|
'm' : 1,
|
|
'ft' : 0.3048
|
|
},
|
|
'm-lrg' : {
|
|
'km' : 1000,
|
|
'mi' : 1609.344,
|
|
'nm' : 1852
|
|
},
|
|
'cms' : { // Horizontal speed
|
|
'kmh' : 27.77777777777778,
|
|
'kt': 51.44444444444457,
|
|
'mph' : 44.704,
|
|
'ms' : 100
|
|
},
|
|
'v-cms' : { // Vertical speed
|
|
'ms' : 100,
|
|
'hftmin' : 50.8,
|
|
'fts' : 30.48
|
|
},
|
|
'msec' : {
|
|
'sec' : 1000
|
|
},
|
|
'dsec' : {
|
|
'sec' : 10
|
|
},
|
|
'decideg' : {
|
|
'deg' : 10
|
|
},
|
|
'decidegc' : {
|
|
'degc' : 10,
|
|
'degf' : 'FAHREN'
|
|
},
|
|
};
|
|
|
|
//this holds which units get converted in which unit systems
|
|
const conversionTable = {
|
|
0: { //imperial
|
|
'cm' : 'ft',
|
|
'm' : 'ft',
|
|
'm-lrg' : 'mi',
|
|
'cms' : 'mph',
|
|
'v-cms' : 'fts',
|
|
'msec' : 'sec',
|
|
'dsec' : 'sec',
|
|
'decideg' : 'deg',
|
|
'decidegc' : 'degf',
|
|
},
|
|
1: { //metric
|
|
'cm': 'm',
|
|
'm' : 'm',
|
|
'm-lrg' : 'km',
|
|
'cms' : 'kmh',
|
|
'v-cms' : 'ms',
|
|
'msec' : 'sec',
|
|
'dsec' : 'sec',
|
|
'decideg' : 'deg',
|
|
'decidegc' : 'degc',
|
|
},
|
|
2: { //metric with MPH
|
|
'cm': 'm',
|
|
'm' : 'm',
|
|
'm-lrg' : 'km',
|
|
'cms' : 'mph',
|
|
'v-cms' : 'ms',
|
|
'decideg' : 'deg',
|
|
'msec' : 'sec',
|
|
'dsec' : 'sec',
|
|
'decidegc' : 'degc',
|
|
},
|
|
3:{ //UK
|
|
'cm' : 'ft',
|
|
'm' : 'ft',
|
|
'm-lrg' : 'mi',
|
|
'cms' : 'mph',
|
|
'v-cms' : 'fts',
|
|
'decideg' : 'deg',
|
|
'msec' : 'sec',
|
|
'dsec' : 'sec',
|
|
'decidegc' : 'degc',
|
|
},
|
|
4: { //General aviation
|
|
'cm' : 'ft',
|
|
'm' : 'ft',
|
|
'm-lrg' : 'nm',
|
|
'cms': 'kt',
|
|
'v-cms' : 'hftmin',
|
|
'decideg' : 'deg',
|
|
'msec' : 'sec',
|
|
'dsec' : 'sec',
|
|
'decidegc' : 'degc',
|
|
},
|
|
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'));
|
|
if (multiplier != 'FAHREN') {
|
|
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
|
|
let newValue = "";
|
|
if (multiplier == 'FAHREN') {
|
|
element.attr('min', toFahrenheit(element.attr('min')).toFixed(2));
|
|
element.attr('max', toFahrenheit(element.attr('max')).toFixed(2));
|
|
newValue = toFahrenheit(oldValue).toFixed(2);
|
|
} else {
|
|
const convertedValue = Number((oldValue / multiplier).toFixed(2));
|
|
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(`<div data-unit="${unitDisplayDames[unitName]}" class="unit_wrapper unit"></div>`);
|
|
|
|
function toFahrenheit(decidegC) {
|
|
return (decidegC / 10) * 1.8 + 32;
|
|
};
|
|
}
|
|
|
|
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 = input.data('setting-multiplier') || 1;
|
|
if (multiplier == 'FAHREN') {
|
|
value = Math.round(((parseFloat(input.val())-32) / 1.8) * 10);
|
|
} else {
|
|
multiplier = parseFloat(multiplier);
|
|
value = Math.round(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;
|
|
})();
|