Make firmware flasher more robust

Check for DFU/serial port regularly during 10 seconds instead of
waiting 1s and trying once. Also, make sure that we don't mistake
DFU devices with serial ones, since the serial port might appear
briefly while the FC is rebooting.
pull/814/head
Alberto García Hierro 5 years ago committed by Pawel Spychalski (DzikuVx)
parent 002d55f180
commit 0a21a1431f

@ -100,25 +100,45 @@ STM32_protocol.prototype.connect = function (port, baud, hex, options, callback)
serial.send(bufferOut, function () {
serial.disconnect(function (result) {
if (result) {
// delay to allow board to boot in bootloader mode
// required to detect if a DFU device appears
setTimeout(function() {
// refresh device list
var intervalMs = 200;
var retries = 0;
var maxRetries = 50; // timeout after intervalMs * 50
var interval = setInterval(function() {
var tryFailed = function() {
retries++;
if (retries > maxRetries) {
clearInterval(interval);
GUI.log('<span style="color: red">Failed</span> to flash ' + port);
}
}
// Check for DFU devices
PortHandler.check_usb_devices(function(dfu_available) {
if (dfu_available) {
clearInterval(interval);
STM32DFU.connect(usbDevices.STM32DFU, hex, options);
} else {
return;
}
// Check for the serial port
serial.getDevices(function(devices) {
if (devices && devices.includes(port)) {
// Serial port might briefly reappear on DFU devices while
// the FC is rebooting, so we don't clear the interval
// until we succesfully connect.
serial.connect(port, {bitrate: self.baud, parityBit: 'even', stopBits: 'one'}, function (openInfo) {
if (openInfo) {
clearInterval(interval);
self.initialize();
} else {
GUI.connect_lock = false;
GUI.log('<span style="color: red">Failed</span> to open serial port');
tryFailed();
}
});
return;
}
tryFailed();
});
});
}, 1000);
}, intervalMs);
} else {
GUI.connect_lock = false;
}

Loading…
Cancel
Save