mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-19 06:15:13 +03:00
Refactor and clean port_handler.js
This commit is contained in:
parent
6370a0153c
commit
eb30f6bef0
1 changed files with 101 additions and 76 deletions
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
const TIMEOUT_CHECK = 500; // With 250 it seems that it produces a memory leak and slowdown in some versions, reason unknown
|
const TIMEOUT_CHECK = 500; // With 250 it seems that it produces a memory leak and slowdown in some versions, reason unknown
|
||||||
|
|
||||||
var usbDevices = { filters: [
|
const usbDevices = { filters: [
|
||||||
{'vendorId': 1155, 'productId': 57105},
|
{'vendorId': 1155, 'productId': 57105},
|
||||||
{'vendorId': 10473, 'productId': 393}
|
{'vendorId': 10473, 'productId': 393},
|
||||||
] };
|
] };
|
||||||
|
|
||||||
var PortHandler = new function () {
|
const PortHandler = new function () {
|
||||||
this.initial_ports = false;
|
this.initial_ports = false;
|
||||||
this.port_detected_callbacks = [];
|
this.port_detected_callbacks = [];
|
||||||
this.port_removed_callbacks = [];
|
this.port_removed_callbacks = [];
|
||||||
|
@ -15,31 +15,45 @@ var PortHandler = new function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.initialize = function () {
|
PortHandler.initialize = function () {
|
||||||
|
|
||||||
|
this.portPickerElement = $('div#port-picker #port');
|
||||||
|
|
||||||
// start listening, check after TIMEOUT_CHECK ms
|
// start listening, check after TIMEOUT_CHECK ms
|
||||||
this.check();
|
this.check();
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.check = function () {
|
PortHandler.check = function () {
|
||||||
var self = this;
|
|
||||||
|
const self = this;
|
||||||
|
|
||||||
|
self.check_serial_devices();
|
||||||
|
self.check_usb_devices();
|
||||||
|
|
||||||
|
GUI.updateManualPortVisibility();
|
||||||
|
|
||||||
|
setTimeout(function () {
|
||||||
|
self.check();
|
||||||
|
}, TIMEOUT_CHECK);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
PortHandler.check_serial_devices = function () {
|
||||||
|
const self = this;
|
||||||
|
|
||||||
serial.getDevices(function(current_ports) {
|
serial.getDevices(function(current_ports) {
|
||||||
// port got removed or initial_ports wasn't initialized yet
|
// port got removed or initial_ports wasn't initialized yet
|
||||||
if (self.array_difference(self.initial_ports, current_ports).length > 0 || !self.initial_ports) {
|
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);
|
const removed_ports = self.array_difference(self.initial_ports, current_ports);
|
||||||
|
|
||||||
if (self.initial_ports != false) {
|
if (self.initial_ports !== false && removed_ports.length > 0) {
|
||||||
if (removed_ports.length > 1) {
|
console.log(`PortHandler - Removed: ${removed_ports}`);
|
||||||
console.log('PortHandler - Removed: ' + removed_ports);
|
|
||||||
} else {
|
|
||||||
console.log('PortHandler - Removed: ' + removed_ports[0]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// disconnect "UI" if necessary
|
// disconnect "UI" if necessary
|
||||||
// Keep in mind that this routine can not fire during atmega32u4 reboot procedure !!!
|
// Keep in mind that this routine can not fire during atmega32u4 reboot procedure !!!
|
||||||
if (GUI.connected_to) {
|
if (GUI.connected_to) {
|
||||||
for (var i = 0; i < removed_ports.length; i++) {
|
for (let i = 0; i < removed_ports.length; i++) {
|
||||||
if (removed_ports[i] == GUI.connected_to) {
|
if (removed_ports[i] === GUI.connected_to) {
|
||||||
$('div#header_btns a.connect').click();
|
$('div#header_btns a.connect').click();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,8 +63,8 @@ PortHandler.check = function () {
|
||||||
|
|
||||||
// trigger callbacks (only after initialization)
|
// trigger callbacks (only after initialization)
|
||||||
if (self.initial_ports) {
|
if (self.initial_ports) {
|
||||||
for (var i = (self.port_removed_callbacks.length - 1); i >= 0; i--) {
|
for (let i = (self.port_removed_callbacks.length - 1); i >= 0; i--) {
|
||||||
var obj = self.port_removed_callbacks[i];
|
const obj = self.port_removed_callbacks[i];
|
||||||
|
|
||||||
// remove timeout
|
// remove timeout
|
||||||
clearTimeout(obj.timer);
|
clearTimeout(obj.timer);
|
||||||
|
@ -59,8 +73,10 @@ PortHandler.check = function () {
|
||||||
obj.code(removed_ports);
|
obj.code(removed_ports);
|
||||||
|
|
||||||
// remove object from array
|
// remove object from array
|
||||||
var index = self.port_removed_callbacks.indexOf(obj);
|
const index = self.port_removed_callbacks.indexOf(obj);
|
||||||
if (index > -1) self.port_removed_callbacks.splice(index, 1);
|
if (index > -1) {
|
||||||
|
self.port_removed_callbacks.splice(index, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,10 +86,10 @@ PortHandler.check = function () {
|
||||||
// if last_used_port was set, we try to select it
|
// if last_used_port was set, we try to select it
|
||||||
if (result.last_used_port) {
|
if (result.last_used_port) {
|
||||||
current_ports.forEach(function(port) {
|
current_ports.forEach(function(port) {
|
||||||
if (port == result.last_used_port) {
|
if (port === result.last_used_port) {
|
||||||
console.log('Selecting last used port: ' + result.last_used_port);
|
console.log(`Selecting last used port: ${result.last_used_port}`);
|
||||||
|
|
||||||
$('div#port-picker #port').val(result.last_used_port);
|
self.portPickerElement.val(result.last_used_port);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
@ -86,44 +102,40 @@ PortHandler.check = function () {
|
||||||
// initialize
|
// initialize
|
||||||
self.initial_ports = current_ports;
|
self.initial_ports = current_ports;
|
||||||
} else {
|
} else {
|
||||||
for (var i = 0; i < removed_ports.length; i++) {
|
for (let i = 0; i < removed_ports.length; i++) {
|
||||||
self.initial_ports.splice(self.initial_ports.indexOf(removed_ports[i]), 1);
|
self.initial_ports.splice(self.initial_ports.indexOf(removed_ports[i]), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// new port detected
|
// new port detected
|
||||||
var new_ports = self.array_difference(current_ports, self.initial_ports);
|
const new_ports = self.array_difference(current_ports, self.initial_ports);
|
||||||
|
|
||||||
if (new_ports.length) {
|
if (new_ports.length) {
|
||||||
if (new_ports.length > 1) {
|
if (new_ports.length > 0) {
|
||||||
console.log('PortHandler - Found: ' + new_ports);
|
console.log(`PortHandler - Found: ${new_ports}`);
|
||||||
} else {
|
|
||||||
console.log('PortHandler - Found: ' + new_ports[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.update_port_select(current_ports);
|
self.update_port_select(current_ports);
|
||||||
|
|
||||||
// select / highlight new port, if connected -> select connected port
|
// select / highlight new port, if connected -> select connected port
|
||||||
if (!GUI.connected_to) {
|
if (!GUI.connected_to) {
|
||||||
$('div#port-picker #port').val(new_ports[0]);
|
self.portPickerElement.val(new_ports[0]);
|
||||||
} else {
|
} else {
|
||||||
$('div#port-picker #port').val(GUI.connected_to);
|
self.portPickerElement.val(GUI.connected_to);
|
||||||
}
|
}
|
||||||
|
|
||||||
// start connect procedure (if statement is valid)
|
// start connect procedure (if statement is valid)
|
||||||
if (GUI.auto_connect && !GUI.connecting_to && !GUI.connected_to) {
|
if (GUI.active_tab !== 'firmware_flasher' && GUI.auto_connect && !GUI.connecting_to && !GUI.connected_to) {
|
||||||
// we need firmware flasher protection over here
|
// we need firmware flasher protection over here
|
||||||
if (GUI.active_tab != 'firmware_flasher') {
|
|
||||||
GUI.timeout_add('auto-connect_timeout', function () {
|
GUI.timeout_add('auto-connect_timeout', function () {
|
||||||
$('div#header_btns a.connect').click();
|
$('div#header_btns a.connect').click();
|
||||||
}, 100); // timeout so bus have time to initialize after being detected by the system
|
}, 100); // timeout so bus have time to initialize after being detected by the system
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// trigger callbacks
|
// trigger callbacks
|
||||||
for (var i = (self.port_detected_callbacks.length - 1); i >= 0; i--) {
|
for (let i = (self.port_detected_callbacks.length - 1); i >= 0; i--) {
|
||||||
var obj = self.port_detected_callbacks[i];
|
const obj = self.port_detected_callbacks[i];
|
||||||
|
|
||||||
// remove timeout
|
// remove timeout
|
||||||
clearTimeout(obj.timer);
|
clearTimeout(obj.timer);
|
||||||
|
@ -132,30 +144,27 @@ PortHandler.check = function () {
|
||||||
obj.code(new_ports);
|
obj.code(new_ports);
|
||||||
|
|
||||||
// remove object from array
|
// remove object from array
|
||||||
var index = self.port_detected_callbacks.indexOf(obj);
|
const index = self.port_detected_callbacks.indexOf(obj);
|
||||||
if (index > -1) self.port_detected_callbacks.splice(index, 1);
|
if (index > -1) {
|
||||||
|
self.port_detected_callbacks.splice(index, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.initial_ports = current_ports;
|
self.initial_ports = current_ports;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.check_usb_devices();
|
|
||||||
|
|
||||||
GUI.updateManualPortVisibility();
|
|
||||||
setTimeout(function () {
|
|
||||||
self.check();
|
|
||||||
}, TIMEOUT_CHECK);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.check_usb_devices = function (callback) {
|
PortHandler.check_usb_devices = function (callback) {
|
||||||
|
const self = this;
|
||||||
chrome.usb.getDevices(usbDevices, function (result) {
|
chrome.usb.getDevices(usbDevices, function (result) {
|
||||||
const portPickerElement = $("div#port-picker #port");
|
|
||||||
const dfuElement = portPickerElement.children("[value='DFU']");
|
const dfuElement = self.portPickerElement.children("[value='DFU']");
|
||||||
if (result.length) {
|
if (result.length) {
|
||||||
if (!dfuElement.length) {
|
if (!dfuElement.length) {
|
||||||
portPickerElement.append($('<option/>', {value: "DFU", text: "DFU", data: {isDFU: true}}));
|
self.portPickerElement.append($('<option/>', {value: "DFU", text: "DFU", data: {isDFU: true}}));
|
||||||
portPickerElement.val('DFU').change();
|
self.portPickerElement.val('DFU').change();
|
||||||
}
|
}
|
||||||
self.dfu_available = true;
|
self.dfu_available = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -164,40 +173,47 @@ PortHandler.check_usb_devices = function (callback) {
|
||||||
}
|
}
|
||||||
self.dfu_available = false;
|
self.dfu_available = false;
|
||||||
}
|
}
|
||||||
if(callback) callback(self.dfu_available);
|
if(callback) {
|
||||||
|
callback(self.dfu_available);
|
||||||
|
}
|
||||||
|
|
||||||
if (!$('option:selected', portPickerElement).data().isDFU) {
|
if (!$('option:selected', self.portPickerElement).data().isDFU) {
|
||||||
portPickerElement.trigger('change');
|
self.portPickerElement.trigger('change');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.update_port_select = function (ports) {
|
PortHandler.update_port_select = function (ports) {
|
||||||
const portPickerElement = $("div#port-picker #port");
|
|
||||||
portPickerElement.empty();
|
|
||||||
|
|
||||||
for (var i = 0; i < ports.length; i++) {
|
this.portPickerElement.empty();
|
||||||
portPickerElement.append($("<option/>", {value: ports[i], text: ports[i], data: {isManual: false}}));
|
|
||||||
|
for (let i = 0; i < ports.length; i++) {
|
||||||
|
this.portPickerElement.append($("<option/>", {value: ports[i], text: ports[i], data: {isManual: false}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
portPickerElement.append($("<option/>", {value: 'manual', i18n: 'portsSelectManual', data: {isManual: true}}));
|
this.portPickerElement.append($("<option/>", {value: 'manual', i18n: 'portsSelectManual', data: {isManual: true}}));
|
||||||
i18n.localizePage();
|
i18n.localizePage();
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.port_detected = function(name, code, timeout, ignore_timeout) {
|
PortHandler.port_detected = function(name, code, timeout, ignore_timeout) {
|
||||||
var self = this;
|
const self = this;
|
||||||
var obj = {'name': name, 'code': code, 'timeout': (timeout) ? timeout : 10000};
|
const obj = {'name': name,
|
||||||
|
'code': code,
|
||||||
|
'timeout': (timeout) ? timeout : 10000,
|
||||||
|
};
|
||||||
|
|
||||||
if (!ignore_timeout) {
|
if (!ignore_timeout) {
|
||||||
obj.timer = setTimeout(function() {
|
obj.timer = setTimeout(function() {
|
||||||
console.log('PortHandler - timeout - ' + obj.name);
|
console.log(`PortHandler - timeout - ${obj.name}`);
|
||||||
|
|
||||||
// trigger callback
|
// trigger callback
|
||||||
code(false);
|
code(false);
|
||||||
|
|
||||||
// remove object from array
|
// remove object from array
|
||||||
var index = self.port_detected_callbacks.indexOf(obj);
|
const index = self.port_detected_callbacks.indexOf(obj);
|
||||||
if (index > -1) self.port_detected_callbacks.splice(index, 1);
|
if (index > -1) {
|
||||||
|
self.port_detected_callbacks.splice(index, 1);
|
||||||
|
}
|
||||||
}, (timeout) ? timeout : 10000);
|
}, (timeout) ? timeout : 10000);
|
||||||
} else {
|
} else {
|
||||||
obj.timer = false;
|
obj.timer = false;
|
||||||
|
@ -210,19 +226,24 @@ PortHandler.port_detected = function(name, code, timeout, ignore_timeout) {
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.port_removed = function (name, code, timeout, ignore_timeout) {
|
PortHandler.port_removed = function (name, code, timeout, ignore_timeout) {
|
||||||
var self = this;
|
const self = this;
|
||||||
var obj = {'name': name, 'code': code, 'timeout': (timeout) ? timeout : 10000};
|
const obj = {'name': name,
|
||||||
|
'code': code,
|
||||||
|
'timeout': (timeout) ? timeout : 10000,
|
||||||
|
};
|
||||||
|
|
||||||
if (!ignore_timeout) {
|
if (!ignore_timeout) {
|
||||||
obj.timer = setTimeout(function () {
|
obj.timer = setTimeout(function () {
|
||||||
console.log('PortHandler - timeout - ' + obj.name);
|
console.log(`PortHandler - timeout - ${obj.name}`);
|
||||||
|
|
||||||
// trigger callback
|
// trigger callback
|
||||||
code(false);
|
code(false);
|
||||||
|
|
||||||
// remove object from array
|
// remove object from array
|
||||||
var index = self.port_removed_callbacks.indexOf(obj);
|
const index = self.port_removed_callbacks.indexOf(obj);
|
||||||
if (index > -1) self.port_removed_callbacks.splice(index, 1);
|
if (index > -1) {
|
||||||
|
self.port_removed_callbacks.splice(index, 1);
|
||||||
|
}
|
||||||
}, (timeout) ? timeout : 10000);
|
}, (timeout) ? timeout : 10000);
|
||||||
} else {
|
} else {
|
||||||
obj.timer = false;
|
obj.timer = false;
|
||||||
|
@ -236,15 +257,15 @@ PortHandler.port_removed = function (name, code, timeout, ignore_timeout) {
|
||||||
|
|
||||||
// accepting single level array with "value" as key
|
// accepting single level array with "value" as key
|
||||||
PortHandler.array_difference = function (firstArray, secondArray) {
|
PortHandler.array_difference = function (firstArray, secondArray) {
|
||||||
var cloneArray = [];
|
const cloneArray = [];
|
||||||
|
|
||||||
// create hardcopy
|
// create hardcopy
|
||||||
for (var i = 0; i < firstArray.length; i++) {
|
for (let i = 0; i < firstArray.length; i++) {
|
||||||
cloneArray.push(firstArray[i]);
|
cloneArray.push(firstArray[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = 0; i < secondArray.length; i++) {
|
for (let i = 0; i < secondArray.length; i++) {
|
||||||
if (cloneArray.indexOf(secondArray[i]) != -1) {
|
if (cloneArray.indexOf(secondArray[i]) !== -1) {
|
||||||
cloneArray.splice(cloneArray.indexOf(secondArray[i]), 1);
|
cloneArray.splice(cloneArray.indexOf(secondArray[i]), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,17 +274,21 @@ PortHandler.array_difference = function (firstArray, secondArray) {
|
||||||
};
|
};
|
||||||
|
|
||||||
PortHandler.flush_callbacks = function () {
|
PortHandler.flush_callbacks = function () {
|
||||||
var killed = 0;
|
let killed = 0;
|
||||||
|
|
||||||
for (var i = this.port_detected_callbacks.length - 1; i >= 0; i--) {
|
for (let i = this.port_detected_callbacks.length - 1; i >= 0; i--) {
|
||||||
if (this.port_detected_callbacks[i].timer) clearTimeout(this.port_detected_callbacks[i].timer);
|
if (this.port_detected_callbacks[i].timer) {
|
||||||
|
clearTimeout(this.port_detected_callbacks[i].timer);
|
||||||
|
}
|
||||||
this.port_detected_callbacks.splice(i, 1);
|
this.port_detected_callbacks.splice(i, 1);
|
||||||
|
|
||||||
killed++;
|
killed++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var i = this.port_removed_callbacks.length - 1; i >= 0; i--) {
|
for (let i = this.port_removed_callbacks.length - 1; i >= 0; i--) {
|
||||||
if (this.port_removed_callbacks[i].timer) clearTimeout(this.port_removed_callbacks[i].timer);
|
if (this.port_removed_callbacks[i].timer) {
|
||||||
|
clearTimeout(this.port_removed_callbacks[i].timer);
|
||||||
|
}
|
||||||
this.port_removed_callbacks.splice(i, 1);
|
this.port_removed_callbacks.splice(i, 1);
|
||||||
|
|
||||||
killed++;
|
killed++;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue