Merge branch 'release_7.1.0' into cli_autocomplete

pull/1867/head
Pawel Spychalski (DzikuVx) 9 months ago
commit 1b4fd4e272

@ -8,23 +8,23 @@ Various types of aircraft are supported by the tool and by INAV, e.g. quadcopter
# Support
INAV Configurator comes `as is`, without any warranty and support from authors. If you found a bug, please create an issue on [GitHub](https://github.com/iNavFlight/inav-configurator/issues).
INAV Configurator comes `as is`, without any warranty and support from the authors. If you find a bug, please create an issue on [GitHub](https://github.com/iNavFlight/inav-configurator/issues).
The GitHub issue tracker is reserved for bugs and other technical problems. If you do not know how to setup
everything, the hardware is not working or have any other _support_ problem, please consult:
The GitHub issue tracker is reserved for bugs and other technical problems. If you do not know how to set up
everything, the hardware is not working, or you have any other _support_ problem, please consult:
* [INAV Discord Server](https://discord.gg/peg2hhbYwN)
* [INAV Official on Facebook](https://www.facebook.com/groups/INAVOfficial)
* [RC Groups Support](https://www.rcgroups.com/forums/showthread.php?2495732-Cleanflight-iNav-(navigation-rewrite)-project)
* [INAV Official on Telegram](https://t.me/INAVFlight)
## INAV Configurator start minimized, what should I do?
## INAV Configurator starts minimized, what should I do?
You have to remove the `C:\Users%Your_UserName%\AppData\Local\inav-configurator` folder and all its content.
[https://www.youtube.com/watch?v=XMoULyiFDp4](https://www.youtube.com/watch?v=XMoULyiFDp4)
Alternatively, on Windows with PowerShell, you can use the `post_install_cleanup.ps1` script that will do the cleaning. (thank you James Cherrill)
Alternatively, on Windows with PowerShell, you can use the `post_install_cleanup.ps1` script that will do the cleaning. (thank you, James Cherrill)
## Installation
@ -114,7 +114,7 @@ in the configurator. If new files are added, they must be included in `gulpfile.
in the `./dist/` directory.
- **release**: Create NW.js apps for each supported platform (win32, osx64 and linux64) in the `./apps`
directory. Running this task on macOS or Linux requires Wine since it's needed to set the icon
for the Windows app. If you don't have Wine installed you can create a release by running the **release-only-Linux** task.
for the Windows app. If you don't have Wine installed, you can create a release by running the **release-only-Linux** task.
<br>`--installer` argument can be added to build installers for a particular OS. NOTE: MacOS Installer can be built with MacOS only.
To build a specific release, use the command `release --platform="win64"` for example.
@ -160,7 +160,7 @@ INAV Configurator is shipped **WITHOUT** API key for Bing Maps. That means: ever
## Font Customisation
INAV provides the font images so that custom fonts can be created for your personal preference. This is the case for both analogue and digital fonts. The resources can be found in the [osd](/resources/osd) folder. Within the **analogue** and **digital** subfolders, you will find information on compiling your own fonts. There is also an [INAV Character Map](/resources/osd/INAV%20Character%20Map.md) document. This contains previews of all the character images in the fonts, and the appropriate variable names within the firmware and Configurator. There are tools for compiling the [analogue](https://github.com/fiam/max7456tool) and [digital](https://github.com/MrD-RC/hdosd-font-tool) fonts. New font submissions via pull requests are welcome.
INAV provides the font images so that custom fonts can be created for your personal preference. This is the case for both analogue and digital fonts. The resources can be found in the [osd](/resources/osd) folder. Within the **analogue** and **digital** subfolders, you will find information on compiling your own fonts. There is also an [INAV Character Map](/resources/osd/INAV%20Character%20Map.md) document. This contains previews of all the character images in the fonts and the appropriate variable names within the firmware and Configurator. There are tools for compiling the [analogue](https://github.com/fiam/max7456tool) and [digital](https://github.com/MrD-RC/hdosd-font-tool) fonts. New font submissions via pull requests are welcome.
## Notes
@ -174,7 +174,7 @@ For INAV configurator issues raise them here
https://github.com/iNavFlight/inav-configurator/issues
For INAV firmware issues raise them here
For INAV firmware issues, raise them here
https://github.com/iNavFlight/inav/issues

@ -1305,6 +1305,9 @@
"portsFunction_MSP_DISPLAYPORT": {
"message": "MSP DisplayPort"
},
"portsFunction_SBUS_OUTPUT": {
"message": "SBus Output"
},
"pidTuning_ShowAllPIDs": {
"message": "Show all PIDs"
},
@ -2223,7 +2226,7 @@
"message": "Blackbox configuration"
},
"blackboxButtonSave": {
"message": "Save and reboot"
"message": "Save and Reboot"
},
"serialLogging": {
"message": "Outboard serial logging device"
@ -4298,8 +4301,8 @@
"missionMultiAddNewMission": {
"message": "Add New Mission"
},
"missionLevelEarthDEMModel": {
"message": "Use Sea Level Earth DEM Model: "
"missionEllipsoidEarthDEMModel": {
"message": "Use Ellipsoid instead of SL DEM: "
},
"SafehomeLegend": {
"message": "Legend : "
@ -4455,7 +4458,7 @@
"message": "Confirm"
},
"mixerButtonSaveAndReboot": {
"message": "Save and reboot"
"message": "Save and Reboot"
},
"mixerApplyDescription": {
"message": "This action overrides all current mixer settings and replaces them with default values. There is no 'Undo' option!"

@ -57,14 +57,6 @@ helper.defaultsDialog = (function () {
key: "dterm_lpf_type",
value: "PT3"
},
{
key: "dterm_lpf2_hz",
value: 0
},
{
key: "dterm_lpf2_type",
value: "PT1"
},
{
key: "dynamic_gyro_notch_enabled",
value: "ON"
@ -200,6 +192,11 @@ helper.defaultsDialog = (function () {
{
key: "failsafe_procedure",
value: "DROP"
},
// Ez Tune
{
key: "ez_filter_hz",
value: 90
}
]
},
@ -270,14 +267,6 @@ helper.defaultsDialog = (function () {
key: "dterm_lpf_type",
value: "PT3"
},
{
key: "dterm_lpf2_hz",
value: 0
},
{
key: "dterm_lpf2_type",
value: "PT1"
},
{
key: "dynamic_gyro_notch_enabled",
value: "ON"
@ -413,6 +402,11 @@ helper.defaultsDialog = (function () {
{
key: "failsafe_procedure",
value: "DROP"
},
// Ez Tune
{
key: "ez_filter_hz",
value: 110
}
]
},
@ -461,14 +455,6 @@ helper.defaultsDialog = (function () {
key: "dterm_lpf_type",
value: "PT3"
},
{
key: "dterm_lpf2_hz",
value: 0
},
{
key: "dterm_lpf2_type",
value: "PT1"
},
{
key: "dynamic_gyro_notch_enabled",
value: "ON"
@ -608,6 +594,11 @@ helper.defaultsDialog = (function () {
{
key: "failsafe_procedure",
value: "DROP"
},
// Ez Tune
{
key: "ez_filter_hz",
value: 90
}
]
},
@ -794,10 +785,6 @@ helper.defaultsDialog = (function () {
key: "nav_rth_altitude",
value: 5000
},
{
key: "failsafe_mission",
value: "ON"
},
{
key: "nav_wp_radius",
value: 5000
@ -1007,10 +994,6 @@ helper.defaultsDialog = (function () {
key: "nav_rth_altitude",
value: 5000
},
{
key: "failsafe_mission",
value: "ON"
},
{
key: "nav_wp_radius",
value: 5000
@ -1169,86 +1152,94 @@ helper.defaultsDialog = (function () {
privateScope.setSettings = function (selectedDefaultPreset) {
var currentControlProfile = parseInt($("#profilechange").val());
var currentBatteryProfile = parseInt($("#batteryprofilechange").val());
//Save analytics
googleAnalytics.sendEvent('Setting', 'Defaults', selectedDefaultPreset.title);
Promise.mapSeries(selectedDefaultPreset.settings, function (input, ii) {
return mspHelper.getSetting(input.key);
}).then(function () {
Promise.mapSeries(selectedDefaultPreset.settings, function (input, ii) {
if (FC.isControlProfileParameter(input.key)) {
return privateScope.setSettingForAllControlProfiles(input.key, input.value);
} else if (FC.isBatteryProfileParameter(input.key)) {
return privateScope.setSettingForAllBatteryProfiles(input.key, input.value);
} else {
return mspHelper.setSetting(input.key, input.value);
}
}).then(function () {
// If default preset is associated to a mixer, apply the mixer as well
if (selectedDefaultPreset.mixerToApply) {
let currentMixerPreset = helper.mixer.getById(selectedDefaultPreset.mixerToApply);
var controlProfileSettings = [];
var batterySettings = [];
var miscSettings = [];
helper.mixer.loadServoRules(currentMixerPreset);
helper.mixer.loadMotorRules(currentMixerPreset);
MIXER_CONFIG.platformType = currentMixerPreset.platform;
MIXER_CONFIG.appliedMixerPreset = selectedDefaultPreset.mixerToApply;
MIXER_CONFIG.motorStopOnLow = (currentMixerPreset.motorStopOnLow === true) ? true : false;
MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false;
selectedDefaultPreset.settings.forEach(input => {
if (FC.isControlProfileParameter(input.key)) {
controlProfileSettings.push(input);
} else if (FC.isBatteryProfileParameter(input.key)) {
batterySettings.push(input);
} else {
miscSettings.push(input);
}
});
SERVO_RULES.cleanup();
SERVO_RULES.inflate();
MOTOR_RULES.cleanup();
MOTOR_RULES.inflate();
//Save analytics
googleAnalytics.sendEvent('Setting', 'Defaults', selectedDefaultPreset.title);
var settingsChainer = MSPChainerClass();
var chain = [];
mspHelper.saveMixerConfig(function() {
mspHelper.sendServoMixer(function () {
mspHelper.sendMotorMixer(function () {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [currentControlProfile], false, function() {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [currentBatteryProfile], false, privateScope.finalize(selectedDefaultPreset));
});
});
});
});
} else {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [currentControlProfile], false, function() {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [currentBatteryProfile], false, privateScope.finalize(selectedDefaultPreset));
});
}
})
miscSettings.forEach(input => {
chain.push(function (callback) {
mspHelper.setSetting(input.key, input.value, callback);
});
});
};
privateScope.setSettingForAllControlProfiles = function (key, value) {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [0], false, function () {
mspHelper.setSetting(key, value, function() {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [1], false, function () {
mspHelper.setSetting(key, value, function() {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [2], false, function () {
mspHelper.setSetting(key, value);
});
});
for (var i = 0; i < 3; i++ ) {
chain.push(function (callback) {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [i], false, callback);
});
controlProfileSettings.forEach(input => {
chain.push(function (callback) {
mspHelper.setSetting(input.key, input.value, callback);
});
});
});
return;
};
}
privateScope.setSettingForAllBatteryProfiles = function (key, value) {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [0], false, function () {
mspHelper.setSetting(key, value, function() {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [1], false, function () {
mspHelper.setSetting(key, value, function() {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [2], false, function () {
mspHelper.setSetting(key, value);
});
});
for (var i = 0; i < 3; i++ ) {
chain.push(function (callback) {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [i], false, callback);
});
batterySettings.forEach(input => {
chain.push(function (callback) {
mspHelper.setSetting(input.key, input.value, callback);
});
});
}
// Set Mixers
if (selectedDefaultPreset.mixerToApply) {
let currentMixerPreset = helper.mixer.getById(selectedDefaultPreset.mixerToApply);
helper.mixer.loadServoRules(currentMixerPreset);
helper.mixer.loadMotorRules(currentMixerPreset);
MIXER_CONFIG.platformType = currentMixerPreset.platform;
MIXER_CONFIG.appliedMixerPreset = selectedDefaultPreset.mixerToApply;
MIXER_CONFIG.motorStopOnLow = (currentMixerPreset.motorStopOnLow === true) ? true : false;
MIXER_CONFIG.hasFlaps = (currentMixerPreset.hasFlaps === true) ? true : false;
SERVO_RULES.cleanup();
SERVO_RULES.inflate();
MOTOR_RULES.cleanup();
MOTOR_RULES.inflate();
chain = chain.concat([
mspHelper.saveMixerConfig,
mspHelper.sendServoMixer,
mspHelper.sendMotorMixer
]);
}
chain.push(function (callback) {
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [currentControlProfile], false, callback);
});
return;
};
chain.push(function (callback) {
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [currentBatteryProfile], false, callback);
});
settingsChainer.setChain(chain);
settingsChainer.setExitPoint(function () {
privateScope.finalize(selectedDefaultPreset);
});
settingsChainer.execute();
}
privateScope.onPresetClick = function (event) {
savingDefaultsModal = new jBox('Modal', {

@ -118,9 +118,9 @@ var FC = {
i2cError: 0,
activeSensors: 0,
mode: [],
mixer_profile: 0,
profile: 0,
battery_profile: 0,
mixer_profile: -1,
profile: -1,
battery_profile: -1,
uid: [0, 0, 0],
accelerometerTrims: [0, 0],
armingFlags: 0,
@ -1439,8 +1439,6 @@ var FC = {
'max_angle_inclination_pit',
'dterm_lpf_hz',
'dterm_lpf_type',
'dterm_lpf2_hz',
'dterm_lpf2_type',
'yaw_lpf_hz',
'fw_iterm_throw_limit',
'fw_reference_airspeed',

@ -260,10 +260,16 @@ GUI_control.prototype.updateStatusBar = function() {
$('span.arming-flags').text(activeArmFlags.length ? activeArmFlags.join(', ') : '-');
};
GUI_control.prototype.updateProfileChange = function() {
GUI_control.prototype.updateProfileChange = function(refresh) {
$('#mixerprofilechange').val(CONFIG.mixer_profile);
$('#profilechange').val(CONFIG.profile);
$('#batteryprofilechange').val(CONFIG.battery_profile);
if (refresh) {
GUI.log(chrome.i18n.getMessage('loadedMixerProfile', [CONFIG.mixer_profile + 1]));
GUI.log(chrome.i18n.getMessage('pidTuning_LoadedProfile', [CONFIG.profile + 1]));
GUI.log(chrome.i18n.getMessage('loadedBatteryProfile', [CONFIG.battery_profile + 1]));
updateActivatedTab();
}
};
GUI_control.prototype.fillSelect = function ($element, values, currentValue, unit) {

@ -42,6 +42,7 @@ var mspHelper = (function (gui) {
'GSM_SMS': 19,
'FRSKY_OSD': 20,
'DJI_FPV': 21,
'SBUS_OUTPUT': 22,
'SMARTPORT_MASTER': 23,
'MSP_DISPLAYPORT': 25,
};
@ -68,6 +69,7 @@ var mspHelper = (function (gui) {
color;
if (!dataHandler.unsupported || dataHandler.unsupported) switch (dataHandler.code) {
case MSPCodes.MSPV2_INAV_STATUS:
let profile_changed = false;
CONFIG.cycleTime = data.getUint16(offset, true);
offset += 2;
CONFIG.i2cError = data.getUint16(offset, true);
@ -76,15 +78,28 @@ var mspHelper = (function (gui) {
offset += 2;
CONFIG.cpuload = data.getUint16(offset, true);
offset += 2;
profile_byte = data.getUint8(offset++)
CONFIG.profile = profile_byte & 0x0F;
CONFIG.battery_profile = (profile_byte & 0xF0) >> 4;
profile_byte = data.getUint8(offset++)
CONFIG.mixer_profile = profile_byte & 0x0F;
let profile = profile_byte & 0x0F;
profile_changed |= (profile !== CONFIG.profile) && (CONFIG.profile !==-1);
CONFIG.profile = profile;
let battery_profile = (profile_byte & 0xF0) >> 4;
profile_changed |= (battery_profile !== CONFIG.battery_profile) && (CONFIG.battery_profile !==-1);
CONFIG.battery_profile = battery_profile;
CONFIG.armingFlags = data.getUint32(offset, true);
offset += 4;
//As there are 8 bytes for mspBoxModeFlags (number of bytes is actually variable)
//read mixer profile as the last byte in the the message
profile_byte = data.getUint8(dataHandler.message_length_expected - 1);
let mixer_profile = profile_byte & 0x0F;
profile_changed |= (mixer_profile !== CONFIG.mixer_profile) && (CONFIG.mixer_profile !==-1);
CONFIG.mixer_profile = mixer_profile;
gui.updateStatusBar();
gui.updateProfileChange();
gui.updateProfileChange(profile_changed);
break;
case MSPCodes.MSP_ACTIVEBOXES:
@ -1456,7 +1471,7 @@ var mspHelper = (function (gui) {
case MSPCodes.MSP2_INAV_MIXER:
MIXER_CONFIG.yawMotorDirection = data.getInt8(0);
MIXER_CONFIG.yawJumpPreventionLimit = data.getUint8(1, true);
MIXER_CONFIG.motorStopOnLow = data.getUint8(1, true);
MIXER_CONFIG.motorStopOnLow = data.getUint8(2, true);
MIXER_CONFIG.platformType = data.getInt8(3);
MIXER_CONFIG.hasFlaps = data.getInt8(4);
MIXER_CONFIG.appliedMixerPreset = data.getInt16(5, true);
@ -1482,6 +1497,9 @@ var mspHelper = (function (gui) {
case MSPCodes.MSP2_INAV_OSD_SET_PREFERENCES:
console.log('OSD preferences saved');
break;
case MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE:
console.log('Battery profile selected');
break;
case MSPCodes.MSPV2_INAV_OUTPUT_MAPPING:
OUTPUT_MAPPING.flush();
for (i = 0; i < data.byteLength; ++i)
@ -2910,7 +2928,7 @@ var mspHelper = (function (gui) {
MSP.send_message(MSPCodes.MSP2_INAV_TIMER_OUTPUT_MODE, false, false, callback);
}
self.sendTimerOutputModes = function(callback) {
self.sendTimerOutputModes = function(onCompleteCallback) {
var nextFunction = send_next_output_mode;
var idIndex = 0;
@ -2935,7 +2953,7 @@ var mspHelper = (function (gui) {
// prepare for next iteration
idIndex++;
if (idIndex == overrideIds.length) {
nextFunction = callback;
nextFunction = onCompleteCallback;
}
MSP.send_message(MSPCodes.MSP2_INAV_SET_TIMER_OUTPUT_MODE, buffer, false, nextFunction);
@ -3297,6 +3315,12 @@ var mspHelper = (function (gui) {
self.encodeSetting = function (name, value) {
return this._getSetting(name).then(function (setting) {
if (!setting) {
console.log("Setting invalid: " + name);
return null;
}
if (setting.table && !Number.isInteger(value)) {
var found = false;
for (var ii = 0; ii < setting.table.values.length; ii++) {
@ -3344,7 +3368,11 @@ var mspHelper = (function (gui) {
self.setSetting = function (name, value, callback) {
this.encodeSetting(name, value).then(function (data) {
return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data).then(callback);
if (data) {
return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data).then(callback);
} else {
return Promise.resolve().then(callback);
}
});
};

@ -22,7 +22,16 @@ PortHandler.initialize = function () {
PortHandler.check = function () {
var self = this;
ConnectionSerial.getDevices(function(current_ports) {
ConnectionSerial.getDevices(function(all_ports) {
// filter out ports that are not serial
let current_ports = [];
for (var i = 0; i < all_ports.length; i++) {
if (all_ports[i].indexOf(':') === -1) {
current_ports.push(all_ports[i]);
}
}
// port got removed or initial_ports wasn't initialized yet
if (self.array_difference(self.initial_ports, current_ports).length > 0 || !self.initial_ports) {
var removed_ports = self.array_difference(self.initial_ports, current_ports);

@ -257,6 +257,7 @@ function onValidFirmware()
$('#tabs ul.mode-connected .tab_setup a').click();
updateEzTuneTabVisibility(true);
updateFirmwareVersion();
});
});

@ -139,7 +139,7 @@ let Waypoint = function (number, action, lat, lon, alt=0, p1=0, p2=0, p3=0, endM
self.getElevation = async function (globalSettings) {
let elevation = "N/A";
if (globalSettings.mapProviderType == 'bing') {
let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "sealevel" : "ellipsoid";
let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "ellipsoid" : "sealevel";
const response = await fetch('http://dev.virtualearth.net/REST/v1/Elevation/List?points='+self.getLatMap()+','+self.getLonMap()+'&heights='+elevationEarthModel+'&key='+globalSettings.mapApiKey);
const myJson = await response.json();

@ -130,10 +130,14 @@ $(document).ready(function () {
//Get saved size and position
chrome.storage.local.get('windowSize', function (result) {
if (result.windowSize) {
win.height = result.windowSize.height;
win.width = result.windowSize.width;
win.x = result.windowSize.x;
win.y = result.windowSize.y;
if (result.windowSize.height <= window.screen.availHeight)
win.height = result.windowSize.height;
if (result.windowSize.width <= window.screen.availWidth)
win.width = result.windowSize.width;
if (result.windowSize.x >= window.screen.availLeft)
win.x = result.windowSize.x;
if (result.windowSize.y >= window.screen.availTop)
win.y = result.windowSize.y;
}
});
@ -585,7 +589,6 @@ $(document).ready(function () {
var profile = parseInt($(this).val());
MSP.send_message(MSPCodes.MSP_SELECT_SETTING, [profile], false, function () {
GUI.log(chrome.i18n.getMessage('pidTuning_LoadedProfile', [profile + 1]));
updateActivatedTab();
});
});
@ -595,7 +598,6 @@ $(document).ready(function () {
var batteryprofile = parseInt($(this).val());
MSP.send_message(MSPCodes.MSP2_INAV_SELECT_BATTERY_PROFILE, [batteryprofile], false, function () {
GUI.log(chrome.i18n.getMessage('loadedBatteryProfile', [batteryprofile + 1]));
updateActivatedTab();
});
});
});
@ -735,3 +737,28 @@ function updateFirmwareVersion() {
globalSettings.docsTreeLocation = 'https://github.com/iNavFlight/inav/blob/master/docs/';
}
}
function updateEzTuneTabVisibility(loadMixerConfig) {
let useEzTune = true;
if (CONFIGURATOR.connectionValid) {
if (loadMixerConfig) {
mspHelper.loadMixerConfig(function() {
if (MIXER_CONFIG.platformType == PLATFORM_MULTIROTOR || MIXER_CONFIG.platformType == PLATFORM_TRICOPTER) {
$('.tab_ez_tune').removeClass("is-hidden");
} else {
$('.tab_ez_tune').addClass("is-hidden");
useEzTune = false;
}
});
} else {
if (MIXER_CONFIG.platformType == PLATFORM_MULTIROTOR || MIXER_CONFIG.platformType == PLATFORM_TRICOPTER) {
$('.tab_ez_tune').removeClass("is-hidden");
} else {
$('.tab_ez_tune').addClass("is-hidden");
useEzTune = false;
}
}
}
return useEzTune;
}

@ -1,7 +1,7 @@
{
"manifest_version": 2,
"minimum_chrome_version": "38",
"version": "7.0.0",
"version": "7.1.0",
"author": "Several",
"name": "INAV - Configurator",
"short_name": "INAV",

16874
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,7 +1,7 @@
{
"name": "inav-configurator",
"description": "INAV Configurator",
"version": "7.0.0",
"version": "7.1.0",
"main": "main.html",
"default_locale": "en",
"scripts": {
@ -37,7 +37,7 @@
"jquery-ui-npm": "1.12.0",
"marked": "^0.3.17",
"minimist": "^1.2.0",
"nw": "^0.61.0-sdk",
"nw": "^0.81.0",
"nw-dialog": "^1.0.7",
"openlayers": "^4.6.5",
"plotly": "^1.0.6",

@ -1,44 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Public domain (CC-BY-SA if you or your laws insist), generated by Jonathan Hudson's svg_model_motors.rb -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200pt" height="200pt" viewBox="0 0 200 200" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 2.679688 -13.863281 L 2.679688 -15.75 C 4.457031 -15.921875 5.695312 -16.210938 6.398438 -16.617188 C 7.101562 -17.023438 7.625 -17.984375 7.96875 -19.496094 L 9.914062 -19.496094 L 9.914062 0 L 7.289062 0 L 7.289062 -13.863281 Z M 2.679688 -13.863281 "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 1.921875 -4.402344 C 2.527344 -5.652344 3.710938 -6.785156 5.46875 -7.804688 L 8.09375 -9.324219 C 9.269531 -10.007812 10.09375 -10.589844 10.570312 -11.074219 C 11.316406 -11.832031 11.6875 -12.695312 11.6875 -13.671875 C 11.6875 -14.8125 11.347656 -15.714844 10.664062 -16.386719 C 9.980469 -17.054688 9.070312 -17.390625 7.929688 -17.390625 C 6.242188 -17.390625 5.078125 -16.753906 4.429688 -15.476562 C 4.082031 -14.792969 3.890625 -13.84375 3.855469 -12.632812 L 1.351562 -12.632812 C 1.378906 -14.335938 1.695312 -15.726562 2.296875 -16.804688 C 3.363281 -18.699219 5.246094 -19.648438 7.945312 -19.648438 C 10.1875 -19.648438 11.824219 -19.039062 12.859375 -17.828125 C 13.894531 -16.617188 14.410156 -15.265625 14.410156 -13.78125 C 14.410156 -12.214844 13.859375 -10.875 12.757812 -9.761719 C 12.117188 -9.113281 10.972656 -8.332031 9.324219 -7.410156 L 7.453125 -6.371094 C 6.558594 -5.878906 5.855469 -5.410156 5.34375 -4.960938 C 4.433594 -4.167969 3.859375 -3.289062 3.625 -2.324219 L 14.3125 -2.324219 L 14.3125 0 L 0.875 0 C 0.964844 -1.6875 1.316406 -3.152344 1.921875 -4.402344 Z M 1.921875 -4.402344 "/>
</symbol>
<symbol overflow="visible" id="glyph0-3">
<path style="stroke:none;" d="M 2.234375 -1.375 C 1.191406 -2.644531 0.671875 -4.191406 0.671875 -6.015625 L 3.242188 -6.015625 C 3.351562 -4.75 3.585938 -3.828125 3.953125 -3.253906 C 4.589844 -2.222656 5.742188 -1.710938 7.410156 -1.710938 C 8.703125 -1.710938 9.742188 -2.054688 10.527344 -2.75 C 11.3125 -3.441406 11.703125 -4.335938 11.703125 -5.429688 C 11.703125 -6.777344 11.289062 -7.71875 10.464844 -8.257812 C 9.640625 -8.796875 8.496094 -9.0625 7.027344 -9.0625 C 6.863281 -9.0625 6.695312 -9.0625 6.527344 -9.058594 C 6.359375 -9.054688 6.1875 -9.046875 6.015625 -9.039062 L 6.015625 -11.210938 C 6.269531 -11.183594 6.484375 -11.164062 6.65625 -11.15625 C 6.832031 -11.148438 7.019531 -11.140625 7.21875 -11.140625 C 8.140625 -11.140625 8.894531 -11.289062 9.488281 -11.578125 C 10.527344 -12.089844 11.046875 -13 11.046875 -14.3125 C 11.046875 -15.289062 10.699219 -16.042969 10.007812 -16.570312 C 9.316406 -17.097656 8.507812 -17.363281 7.585938 -17.363281 C 5.945312 -17.363281 4.8125 -16.816406 4.183594 -15.722656 C 3.835938 -15.121094 3.640625 -14.265625 3.59375 -13.152344 L 1.164062 -13.152344 C 1.164062 -14.609375 1.453125 -15.851562 2.039062 -16.871094 C 3.039062 -18.695312 4.804688 -19.605469 7.328125 -19.605469 C 9.324219 -19.605469 10.867188 -19.160156 11.960938 -18.273438 C 13.054688 -17.382812 13.601562 -16.097656 13.601562 -14.410156 C 13.601562 -13.207031 13.28125 -12.230469 12.632812 -11.484375 C 12.230469 -11.019531 11.710938 -10.65625 11.074219 -10.390625 C 12.105469 -10.109375 12.910156 -9.5625 13.488281 -8.757812 C 14.066406 -7.949219 14.355469 -6.964844 14.355469 -5.796875 C 14.355469 -3.929688 13.742188 -2.40625 12.507812 -1.230469 C 11.277344 -0.0546875 9.535156 0.53125 7.273438 0.53125 C 4.957031 0.53125 3.277344 -0.101562 2.234375 -1.375 Z M 2.234375 -1.375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-4">
<path style="stroke:none;" d="M 9.257812 -6.929688 L 9.257812 -15.804688 L 2.980469 -6.929688 Z M 9.296875 0 L 9.296875 -4.785156 L 0.710938 -4.785156 L 0.710938 -7.191406 L 9.679688 -19.632812 L 11.757812 -19.632812 L 11.757812 -6.929688 L 14.640625 -6.929688 L 14.640625 -4.785156 L 11.757812 -4.785156 L 11.757812 0 Z M 9.296875 0 "/>
</symbol>
</g>
</defs>
<g id="surface11">
<path style="fill:none;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(72.941176%,72.941176%,72.941176%);stroke-opacity:1;stroke-miterlimit:10;" d="M 40 40 L 160 160 M 40 160 L 160 40 "/>
<path style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;" d="M 188 160 C 188 175.464844 175.464844 188 160 188 C 144.535156 188 132 175.464844 132 160 C 132 144.535156 144.535156 132 160 132 C 175.464844 132 188 144.535156 188 160 M 179.800781 179.800781 L 177.785156 163 M 179.800781 179.800781 L 196.601562 179.800781 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="153" y="167"/>
</g>
<path style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;" d="M 188 40 C 188 55.464844 175.464844 68 160 68 C 144.535156 68 132 55.464844 132 40 C 132 24.535156 144.535156 12 160 12 C 175.464844 12 188 24.535156 188 40 M 179.800781 20.199219 L 177.785156 37 M 179.800781 20.199219 L 196.601562 20.199219 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-2" x="153" y="47"/>
</g>
<path style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;" d="M 68 160 C 68 175.464844 55.464844 188 40 188 C 24.535156 188 12 175.464844 12 160 C 12 144.535156 24.535156 132 40 132 C 55.464844 132 68 144.535156 68 160 M 20.199219 179.800781 L 22.214844 163 M 20.199219 179.800781 L 3.398438 179.800781 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="33" y="167"/>
</g>
<path style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;" d="M 68 40 C 68 55.464844 55.464844 68 40 68 C 24.535156 68 12 55.464844 12 40 C 12 24.535156 24.535156 12 40 12 C 55.464844 12 68 24.535156 68 40 M 20.199219 20.199219 L 22.214844 37 M 20.199219 20.199219 L 3.398438 20.199219 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="33" y="47"/>
</g>
<path style="fill:none;stroke-width:12;stroke-linecap:butt;stroke-linejoin:bevel;stroke:rgb(98.039216%,2.745098%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 100 80 L 100 120 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(98.039216%,2.745098%,0%);fill-opacity:1;" d="M 100 75 L 85 90 L 115 90 L 100 75 "/>
</g>
<svg
width="200pt"
height="200pt"
viewBox="0 0 200 200"
version="1.1"
id="svg52"
sodipodi:docname="quad_x.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview54"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="pt"
showgrid="false"
inkscape:zoom="3.165"
inkscape:cx="133.17536"
inkscape:cy="133.49131"
inkscape:window-width="1850"
inkscape:window-height="1016"
inkscape:window-x="1990"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="g45" />
<defs
id="defs19">
<g
id="g17">
<symbol
overflow="visible"
id="glyph0-0">
<path
style="stroke:none;"
d=""
id="path2" />
</symbol>
<symbol
overflow="visible"
id="glyph0-1">
<path
style="stroke:none;"
d="M 2.679688 -13.863281 L 2.679688 -15.75 C 4.457031 -15.921875 5.695312 -16.210938 6.398438 -16.617188 C 7.101562 -17.023438 7.625 -17.984375 7.96875 -19.496094 L 9.914062 -19.496094 L 9.914062 0 L 7.289062 0 L 7.289062 -13.863281 Z M 2.679688 -13.863281 "
id="path5" />
</symbol>
<symbol
overflow="visible"
id="glyph0-2">
<path
style="stroke:none;"
d="M 1.921875 -4.402344 C 2.527344 -5.652344 3.710938 -6.785156 5.46875 -7.804688 L 8.09375 -9.324219 C 9.269531 -10.007812 10.09375 -10.589844 10.570312 -11.074219 C 11.316406 -11.832031 11.6875 -12.695312 11.6875 -13.671875 C 11.6875 -14.8125 11.347656 -15.714844 10.664062 -16.386719 C 9.980469 -17.054688 9.070312 -17.390625 7.929688 -17.390625 C 6.242188 -17.390625 5.078125 -16.753906 4.429688 -15.476562 C 4.082031 -14.792969 3.890625 -13.84375 3.855469 -12.632812 L 1.351562 -12.632812 C 1.378906 -14.335938 1.695312 -15.726562 2.296875 -16.804688 C 3.363281 -18.699219 5.246094 -19.648438 7.945312 -19.648438 C 10.1875 -19.648438 11.824219 -19.039062 12.859375 -17.828125 C 13.894531 -16.617188 14.410156 -15.265625 14.410156 -13.78125 C 14.410156 -12.214844 13.859375 -10.875 12.757812 -9.761719 C 12.117188 -9.113281 10.972656 -8.332031 9.324219 -7.410156 L 7.453125 -6.371094 C 6.558594 -5.878906 5.855469 -5.410156 5.34375 -4.960938 C 4.433594 -4.167969 3.859375 -3.289062 3.625 -2.324219 L 14.3125 -2.324219 L 14.3125 0 L 0.875 0 C 0.964844 -1.6875 1.316406 -3.152344 1.921875 -4.402344 Z M 1.921875 -4.402344 "
id="path8" />
</symbol>
<symbol
overflow="visible"
id="glyph0-3">
<path
style="stroke:none;"
d="M 2.234375 -1.375 C 1.191406 -2.644531 0.671875 -4.191406 0.671875 -6.015625 L 3.242188 -6.015625 C 3.351562 -4.75 3.585938 -3.828125 3.953125 -3.253906 C 4.589844 -2.222656 5.742188 -1.710938 7.410156 -1.710938 C 8.703125 -1.710938 9.742188 -2.054688 10.527344 -2.75 C 11.3125 -3.441406 11.703125 -4.335938 11.703125 -5.429688 C 11.703125 -6.777344 11.289062 -7.71875 10.464844 -8.257812 C 9.640625 -8.796875 8.496094 -9.0625 7.027344 -9.0625 C 6.863281 -9.0625 6.695312 -9.0625 6.527344 -9.058594 C 6.359375 -9.054688 6.1875 -9.046875 6.015625 -9.039062 L 6.015625 -11.210938 C 6.269531 -11.183594 6.484375 -11.164062 6.65625 -11.15625 C 6.832031 -11.148438 7.019531 -11.140625 7.21875 -11.140625 C 8.140625 -11.140625 8.894531 -11.289062 9.488281 -11.578125 C 10.527344 -12.089844 11.046875 -13 11.046875 -14.3125 C 11.046875 -15.289062 10.699219 -16.042969 10.007812 -16.570312 C 9.316406 -17.097656 8.507812 -17.363281 7.585938 -17.363281 C 5.945312 -17.363281 4.8125 -16.816406 4.183594 -15.722656 C 3.835938 -15.121094 3.640625 -14.265625 3.59375 -13.152344 L 1.164062 -13.152344 C 1.164062 -14.609375 1.453125 -15.851562 2.039062 -16.871094 C 3.039062 -18.695312 4.804688 -19.605469 7.328125 -19.605469 C 9.324219 -19.605469 10.867188 -19.160156 11.960938 -18.273438 C 13.054688 -17.382812 13.601562 -16.097656 13.601562 -14.410156 C 13.601562 -13.207031 13.28125 -12.230469 12.632812 -11.484375 C 12.230469 -11.019531 11.710938 -10.65625 11.074219 -10.390625 C 12.105469 -10.109375 12.910156 -9.5625 13.488281 -8.757812 C 14.066406 -7.949219 14.355469 -6.964844 14.355469 -5.796875 C 14.355469 -3.929688 13.742188 -2.40625 12.507812 -1.230469 C 11.277344 -0.0546875 9.535156 0.53125 7.273438 0.53125 C 4.957031 0.53125 3.277344 -0.101562 2.234375 -1.375 Z M 2.234375 -1.375 "
id="path11" />
</symbol>
<symbol
overflow="visible"
id="glyph0-4">
<path
style="stroke:none;"
d="M 9.257812 -6.929688 L 9.257812 -15.804688 L 2.980469 -6.929688 Z M 9.296875 0 L 9.296875 -4.785156 L 0.710938 -4.785156 L 0.710938 -7.191406 L 9.679688 -19.632812 L 11.757812 -19.632812 L 11.757812 -6.929688 L 14.640625 -6.929688 L 14.640625 -4.785156 L 11.757812 -4.785156 L 11.757812 0 Z M 9.296875 0 "
id="path14" />
</symbol>
</g>
</defs>
<g
id="surface11">
<path
style="fill:none;stroke-width:28;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(72.941176%,72.941176%,72.941176%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 40 40 L 160 160 M 40 160 L 160 40 "
id="path21" />
<path
style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;"
d="M 188 160 C 188 175.464844 175.464844 188 160 188 C 144.535156 188 132 175.464844 132 160 C 132 144.535156 144.535156 132 160 132 C 175.464844 132 188 144.535156 188 160 M 179.800781 179.800781 L 177.785156 163 M 179.800781 179.800781 L 196.601562 179.800781 "
id="path23" />
<g
style="fill:rgb(0%,0%,0%);fill-opacity:1;"
id="g27" />
<path
style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;"
d="M 188 40 C 188 55.464844 175.464844 68 160 68 C 144.535156 68 132 55.464844 132 40 C 132 24.535156 144.535156 12 160 12 C 175.464844 12 188 24.535156 188 40 M 179.800781 20.199219 L 177.785156 37 M 179.800781 20.199219 L 196.601562 20.199219 "
id="path29" />
<g
style="fill:rgb(0%,0%,0%);fill-opacity:1;"
id="g33" />
<path
style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;"
d="M 68 160 C 68 175.464844 55.464844 188 40 188 C 24.535156 188 12 175.464844 12 160 C 12 144.535156 24.535156 132 40 132 C 55.464844 132 68 144.535156 68 160 M 20.199219 179.800781 L 22.214844 163 M 20.199219 179.800781 L 3.398438 179.800781 "
id="path35" />
<path
style="fill:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(55,168,219);stroke-opacity:1;stroke-miterlimit:10;"
d="M 68 40 C 68 55.464844 55.464844 68 40 68 C 24.535156 68 12 55.464844 12 40 C 12 24.535156 24.535156 12 40 12 C 55.464844 12 68 24.535156 68 40 M 20.199219 20.199219 L 22.214844 37 M 20.199219 20.199219 L 3.398438 20.199219 "
id="path41" />
<g
style="fill:rgb(0%,0%,0%);fill-opacity:1;"
id="g45" />
<path
style="fill:none;stroke-width:12;stroke-linecap:butt;stroke-linejoin:bevel;stroke:rgb(98.039216%,2.745098%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 100 80 L 100 120 "
id="path47" />
<path
style=" stroke:none;fill-rule:nonzero;fill:rgb(98.039216%,2.745098%,0%);fill-opacity:1;"
d="M 100 75 L 85 90 L 115 90 L 100 75 "
id="path49" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

@ -8,10 +8,9 @@
version="1.1"
id="svg52"
sodipodi:docname="quad_x_reverse.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
@ -25,14 +24,14 @@
inkscape:document-units="pt"
showgrid="false"
inkscape:zoom="1.1269514"
inkscape:cx="-5.3240981"
inkscape:cy="231.15459"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:cx="-4.8804234"
inkscape:cy="231.1546"
inkscape:window-width="1850"
inkscape:window-height="1016"
inkscape:window-x="1990"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg52" />
inkscape:current-layer="g862" />
<defs
id="defs19">
<g
@ -89,62 +88,18 @@
style="fill:none;stroke:#37a8db;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
d="m 188,160 c 0,-15.46484 -12.53516,-28 -28,-28 -15.46484,0 -28,12.53516 -28,28 0,15.46484 12.53516,28 28,28 15.46484,0 28,-12.53516 28,-28 M 179.80078,140.19922 177.78516,157 m 2.01562,-16.80078 h 16.80078"
id="path23" />
<g
style="fill:#000000;fill-opacity:1"
id="g27">
<use
xlink:href="#glyph0-1"
x="153"
y="167"
id="use25"
width="100%"
height="100%" />
</g>
<path
style="fill:none;stroke:#37a8db;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
d="m 188,40 c 0,-15.464844 -12.53516,-28 -28,-28 -15.46484,0 -28,12.535156 -28,28 0,15.464844 12.53516,28 28,28 15.46484,0 28,-12.535156 28,-28 M 179.80078,59.800781 177.78516,43 m 2.01562,16.800781 h 16.80078"
id="path29" />
<g
style="fill:#000000;fill-opacity:1"
id="g33">
<use
xlink:href="#glyph0-2"
x="153"
y="47"
id="use31"
width="100%"
height="100%" />
</g>
<path
style="fill:none;stroke:#37a8db;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
d="m 68,160 c 0,-15.46484 -12.535156,-28 -28,-28 -15.464844,0 -28,12.53516 -28,28 0,15.46484 12.535156,28 28,28 15.464844,0 28,-12.53516 28,-28 M 20.199219,140.19922 22.214844,157 M 20.199219,140.19922 H 3.398438"
id="path35" />
<g
style="fill:#000000;fill-opacity:1"
id="g39">
<use
xlink:href="#glyph0-3"
x="33"
y="167"
id="use37"
width="100%"
height="100%" />
</g>
<path
style="fill:none;stroke:#37a8db;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
d="M 68,40 C 68,24.535156 55.464844,12 40,12 24.535156,12 12,24.535156 12,40 12,55.464844 24.535156,68 40,68 55.464844,68 68,55.464844 68,40 M 20.199219,59.800781 22.214844,43 M 20.199219,59.800781 H 3.398438"
id="path41" />
<g
style="fill:#000000;fill-opacity:1"
id="g45">
<use
xlink:href="#glyph0-4"
x="33"
y="47"
id="use43"
width="100%"
height="100%" />
</g>
<path
style="fill:none;stroke:#fa0500;stroke-width:12;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:10;stroke-opacity:1"
d="m 100,80 v 40"

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 252 B

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

@ -16068,34 +16068,37 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
01010101
10000101
01010101
01010010
00010101
10100001
01010101
01001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
00101010
10100001
01010000
10000001
01010101
01000010
00000101
01001010
10101000
01010100
01010010
00010101
10100001
01010010
00010010
00010101
00010100
10000101
01010010
10000100
01010101
10000101
00010101
01001010
10000101
01000101
@ -16130,9 +16133,6 @@ MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010000
00010101

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

@ -118,4 +118,14 @@
height: 29px;
line-height: 27px;
border-radius: 20px;
}
}
.motorNumber {
position: absolute;
font-size: 1.4em;
}
.mixer-preview-image-numbers {
width: fit-content;
}

@ -166,7 +166,7 @@
</div>
</div>
<div class="point" id="elevationEarthModelclass" style="display: none">
<label class="spacer_box_title" for="elevationEarthModel" data-i18n="missionLevelEarthDEMModel"></label>
<label class="spacer_box_title" for="elevationEarthModel" data-i18n="missionEllipsoidEarthDEMModel"></label>
<input id="elevationEarthModel" type="checkbox" value="0" class="togglemedium" required>
</div>
</div>

@ -364,24 +364,15 @@ TABS.mission_control.initialize = function (callback) {
//////////////////////////////////////////////////////////////////////////////////////////////
// define & init parameters for default Settings
//////////////////////////////////////////////////////////////////////////////////////////////
var vMaxDistSH = 0;
var settings = {};
var settings = {speed: 0, alt: 5000, safeRadiusSH : 50, maxDistSH : 0, bingDemModel : false};
if (CONFIGURATOR.connectionValid) {
mspHelper.getSetting("safehome_max_distance").then(function (s) {
if (s) {
vMaxDistSH = Number(s.value)/100;
settings = { speed: 0, alt: 5000, safeRadiusSH : 50, maxDistSH : vMaxDistSH};
}
else {
vMaxDistSH = 0;
settings = { speed: 0, alt: 5000, safeRadiusSH : 50, maxDistSH : vMaxDistSH};
settings.maxDistSH = Number(s.value)/100;
}
});
}
else {
vMaxDistSH = 0;
settings = { speed: 0, alt: 5000, safeRadiusSH : 50, maxDistSH : vMaxDistSH};
}
//////////////////////////////////////////////////////////////////////////////////////////////
// define & init Waypoints parameters
@ -679,6 +670,7 @@ TABS.mission_control.initialize = function (callback) {
if (globalSettings.mapProviderType == 'bing') {
$('#elevationEarthModelclass').fadeIn(300);
changeSwitchery($('#elevationEarthModel'), settings.bingDemModel);
} else {
$('#elevationEarthModelclass').fadeOut(300);
}
@ -1541,7 +1533,7 @@ TABS.mission_control.initialize = function (callback) {
// * @param {Object=} opt_options Control options.
// */
app.PlannerMultiMissionControl = function (opt_options) {
var options = opt_options || {};
var button = document.createElement('button');
@ -1847,7 +1839,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointP1').val(selectedMarker.getP1());
$('#pointP2').val(selectedMarker.getP2());
// Selection box update depending on choice of type of waypoint
for (var j in dictOfLabelParameterPoint[selectedMarker.getAction()]) {
if (dictOfLabelParameterPoint[selectedMarker.getAction()][j] != '') {
@ -2114,7 +2106,7 @@ TABS.mission_control.initialize = function (callback) {
$('#pointP3Alt').on('change', function (event) {
if (selectedMarker) {
P3Value = selectedMarker.getP3();
if (disableMarkerEdit) {
changeSwitchery($('#pointP3Alt'), TABS.mission_control.isBitSet(P3Value, MWNP.P3.ALT_TYPE));
}
@ -2124,18 +2116,26 @@ TABS.mission_control.initialize = function (callback) {
const elevationAtWP = await selectedMarker.getElevation(globalSettings);
$('#elevationValueAtWP').text(elevationAtWP);
var altitude = Number($('#pointAlt').val());
if (P3Value != selectedMarker.getP3()) {
selectedMarker.setP3(P3Value);
let groundClearance = 100 * Number($('#groundClearanceValueAtWP').text());
if (isNaN(groundClearance)) {
groundClearance = settings.alt; // use default altitude if no current ground clearance
}
if ($('#pointP3Alt').prop("checked")) {
if (altitude < 0) {
altitude = settings.alt;
}
selectedMarker.setAlt(altitude + elevationAtWP * 100);
selectedMarker.setAlt(groundClearance + elevationAtWP * 100);
} else {
selectedMarker.setAlt(altitude - Number(elevationAtWP) * 100);
let elevationAtHome = HOME.getAlt();
if (isNaN(elevationAtHome)) {
elevationAtHome = elevationAtWP;
}
selectedMarker.setAlt(groundClearance + 100 * (elevationAtWP - elevationAtHome));
}
}
const returnAltitude = checkAltElevSanity(false, selectedMarker.getAlt(), elevationAtWP, selectedMarker.getP3());
selectedMarker.setAlt(returnAltitude);
$('#pointAlt').val(selectedMarker.getAlt());
@ -2158,7 +2158,7 @@ TABS.mission_control.initialize = function (callback) {
P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), MWNP.P3.USER_ACTION_1, $('#pointP3UserAction1').prop("checked"));
selectedMarker.setP3(P3Value);
mission.updateWaypoint(selectedMarker);
mission.update(singleMissionActive());
redrawLayer();
@ -2185,7 +2185,7 @@ TABS.mission_control.initialize = function (callback) {
if (disableMarkerEdit) {
changeSwitchery($('#pointP3UserAction3'), TABS.mission_control.isBitSet(selectedMarker.getP3(), MWNP.P3.USER_ACTION_3));
}
P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), MWNP.P3.USER_ACTION_3, $('#pointP3UserAction3').prop("checked"));
selectedMarker.setP3(P3Value);
@ -2200,7 +2200,7 @@ TABS.mission_control.initialize = function (callback) {
if (disableMarkerEdit) {
changeSwitchery($('#pointP3UserAction4'), TABS.mission_control.isBitSet(selectedMarker.getP3(), MWNP.P3.USER_ACTION_4));
}
P3Value = TABS.mission_control.setBit(selectedMarker.getP3(), MWNP.P3.USER_ACTION_4, $('#pointP3UserAction4').prop("checked"));
selectedMarker.setP3(P3Value);
@ -2318,6 +2318,9 @@ TABS.mission_control.initialize = function (callback) {
redrawLayer();
plotElevation();
})()
settings.bingDemModel = $('#elevationEarthModel').prop("checked") ? true : false;
saveSettings();
}
});
@ -2469,13 +2472,19 @@ TABS.mission_control.initialize = function (callback) {
/////////////////////////////////////////////
$('#saveSettings').on('click', function () {
let oldSafeRadiusSH = settings.safeRadiusSH;
settings = { speed: Number($('#MPdefaultPointSpeed').val()), alt: Number($('#MPdefaultPointAlt').val()), safeRadiusSH: Number($('#MPdefaultSafeRangeSH').val()), maxDistSH : vMaxDistSH};
settings.speed = Number($('#MPdefaultPointSpeed').val());
settings.alt = Number($('#MPdefaultPointAlt').val());
settings.safeRadiusSH = Number($('#MPdefaultSafeRangeSH').val());
saveSettings();
if (settings.safeRadiusSH != oldSafeRadiusSH && $('#showHideSafehomeButton').is(":visible")) {
cleanSafehomeLayers();
renderSafehomesOnMap();
$('#SafeHomeSafeDistance').text(settings.safeRadiusSH);
}
closeSettingsPanel();
});
@ -2833,7 +2842,11 @@ TABS.mission_control.initialize = function (callback) {
alert(chrome.i18n.getMessage('MissionPlannerAltitudeChangeReset'));
altitude = selectedMarker.getAlt();
} else {
altitude = settings.alt + 100 * (elevation - elevationAtHome);
let currentGroundClearance = 100 * Number($('#groundClearanceValueAtWP').text());
if (isNaN(currentGroundClearance) || selectedMarker == null) {
currentGroundClearance = settings.alt; // use default altitude if no current ground clearance
}
altitude = currentGroundClearance + 100 * (elevation - elevationAtHome);
}
}
groundClearance = altitude / 100 + (elevationAtHome - elevation);

@ -44,7 +44,11 @@
<div class="spacer_box">
<div class="select position-relative">
<div class="mixerPreview" style="max-width: 175px">
<img src="./resources/motor_order/custom.svg" />
<img src="./resources/motor_order/custom.svg" id="motor-mixer-preview-img"/>
<div class="motorNumber" id="motorNumber1">1</div>
<div class="motorNumber" id="motorNumber2">2</div>
<div class="motorNumber" id="motorNumber3">3</div>
<div class="motorNumber" id="motorNumber4">4</div>
</div>
<div class="half" style="width: calc(50% - 10px); margin-left: 10px;">
<select id="mixer-preset"></select>
@ -254,4 +258,4 @@
<a id="save-button" class="save" href="#" data-i18n="configurationButtonSave"></a>
</div>
</div>
</div>
</div>

@ -29,7 +29,8 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
mspHelper.loadMotorMixRules,
mspHelper.loadOutputMappingExt,
mspHelper.loadTimerOutputModes,
mspHelper.loadLogicConditions
mspHelper.loadLogicConditions,
mspHelper.loadEzTune,
]);
loadChainer.setExitPoint(loadHtml);
loadChainer.execute();
@ -420,6 +421,45 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
return (parseInt(weight) + 100) * 1000 / 200 + 1000;
}
function labelMotorNumbers() {
let index = 0;
var rules
if (currentMixerPreset.id == loadedMixerPresetID) {
rules = MOTOR_RULES.get();
} else {
rules = currentMixerPreset.motorMixer;
}
for (const i in rules) {
if (rules.hasOwnProperty(i)) {
const rule = rules[i];
index++;
if (currentMixerPreset.image != 'quad_x') {
$("#motorNumber"+index).css("visibility", "hidden");
continue;
}
let top_px = 30;
let left_px = 28;
if (rule.getRoll() < -0.5) {
left_px = $("#motor-mixer-preview-img").width() - 42;
}
if (rule.getPitch() > 0.5) {
top_px = $("#motor-mixer-preview-img").height() - 42;
}
$("#motorNumber"+index).css("left", left_px + "px");
$("#motorNumber"+index).css("top", top_px + "px");
$("#motorNumber"+index).css("visibility", "visible");
}
}
}
function renderMotorMixRules() {
/*
@ -483,6 +523,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
}
}
labelMotorNumbers();
localize();
}
@ -590,7 +631,7 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
r.getYaw()
)
);
}
renderMotorMixRules();
@ -668,8 +709,13 @@ TABS.mixer.initialize = function (callback, scrollPosition) {
$('#platform-type').parent('.select').addClass('no-bottom-border');
}
updateRefreshButtonStatus();
if (!updateEzTuneTabVisibility(false)) {
EZ_TUNE.enabled = 0;
mspHelper.saveEzTune();
}
updateRefreshButtonStatus();
labelMotorNumbers();
updateMotorDirection();
});

@ -114,6 +114,12 @@ TABS.ports.initialize = function (callback) {
maxPorts: 1,
defaultBaud: 57600 }
);
portFunctionRules.push({
name: 'SBUS_OUTPUT',
groups: ['peripherals'],
maxPorts: 1,
defaultBaud: 115200 }
);
for (var i = 0; i < portFunctionRules.length; i++) {
portFunctionRules[i].displayName = chrome.i18n.getMessage('portsFunction_' + portFunctionRules[i].name);

@ -69,7 +69,10 @@ TABS.setup.initialize = function (callback) {
GUI.log(chrome.i18n.getMessage('initialSetupSettingsRestored'));
GUI.tab_switch_cleanup(function () {
TABS.setup.initialize();
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, function() {
GUI.log(chrome.i18n.getMessage('deviceRebooting'));
GUI.handleReconnect();
});
});
});
}

Loading…
Cancel
Save