1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-24 00:35:20 +03:00

Merge pull request #30 from gaelj/fw_flash-target_firmware_select

Add target and firmware version selects to firmware flasher tab
This commit is contained in:
Konstantin Sharlaimov 2016-07-22 05:29:40 +03:00 committed by GitHub
commit 1e7c0597a5
3 changed files with 118 additions and 88 deletions

View file

@ -1367,8 +1367,12 @@
"firmwareFlasherNoReboot": {
"message": "No reboot sequence"
},
"firmwareFlasherOnlineReleasesDescription": {
"message": "Available online firmware releases - Select the correct firmware appropriate for your board."
"firmwareFlasherOnlineSelectBoardDescription": {
"message": "Select your board to see available online firmware releases - Select the correct firmware appropriate for your board."
},
"firmwareFlasherOnlineSelectFirmwareVersionDescription": {
"message": "Select firmware version for your board."
},
"firmwareFlasherNoRebootDescription": {
"message": "Enable if you powered your FC while the bootloader pins are jumpered or have your FC's BOOT button pressed."
@ -1406,6 +1410,15 @@
"firmwareFlasherOptionLabelSelectFirmware": {
"message": "Choose a Firmware / Board"
},
"firmwareFlasherOptionLabelSelectBoard": {
"message": "Choose a Board"
},
"firmwareFlasherOptionLabelSelectFirmwareVersion": {
"message": "Choose a Firmware version"
},
"firmwareFlasherOptionLabelSelectFirmwareVersionFor": {
"message": "Choose a Firmware version for"
},
"firmwareFlasherButtonLoadLocal": {
"message": "Load Firmware [Local]"
},
@ -1437,7 +1450,7 @@
"message": "Warning"
},
"firmwareFlasherWarningText": {
"message": "Please do <span style=\"color: red\">not</span> try to flash <strong>non-cleanflight</strong> hardware with this firmware flasher.<br />Do <span style=\"color: red\">not</span> <strong>disconnect</strong> the board or <strong>turn off</strong> your computer while flashing.<br /><br /><strong>Note: </strong>STM32 bootloader is stored in ROM, it cannot be bricked.<br /><strong>Note: </strong><span style=\"color: red\">Auto-Connect</span> is always disabled while you are inside firmware flasher.<br /><strong>Note: </strong>Make sure you have a backup; some upgrades/downgrades will wipe your configuration.<br /><strong>Note:</strong> If you have problems flashing try disconnecting all cables from your FC first, try rebooting, upgrade chrome, upgrade drivers.<br /><strong>Note:</strong> When flashing boards that have directly connected USB sockets (SPRacingF3Mini, Sparky, ColibriRace, etc) ensure you have read the USB Flashing section of the Cleanflight manual and have the correct software and drivers installed"
"message": "Please do <span style=\"color: red\">not</span> try to flash <strong>non-iNAV</strong> hardware with this firmware flasher.<br />Do <span style=\"color: red\">not</span> <strong>disconnect</strong> the board or <strong>turn off</strong> your computer while flashing.<br /><br /><strong>Note: </strong>STM32 bootloader is stored in ROM, it cannot be bricked.<br /><strong>Note: </strong><span style=\"color: red\">Auto-Connect</span> is always disabled while you are inside firmware flasher.<br /><strong>Note: </strong>Make sure you have a backup; some upgrades/downgrades will wipe your configuration.<br /><strong>Note:</strong> If you have problems flashing try disconnecting all cables from your FC first, try rebooting, upgrade chrome, upgrade drivers.<br /><strong>Note:</strong> When flashing boards that have directly connected USB sockets (SPRacingF3Mini, Sparky, ColibriRace, etc) ensure you have read the USB Flashing section of the Cleanflight manual and have the correct software and drivers installed"
},
"firmwareFlasherRecoveryHead": {
"message": "<strong>Recovery / Lost communication<strong>"

View file

@ -4,10 +4,16 @@
<div class="spacer">
<table class="cf_table" style="margin-top: 10px;">
<tr>
<td><select name="release">
<td><select name="board">
<option value="0">Loading ...</option>
</select></td>
<td><span class="description" i18n="firmwareFlasherOnlineReleasesDescription"></span></td>
<td><span class="description" i18n="firmwareFlasherOnlineSelectBoardDescription"></span></td>
</tr>
<tr>
<td><select name="firmware_version">
<option value="0">Loading ...</option>
</select></td>
<td><span class="description" i18n="firmwareFlasherOnlineSelectFirmwareVersionDescription"></span></td>
</tr>
<tr>
<td><label> <input class="updating toggle" type="checkbox" /> <span

View file

@ -32,30 +32,56 @@ TABS.firmware_flasher.initialize = function (callback) {
$('input.show_development_releases').click(function(){
buildFirmwareOptions();
buildBoardOptions();
});
var buildFirmwareOptions = function(){
var releases_e = $('select[name="release"]').empty();
var showDevReleases = ($('input.show_development_releases').is(':checked'));
releases_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectFirmware'))));
var buildBoardOptions = function(){
var releaseDescriptors = [];
TABS.firmware_flasher.releases.forEach(function(release){
var boards_e = $('select[name="board"]').empty();
var showDevReleases = ($('input.show_development_releases').is(':checked'));
boards_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectBoard'))));
var versions_e = $('select[name="firmware_version"]').empty();
versions_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectFirmwareVersion'))));
var releases = {};
var sortedTargets = [];
var unsortedTargets = [];
TABS.firmware_flasher.releasesData.forEach(function(release){
release.assets.forEach(function(asset){
var targetFromFilenameExpression = /w*_(.*)\.(.*)/;
var targetFromFilenameExpression = /inav_([\d.]+)?_?([^.]+)\.(.*)/;
var match = targetFromFilenameExpression.exec(asset.name);
if (!showDevReleases && release.prerelease) {
if ((!showDevReleases && release.prerelease) || !match) {
return;
}
var target = match[2].replace("_", " ");
if($.inArray(target, unsortedTargets) == -1) {
unsortedTargets.push(target);
}
});
sortedTargets = unsortedTargets.sort();
});
sortedTargets.forEach(function(release) {
releases[release] = [];
});
TABS.firmware_flasher.releasesData.forEach(function(release){
var versionFromTagExpression = /v?(.*)/;
var matchVersionFromTag = versionFromTagExpression.exec(release.tag_name);
var version = matchVersionFromTag[1];
release.assets.forEach(function(asset){
var targetFromFilenameExpression = /inav_([\d.]+)?_?([^.]+)\.(.*)/;
var match = targetFromFilenameExpression.exec(asset.name);
if ((!showDevReleases && release.prerelease) || !match) {
return;
}
if (!match) {
return;
}
var target = match[1].replace("_", " ");
var format = match[2];
var target = match[2].replace("_", " ");
var format = match[3];
if (format != 'hex') {
return;
@ -72,7 +98,7 @@ TABS.firmware_flasher.initialize = function (callback) {
var descriptor = {
"releaseUrl": release.html_url,
"name" : release.name,
"name" : semver.clean(release.name),
"version" : release.tag_name,
"url" : asset.browser_download_url,
"file" : asset.name,
@ -81,79 +107,63 @@ TABS.firmware_flasher.initialize = function (callback) {
"notes" : release.body,
"status" : release.prerelease ? "release-candidate" : "stable"
};
releaseDescriptors.push(descriptor);
releases[target].push(descriptor);
});
});
releaseDescriptors.sort(function(o1,o2){
// compare versions descending
// compare versions descending
var oo1 = o1.version.replace(/[^0-9]+/g, "");
var oo2 = o2.version.replace(/[^0-9]+/g, "");
var cmpVal = (oo2<oo1?-1:(oo2>oo1?1:0));
if (cmpVal == 0){
// compare target names ascending
cmpVal = (o1.target<o2.target?-1:(o1.target>o2.target?1:0));
}
return cmpVal;
});
var optionIndex = 1;
releaseDescriptors.forEach(function(descriptor){
var selectTargets = [];
Object.keys(releases)
.sort()
.forEach(function(target, i) {
var descriptors = releases[target];
descriptors.forEach(function(descriptor){
if($.inArray(target, selectTargets) == -1) {
selectTargets.push(target);
var select_e =
$("<option value='{0}'>{1} {2} {3} ({4})</option>".format(
optionIndex++,
descriptor.name,
descriptor.target,
descriptor.date,
descriptor.status
$("<option value='{0}'>{0}</option>".format(
descriptor.target
)).data('summary', descriptor);
releases_e.append(select_e);
});
};
var processReleases = function (releases){
var promises = [];
releases.forEach(function(release){
var promise = Q.defer();
promises.push(promise);
$.get(release.assets_url).
done(function(assets){
release.assets = assets;
promise.resolve(assets);
boards_e.append(select_e);
}
).
fail(function(reason){
promise.reject(reason);
}
);
});
Q.all(promises).then(function(){
buildFirmwareOptions();
})
};
$.get('https://api.github.com/repos/iNavFlight/inav/releases', function (releases){
processReleases(releases);
});
TABS.firmware_flasher.releases = releases;
};
$.get('https://api.github.com/repos/iNavFlight/inav/releases', function (releasesData){
TABS.firmware_flasher.releasesData = releasesData;
buildBoardOptions();
// bind events
$('select[name="release"]').change(function() {
$('select[name="board"]').change(function() {
$("a.load_remote_file").addClass('disabled');
var target = $(this).val();
if (!GUI.connect_lock) {
$('.progress').val(0).removeClass('valid invalid');
$('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherLoadFirmwareFile'));
$('div.git_info').slideUp();
$('div.release_info').slideUp();
$('a.flash_firmware').addClass('disabled');
var versions_e = $('select[name="firmware_version"]').empty();
if(target == 0) {
versions_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectFirmwareVersion'))));
} else {
versions_e.append($("<option value='0'>{0} {1}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectFirmwareVersionFor'), target)));
}
TABS.firmware_flasher.releases[target].forEach(function(descriptor) {
var select_e =
$("<option value='{0}'>{0} - {1} - {2} ({3})</option>".format(
descriptor.version,
descriptor.target,
descriptor.date,
descriptor.status
)).data('summary', descriptor);
versions_e.append(select_e);
});
}
});
@ -164,7 +174,6 @@ TABS.firmware_flasher.initialize = function (callback) {
$('select[name="release"]').empty().append('<option value="0">Offline</option>');
});
// UI Hooks
$('a.load_file').click(function () {
chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{extensions: ['hex']}]}, function (fileEntry) {
@ -221,7 +230,9 @@ TABS.firmware_flasher.initialize = function (callback) {
/**
* Lock / Unlock the firmware download button according to the firmware selection dropdown.
*/
$('select[name="release"]').change(function(evt){
$('select[name="firmware_version"]').change(function(evt){
$('div.release_info').slideUp();
$('a.flash_firmware').addClass('disabled');
if (evt.target.value=="0") {
$("a.load_remote_file").addClass('disabled');
}
@ -232,7 +243,7 @@ TABS.firmware_flasher.initialize = function (callback) {
$('a.load_remote_file').click(function (evt) {
if ($('select[name="release"]').val() == "0") {
if ($('select[name="firmware_version"]').val() == "0") {
GUI.log("<b>No firmware selected to load</b>");
return;
}
@ -283,6 +294,7 @@ TABS.firmware_flasher.initialize = function (callback) {
$('div.release_info .name').text(summary.name).prop('href', summary.releaseUrl);
$('div.release_info .date').text(summary.date);
$('div.release_info .status').text(summary.status);
$('div.release_info .file').text(summary.file).prop('href', summary.url);
var formattedNotes = summary.notes.trim('\r').replace(/\r/g, '<br />');
@ -301,8 +313,7 @@ TABS.firmware_flasher.initialize = function (callback) {
$('a.flash_firmware').addClass('disabled');
}
var summary = $('select[name="release"] option:selected').data('summary');
var summary = $('select[name="firmware_version"] option:selected').data('summary');
if (summary) { // undefined while list is loading or while running offline
$.get(summary.url, function (data) {
process_hex(data, summary);
@ -367,7 +378,7 @@ TABS.firmware_flasher.initialize = function (callback) {
});
$(document).on('click', 'span.progressLabel a.save_firmware', function () {
chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: 'baseflight', accepts: [{extensions: ['hex']}]}, function (fileEntry) {
chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: 'inav', accepts: [{extensions: ['hex']}]}, function (fileEntry) {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError.message);
return;