diff --git a/js/gui.js b/js/gui.js index 3b80189fb7..4e6a80ecd1 100644 --- a/js/gui.js +++ b/js/gui.js @@ -226,7 +226,7 @@ GUI_control.prototype.tab_switch_cleanup = function(callback) { }); break; case 'sensors': - GUI.interval_kill_all(['port_handler', 'port_usage']); + GUI.interval_kill_all(['port_usage']); serial.empty_output_buffer(); // sensor data tab uses scrollbars, emptying the content before loading another tab diff --git a/js/port_handler.js b/js/port_handler.js index db63731882..da6df38fd3 100644 --- a/js/port_handler.js +++ b/js/port_handler.js @@ -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); diff --git a/js/serial_backend.js b/js/serial_backend.js index 4ac024b453..98059d9088 100644 --- a/js/serial_backend.js +++ b/js/serial_backend.js @@ -22,7 +22,7 @@ $(document).ready(function() { serial.connect(selected_port, {bitrate: selected_baud}, onOpen); } else { // Disable any active "data pulling" timer - GUI.interval_kill_all(['port_handler']); + GUI.interval_kill_all(); GUI.tab_switch_cleanup(); GUI.timeout_remove('connecting');