Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/iNavFlight/inav-configurator.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto García Hierro <alberto@garciahierro.com>2020-04-07 16:48:12 +0300
committerAlberto García Hierro <alberto@garciahierro.com>2020-05-01 00:41:07 +0300
commita84f24080551f751182e92953081ea27020df354 (patch)
treebb5c136c33e40cdecaa92bcfe7c9ad60836f3651
parent680ae6a169c0a81f16d7d4d5b04945de648240bf (diff)
Enhance port discovery and port option storage/restoringagh_porthandling
- Detect when a port is backed by BLE and force wireless mode - Detect port types that don't use the BPS and disable the input - Disable manual port selection for runtimes that don't support it - Save bps/wireless mode per port instead of globally
-rwxr-xr-x_locales/en/messages.json3
-rwxr-xr-xjs/port_handler.js100
-rw-r--r--js/serial.js5
-rwxr-xr-xjs/serial_backend.js50
-rw-r--r--main.css5
-rw-r--r--src/css/dropdown-lists/css/style_lists.css6
6 files changed, 131 insertions, 38 deletions
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 600f07fa..af3f2095 100755
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -2342,6 +2342,9 @@
"w_z_gos_p_help": {
"message": "When this value is set to <strong>0</strong>, GPS is not used for altitude computation"
},
+ "portManual": {
+ "message": "Manual Selection"
+ },
"wirelessModeSwitch": {
"message": "Wireless mode"
},
diff --git a/js/port_handler.js b/js/port_handler.js
index 28023291..1162e701 100755
--- a/js/port_handler.js
+++ b/js/port_handler.js
@@ -76,20 +76,8 @@ PortHandler.check = function () {
} else {
console.log('Last used port wasn\'t saved "yet", auto-select disabled.');
}
+ self.restorePortOptions();
});
-
- chrome.storage.local.get('last_used_bps', function (result) {
- if (result['last_used_bps']) {
- $('#baud').val(result['last_used_bps']);
- }
- });
-
- chrome.storage.local.get('wireless_mode_enabled', function (result) {
- if (result['wireless_mode_enabled']) {
- $('#wireless-mode').prop('checked', true).change();
- }
- });
-
}
if (!self.initial_ports) {
@@ -141,7 +129,7 @@ PortHandler.check = function () {
self.check_usb_devices();
- GUI.updateManualPortVisibility();
+ GUI.updatePortOptions();
setTimeout(function () {
self.check();
}, 250);
@@ -149,10 +137,11 @@ PortHandler.check = function () {
};
PortHandler.check_usb_devices = function (callback) {
+ const self = this;
chrome.usb.getDevices(usbDevices.STM32DFU, function (result) {
if (result.length) {
if (!$("div#port-picker #port [value='DFU']").length) {
- $('div#port-picker #port').append($('<option/>', {value: "DFU", text: "DFU", data: {isDFU: true}}));
+ self.appendPort('DFU');
$('div#port-picker #port').val('DFU');
}
self.dfu_available = true;
@@ -163,18 +152,43 @@ PortHandler.check_usb_devices = function (callback) {
self.dfu_available = false;
}
- if(callback) callback(self.dfu_available);
+ if (callback) {
+ callback(self.dfu_available);
+ }
});
};
+PortHandler.portProperties = function (port) {
+ let data = {};
+ if (port === 'manual') {
+ data.isManual = true
+ }
+ if (port && port.startsWith('BLE')) {
+ data.isBLE = true;
+ data.ignoresBaudRate = true;
+ }
+ if (port === 'DFU') {
+ data.isDFU = true;
+ data.ignoresBaudRate = true;
+ }
+ return data;
+}
+
+PortHandler.appendPort = function (port, name) {
+ let data = this.portProperties(port);
+ let portName = name || port;
+ $('div#port-picker #port').append($("<option/>", {value: port, text: portName, data: data}));
+}
+
PortHandler.update_port_select = function (ports) {
$('div#port-picker #port').html(''); // drop previous one
- for (var i = 0; i < ports.length; i++) {
- $('div#port-picker #port').append($("<option/>", {value: ports[i], text: ports[i], data: {isManual: false}}));
+ for (let ii = 0; ii < ports.length; ii++) {
+ this.appendPort(ports[ii]);
+ }
+ if (serial.allowsOtherDevices()) {
+ this.appendPort('manual', 'Manual Selection');
}
-
- $('div#port-picker #port').append($("<option/>", {value: 'manual', text: 'Manual Selection', data: {isManual: true}}));
};
PortHandler.port_detected = function(name, code, timeout, ignore_timeout) {
@@ -202,6 +216,52 @@ PortHandler.port_detected = function(name, code, timeout, ignore_timeout) {
return obj;
};
+PortHandler.getSelectedPort = function() {
+ const $port = $('#port');
+ const $portOverride = $('#port-override');
+ const portData = $port.find('option:selected').data();
+ if (portData && portData.isManual) {
+ return $portOverride.val();
+ }
+ return $port.val();
+};
+
+PortHandler.portOptionsKey = function(port) {
+ return 'portOptions:' + port;
+};
+
+PortHandler.savePortOptions = function() {
+ const port = this.getSelectedPort();
+ const key = this.portOptionsKey(port);
+ const baud = $('#baud').val();
+ const wirelessMode = $('#wireless-mode').prop('checked');
+ const data = {};
+ data[key] = {baud: baud, wirelessMode: wirelessMode};
+ chrome.storage.local.set(data);
+};
+
+PortHandler.restorePortOptions = function() {
+ const port = this.getSelectedPort();
+ const key = this.portOptionsKey(port);
+ const $baud = $('#baud');
+ const $wirelessMode = $('#wireless-mode');
+ chrome.storage.local.get([key], function(result) {
+ // Defaults
+ let baud = $baud.find('option').first().val();
+ let wirelessMode = false;
+ if (result && result[key]) {
+ baud = result[key].baud;
+ wirelessMode = result[key].wirelessMode;
+ }
+ if (!$baud.prop('disabled')) {
+ $baud.val(baud);
+ }
+ if (!$wirelessMode.prop('disabled')) {
+ $wirelessMode.prop('checked', wirelessMode).change();
+ }
+ });
+};
+
PortHandler.port_removed = function (name, code, timeout, ignore_timeout) {
var self = this;
var obj = {'name': name, 'code': code, 'timeout': (timeout) ? timeout : 10000};
diff --git a/js/serial.js b/js/serial.js
index 98a1f9ae..3581c159 100644
--- a/js/serial.js
+++ b/js/serial.js
@@ -199,6 +199,9 @@ var serial = {
callback(devices);
});
},
+ allowsOtherDevices: function () {
+ return !chrome.serial._disallows_other_devices;
+ },
getInfo: function (callback) {
chrome.serial.getInfo(this.connectionId, callback);
},
@@ -306,4 +309,4 @@ var serial = {
}
}
-}; \ No newline at end of file
+};
diff --git a/js/serial_backend.js b/js/serial_backend.js
index 6f400b31..23e7b02c 100755
--- a/js/serial_backend.js
+++ b/js/serial_backend.js
@@ -5,19 +5,28 @@ $(document).ready(function () {
var $port = $('#port'),
$baud = $('#baud'),
- $portOverride = $('#port-override');
+ $portOverride = $('#port-override'),
+ $wirelessMode = $('#wireless-mode');
/*
* Handle "Wireless" mode with strict queueing of messages
*/
- $('#wireless-mode').change(function () {
- var $this = $(this);
- if ($this.is(':checked')) {
+ $wirelessMode.change(function (e) {
+ if ($wirelessMode.prop('checked')) {
helper.mspQueue.setLockMethod('hard');
} else {
helper.mspQueue.setLockMethod('soft');
}
+ if (e.originalEvent) {
+ PortHandler.savePortOptions();
+ }
+ });
+
+ $baud.change(function (e) {
+ if (e.originalEvent) {
+ PortHandler.savePortOptions();
+ }
});
GUI.handleReconnect = function ($tabElement) {
@@ -72,23 +81,35 @@ $(document).ready(function () {
}
};
- GUI.updateManualPortVisibility = function(){
+ GUI.updatePortOptions = function(){
var selected_port = $port.find('option:selected');
+ if (!selected_port || !selected_port.data()) {
+ return;
+ }
if (selected_port.data().isManual) {
$('#port-override-option').show();
}
else {
$('#port-override-option').hide();
}
- if (selected_port.data().isDFU) {
- $baud.hide();
+ if (selected_port.data().ignoresBaudRate) {
+ $baud.addClass('disabled').prop('disabled', true);
}
else {
- $baud.show();
+ $baud.removeClass('disabled').prop('disabled', false);
}
+ let wirelessModeContainer = $wirelessMode.parent();
+ if (selected_port.data().isBLE) {
+ $wirelessMode.prop('disabled', true).prop('checked', true).change();
+ wirelessModeContainer.addClass('disabled');
+ } else {
+ $wirelessMode.prop('disabled', false);
+ wirelessModeContainer.removeClass('disabled');
+ }
+ PortHandler.restorePortOptions();
};
- GUI.updateManualPortVisibility();
+ GUI.updatePortOptions();
$portOverride.change(function () {
chrome.storage.local.set({'portOverride': $portOverride.val()});
@@ -99,7 +120,7 @@ $(document).ready(function () {
});
$port.change(function (target) {
- GUI.updateManualPortVisibility();
+ GUI.updatePortOptions();
});
$('div.connect_controls a.connect').click(function () {
@@ -107,9 +128,7 @@ $(document).ready(function () {
var clicks = $(this).data('clicks');
var selected_baud = parseInt($baud.val());
- var selected_port = $port.find('option:selected').data().isManual ?
- $portOverride.val() :
- String($port.val());
+ var selected_port = PortHandler.getSelectedPort();
if (selected_port === 'DFU') {
GUI.log(chrome.i18n.getMessage('dfu_connect_message'));
}
@@ -237,6 +256,8 @@ function onOpen(openInfo) {
GUI.log(chrome.i18n.getMessage('serialPortOpened', [openInfo.connectionId]));
+ PortHandler.savePortOptions();
+
// save selected port with chrome.storage if the port differs
chrome.storage.local.get('last_used_port', function (result) {
if (result.last_used_port) {
@@ -250,9 +271,6 @@ function onOpen(openInfo) {
}
});
- chrome.storage.local.set({last_used_bps: serial.bitrate});
- chrome.storage.local.set({wireless_mode_enabled: $('#wireless-mode').is(":checked")});
-
serial.onReceive.addListener(read_serial);
// disconnect after 10 seconds with error if we don't get IDENT data
diff --git a/main.css b/main.css
index 7d32c753..029dcd27 100644
--- a/main.css
+++ b/main.css
@@ -185,6 +185,11 @@ input[type="number"]::-webkit-inner-spin-button {
margin-left: 5px;
}
+.disabled .switchery {
+ opacity: 0.5 !important;
+ pointer-events: none;
+}
+
.portsinput__top-element--inline span {
color: #ddd;
}
diff --git a/src/css/dropdown-lists/css/style_lists.css b/src/css/dropdown-lists/css/style_lists.css
index 772b808e..62d06d53 100644
--- a/src/css/dropdown-lists/css/style_lists.css
+++ b/src/css/dropdown-lists/css/style_lists.css
@@ -140,8 +140,12 @@
text-shadow: 0 1px black;
/* Fallback for IE 8 */
background: #444;
-
}
+
+.dropdown-dark .dropdown-select.disabled {
+ opacity: 0.5;
+}
+
.dropdown-dark .dropdown-select:focus {
color: #fff;
}