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:
commit
1e7c0597a5
3 changed files with 118 additions and 88 deletions
|
@ -1367,8 +1367,12 @@
|
||||||
"firmwareFlasherNoReboot": {
|
"firmwareFlasherNoReboot": {
|
||||||
"message": "No reboot sequence"
|
"message": "No reboot sequence"
|
||||||
},
|
},
|
||||||
"firmwareFlasherOnlineReleasesDescription": {
|
"firmwareFlasherOnlineSelectBoardDescription": {
|
||||||
"message": "Available online firmware releases - Select the correct firmware appropriate for your board."
|
|
||||||
|
"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": {
|
"firmwareFlasherNoRebootDescription": {
|
||||||
"message": "Enable if you powered your FC while the bootloader pins are jumpered or have your FC's BOOT button pressed."
|
"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": {
|
"firmwareFlasherOptionLabelSelectFirmware": {
|
||||||
"message": "Choose a Firmware / Board"
|
"message": "Choose a Firmware / Board"
|
||||||
},
|
},
|
||||||
|
"firmwareFlasherOptionLabelSelectBoard": {
|
||||||
|
"message": "Choose a Board"
|
||||||
|
},
|
||||||
|
"firmwareFlasherOptionLabelSelectFirmwareVersion": {
|
||||||
|
"message": "Choose a Firmware version"
|
||||||
|
},
|
||||||
|
"firmwareFlasherOptionLabelSelectFirmwareVersionFor": {
|
||||||
|
"message": "Choose a Firmware version for"
|
||||||
|
},
|
||||||
"firmwareFlasherButtonLoadLocal": {
|
"firmwareFlasherButtonLoadLocal": {
|
||||||
"message": "Load Firmware [Local]"
|
"message": "Load Firmware [Local]"
|
||||||
},
|
},
|
||||||
|
@ -1437,7 +1450,7 @@
|
||||||
"message": "Warning"
|
"message": "Warning"
|
||||||
},
|
},
|
||||||
"firmwareFlasherWarningText": {
|
"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": {
|
"firmwareFlasherRecoveryHead": {
|
||||||
"message": "<strong>Recovery / Lost communication<strong>"
|
"message": "<strong>Recovery / Lost communication<strong>"
|
||||||
|
|
|
@ -4,10 +4,16 @@
|
||||||
<div class="spacer">
|
<div class="spacer">
|
||||||
<table class="cf_table" style="margin-top: 10px;">
|
<table class="cf_table" style="margin-top: 10px;">
|
||||||
<tr>
|
<tr>
|
||||||
<td><select name="release">
|
<td><select name="board">
|
||||||
<option value="0">Loading ...</option>
|
<option value="0">Loading ...</option>
|
||||||
</select></td>
|
</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>
|
||||||
<tr>
|
<tr>
|
||||||
<td><label> <input class="updating toggle" type="checkbox" /> <span
|
<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(){
|
$('input.show_development_releases').click(function(){
|
||||||
buildFirmwareOptions();
|
buildBoardOptions();
|
||||||
});
|
});
|
||||||
|
|
||||||
var buildFirmwareOptions = function(){
|
var buildBoardOptions = 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 releaseDescriptors = [];
|
var boards_e = $('select[name="board"]').empty();
|
||||||
TABS.firmware_flasher.releases.forEach(function(release){
|
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){
|
release.assets.forEach(function(asset){
|
||||||
var targetFromFilenameExpression = /w*_(.*)\.(.*)/;
|
var targetFromFilenameExpression = /inav_([\d.]+)?_?([^.]+)\.(.*)/;
|
||||||
var match = targetFromFilenameExpression.exec(asset.name);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!match) {
|
var target = match[2].replace("_", " ");
|
||||||
return;
|
var format = match[3];
|
||||||
}
|
|
||||||
|
|
||||||
var target = match[1].replace("_", " ");
|
|
||||||
var format = match[2];
|
|
||||||
|
|
||||||
if (format != 'hex') {
|
if (format != 'hex') {
|
||||||
return;
|
return;
|
||||||
|
@ -72,7 +98,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
|
|
||||||
var descriptor = {
|
var descriptor = {
|
||||||
"releaseUrl": release.html_url,
|
"releaseUrl": release.html_url,
|
||||||
"name" : release.name,
|
"name" : semver.clean(release.name),
|
||||||
"version" : release.tag_name,
|
"version" : release.tag_name,
|
||||||
"url" : asset.browser_download_url,
|
"url" : asset.browser_download_url,
|
||||||
"file" : asset.name,
|
"file" : asset.name,
|
||||||
|
@ -81,79 +107,63 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
"notes" : release.body,
|
"notes" : release.body,
|
||||||
"status" : release.prerelease ? "release-candidate" : "stable"
|
"status" : release.prerelease ? "release-candidate" : "stable"
|
||||||
};
|
};
|
||||||
|
releases[target].push(descriptor);
|
||||||
releaseDescriptors.push(descriptor);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
var selectTargets = [];
|
||||||
|
Object.keys(releases)
|
||||||
|
.sort()
|
||||||
releaseDescriptors.sort(function(o1,o2){
|
.forEach(function(target, i) {
|
||||||
// compare versions descending
|
var descriptors = releases[target];
|
||||||
// compare versions descending
|
descriptors.forEach(function(descriptor){
|
||||||
var oo1 = o1.version.replace(/[^0-9]+/g, "");
|
if($.inArray(target, selectTargets) == -1) {
|
||||||
var oo2 = o2.version.replace(/[^0-9]+/g, "");
|
selectTargets.push(target);
|
||||||
var cmpVal = (oo2<oo1?-1:(oo2>oo1?1:0));
|
var select_e =
|
||||||
|
$("<option value='{0}'>{0}</option>".format(
|
||||||
if (cmpVal == 0){
|
descriptor.target
|
||||||
// compare target names ascending
|
)).data('summary', descriptor);
|
||||||
cmpVal = (o1.target<o2.target?-1:(o1.target>o2.target?1:0));
|
boards_e.append(select_e);
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
).
|
});
|
||||||
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;
|
TABS.firmware_flasher.releases = releases;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.get('https://api.github.com/repos/iNavFlight/inav/releases', function (releasesData){
|
||||||
|
TABS.firmware_flasher.releasesData = releasesData;
|
||||||
|
buildBoardOptions();
|
||||||
|
|
||||||
// bind events
|
// 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) {
|
if (!GUI.connect_lock) {
|
||||||
$('.progress').val(0).removeClass('valid invalid');
|
$('.progress').val(0).removeClass('valid invalid');
|
||||||
$('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherLoadFirmwareFile'));
|
$('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherLoadFirmwareFile'));
|
||||||
$('div.git_info').slideUp();
|
$('div.git_info').slideUp();
|
||||||
$('div.release_info').slideUp();
|
$('div.release_info').slideUp();
|
||||||
$('a.flash_firmware').addClass('disabled');
|
$('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>');
|
$('select[name="release"]').empty().append('<option value="0">Offline</option>');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// UI Hooks
|
// UI Hooks
|
||||||
$('a.load_file').click(function () {
|
$('a.load_file').click(function () {
|
||||||
chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{extensions: ['hex']}]}, function (fileEntry) {
|
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.
|
* 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") {
|
if (evt.target.value=="0") {
|
||||||
$("a.load_remote_file").addClass('disabled');
|
$("a.load_remote_file").addClass('disabled');
|
||||||
}
|
}
|
||||||
|
@ -232,7 +243,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
|
|
||||||
$('a.load_remote_file').click(function (evt) {
|
$('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>");
|
GUI.log("<b>No firmware selected to load</b>");
|
||||||
return;
|
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 .name').text(summary.name).prop('href', summary.releaseUrl);
|
||||||
$('div.release_info .date').text(summary.date);
|
$('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);
|
$('div.release_info .file').text(summary.file).prop('href', summary.url);
|
||||||
|
|
||||||
var formattedNotes = summary.notes.trim('\r').replace(/\r/g, '<br />');
|
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');
|
$('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
|
if (summary) { // undefined while list is loading or while running offline
|
||||||
$.get(summary.url, function (data) {
|
$.get(summary.url, function (data) {
|
||||||
process_hex(data, summary);
|
process_hex(data, summary);
|
||||||
|
@ -367,7 +378,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).on('click', 'span.progressLabel a.save_firmware', function () {
|
$(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) {
|
if (chrome.runtime.lastError) {
|
||||||
console.error(chrome.runtime.lastError.message);
|
console.error(chrome.runtime.lastError.message);
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue