mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-21 07:15:15 +03:00
Added checking for latest configurator release and update notification.
This commit is contained in:
parent
8278ba83a4
commit
ec8b7449f8
9 changed files with 225 additions and 199 deletions
|
@ -5,12 +5,12 @@
|
||||||
"warningTitle": {
|
"warningTitle": {
|
||||||
"message": "Warning"
|
"message": "Warning"
|
||||||
},
|
},
|
||||||
|
"noticeTitle": {
|
||||||
|
"message": "Notice"
|
||||||
|
},
|
||||||
"options_title": {
|
"options_title": {
|
||||||
"message": "Application Options"
|
"message": "Application Options"
|
||||||
},
|
},
|
||||||
"options_receive_app_notifications": {
|
|
||||||
"message": "Receive desktop <strong>notification</strong> when application updates"
|
|
||||||
},
|
|
||||||
"connect": {
|
"connect": {
|
||||||
"message": "Connect"
|
"message": "Connect"
|
||||||
},
|
},
|
||||||
|
@ -35,6 +35,12 @@
|
||||||
"permanentExpertMode": {
|
"permanentExpertMode": {
|
||||||
"message": "Permanently enable Expert Mode"
|
"message": "Permanently enable Expert Mode"
|
||||||
},
|
},
|
||||||
|
"checkForConfiguratorUnstableVersions": {
|
||||||
|
"message": "Show update notifications for unstable versions of the configurator"
|
||||||
|
},
|
||||||
|
"configuratorUpdateNotice": {
|
||||||
|
"message": "You are using an outdated version of the <b>Betaflight Configurator</b>.<br>Version <b>$1</b> is available online, please visit <a href=\"$2\" target=\"_blank\">the release page</a> to download and install the latest version with fixes and improvements.<br>Please close the configurator window before updating."
|
||||||
|
},
|
||||||
"deviceRebooting": {
|
"deviceRebooting": {
|
||||||
"message": "Device - <span style=\"color: red\">Rebooting</span>"
|
"message": "Device - <span style=\"color: red\">Rebooting</span>"
|
||||||
},
|
},
|
||||||
|
|
|
@ -84,8 +84,6 @@ chrome.runtime.onInstalled.addListener(function (details) {
|
||||||
|
|
||||||
// only fire up notification sequence when one of the major version numbers changed
|
// only fire up notification sequence when one of the major version numbers changed
|
||||||
if (currentVersionArr[0] > previousVersionArr[0] || currentVersionArr[1] > previousVersionArr[1]) {
|
if (currentVersionArr[0] > previousVersionArr[0] || currentVersionArr[1] > previousVersionArr[1]) {
|
||||||
chrome.storage.local.get('update_notify', function (result) {
|
|
||||||
if (result.update_notify === 'undefined' || result.update_notify) {
|
|
||||||
var manifest = chrome.runtime.getManifest();
|
var manifest = chrome.runtime.getManifest();
|
||||||
var options = {
|
var options = {
|
||||||
priority: 0,
|
priority: 0,
|
||||||
|
@ -100,8 +98,6 @@ chrome.runtime.onInstalled.addListener(function (details) {
|
||||||
// empty
|
// empty
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -181,6 +181,7 @@ gulp.task('dist', ['clean-dist'], function () {
|
||||||
'./js/RateCurve.js',
|
'./js/RateCurve.js',
|
||||||
'./js/Features.js',
|
'./js/Features.js',
|
||||||
'./js/Beepers.js',
|
'./js/Beepers.js',
|
||||||
|
'./js/release_checker.js',
|
||||||
'./tabs/adjustments.js',
|
'./tabs/adjustments.js',
|
||||||
'./tabs/auxiliary.js',
|
'./tabs/auxiliary.js',
|
||||||
'./tabs/cli.js',
|
'./tabs/cli.js',
|
||||||
|
|
|
@ -325,8 +325,7 @@ GUI_control.prototype.show_modal = function (title, message) {
|
||||||
var popup = new jBox('Modal', {
|
var popup = new jBox('Modal', {
|
||||||
title: title,
|
title: title,
|
||||||
content: message,
|
content: message,
|
||||||
closeButton: 'title',
|
closeButton: 'title'
|
||||||
closeOnClick: 'box'
|
|
||||||
});
|
});
|
||||||
|
|
||||||
popup.open();
|
popup.open();
|
||||||
|
|
58
js/release_checker.js
Normal file
58
js/release_checker.js
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
'use strict;'
|
||||||
|
|
||||||
|
var ReleaseChecker = function (releaseName, releaseUrl) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self._releaseName = releaseName;
|
||||||
|
self._releaseDataTag = `${self._releaseName}ReleaseData`;
|
||||||
|
self._releaseLastUpdateTag = `${self._releaseName}ReleaseLastUpdate`
|
||||||
|
self._releaseUrl = releaseUrl;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseChecker.prototype.loadReleaseData = function (processFunction) {
|
||||||
|
var self = this;
|
||||||
|
chrome.storage.local.get([self._releaseLastUpdateTag, self._releaseDataTag], function (result) {
|
||||||
|
var releaseDataTimestamp = $.now();
|
||||||
|
var cacheReleaseData = result[self._releaseDataTag];
|
||||||
|
var cachedReleaseLastUpdate = result[self._releaseLastUpdateTag];
|
||||||
|
if (!cacheReleaseData || !cachedReleaseLastUpdate || releaseDataTimestamp - cachedReleaseLastUpdate > 3600 * 1000) {
|
||||||
|
$.get(self._releaseUrl, function (releaseData) {
|
||||||
|
GUI.log(`Loaded release information for ${self._releaseName} from GitHub.`);
|
||||||
|
|
||||||
|
var data = {};
|
||||||
|
data[self._releaseDataTag] = releaseData
|
||||||
|
data[self._releaseLastUpdateTag] = releaseDataTimestamp
|
||||||
|
chrome.storage.local.set(data, function () {});
|
||||||
|
|
||||||
|
self._processReleaseData(releaseData, processFunction);
|
||||||
|
}).fail(function (data) {
|
||||||
|
var message = '';
|
||||||
|
if (data['responseJSON']) {
|
||||||
|
message = data['responseJSON'].message;
|
||||||
|
}
|
||||||
|
GUI.log(`<b>GitHub query for ${self._releaseName} releases failed, using cached information. Reason: <code>${message}</code></b>`);
|
||||||
|
|
||||||
|
self._processReleaseData(cacheReleaseData, processFunction);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (cacheReleaseData) {
|
||||||
|
GUI.log(`Using cached release information for ${self._releaseName} releases.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
self._processReleaseData(cacheReleaseData, processFunction);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ReleaseChecker.prototype._processReleaseData = function (releaseData, processFunction) {
|
||||||
|
if (releaseData) {
|
||||||
|
processFunction(releaseData);
|
||||||
|
} else {
|
||||||
|
GUI.log(`No release information available for ${self._releaseName}.`);
|
||||||
|
|
||||||
|
processFunction();
|
||||||
|
}
|
||||||
|
}
|
|
@ -73,6 +73,7 @@
|
||||||
<script type="text/javascript" src="./js/RateCurve.js"></script>
|
<script type="text/javascript" src="./js/RateCurve.js"></script>
|
||||||
<script type="text/javascript" src="./js/Features.js"></script>
|
<script type="text/javascript" src="./js/Features.js"></script>
|
||||||
<script type="text/javascript" src="./js/Beepers.js"></script>
|
<script type="text/javascript" src="./js/Beepers.js"></script>
|
||||||
|
<script type="text/javascript" src="./js/release_checker.js"></script>
|
||||||
<script type="text/javascript" src="./main.js"></script>
|
<script type="text/javascript" src="./main.js"></script>
|
||||||
<script type="text/javascript" src="./tabs/landing.js"></script>
|
<script type="text/javascript" src="./tabs/landing.js"></script>
|
||||||
<script type="text/javascript" src="./tabs/setup.js"></script>
|
<script type="text/javascript" src="./tabs/setup.js"></script>
|
||||||
|
|
90
main.js
90
main.js
|
@ -28,35 +28,7 @@ $(document).ready(function () {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for newer releases online to inform people in case they are running an old release
|
checkForConfiguratorUpdates();
|
||||||
|
|
||||||
chrome.storage.local.get(['lastVersionChecked', 'lastVersionAvailableOnline'], function (result) {
|
|
||||||
if (typeof result.lastVersionChecked === undefined || ($.now() - result.lastVersionChecked) > 3600 * 1000) {
|
|
||||||
try {
|
|
||||||
var url = 'https://api.github.com/repos/betaflight/betaflight-configurator/tags';
|
|
||||||
$.get(url).done(function (data) {
|
|
||||||
var versions = data.sort(function (v1, v2) {
|
|
||||||
try {
|
|
||||||
return semver.compare(v2.name, v1.name);
|
|
||||||
} catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
chrome.storage.local.set({
|
|
||||||
'lastVersionChecked': $.now(),
|
|
||||||
'lastVersionAvailableOnline': versions[0].name
|
|
||||||
}, function (result) {
|
|
||||||
console.log("Latest version available online: " + versions[0].name);
|
|
||||||
});
|
|
||||||
notifyOutdatedVersion(versions[0].name);
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
// Just to catch and supress warnings if no internet connection is available
|
|
||||||
}
|
|
||||||
} else if (result.lastVersionAvailableOnline) {
|
|
||||||
notifyOutdatedVersion(result.lastVersionAvailableOnline);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.storage.local.get('logopen', function (result) {
|
chrome.storage.local.get('logopen', function (result) {
|
||||||
if (result.logopen) {
|
if (result.logopen) {
|
||||||
|
@ -212,19 +184,6 @@ $(document).ready(function () {
|
||||||
// translate to user-selected language
|
// translate to user-selected language
|
||||||
localize();
|
localize();
|
||||||
|
|
||||||
// if notifications are enabled, or wasn't set, check the notifications checkbox
|
|
||||||
chrome.storage.local.get('update_notify', function (result) {
|
|
||||||
if (typeof result.update_notify === 'undefined' || result.update_notify) {
|
|
||||||
$('div.notifications input').prop('checked', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$('div.notifications input').change(function () {
|
|
||||||
var check = $(this).is(':checked');
|
|
||||||
|
|
||||||
chrome.storage.local.set({'update_notify': check});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.storage.local.get('permanentExpertMode', function (result) {
|
chrome.storage.local.get('permanentExpertMode', function (result) {
|
||||||
if (result.permanentExpertMode) {
|
if (result.permanentExpertMode) {
|
||||||
$('div.permanentExpertMode input').prop('checked', true);
|
$('div.permanentExpertMode input').prop('checked', true);
|
||||||
|
@ -243,6 +202,21 @@ $(document).ready(function () {
|
||||||
}).change();
|
}).change();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
chrome.storage.local.get('checkForConfiguratorUnstableVersions', function (result) {
|
||||||
|
$('div.checkForConfiguratorUnstableVersions input').change(function () {
|
||||||
|
var checked = $(this).is(':checked');
|
||||||
|
|
||||||
|
chrome.storage.local.set({'checkForConfiguratorUnstableVersions': checked});
|
||||||
|
|
||||||
|
$('input[name="checkForConfiguratorUnstableVersions"]').prop('checked', checked).change();
|
||||||
|
checkForConfiguratorUpdates();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.checkForConfiguratorUnstableVersions) {
|
||||||
|
$('div.checkForConfiguratorUnstableVersions input').prop('checked', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function close_and_cleanup(e) {
|
function close_and_cleanup(e) {
|
||||||
if (e.type == 'click' && !$.contains($('div#options-window')[0], e.target) || e.type == 'keyup' && e.keyCode == 27) {
|
if (e.type == 'click' && !$.contains($('div#options-window')[0], e.target) || e.type == 'keyup' && e.keyCode == 27) {
|
||||||
$(document).unbind('click keyup', close_and_cleanup);
|
$(document).unbind('click keyup', close_and_cleanup);
|
||||||
|
@ -377,10 +351,36 @@ $(document).ready(function () {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function notifyOutdatedVersion(version) {
|
function checkForConfiguratorUpdates() {
|
||||||
if (semver.lt(getManifestVersion(), version)) {
|
var releaseChecker = new ReleaseChecker('configurator', 'https://api.github.com/repos/betaflight/betaflight-configurator/releases');
|
||||||
GUI.log('You are using an old version of ' + chrome.runtime.getManifest().name + '. Version ' + version + ' is available online with possible improvements and fixes.');
|
|
||||||
|
releaseChecker.loadReleaseData(notifyOutdatedVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifyOutdatedVersion(releaseData) {
|
||||||
|
chrome.storage.local.get('checkForConfiguratorUnstableVersions', function (result) {
|
||||||
|
var showUnstableReleases = false;
|
||||||
|
if (result.checkForConfiguratorUnstableVersions) {
|
||||||
|
showUnstableReleases = true;
|
||||||
}
|
}
|
||||||
|
var versions = releaseData.filter(function (version) {
|
||||||
|
var semVerVersion = semver.parse(version.tag_name);
|
||||||
|
if (semVerVersion && (showUnstableReleases || semVerVersion.prerelease.length === 0)) {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}).sort(function (v1, v2) {
|
||||||
|
try {
|
||||||
|
return semver.compare(v2.tag_name, v1.tag_name);
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (versions.length > 0 && semver.lt(getManifestVersion(), versions[0].tag_name)) {
|
||||||
|
GUI.show_modal(chrome.i18n.getMessage('noticeTitle'), chrome.i18n.getMessage('configuratorUpdateNotice', [versions[0].tag_name, versions[0].html_url]));
|
||||||
|
GUI.log(chrome.i18n.getMessage('configuratorUpdateNotice', [versions[0].tag_name, versions[0].html_url]));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function update_packet_error(caller) {
|
function update_packet_error(caller) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
TABS.firmware_flasher = {
|
TABS.firmware_flasher = {
|
||||||
releases: null,
|
releases: null,
|
||||||
|
releaseChecker: new ReleaseChecker('firmware', 'https://api.github.com/repos/betaflight/betaflight/releases')
|
||||||
};
|
};
|
||||||
|
|
||||||
TABS.firmware_flasher.initialize = function (callback) {
|
TABS.firmware_flasher.initialize = function (callback) {
|
||||||
|
@ -30,6 +31,10 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildBoardOptions(releaseData) {
|
function buildBoardOptions(releaseData) {
|
||||||
|
if (!releaseData) {
|
||||||
|
$('select[name="board"]').empty().append('<option value="0">Offline</option>');
|
||||||
|
$('select[name="firmware_version"]').empty().append('<option value="0">Offline</option>');
|
||||||
|
} else {
|
||||||
var boards_e = $('select[name="board"]').empty();
|
var boards_e = $('select[name="board"]').empty();
|
||||||
var showDevReleases = ($('input.show_development_releases').is(':checked'));
|
var showDevReleases = ($('input.show_development_releases').is(':checked'));
|
||||||
boards_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectBoard'))));
|
boards_e.append($("<option value='0'>{0}</option>".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectBoard'))));
|
||||||
|
@ -80,8 +85,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var date = new Date(release.published_at);
|
var date = new Date(release.published_at);
|
||||||
var formattedDate = ("0" + date.getDate()).slice(-2) + "-" + ("0"+(date.getMonth()+1)).slice(-2) + "-" +
|
var formattedDate = ("0" + date.getDate()).slice(-2) + "-" + ("0"+(date.getMonth()+1)).slice(-2) + "-" + date.getFullYear() + " " + ("0" + date.getHours()).slice(-2) + ":" + ("0" + date.getMinutes()).slice(-2);
|
||||||
date.getFullYear() + " " + ("0" + date.getHours()).slice(-2) + ":" + ("0" + date.getMinutes()).slice(-2);
|
|
||||||
|
|
||||||
var descriptor = {
|
var descriptor = {
|
||||||
"releaseUrl": release.html_url,
|
"releaseUrl": release.html_url,
|
||||||
|
@ -120,54 +124,15 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
$('select[name="board"]').trigger("change");
|
$('select[name="board"]').trigger("change");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function loadReleaseData() {
|
|
||||||
chrome.storage.local.get(['releaseDataLastUpdate', 'releaseData'], function (result) {
|
|
||||||
var releaseDataTimestamp = $.now();
|
|
||||||
if (!result.releaseData || !result.releaseDataLastUpdate || releaseDataTimestamp - result.releaseDataLastUpdate > 3600 * 1000) {
|
|
||||||
$.get('https://api.github.com/repos/betaflight/betaflight/releases', function (releaseData) {
|
|
||||||
GUI.log("Loaded release information from GitHub.");
|
|
||||||
|
|
||||||
chrome.storage.local.set({'releaseDataLastUpdate': releaseDataTimestamp, 'releaseData': releaseData}, function () {});
|
|
||||||
|
|
||||||
processReleaseData(releaseData);
|
|
||||||
}).fail(function (data){
|
|
||||||
processReleaseData(result.releaseData);
|
|
||||||
|
|
||||||
var message = '';
|
|
||||||
if (data["responseJSON"]) {
|
|
||||||
message = data["responseJSON"].message;
|
|
||||||
}
|
|
||||||
GUI.log("<b>GitHub query failed: <code>{0}</code></b>".format(message));
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (result.releaseData) {
|
|
||||||
GUI.log("Using cached release information.");
|
|
||||||
}
|
|
||||||
|
|
||||||
processReleaseData(result.releaseData);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function processReleaseData(releaseData) {
|
|
||||||
if (releaseData) {
|
|
||||||
buildBoardOptions(releaseData);
|
|
||||||
} else {
|
|
||||||
GUI.log("No release information available.");
|
|
||||||
|
|
||||||
$('select[name="board"]').empty().append('<option value="0">Offline</option>');
|
|
||||||
$('select[name="firmware_version"]').empty().append('<option value="0">Offline</option>');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// translate to user-selected language
|
// translate to user-selected language
|
||||||
localize();
|
localize();
|
||||||
|
|
||||||
// bind events
|
// bind events
|
||||||
$('input.show_development_releases').click(function () {
|
$('input.show_development_releases').click(function () {
|
||||||
loadReleaseData();
|
self.releaseChecker.loadReleaseData(buildBoardOptions);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('select[name="board"]').change(function() {
|
$('select[name="board"]').change(function() {
|
||||||
|
@ -518,7 +483,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
$('input.show_development_releases').prop('checked', false);
|
$('input.show_development_releases').prop('checked', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
loadReleaseData();
|
self.releaseChecker.loadReleaseData(buildBoardOptions);
|
||||||
|
|
||||||
$('input.show_development_releases').change(function () {
|
$('input.show_development_releases').change(function () {
|
||||||
chrome.storage.local.set({'show_development_releases': $(this).is(':checked')});
|
chrome.storage.local.set({'show_development_releases': $(this).is(':checked')});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="notifications">
|
|
||||||
<label><input type="checkbox" /><span i18n="options_receive_app_notifications"></span></label>
|
|
||||||
</div>
|
|
||||||
<div class="permanentExpertMode">
|
<div class="permanentExpertMode">
|
||||||
<label><input type="checkbox" /><span i18n="permanentExpertMode"></span></label>
|
<label><input type="checkbox" /><span i18n="permanentExpertMode"></span></label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="checkForConfiguratorUnstableVersions">
|
||||||
|
<label><input type="checkbox" /><span i18n="checkForConfiguratorUnstableVersions"></span></label>
|
||||||
|
</div>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue