mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-26 01:35:28 +03:00
Merge pull request #76 from bilson/master
Adds target and firmware version selects to firmware flasher tab
This commit is contained in:
commit
95f6363103
3 changed files with 119 additions and 117 deletions
|
@ -1375,8 +1375,11 @@
|
||||||
"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."
|
||||||
|
@ -1414,6 +1417,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]"
|
||||||
},
|
},
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -34,45 +34,66 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
buildFirmwareOptions();
|
buildFirmwareOptions();
|
||||||
});
|
});
|
||||||
|
|
||||||
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 = /betaflight_([\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];
|
||||||
|
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 = /betaflight_([\d.]+)?_?([^.]+)\.(.*)/;
|
||||||
|
var match = targetFromFilenameExpression.exec(asset.name);
|
||||||
|
|
||||||
|
if ((!showDevReleases && release.prerelease) || !match) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!match) {
|
var target = match[2];
|
||||||
return;
|
var format = match[3];
|
||||||
}
|
|
||||||
|
|
||||||
var target = match[1].replace("_", " ");
|
|
||||||
var format = match[2];
|
|
||||||
|
|
||||||
if (format != 'hex') {
|
if (format != 'hex') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var date = new Date(release.published_at);
|
var date = new Date(release.published_at);
|
||||||
var formattedDate = "{0}-{1}-{2} {3}:{4}".format(
|
var formattedDate = ("0" + date.getDate()).slice(-2) + "-" + ("0"+(date.getMonth()+1)).slice(-2) + "-" +
|
||||||
date.getFullYear(),
|
date.getFullYear() + " " + ("0" + date.getHours()).slice(-2) + ":" + ("0" + date.getMinutes()).slice(-2);
|
||||||
date.getMonth() + 1,
|
|
||||||
date.getDate(),
|
|
||||||
date.getUTCHours(),
|
|
||||||
date.getMinutes()
|
|
||||||
);
|
|
||||||
|
|
||||||
var descriptor = {
|
var descriptor = {
|
||||||
"releaseUrl": release.html_url,
|
"releaseUrl": release.html_url,
|
||||||
"name" : semver.clean(release.name),
|
"name" : version,
|
||||||
"version" : release.name,
|
"version" : version,
|
||||||
"url" : asset.browser_download_url,
|
"url" : asset.browser_download_url,
|
||||||
"file" : asset.name,
|
"file" : asset.name,
|
||||||
"target" : target,
|
"target" : target,
|
||||||
|
@ -80,72 +101,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 = [];
|
||||||
releaseDescriptors.sort(function(o1,o2){
|
Object.keys(releases)
|
||||||
// compare versions descending
|
.sort()
|
||||||
var oo1 = o1.version.replace(/[^0-9]+/g, "");
|
.forEach(function(target, i) {
|
||||||
var oo2 = o2.version.replace(/[^0-9]+/g, "");
|
var descriptors = releases[target];
|
||||||
var cmpVal = (oo2<oo1?-1:(oo2>oo1?1:0));
|
descriptors.forEach(function(descriptor){
|
||||||
if (cmpVal == 0){
|
if($.inArray(target, selectTargets) == -1) {
|
||||||
// compare target names ascending
|
selectTargets.push(target);
|
||||||
cmpVal = (o1.target<o2.target?-1:(o1.target>o2.target?1:0));
|
var select_e =
|
||||||
}
|
$("<option value='{0}'>{0}</option>".format(
|
||||||
return cmpVal;
|
descriptor.target
|
||||||
});
|
)).data('summary', descriptor);
|
||||||
|
boards_e.append(select_e);
|
||||||
var optionIndex = 1;
|
|
||||||
releaseDescriptors.forEach(function(descriptor){
|
|
||||||
var select_e =
|
|
||||||
$("<option value='{0}'>{1} {2} ({3})</option>".format(
|
|
||||||
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/betaflight/betaflight/releases', function (releases){
|
|
||||||
processReleases(releases);
|
|
||||||
TABS.firmware_flasher.releases = releases;
|
TABS.firmware_flasher.releases = releases;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.get('https://api.github.com/repos/betaflight/betaflight/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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -156,7 +168,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) {
|
||||||
|
@ -212,7 +223,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');
|
||||||
}
|
}
|
||||||
|
@ -223,7 +236,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;
|
||||||
}
|
}
|
||||||
|
@ -241,38 +254,10 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
|
|
||||||
$('a.flash_firmware').removeClass('disabled');
|
$('a.flash_firmware').removeClass('disabled');
|
||||||
|
|
||||||
if (summary.commit) {
|
|
||||||
$.get('https://api.github.com/repos/betaflight/betaflight/commits/' + summary.commit, function (data) {
|
|
||||||
var data = data,
|
|
||||||
d = new Date(data.commit.author.date),
|
|
||||||
offset = d.getTimezoneOffset() / 60,
|
|
||||||
date;
|
|
||||||
|
|
||||||
date = d.getFullYear() + '.' + ('0' + (d.getMonth() + 1)).slice(-2) + '.' + ('0' + (d.getDate())).slice(-2);
|
|
||||||
date += ' @ ' + ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2);
|
|
||||||
date += (offset > 0) ? ' GMT+' + offset : ' GMT' + offset;
|
|
||||||
|
|
||||||
$('div.git_info .committer').text(data.commit.author.name);
|
|
||||||
$('div.git_info .date').text(date);
|
|
||||||
$('div.git_info .hash').text(data.sha.slice(0, 7)).prop('href', 'https://api.github.com/betaflight/betaflight/commit/' + data.sha);
|
|
||||||
|
|
||||||
$('div.git_info .message').text(data.commit.message);
|
|
||||||
|
|
||||||
$('div.git_info').slideDown();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$('div.release_info .target').text(summary.target);
|
$('div.release_info .target').text(summary.target);
|
||||||
|
$('div.release_info .name').text(summary.version).prop('href', summary.releaseUrl);
|
||||||
var status_e = $('div.release_info .status');
|
|
||||||
if (summary.status == 'release-candidate') {
|
|
||||||
$('div.release_info .status').html(chrome.i18n.getMessage('firmwareFlasherReleaseStatusReleaseCandidate')).show();
|
|
||||||
} else {
|
|
||||||
status_e.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
$('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 />');
|
||||||
|
@ -291,8 +276,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);
|
||||||
|
@ -357,7 +341,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: 'betaflight', 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