1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-17 13:25:24 +03:00

Added button to exit DFU.

This commit is contained in:
mikeller 2020-01-26 19:40:57 +13:00
parent 4475586e59
commit d293d6b1e7
8 changed files with 261 additions and 191 deletions

View file

@ -2811,6 +2811,9 @@
"firmwareFlasherButtonDownloading": { "firmwareFlasherButtonDownloading": {
"message": "Downloading..." "message": "Downloading..."
}, },
"firmwareFlasherExitDfu": {
"message": "Exit DFU Mode"
},
"firmwareFlasherFlashFirmware": { "firmwareFlasherFlashFirmware": {
"message": "Flash Firmware" "message": "Flash Firmware"
}, },

View file

@ -215,6 +215,17 @@
background-color: #dedcdc; background-color: #dedcdc;
} }
.tab-firmware_flasher .buttons a.exit_dfu.locked {
float: left;
background-color: #b8b8b8;
}
.tab-firmware_flasher .buttons a.exit_dfu.locked:hover {
float: left;
cursor: default;
background-color: #b8b8b8;
}
.tab-firmware_flasher .buttons a.flash_firmware.locked { .tab-firmware_flasher .buttons a.flash_firmware.locked {
background-color: #b8b8b8; background-color: #b8b8b8;
} }

View file

@ -150,15 +150,17 @@ PortHandler.check = function () {
PortHandler.check_usb_devices = function (callback) { PortHandler.check_usb_devices = function (callback) {
chrome.usb.getDevices(usbDevices, function (result) { chrome.usb.getDevices(usbDevices, function (result) {
const portPickerElement = $("div#port-picker #port");
const dfuElement = portPickerElement.children("[value='DFU']");
if (result.length) { if (result.length) {
if (!$("div#port-picker #port [value='DFU']").length) { if (!dfuElement.length) {
$('div#port-picker #port').append($('<option/>', {value: "DFU", text: "DFU", data: {isDFU: true}})); portPickerElement.append($('<option/>', {value: "DFU", text: "DFU", data: {isDFU: true}}));
$('div#port-picker #port').val('DFU'); portPickerElement.val('DFU').change();
} }
self.dfu_available = true; self.dfu_available = true;
} else { } else {
if ($("div#port-picker #port [value='DFU']").length) { if (dfuElement.length) {
$("div#port-picker #port [value='DFU']").remove(); dfuElement.remove();
} }
self.dfu_available = false; self.dfu_available = false;
} }
@ -168,15 +170,15 @@ PortHandler.check_usb_devices = function (callback) {
}; };
PortHandler.update_port_select = function (ports) { PortHandler.update_port_select = function (ports) {
$('div#port-picker #port').html(''); // drop previous one const portPickerElement = $("div#port-picker #port");
portPickerElement.empty();
for (var i = 0; i < ports.length; i++) { for (var i = 0; i < ports.length; i++) {
$('div#port-picker #port').append($("<option/>", {value: ports[i], text: ports[i], data: {isManual: false}})); portPickerElement.append($("<option/>", {value: ports[i], text: ports[i], data: {isManual: false}}));
} }
$('div#port-picker #port').append($("<option/>", {value: 'manual', i18n: 'portsSelectManual', data: {isManual: true}})); 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) {

View file

@ -73,10 +73,13 @@ STM32DFU_protocol.prototype.connect = function (device, hex, options, callback)
self.callback = callback; self.callback = callback;
self.options = { self.options = {
erase_chip: false erase_chip: false,
exitDfu: false,
}; };
if (options.erase_chip) { if (options.exitDfu) {
self.options.exitDfu = true;
} else if (options.erase_chip) {
self.options.erase_chip = true; self.options.erase_chip = true;
} }
@ -85,9 +88,7 @@ STM32DFU_protocol.prototype.connect = function (device, hex, options, callback)
self.verify_hex = []; self.verify_hex = [];
// reset progress bar to initial state // reset progress bar to initial state
TABS.firmware_flasher.flashingMessage(null, TABS.firmware_flasher.FLASH_MESSAGE_TYPES.NEUTRAL) TABS.firmware_flasher.flashingMessage(null, TABS.firmware_flasher.FLASH_MESSAGE_TYPES.NEUTRAL).flashProgress(0);
.flashProgress(0);
chrome.usb.getDevices(device, function (result) { chrome.usb.getDevices(device, function (result) {
if (result.length) { if (result.length) {
@ -157,12 +158,16 @@ STM32DFU_protocol.prototype.claimInterface = function (interfaceNumber) {
chrome.usb.claimInterface(this.handle, interfaceNumber, function claimed() { chrome.usb.claimInterface(this.handle, interfaceNumber, function claimed() {
if(self.checkChromeError()) { if(self.checkChromeError()) {
console.log('Failed to claim USB device!'); console.log('Failed to claim USB device!');
self.upload_procedure(99); self.cleanup();
} }
console.log('Claimed interface: ' + interfaceNumber); console.log('Claimed interface: ' + interfaceNumber);
if (self.options.exitDfu) {
self.leave();
} else {
self.upload_procedure(0); self.upload_procedure(0);
}
}); });
}; };
@ -523,7 +528,7 @@ STM32DFU_protocol.prototype.loadAddress = function (address, callback, abort) {
} else { } else {
console.log('Failed to execute address load'); console.log('Failed to execute address load');
if(typeof abort === "undefined" || abort) { if(typeof abort === "undefined" || abort) {
self.upload_procedure(99); self.cleanup();
} else { } else {
callback(data); callback(data);
} }
@ -532,7 +537,7 @@ STM32DFU_protocol.prototype.loadAddress = function (address, callback, abort) {
}, delay); }, delay);
} else { } else {
console.log('Failed to request address load'); console.log('Failed to request address load');
self.upload_procedure(99); self.cleanup();
} }
}); });
}); });
@ -562,7 +567,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
self.getChipInfo(0, function (chipInfo, resultCode) { self.getChipInfo(0, function (chipInfo, resultCode) {
if (resultCode != 0 || typeof chipInfo === "undefined") { if (resultCode != 0 || typeof chipInfo === "undefined") {
console.log('Failed to detect chip info, resultCode: ' + resultCode); console.log('Failed to detect chip info, resultCode: ' + resultCode);
self.upload_procedure(99); self.cleanup();
} else { } else {
if (typeof chipInfo.internal_flash !== "undefined") { if (typeof chipInfo.internal_flash !== "undefined") {
// internal flash // internal flash
@ -577,7 +582,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
GUI.log(i18n.getMessage('dfu_error_image_size', GUI.log(i18n.getMessage('dfu_error_image_size',
[(self.hex.bytes_total / 1024.0).toFixed(1), [(self.hex.bytes_total / 1024.0).toFixed(1),
(self.available_flash_size / 1024.0).toFixed(1)])); (self.available_flash_size / 1024.0).toFixed(1)]));
self.upload_procedure(99); self.cleanup();
} else { } else {
self.getFunctionalDescriptor(0, function (descriptor, resultCode) { self.getFunctionalDescriptor(0, function (descriptor, resultCode) {
self.transferSize = resultCode ? 2048 : descriptor.wTransferSize; self.transferSize = resultCode ? 2048 : descriptor.wTransferSize;
@ -604,7 +609,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
GUI.log(i18n.getMessage('dfu_error_image_size', GUI.log(i18n.getMessage('dfu_error_image_size',
[(self.hex.bytes_total / 1024.0).toFixed(1), [(self.hex.bytes_total / 1024.0).toFixed(1),
(self.available_flash_size / 1024.0).toFixed(1)])); (self.available_flash_size / 1024.0).toFixed(1)]));
self.upload_procedure(99); self.cleanup();
} else { } else {
self.getFunctionalDescriptor(0, function (descriptor, resultCode) { self.getFunctionalDescriptor(0, function (descriptor, resultCode) {
self.transferSize = resultCode ? 2048 : descriptor.wTransferSize; self.transferSize = resultCode ? 2048 : descriptor.wTransferSize;
@ -616,7 +621,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
} }
} else { } else {
console.log('Failed to detect internal or external flash'); console.log('Failed to detect internal or external flash');
self.upload_procedure(99); self.cleanup();
} }
} }
}); });
@ -624,7 +629,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
case 1: case 1:
if (typeof self.chipInfo.option_bytes === "undefined") { if (typeof self.chipInfo.option_bytes === "undefined") {
console.log('Failed to detect option bytes'); console.log('Failed to detect option bytes');
self.upload_procedure(99); self.cleanup();
} }
var unprotect = function() { var unprotect = function() {
@ -666,7 +671,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
GUI.log(i18n.getMessage('stm32UnprotectFailed')); GUI.log(i18n.getMessage('stm32UnprotectFailed'));
TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32UnprotectFailed'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID); TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32UnprotectFailed'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID);
console.log(data); console.log(data);
self.upload_procedure(99); self.cleanup();
} }
}, 2000); // this should stall/disconnect anyways. so we only wait 2 sec max. }, 2000); // this should stall/disconnect anyways. so we only wait 2 sec max.
}, incr); }, incr);
@ -675,7 +680,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
let messageUnprotectInitFailed = i18n.getMessage('stm32UnprotectInitFailed') let messageUnprotectInitFailed = i18n.getMessage('stm32UnprotectInitFailed')
GUI.log(messageUnprotectInitFailed); GUI.log(messageUnprotectInitFailed);
TABS.firmware_flasher.flashingMessage(messageUnprotectInitFailed, TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID) TABS.firmware_flasher.flashingMessage(messageUnprotectInitFailed, TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID)
self.upload_procedure(99); self.cleanup();
} }
}); });
}); });
@ -686,7 +691,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
self.controlTransfer('in', self.request.UPLOAD, 2, 0, self.chipInfo.option_bytes.total_size, 0, function (ob_data, errcode) { self.controlTransfer('in', self.request.UPLOAD, 2, 0, self.chipInfo.option_bytes.total_size, 0, function (ob_data, errcode) {
if(errcode) { if(errcode) {
console.log('USB transfer error while reading option bytes: ' + errcode1); console.log('USB transfer error while reading option bytes: ' + errcode1);
self.upload_procedure(99); self.cleanup();
return; return;
} }
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) { self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
@ -710,16 +715,16 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) { self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
if (data[4] == self.state.dfuDNLOAD_IDLE) { if (data[4] == self.state.dfuDNLOAD_IDLE) {
console.log('Failed to write ob'); console.log('Failed to write ob');
self.upload_procedure(99); self.cleanup();
} else { } else {
console.log('Success writing ob'); console.log('Success writing ob');
self.upload_procedure(99); self.cleanup();
} }
}); });
}, delay); }, delay);
} else { } else {
console.log('Failed to initiate write ob'); console.log('Failed to initiate write ob');
self.upload_procedure(99); self.cleanup();
} }
}); });
}); });
@ -750,7 +755,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
self.clearStatus(tryReadOB); self.clearStatus(tryReadOB);
} else { } else {
GUI.log(i18n.getMessage('stm32AddressLoadUnknown')); GUI.log(i18n.getMessage('stm32AddressLoadUnknown'));
self.upload_procedure(99); self.cleanup();
} }
} }
@ -792,7 +797,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
if (erase_pages.length === 0) { if (erase_pages.length === 0) {
console.log('Aborting, No flash pages to erase'); console.log('Aborting, No flash pages to erase');
TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32InvalidHex'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID); TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32InvalidHex'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID);
self.upload_procedure(99); self.cleanup();
break; break;
} }
@ -851,7 +856,7 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
erase_page_next(); erase_page_next();
} else { } else {
console.log('Failed to erase page 0x' + page_addr.toString(16) + ' (did not reach dfuIDLE after clearing'); console.log('Failed to erase page 0x' + page_addr.toString(16) + ' (did not reach dfuIDLE after clearing');
self.upload_procedure(99); self.cleanup();
} }
}) })
}); });
@ -859,13 +864,13 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
erase_page_next(); erase_page_next();
} else { } else {
console.log('Failed to erase page 0x' + page_addr.toString(16)); console.log('Failed to erase page 0x' + page_addr.toString(16));
self.upload_procedure(99); self.cleanup();
} }
}); });
}, delay); }, delay);
} else { } else {
console.log('Failed to initiate page erase, page 0x' + page_addr.toString(16)); console.log('Failed to initiate page erase, page 0x' + page_addr.toString(16));
self.upload_procedure(99); self.cleanup();
} }
}); });
}); });
@ -914,13 +919,13 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
write(); write();
} else { } else {
console.log('Failed to write ' + bytes_to_write + 'bytes to 0x' + address.toString(16)); console.log('Failed to write ' + bytes_to_write + 'bytes to 0x' + address.toString(16));
self.upload_procedure(99); self.cleanup();
} }
}); });
}, delay); }, delay);
} else { } else {
console.log('Failed to initiate write ' + bytes_to_write + 'bytes to 0x' + address.toString(16)); console.log('Failed to initiate write ' + bytes_to_write + 'bytes to 0x' + address.toString(16));
self.upload_procedure(99); self.cleanup();
} }
}); });
}) })
@ -1022,38 +1027,50 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32ProgrammingSuccessful'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.VALID); TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32ProgrammingSuccessful'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.VALID);
// proceed to next step // proceed to next step
self.upload_procedure(6); self.leave();
} else { } else {
console.log('Programming: FAILED'); console.log('Programming: FAILED');
// update progress bar // update progress bar
TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32ProgrammingFailed'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID); TABS.firmware_flasher.flashingMessage(i18n.getMessage('stm32ProgrammingFailed'), TABS.firmware_flasher.FLASH_MESSAGE_TYPES.INVALID);
// disconnect // disconnect
self.upload_procedure(99); self.cleanup();
} }
} }
} }
} }
break; break;
case 6: }
// jump to application code };
var address = self.hex.data[0].address;
STM32DFU_protocol.prototype.leave = function () {
// leave DFU
const self = this;
let address;
if (self.hex) {
address = self.hex.data[0].address;
} else {
// Assuming we're running off internal flash
address = 0x08000000;
}
self.clearStatus(function () { self.clearStatus(function () {
self.loadAddress(address, leave); self.loadAddress(address, function () {
}); // 'downloading' 0 bytes to the program start address followed by a GETSTATUS is used to trigger DFU exit on STM32
var leave = function () {
self.controlTransfer('out', self.request.DNLOAD, 0, 0, 0, 0, function () { self.controlTransfer('out', self.request.DNLOAD, 0, 0, 0, 0, function () {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) { self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
self.upload_procedure(99); self.cleanup();
}); });
}); });
} });
});
};
STM32DFU_protocol.prototype.cleanup = function () {
const self = this;
break;
case 99:
// cleanup
self.releaseInterface(0); self.releaseInterface(0);
GUI.connect_lock = false; GUI.connect_lock = false;
@ -1062,8 +1079,8 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
console.log('Script finished after: ' + (timeSpent / 1000) + ' seconds'); console.log('Script finished after: ' + (timeSpent / 1000) + ' seconds');
if (self.callback) self.callback(); if (self.callback) {
break; self.callback();
} }
}; };

View file

@ -48,22 +48,27 @@ function initializeSerialBackend() {
GUI.configuration_loaded = false; GUI.configuration_loaded = false;
var selected_baud = parseInt($('div#port-picker #baud').val()); var selected_baud = parseInt($('div#port-picker #baud').val());
var selected_port = $('div#port-picker #port option:selected').data().isManual ? const selectedPort = $('div#port-picker #port option:selected');
$('#port-override').val() :
String($('div#port-picker #port').val()); let portName;
if (selected_port === 'DFU') { if (selectedPort.data().isManual) {
GUI.log(i18n.getMessage('dfu_connect_message')); portName = $('#port-override').val();
} else {
portName = String($('div#port-picker #port').val());
} }
else if (selected_port != '0') {
if (selectedPort.data().isDFU) {
$('select#baud').hide();
} else if (portName !== '0') {
if (!clicks) { if (!clicks) {
console.log('Connecting to: ' + selected_port); console.log(`Connecting to: ${portName}`);
GUI.connecting_to = selected_port; GUI.connecting_to = portName;
// lock port select & baud while we are connecting / connected // lock port select & baud while we are connecting / connected
$('div#port-picker #port, div#port-picker #baud, div#port-picker #delay').prop('disabled', true); $('div#port-picker #port, div#port-picker #baud, div#port-picker #delay').prop('disabled', true);
$('div.connect_controls a.connect_state').text(i18n.getMessage('connecting')); $('div.connect_controls a.connect_state').text(i18n.getMessage('connecting'));
serial.connect(selected_port, {bitrate: selected_baud}, onOpen); serial.connect(portName, {bitrate: selected_baud}, onOpen);
toggleStatus(); toggleStatus();
} else { } else {

View file

@ -56,6 +56,7 @@ TABS.firmware_flasher.initialize = function (callback) {
// send data/string over for processing // send data/string over for processing
worker.postMessage(str); worker.postMessage(str);
} }
function show_loaded_hex(summary) { function show_loaded_hex(summary) {
self.flashingMessage('<a class="save_firmware" href="#" title="Save Firmware">' + i18n.getMessage('firmwareFlasherFirmwareOnlineLoaded', self.parsed_hex.bytes_total) + '</a>', self.flashingMessage('<a class="save_firmware" href="#" title="Save Firmware">' + i18n.getMessage('firmwareFlasherFirmwareOnlineLoaded', self.parsed_hex.bytes_total) + '</a>',
self.FLASH_MESSAGE_TYPES.NEUTRAL); self.FLASH_MESSAGE_TYPES.NEUTRAL);
@ -87,6 +88,7 @@ TABS.firmware_flasher.initialize = function (callback) {
}); });
$('div.release_info').slideDown(); $('div.release_info').slideDown();
} }
function process_hex(data, summary) { function process_hex(data, summary) {
self.intel_hex = data; self.intel_hex = data;
@ -388,7 +390,7 @@ TABS.firmware_flasher.initialize = function (callback) {
i18n.localizePage(); i18n.localizePage();
buildType_e.change(function() { buildType_e.change(function() {
analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHANNEL, $(this).find('option:selected').text()); analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHANNEL, $('option:selected', this).text());
$("a.load_remote_file").addClass('disabled'); $("a.load_remote_file").addClass('disabled');
var build_type = $(this).val(); var build_type = $(this).val();
@ -664,6 +666,7 @@ TABS.firmware_flasher.initialize = function (callback) {
self.flashingMessage(i18n.getMessage('firmwareFlasherFirmwareLocalLoaded', self.parsed_hex.bytes_total), self.FLASH_MESSAGE_TYPES.NEUTRAL); self.flashingMessage(i18n.getMessage('firmwareFlasherFirmwareLocalLoaded', self.parsed_hex.bytes_total), self.FLASH_MESSAGE_TYPES.NEUTRAL);
} }
} }
function cleanUnifiedConfigFile(input) { function cleanUnifiedConfigFile(input) {
let output = []; let output = [];
let inComment = false; let inComment = false;
@ -686,6 +689,127 @@ TABS.firmware_flasher.initialize = function (callback) {
} }
return output.join(''); return output.join('');
} }
const portPickerElement = $('div#port-picker #port');
function flashFirmware(firmware) {
var options = {};
var eraseAll = false;
if ($('input.erase_chip').is(':checked')) {
options.erase_chip = true;
eraseAll = true
}
analytics.setFirmwareData(analytics.DATA.FIRMWARE_ERASE_ALL, eraseAll.toString());
if (!$('option:selected', portPickerElement).data().isDFU) {
if (String(portPickerElement.val()) !== '0') {
const port = String(portPickerElement.val());
if ($('input.updating').is(':checked')) {
options.no_reboot = true;
} else {
options.reboot_baud = parseInt($('div#port-picker #baud').val());
}
let baud = 115200;
if ($('input.flash_manual_baud').is(':checked')) {
baud = parseInt($('#flash_manual_baud_rate').val());
}
analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'Flashing', self.unifiedTargetConfigName || null);
STM32.connect(port, baud, firmware, options);
} else {
console.log('Please select valid serial port');
GUI.log(i18n.getMessage('firmwareFlasherNoValidPort'));
}
} else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'Flashing', self.unifiedTargetConfigName || null);
STM32DFU.connect(usbDevices, firmware, options);
}
}
ConfigStorage.get('erase_chip', function (result) {
if (result.erase_chip) {
$('input.erase_chip').prop('checked', true);
} else {
$('input.erase_chip').prop('checked', false);
}
$('input.erase_chip').change(function () {
ConfigStorage.set({'erase_chip': $(this).is(':checked')});
}).change();
});
chrome.storage.local.get('show_development_releases', function (result) {
$('input.show_development_releases')
.prop('checked', result.show_development_releases)
.change(function () {
chrome.storage.local.set({'show_development_releases': $(this).is(':checked')});
}).change();
});
chrome.storage.local.get('selected_build_type', function (result) {
// ensure default build type is selected
buildType_e.val(result.selected_build_type || 0).trigger('change');
});
ConfigStorage.get('no_reboot_sequence', function (result) {
if (result.no_reboot_sequence) {
$('input.updating').prop('checked', true);
$('.flash_on_connect_wrapper').show();
} else {
$('input.updating').prop('checked', false);
}
// bind UI hook so the status is saved on change
$('input.updating').change(function() {
var status = $(this).is(':checked');
if (status) {
$('.flash_on_connect_wrapper').show();
} else {
$('input.flash_on_connect').prop('checked', false).change();
$('.flash_on_connect_wrapper').hide();
}
ConfigStorage.set({'no_reboot_sequence': status});
});
$('input.updating').change();
});
ConfigStorage.get('flash_manual_baud', function (result) {
if (result.flash_manual_baud) {
$('input.flash_manual_baud').prop('checked', true);
} else {
$('input.flash_manual_baud').prop('checked', false);
}
// bind UI hook so the status is saved on change
$('input.flash_manual_baud').change(function() {
var status = $(this).is(':checked');
ConfigStorage.set({'flash_manual_baud': status});
});
$('input.flash_manual_baud').change();
});
ConfigStorage.get('flash_manual_baud_rate', function (result) {
$('#flash_manual_baud_rate').val(result.flash_manual_baud_rate);
// bind UI hook so the status is saved on change
$('#flash_manual_baud_rate').change(function() {
var baud = parseInt($('#flash_manual_baud_rate').val());
ConfigStorage.set({'flash_manual_baud_rate': baud});
});
$('input.flash_manual_baud_rate').change();
});
// UI Hooks // UI Hooks
$('a.load_file').click(function () { $('a.load_file').click(function () {
self.enableFlashing(false); self.enableFlashing(false);
@ -778,7 +902,7 @@ TABS.firmware_flasher.initialize = function (callback) {
let release = $("option:selected", evt.target).data("summary"); let release = $("option:selected", evt.target).data("summary");
let isCached = FirmwareCache.has(release); let isCached = FirmwareCache.has(release);
if (evt.target.value=="0" || isCached) { if (evt.target.value === "0" || isCached) {
if (isCached) { if (isCached) {
analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'cache'); analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'cache');
@ -835,50 +959,32 @@ TABS.firmware_flasher.initialize = function (callback) {
} }
}); });
function flashFirmware(firmware) { const exitDfuElement = $('a.exit_dfu');
var options = {}; exitDfuElement.click(function () {
if (!$(this).hasClass('disabled')) {
var eraseAll = false; if (!GUI.connect_lock) { // button disabled while flashing is in progress
if ($('input.erase_chip').is(':checked')) { analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'ExitDfu', null);
options.erase_chip = true; try {
STM32DFU.connect(usbDevices, self.parsed_hex, { exitDfu: true });
eraseAll = true } catch (e) {
console.log(`Exiting DFU failed: ${e.message}`);
} }
analytics.setFirmwareData(analytics.DATA.FIRMWARE_ERASE_ALL, eraseAll.toString()); }
}
});
if (String($('div#port-picker #port').val()) != 'DFU') { portPickerElement.change(function () {
if (String($('div#port-picker #port').val()) != '0') { if ($('option:selected', this).data().isDFU) {
var port = String($('div#port-picker #port').val()), baud; exitDfuElement.removeClass('disabled');
baud = 115200;
if ($('input.updating').is(':checked')) {
options.no_reboot = true;
} else { } else {
options.reboot_baud = parseInt($('div#port-picker #baud').val()); exitDfuElement.addClass('disabled');
}
if ($('input.flash_manual_baud').is(':checked')) {
baud = parseInt($('#flash_manual_baud_rate').val());
}
analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'Flashing', self.unifiedTargetConfigName || null);
STM32.connect(port, baud, firmware, options);
} else {
console.log('Please select valid serial port');
GUI.log(i18n.getMessage('firmwareFlasherNoValidPort'));
}
} else {
analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'Flashing', self.unifiedTargetConfigName || null);
STM32DFU.connect(usbDevices, firmware, options);
}
} }
}).change();
$('a.flash_firmware').click(function () { $('a.flash_firmware').click(function () {
if (!$(this).hasClass('disabled')) { if (!$(this).hasClass('disabled')) {
if (!GUI.connect_lock) { // button disabled while flashing is in progress if (!GUI.connect_lock) { // button disabled while flashing is in progress
if (self.parsed_hex != false) { if (self.parsed_hex) {
try { try {
if (self.unifiedTargetConfig && !self.parsed_hex.configInserted) { if (self.unifiedTargetConfig && !self.parsed_hex.configInserted) {
var configInserter = new ConfigInserter(); var configInserter = new ConfigInserter();
@ -905,7 +1011,7 @@ TABS.firmware_flasher.initialize = function (callback) {
} }
}); });
$(document).on('click', 'span.progressLabel a.save_firmware', function () { $('span.progressLabel a.save_firmware').click(function () {
var summary = $('select[name="firmware_version"] option:selected').data('summary'); var summary = $('select[name="firmware_version"] option:selected').data('summary');
chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: summary.file, accepts: [{description: 'HEX files', extensions: ['hex']}]}, function (fileEntry) { chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: summary.file, accepts: [{description: 'HEX files', extensions: ['hex']}]}, function (fileEntry) {
if (chrome.runtime.lastError) { if (chrome.runtime.lastError) {
@ -936,6 +1042,8 @@ TABS.firmware_flasher.initialize = function (callback) {
return; return;
} }
analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'SaveFirmware', path);
}; };
writer.write(blob); writer.write(blob);
@ -951,64 +1059,6 @@ TABS.firmware_flasher.initialize = function (callback) {
}); });
}); });
chrome.storage.local.get('selected_build_type', function (result) {
// ensure default build type is selected
buildType_e.val(result.selected_build_type || 0).trigger('change');
});
ConfigStorage.get('no_reboot_sequence', function (result) {
if (result.no_reboot_sequence) {
$('input.updating').prop('checked', true);
$('.flash_on_connect_wrapper').show();
} else {
$('input.updating').prop('checked', false);
}
// bind UI hook so the status is saved on change
$('input.updating').change(function() {
var status = $(this).is(':checked');
if (status) {
$('.flash_on_connect_wrapper').show();
} else {
$('input.flash_on_connect').prop('checked', false).change();
$('.flash_on_connect_wrapper').hide();
}
ConfigStorage.set({'no_reboot_sequence': status});
});
$('input.updating').change();
});
ConfigStorage.get('flash_manual_baud', function (result) {
if (result.flash_manual_baud) {
$('input.flash_manual_baud').prop('checked', true);
} else {
$('input.flash_manual_baud').prop('checked', false);
}
// bind UI hook so the status is saved on change
$('input.flash_manual_baud').change(function() {
var status = $(this).is(':checked');
ConfigStorage.set({'flash_manual_baud': status});
});
$('input.flash_manual_baud').change();
});
ConfigStorage.get('flash_manual_baud_rate', function (result) {
$('#flash_manual_baud_rate').val(result.flash_manual_baud_rate);
// bind UI hook so the status is saved on change
$('#flash_manual_baud_rate').change(function() {
var baud = parseInt($('#flash_manual_baud_rate').val());
ConfigStorage.set({'flash_manual_baud_rate': baud});
});
$('input.flash_manual_baud_rate').change();
});
$('input.flash_on_connect').change(function () { $('input.flash_on_connect').change(function () {
var status = $(this).is(':checked'); var status = $(this).is(':checked');
@ -1040,29 +1090,6 @@ TABS.firmware_flasher.initialize = function (callback) {
} }
}).change(); }).change();
ConfigStorage.get('erase_chip', function (result) {
if (result.erase_chip) {
$('input.erase_chip').prop('checked', true);
} else {
$('input.erase_chip').prop('checked', false);
}
$('input.erase_chip').change(function () {
ConfigStorage.set({'erase_chip': $(this).is(':checked')});
}).change();
});
chrome.storage.local.get('show_development_releases', function (result) {
$('input.show_development_releases')
.prop('checked', result.show_development_releases)
.change(function () {
chrome.storage.local.set({'show_development_releases': $(this).is(':checked')});
}).change();
});
self.flashingMessage(i18n.getMessage('firmwareFlasherLoadFirmwareFile'), self.FLASH_MESSAGE_TYPES.NEUTRAL);
$(document).keypress(function (e) { $(document).keypress(function (e) {
if (e.which == 13) { // enter if (e.which == 13) { // enter
// Trigger regular Flashing sequence // Trigger regular Flashing sequence
@ -1070,6 +1097,8 @@ TABS.firmware_flasher.initialize = function (callback) {
} }
}); });
self.flashingMessage(i18n.getMessage('firmwareFlasherLoadFirmwareFile'), self.FLASH_MESSAGE_TYPES.NEUTRAL);
// Update Firmware button at top // Update Firmware button at top
$('div#flashbutton a.flash_state').addClass('active'); $('div#flashbutton a.flash_state').addClass('active');
$('div#flashbutton a.flash').addClass('active'); $('div#flashbutton a.flash').addClass('active');

View file

@ -89,7 +89,7 @@ function read_hex_file(data) {
if (result.end_of_file && hexfile_valid) { if (result.end_of_file && hexfile_valid) {
postMessage(result); postMessage(result);
} else { } else {
postMessage(false); postMessage(null);
} }
} }

View file

@ -138,6 +138,9 @@
<progress class="progress" value="0" min="0" max="100"></progress> <progress class="progress" value="0" min="0" max="100"></progress>
<span class="progressLabel"></span> <span class="progressLabel"></span>
</div> </div>
<div class="btn">
<a class="exit_dfu disabled" href="#" i18n="firmwareFlasherExitDfu"></a>
</div>
<div class="btn"> <div class="btn">
<a class="flash_firmware disabled" href="#progressbar" i18n="firmwareFlasherFlashFirmware"></a> <a class="flash_firmware disabled" href="#progressbar" i18n="firmwareFlasherFlashFirmware"></a>
</div> </div>