mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-13 11:29:53 +03:00
major port handler rework
This commit is contained in:
parent
801ed36fd7
commit
38d6a80ae2
3 changed files with 115 additions and 108 deletions
|
@ -1,4 +1,5 @@
|
|||
function port_handler() {
|
||||
this.main_timeout_reference;
|
||||
this.initial_ports = false;
|
||||
|
||||
this.port_detected_callbacks = [];
|
||||
|
@ -6,122 +7,128 @@ function port_handler() {
|
|||
}
|
||||
|
||||
port_handler.prototype.initialize = function() {
|
||||
// start listening, check after 250ms
|
||||
this.check();
|
||||
};
|
||||
|
||||
port_handler.prototype.check = function() {
|
||||
var self = this;
|
||||
|
||||
// 250ms refresh interval, fire instantly after creation
|
||||
GUI.interval_add('port_handler', function() {
|
||||
serial.getDevices(function(current_ports) {
|
||||
// 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);
|
||||
|
||||
if (self.initial_ports != false) {
|
||||
if (removed_ports.length > 1) {
|
||||
console.log('PortHandler - Ports removed: ' + removed_ports);
|
||||
} else {
|
||||
console.log('PortHandler - Port removed: ' + removed_ports[0]);
|
||||
}
|
||||
}
|
||||
|
||||
// disconnect "UI" if necessary
|
||||
// Keep in mind that this routine can not fire during atmega32u4 reboot procedure !!!
|
||||
if (GUI.connected_to) {
|
||||
for (var i = 0; i < removed_ports.length; i++) {
|
||||
if (removed_ports[i] == GUI.connected_to) {
|
||||
$('div#port-picker a.connect').click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.update_port_select(current_ports);
|
||||
|
||||
// trigger callbacks (only after initialization)
|
||||
if (self.initial_ports) {
|
||||
for (var i = 0; i < self.port_removed_callbacks.length; i++) {
|
||||
var obj = self.port_removed_callbacks[i];
|
||||
|
||||
// remove timeout
|
||||
GUI.timeout_remove(obj.name);
|
||||
|
||||
// trigger callback
|
||||
obj.code(removed_ports);
|
||||
}
|
||||
self.port_removed_callbacks = []; // drop references
|
||||
}
|
||||
|
||||
// auto-select last used port (only during initialization)
|
||||
if (!self.initial_ports) {
|
||||
chrome.storage.local.get('last_used_port', function(result) {
|
||||
// if last_used_port was set, we try to select it
|
||||
if (result.last_used_port) {
|
||||
current_ports.forEach(function(port) {
|
||||
if (port == result.last_used_port) {
|
||||
console.log('Selecting last used port: ' + result.last_used_port);
|
||||
|
||||
$('div#port-picker .port select').val(result.last_used_port);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log('Last used port wasn\'t saved "yet", auto-select disabled.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!self.initial_ports) {
|
||||
// initialize
|
||||
self.initial_ports = current_ports;
|
||||
serial.getDevices(function(current_ports) {
|
||||
// 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);
|
||||
|
||||
if (self.initial_ports != false) {
|
||||
if (removed_ports.length > 1) {
|
||||
console.log('PortHandler - Ports removed: ' + removed_ports);
|
||||
} else {
|
||||
for (var i = 0; i < removed_ports.length; i++) {
|
||||
self.initial_ports.splice(self.initial_ports.indexOf(removed_ports[i]), 1);
|
||||
console.log('PortHandler - Port removed: ' + removed_ports[0]);
|
||||
}
|
||||
}
|
||||
|
||||
// disconnect "UI" if necessary
|
||||
// Keep in mind that this routine can not fire during atmega32u4 reboot procedure !!!
|
||||
if (GUI.connected_to) {
|
||||
for (var i = 0; i < removed_ports.length; i++) {
|
||||
if (removed_ports[i] == GUI.connected_to) {
|
||||
$('div#port-picker a.connect').click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// new port detected
|
||||
var new_ports = self.array_difference(current_ports, self.initial_ports);
|
||||
self.update_port_select(current_ports);
|
||||
|
||||
if (new_ports.length) {
|
||||
if (new_ports.length > 1) {
|
||||
console.log('PortHandler - Ports found: ' + new_ports);
|
||||
} else {
|
||||
console.log('PortHandler - Port found: ' + new_ports[0]);
|
||||
}
|
||||
|
||||
self.update_port_select(current_ports);
|
||||
|
||||
// select / highlight new port, if connected -> select connected port
|
||||
if (!GUI.connected_to) {
|
||||
$('div#port-picker .port select').val(new_ports[0]);
|
||||
} else {
|
||||
$('div#port-picker .port select').val(GUI.connected_to);
|
||||
}
|
||||
|
||||
// start connect procedure (if statement is valid)
|
||||
if (GUI.auto_connect && !GUI.connecting_to && !GUI.connected_to) {
|
||||
// we need firmware flasher protection over here
|
||||
if (GUI.active_tab != 'firmware_flasher') {
|
||||
GUI.timeout_add('auto-connect_timeout', function() {
|
||||
$('div#port-picker a.connect').click();
|
||||
}, 50); // small timeout so we won't get any nasty connect errors due to system initializing the bus
|
||||
}
|
||||
}
|
||||
|
||||
// trigger callbacks
|
||||
for (var i = 0; i < self.port_detected_callbacks.length; i++) {
|
||||
var obj = self.port_detected_callbacks[i];
|
||||
// trigger callbacks (only after initialization)
|
||||
if (self.initial_ports) {
|
||||
for (var i = 0; i < self.port_removed_callbacks.length; i++) {
|
||||
var obj = self.port_removed_callbacks[i];
|
||||
|
||||
// remove timeout
|
||||
GUI.timeout_remove(obj.name);
|
||||
clearTimeout(obj.timer);
|
||||
|
||||
// trigger callback
|
||||
obj.code(new_ports);
|
||||
obj.code(removed_ports);
|
||||
}
|
||||
self.port_detected_callbacks = []; // drop references
|
||||
|
||||
self.initial_ports = current_ports;
|
||||
self.port_removed_callbacks = []; // drop references
|
||||
}
|
||||
});
|
||||
}, 250, true);
|
||||
|
||||
// auto-select last used port (only during initialization)
|
||||
if (!self.initial_ports) {
|
||||
chrome.storage.local.get('last_used_port', function(result) {
|
||||
// if last_used_port was set, we try to select it
|
||||
if (result.last_used_port) {
|
||||
current_ports.forEach(function(port) {
|
||||
if (port == result.last_used_port) {
|
||||
console.log('Selecting last used port: ' + result.last_used_port);
|
||||
|
||||
$('div#port-picker .port select').val(result.last_used_port);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log('Last used port wasn\'t saved "yet", auto-select disabled.');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!self.initial_ports) {
|
||||
// initialize
|
||||
self.initial_ports = current_ports;
|
||||
} else {
|
||||
for (var i = 0; i < removed_ports.length; i++) {
|
||||
self.initial_ports.splice(self.initial_ports.indexOf(removed_ports[i]), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// new port detected
|
||||
var new_ports = self.array_difference(current_ports, self.initial_ports);
|
||||
|
||||
if (new_ports.length) {
|
||||
if (new_ports.length > 1) {
|
||||
console.log('PortHandler - Ports found: ' + new_ports);
|
||||
} else {
|
||||
console.log('PortHandler - Port found: ' + new_ports[0]);
|
||||
}
|
||||
|
||||
self.update_port_select(current_ports);
|
||||
|
||||
// select / highlight new port, if connected -> select connected port
|
||||
if (!GUI.connected_to) {
|
||||
$('div#port-picker .port select').val(new_ports[0]);
|
||||
} else {
|
||||
$('div#port-picker .port select').val(GUI.connected_to);
|
||||
}
|
||||
|
||||
// start connect procedure (if statement is valid)
|
||||
if (GUI.auto_connect && !GUI.connecting_to && !GUI.connected_to) {
|
||||
// we need firmware flasher protection over here
|
||||
if (GUI.active_tab != 'firmware_flasher') {
|
||||
GUI.timeout_add('auto-connect_timeout', function() {
|
||||
$('div#port-picker a.connect').click();
|
||||
}, 50); // small timeout so we won't get any nasty connect errors due to system initializing the bus
|
||||
}
|
||||
}
|
||||
|
||||
// trigger callbacks
|
||||
for (var i = 0; i < self.port_detected_callbacks.length; i++) {
|
||||
var obj = self.port_detected_callbacks[i];
|
||||
|
||||
// remove timeout
|
||||
clearTimeout(obj.timer);
|
||||
|
||||
// trigger callback
|
||||
obj.code(new_ports);
|
||||
}
|
||||
self.port_detected_callbacks = []; // drop references
|
||||
|
||||
self.initial_ports = current_ports;
|
||||
}
|
||||
|
||||
self.main_timeout_reference = setTimeout(function() {
|
||||
self.check();
|
||||
}, 250);
|
||||
});
|
||||
};
|
||||
|
||||
port_handler.prototype.update_port_select = function(ports) {
|
||||
|
@ -141,7 +148,7 @@ port_handler.prototype.port_detected = function(name, code, timeout) {
|
|||
var obj = {'name': name, 'code': code, 'timeout': timeout, 'timer': false};
|
||||
|
||||
if (timeout) {
|
||||
obj.timer = GUI.timeout_add(name, function() {
|
||||
obj.timer = setTimeout(function() {
|
||||
console.log('PortHandler - port detected timeout triggered - ' + obj.name);
|
||||
|
||||
// trigger callback
|
||||
|
@ -149,7 +156,7 @@ port_handler.prototype.port_detected = function(name, code, timeout) {
|
|||
|
||||
// reset callback array
|
||||
self.port_detected_callbacks = [];
|
||||
}, timeout).timer;
|
||||
}, timeout);
|
||||
}
|
||||
|
||||
this.port_detected_callbacks.push(obj);
|
||||
|
@ -160,7 +167,7 @@ port_handler.prototype.port_removed = function(name, code, timeout) {
|
|||
var obj = {'name': name, 'code': code, 'timeout': timeout, 'timer': false};
|
||||
|
||||
if (timeout) {
|
||||
obj.timer = GUI.timeout_add(name, function() {
|
||||
obj.timer = setTimeout(function() {
|
||||
console.log('PortHandler - port removed timeout triggered - ' + obj.name);
|
||||
|
||||
// trigger callback
|
||||
|
@ -168,7 +175,7 @@ port_handler.prototype.port_removed = function(name, code, timeout) {
|
|||
|
||||
// reset callback array
|
||||
self.port_removed_callbacks = [];
|
||||
}, timeout).timer;
|
||||
}, timeout);
|
||||
}
|
||||
|
||||
this.port_removed_callbacks.push(obj);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue