mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-23 08:15:19 +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:
commit
1e7c0597a5
3 changed files with 118 additions and 88 deletions
|
@ -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>"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 select_e =
|
||||
$("<option value='{0}'>{1} {2} {3} ({4})</option>".format(
|
||||
optionIndex++,
|
||||
descriptor.name,
|
||||
descriptor.target,
|
||||
descriptor.date,
|
||||
descriptor.status
|
||||
)).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);
|
||||
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}'>{0}</option>".format(
|
||||
descriptor.target
|
||||
)).data('summary', descriptor);
|
||||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue