diff options
author | Alberto García Hierro <alberto@garciahierro.com> | 2020-04-07 16:48:12 +0300 |
---|---|---|
committer | Alberto García Hierro <alberto@garciahierro.com> | 2020-05-01 00:41:07 +0300 |
commit | a84f24080551f751182e92953081ea27020df354 (patch) | |
tree | bb5c136c33e40cdecaa92bcfe7c9ad60836f3651 | |
parent | 680ae6a169c0a81f16d7d4d5b04945de648240bf (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.json | 3 | ||||
-rwxr-xr-x | js/port_handler.js | 100 | ||||
-rw-r--r-- | js/serial.js | 5 | ||||
-rwxr-xr-x | js/serial_backend.js | 50 | ||||
-rw-r--r-- | main.css | 5 | ||||
-rw-r--r-- | src/css/dropdown-lists/css/style_lists.css | 6 |
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 @@ -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; } |