-
+
-
\ No newline at end of file
+
diff --git a/tabs/firmware_flasher.js b/tabs/firmware_flasher.js
index a7e7e940..acc631fa 100755
--- a/tabs/firmware_flasher.js
+++ b/tabs/firmware_flasher.js
@@ -8,7 +8,8 @@ TABS.firmware_flasher.initialize = function (callback) {
GUI.active_tab = 'firmware_flasher';
googleAnalytics.sendAppView('Firmware Flasher');
}
-
+
+
var intel_hex = false, // standard intel hex in string format
parsed_hex = false; // parsed raw hex in array format
@@ -16,7 +17,19 @@ TABS.firmware_flasher.initialize = function (callback) {
// translate to user-selected language
localize();
- function parse_hex(str, callback) {
+ // load switchery
+ var elems = Array.prototype.slice.call(document.querySelectorAll('#toggle'));
+
+elems.forEach(function(html) {
+ var switchery = new Switchery(html,
+ {
+ color: '#59aa29',
+ secondaryColor: '#c4c4c4'
+});
+ });
+
+
+ function parse_hex(str, callback) {
// parsing hex in different thread
var worker = new Worker('./js/workers/hex_parser.js');
@@ -526,4 +539,7 @@ TABS.firmware_flasher.cleanup = function (callback) {
$(document).off('click', 'span.progressLabel a');
if (callback) callback();
-};
\ No newline at end of file
+};
+
+
+
diff --git a/tabs/landing kopie.html b/tabs/landing kopie.html
new file mode 100644
index 00000000..635f5e12
--- /dev/null
+++ b/tabs/landing kopie.html
@@ -0,0 +1,66 @@
+
@@ -125,7 +125,7 @@
diff --git a/main.js b/main.js
index c82e12ab..505f9955 100644
--- a/main.js
+++ b/main.js
@@ -401,5 +401,23 @@ $("#showlog").on('click', function() {
+/** toggle switch **/
+$(document).ready(function () {
+
+
+
+var elems = Array.prototype.slice.call(document.querySelectorAll('#togglesmall'));
+
+elems.forEach(function(html) {
+ var switchery = new Switchery(html,
+ {
+ size: 'small',
+ color: '#59aa29',
+ secondaryColor: '#c4c4c4'
+});
+
+});
+
+});
diff --git a/tabs/firmware_flasher Kopie.css b/tabs/firmware_flasher Kopie.css
new file mode 100755
index 00000000..672f5e3b
--- /dev/null
+++ b/tabs/firmware_flasher Kopie.css
@@ -0,0 +1,220 @@
+.tab-firmware_flasher .info {
+ margin: 10px 0 10px 0;
+ position: relative;
+}
+.tab-firmware_flasher .info .progressLabel {
+ position: absolute;
+
+ width: 100%;
+ height: 26px;
+
+ top: 0;
+ left: 0;
+
+ text-align: center;
+ line-height: 24px;
+
+ color: white;
+ font-weight: bold;
+
+ /* text-shadow: 1px 0px 2px rgba(0, 0, 0, 0.9);*/
+}
+.tab-firmware_flasher .info .progressLabel a {
+ color: white;
+}
+.tab-firmware_flasher .info .progressLabel a:hover {
+ text-decoration: underline;
+}
+.tab-firmware_flasher .info .progress {
+ width: 100%;
+ height: 26px;
+
+ border: 1px solid silver;
+}
+.tab-firmware_flasher .info .progress {
+ -webkit-appearance: none;
+}
+.tab-firmware_flasher .info .progress::-webkit-progress-bar {
+ background-color: #343434;
+}
+.tab-firmware_flasher .info .progress::-webkit-progress-value {
+ background-color: #F86008;
+}
+.tab-firmware_flasher .info .progress.valid::-webkit-progress-bar {
+ background-color: #73BE45;
+}
+.tab-firmware_flasher .info .progress.valid::-webkit-progress-value {
+ background-color: #73BE45;
+}
+.tab-firmware_flasher .info .progress.invalid::-webkit-progress-bar {
+ background-color: #A62E32;
+}
+.tab-firmware_flasher .info .progress.invalid::-webkit-progress-value {
+ background-color: #A62E32;
+}
+.tab-firmware_flasher .options {
+ position: relative;
+
+ margin-bottom: 10px;
+ padding: 5px;
+
+ line-height: 18px;
+
+ border: 1px dotted silver;
+}
+.tab-firmware_flasher .options label input {
+ float: left;
+ margin-top: 2px;
+}
+.tab-firmware_flasher .options label span {
+ font-weight: bold;
+ margin-left: 6px;
+}
+.tab-firmware_flasher .options select {
+ height: 20px;
+
+ border: 1px solid silver;
+}
+
+.tab-firmware_flasher .options .releases select {
+ width: 280px;
+}
+
+.tab-firmware_flasher .option.releases {
+ margin: 0 0 2px 0;
+ line-height: 20px;
+}
+.tab-firmware_flasher .options .description {
+ position: absolute;
+ left: 300px;
+
+ font-style: italic;
+ color: #818181;
+}
+.tab-firmware_flasher .options .flash_on_connect_wrapper {
+ display: none;
+}
+
+.tab-firmware_flasher .options .manual_baud_rate select {
+ width: 70px;
+}
+
+.tab-firmware_flasher .release_info {
+ display: none;
+
+ margin-bottom: 10px;
+
+ border: 1px solid silver;
+}
+.tab-firmware_flasher .release_info .title {
+ line-height: 20px;
+
+ text-align: center;
+ font-weight: bold;
+ color: white;
+
+ border-bottom: 1px solid silver;
+ background-color: #3f4241;
+}
+
+.tab-firmware_flasher .release_info .target {
+ color: blue;
+}
+
+.tab-firmware_flasher .release_info p {
+ padding: 5px;
+}
+.tab-firmware_flasher .release_info p a {
+ font-weight: bold;
+}
+.tab-firmware_flasher .release_info p a:hover {
+ text-decoration: underline;
+}
+.tab-firmware_flasher .release_info .notes {
+ padding: 5px;
+}
+
+.tab-firmware_flasher .git_info {
+ display: none;
+
+ margin-bottom: 10px;
+
+ border: 1px solid silver;
+}
+.tab-firmware_flasher .git_info .title {
+ line-height: 20px;
+
+ text-align: center;
+ font-weight: bold;
+ color: white;
+
+ border-bottom: 1px solid silver;
+ background-color: #3f4241;
+}
+.tab-firmware_flasher .git_info p {
+ padding: 5px;
+}
+.tab-firmware_flasher .git_info p a {
+ font-weight: bold;
+}
+.tab-firmware_flasher .git_info p a:hover {
+ text-decoration: underline;
+}
+.warning {
+ border: 1px solid silver;
+}
+.warning .title {
+ line-height: 20px;
+
+ text-align: center;
+ font-weight: bold;
+ color: white;
+
+ border-bottom: 1px solid silver;
+ background-color: #cd4c4c;
+}
+.warning p {
+ padding: 5px;
+}
+.tab-firmware_flasher .buttons {
+ width: calc(100% - 20px);
+
+ margin-top: 10px;
+ bottom: 10px;
+}
+.tab-firmware_flasher .buttons a {
+ display: block;
+ float: left;
+
+ margin: 0 10px 0 0;
+ padding: 0 15px 0 15px;
+
+ height: 28px;
+ line-height: 28px;
+ text-align: center;
+ font-weight: bold;
+
+ border: 1px solid silver;
+ background-color: #ececec;
+}
+.tab-firmware_flasher .buttons a:hover {
+ background-color: #dedcdc;
+}
+.tab-firmware_flasher .buttons a.flash_firmware.locked {
+ background-color: #b8b8b8;
+}
+.tab-firmware_flasher .buttons a.flash_firmware.locked:hover {
+ cursor: default;
+ background-color: #b8b8b8;
+}
+.tab-firmware_flasher .buttons a.load_remote_file.locked {
+ background-color: #b8b8b8;
+}
+.tab-firmware_flasher .buttons a.load_remote_file.locked:hover {
+ cursor: default;
+ background-color: #b8b8b8;
+}
+.tab-firmware_flasher .buttons a.back {
+ float: right;
+ margin: 0;
+}
\ No newline at end of file
diff --git a/tabs/firmware_flasher Kopie.html b/tabs/firmware_flasher Kopie.html
new file mode 100755
index 00000000..7bf2c631
--- /dev/null
+++ b/tabs/firmware_flasher Kopie.html
@@ -0,0 +1,96 @@
+o2.target?1:0));
+ }
+ return cmpVal;
+ });
+
+ var optionIndex = 1;
+ releaseDescriptors.forEach(function(descriptor){
+ var select_e =
+ $("".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/cleanflight/cleanflight/releases', function (releases){
+ processReleases(releases);
+ TABS.firmware_flasher.releases = releases;
+
+ // bind events
+ $('select[name="release"]').change(function() {
+ 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('locked');
+ }
+ });
+
+ }).fail(function (data){
+ if (data["responseJSON"]){
+ GUI.log("GITHUB Query Failed:
'); + $('div.release_info .notes').html(formattedNotes); + + $('div.release_info').slideDown(); + + } else { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherHexCorrupted')); + } + }); + } + + function failed_to_load() { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFailedToLoadOnlineFirmware')); + $('a.flash_firmware').addClass('locked'); + } + + var summary = $('select[name="release"] option:selected').data('summary'); + + if (summary) { // undefined while list is loading or while running offline + $.get(summary.url, function (data) { + process_hex(data, summary); + }).fail(failed_to_load); + } else { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFailedToLoadOnlineFirmware')); + } + }); + + $('a.flash_firmware').click(function () { + if (!$(this).hasClass('locked')) { + if (!GUI.connect_lock) { // button disabled while flashing is in progress + if (parsed_hex != false) { + if (String($('div#port-picker #port').val()) != 'DFU') { + if (String($('div#port-picker #port').val()) != '0') { + var options = {}, + port = String($('div#port-picker #port').val()), + baud; + + switch (GUI.operating_system) { + case 'Windows': + case 'MacOS': + case 'ChromeOS': + case 'Linux': + case 'UNIX': + baud = 921600; + break; + + default: + baud = 115200; + } + + if ($('input.updating').is(':checked')) { + options.no_reboot = true; + } else { + options.reboot_baud = parseInt($('div#port-picker #baud').val()); + } + + if ($('input.erase_chip').is(':checked')) { + options.erase_chip = true; + } + + if ($('input.flash_manual_baud').is(':checked')) { + baud = parseInt($('#flash_manual_baud_rate').val()); + } + + + STM32.connect(port, baud, parsed_hex, options); + } else { + console.log('Please select valid serial port'); + GUI.log('Please select valid serial port'); + } + } else { + STM32DFU.connect(usbDevices.STM32DFU, parsed_hex); + } + } else { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFirmwareNotLoaded')); + } + } + } + }); + + $(document).on('click', 'span.progressLabel a.save_firmware', function () { + chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: 'baseflight', accepts: [{extensions: ['hex']}]}, function (fileEntry) { + if (chrome.runtime.lastError) { + console.error(chrome.runtime.lastError.message); + return; + } + + chrome.fileSystem.getDisplayPath(fileEntry, function (path) { + console.log('Saving firmware to: ' + path); + + // check if file is writable + chrome.fileSystem.isWritableEntry(fileEntry, function (isWritable) { + if (isWritable) { + var blob = new Blob([intel_hex], {type: 'text/plain'}); + + fileEntry.createWriter(function (writer) { + var truncated = false; + + writer.onerror = function (e) { + console.error(e); + }; + + writer.onwriteend = function() { + if (!truncated) { + // onwriteend will be fired again when truncation is finished + truncated = true; + writer.truncate(blob.size); + + return; + } + }; + + writer.write(blob); + }, function (e) { + console.error(e); + }); + } else { + console.log('You don\'t have write permissions for this file, sorry.'); + GUI.log('You don\'t have write permissions for this file'); + } + }); + }); + }); + }); + + chrome.storage.local.get('no_reboot_sequence', function (result) { + if (result.no_reboot_sequence) { + $('input.updating').prop('checked', true); + $('.flash_on_connect_wrapper').show(); + } else { + $('input.updating').prop('checked', false); + } + + // bind UI hook so the status is saved on change + $('input.updating').change(function() { + var status = $(this).is(':checked'); + + if (status) { + $('.flash_on_connect_wrapper').show(); + } else { + $('input.flash_on_connect').prop('checked', false).change(); + $('.flash_on_connect_wrapper').hide(); + } + + chrome.storage.local.set({'no_reboot_sequence': status}); + }); + }); + + chrome.storage.local.get('flash_manual_baud', function (result) { + if (result.flash_manual_baud) { + $('input.flash_manual_baud').prop('checked', true); + } else { + $('input.flash_manual_baud').prop('checked', false); + } + + // bind UI hook so the status is saved on change + $('input.flash_manual_baud').change(function() { + var status = $(this).is(':checked'); + + chrome.storage.local.set({'flash_manual_baud': status}); + }); + + $('input.flash_manual_baud').change(); + }); + + chrome.storage.local.get('flash_manual_baud_rate', function (result) { + $('#flash_manual_baud_rate').val(result.flash_manual_baud_rate); + + // bind UI hook so the status is saved on change + $('#flash_manual_baud_rate').change(function() { + var baud = parseInt($('#flash_manual_baud_rate').val()); + chrome.storage.local.set({'flash_manual_baud_rate': baud}); + }); + + $('input.flash_manual_baud_rate').change(); + }); + + chrome.storage.local.get('flash_on_connect', function (result) { + if (result.flash_on_connect) { + $('input.flash_on_connect').prop('checked', true); + } else { + $('input.flash_on_connect').prop('checked', false); + } + + $('input.flash_on_connect').change(function () { + var status = $(this).is(':checked'); + + if (status) { + var catch_new_port = function () { + PortHandler.port_detected('flash_detected_device', function (result) { + var port = result[0]; + + if (!GUI.connect_lock) { + GUI.log('Detected: ' + port + ' - triggering flash on connect'); + console.log('Detected: ' + port + ' - triggering flash on connect'); + + // Trigger regular Flashing sequence + GUI.timeout_add('initialization_timeout', function () { + $('a.flash_firmware').click(); + }, 100); // timeout so bus have time to initialize after being detected by the system + } else { + GUI.log('Detected ' + port + ' - previous device still flashing, please replug to try again'); + } + + // Since current port_detected request was consumed, create new one + catch_new_port(); + }, false, true); + }; + + catch_new_port(); + } else { + PortHandler.flush_callbacks(); + } + + chrome.storage.local.set({'flash_on_connect': status}); + }).change(); + }); + + chrome.storage.local.get('erase_chip', function (result) { + if (result.erase_chip) { + $('input.erase_chip').prop('checked', true); + } else { + $('input.erase_chip').prop('checked', false); + } + + // bind UI hook so the status is saved on change + $('input.erase_chip').change(function () { + chrome.storage.local.set({'erase_chip': $(this).is(':checked')}); + }); + }); + + $(document).keypress(function (e) { + if (e.which == 13) { // enter + // Trigger regular Flashing sequence + $('a.flash_firmware').click(); + } + }); + + if (callback) callback(); + }); +}; + +TABS.firmware_flasher.cleanup = function (callback) { + PortHandler.flush_callbacks(); + + // unbind "global" events + $(document).unbind('keypress'); + $(document).off('click', 'span.progressLabel a'); + + if (callback) callback(); +}; \ No newline at end of file diff --git a/tabs/firmware_flasher.html b/tabs/firmware_flasher.html index 7bf2c631..26d011d7 100755 --- a/tabs/firmware_flasher.html +++ b/tabs/firmware_flasher.html @@ -8,28 +8,28 @@
+
\ No newline at end of file
diff --git a/tabs/firmware_flasher Kopie.js b/tabs/firmware_flasher Kopie.js
new file mode 100755
index 00000000..a7e7e940
--- /dev/null
+++ b/tabs/firmware_flasher Kopie.js
@@ -0,0 +1,529 @@
+'use strict';
+
+TABS.firmware_flasher = {};
+TABS.firmware_flasher.initialize = function (callback) {
+ var self = this;
+
+ if (GUI.active_tab != 'firmware_flasher') {
+ GUI.active_tab = 'firmware_flasher';
+ googleAnalytics.sendAppView('Firmware Flasher');
+ }
+
+ var intel_hex = false, // standard intel hex in string format
+ parsed_hex = false; // parsed raw hex in array format
+
+ $('#content').load("./tabs/firmware_flasher.html", function () {
+ // translate to user-selected language
+ localize();
+
+ function parse_hex(str, callback) {
+ // parsing hex in different thread
+ var worker = new Worker('./js/workers/hex_parser.js');
+
+ // "callback"
+ worker.onmessage = function (event) {
+ callback(event.data);
+ };
+
+ // send data/string over for processing
+ worker.postMessage(str);
+ }
+
+
+ $('input.show_development_releases').click(function(){
+ buildFirmwareOptions();
+ });
+
+ var buildFirmwareOptions = function(){
+ var releases_e = $('select[name="release"]').empty();
+ var showDevReleases = ($('input.show_development_releases').is(':checked'));
+ releases_e.append($("".format(chrome.i18n.getMessage('firmwareFlasherOptionLabelSelectFirmware'))));
+
+ var releaseDescriptors = [];
+ TABS.firmware_flasher.releases.forEach(function(release){
+ release.assets.forEach(function(asset){
+ var targetFromFilenameExpression = /.*_(.*)\.(.*)/;
+ var match = targetFromFilenameExpression.exec(asset.name);
+
+ if (!showDevReleases && release.prerelease) {
+ return;
+ }
+
+ if (!match) {
+ return;
+ }
+
+ var target = match[1];
+ var format = match[2];
+
+ if (format != 'hex') {
+ return;
+ }
+
+ var date = new Date(release.published_at);
+ var formattedDate = "{0}-{1}-{2} {3}:{4}".format(
+ date.getFullYear(),
+ date.getMonth() + 1,
+ date.getDate(),
+ date.getUTCHours(),
+ date.getMinutes()
+ );
+
+ var descriptor = {
+ "releaseUrl": release.html_url,
+ "name" : semver.clean(release.name),
+ "version" : release.tag_name,
+ "url" : asset.browser_download_url,
+ "file" : asset.name,
+ "target" : target,
+ "date" : formattedDate,
+ "notes" : release.body,
+ "status" : release.prerelease ? "release-candidate" : "stable"
+ };
+
+ releaseDescriptors.push(descriptor);
+ });
+ });
+
+ releaseDescriptors.sort(function(o1,o2){
+ // compare versions descending
+ var cmpVal = semver(o2.version).compare(semver(o1.version));
+ if (cmpVal == 0){
+ // compare target names ascending
+ cmpVal = (o1.target
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+{0}
".format(data["responseJSON"].message));
+ }
+ $('select[name="release"]').empty().append('');
+ });
+
+
+ // UI Hooks
+ $('a.load_file').click(function () {
+ chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{extensions: ['hex']}]}, function (fileEntry) {
+ if (chrome.runtime.lastError) {
+ console.error(chrome.runtime.lastError.message);
+
+ return;
+ }
+
+ // hide github info (if it exists)
+ $('div.git_info').slideUp();
+
+ chrome.fileSystem.getDisplayPath(fileEntry, function (path) {
+ console.log('Loading file from: ' + path);
+
+ fileEntry.file(function (file) {
+ var reader = new FileReader();
+
+ reader.onprogress = function (e) {
+ if (e.total > 1048576) { // 1 MB
+ // dont allow reading files bigger then 1 MB
+ console.log('File limit (1 MB) exceeded, aborting');
+ reader.abort();
+ }
+ };
+
+ reader.onloadend = function(e) {
+ if (e.total != 0 && e.total == e.loaded) {
+ console.log('File loaded');
+
+ intel_hex = e.target.result;
+
+ parse_hex(intel_hex, function (data) {
+ parsed_hex = data;
+
+ if (parsed_hex) {
+ googleAnalytics.sendEvent('Flashing', 'Firmware', 'local');
+ $('a.flash_firmware').removeClass('locked');
+
+ $('span.progressLabel').text('Loaded Local Firmware: (' + parsed_hex.bytes_total + ' bytes)');
+ } else {
+ $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherHexCorrupted'));
+ }
+ });
+ }
+ };
+
+ reader.readAsText(file);
+ });
+ });
+ });
+ });
+
+ /**
+ * Lock / Unlock the firmware download button according to the firmware selection dropdown.
+ */
+ $('select[name="release"]').change(function(evt){
+ if (evt.target.value=="0") {
+ $("a.load_remote_file").addClass('locked');
+ }
+ else {
+ $("a.load_remote_file").removeClass('locked');
+ }
+ });
+
+ $('a.load_remote_file').click(function (evt) {
+
+ if ($('select[name="release"]').val() == "0") {
+ GUI.log("No firmware selected to load");
+ return;
+ }
+
+ function process_hex(data, summary) {
+ intel_hex = data;
+
+ parse_hex(intel_hex, function (data) {
+ parsed_hex = data;
+
+ if (parsed_hex) {
+ var url;
+
+ googleAnalytics.sendEvent('Flashing', 'Firmware', 'online');
+ $('span.progressLabel').html('Loaded Online Firmware: (' + parsed_hex.bytes_total + ' bytes)');
+
+ $('a.flash_firmware').removeClass('locked');
+
+ if (summary.commit) {
+ $.get('https://api.github.com/repos/cleanflight/cleanflight/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://github.com/cleanflight/cleanflight/commit/' + data.sha);
+
+ $('div.git_info .message').text(data.commit.message);
+
+ $('div.git_info').slideDown();
+ });
+ }
+
+ $('div.release_info .target').text(summary.target);
+
+ 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 .file').text(summary.file).prop('href', summary.url);
+
+ var formattedNotes = summary.notes.trim('\r').replace(/\r/g, ''); + $('div.release_info .notes').html(formattedNotes); + + $('div.release_info').slideDown(); + + } else { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherHexCorrupted')); + } + }); + } + + function failed_to_load() { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFailedToLoadOnlineFirmware')); + $('a.flash_firmware').addClass('locked'); + } + + var summary = $('select[name="release"] option:selected').data('summary'); + + if (summary) { // undefined while list is loading or while running offline + $.get(summary.url, function (data) { + process_hex(data, summary); + }).fail(failed_to_load); + } else { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFailedToLoadOnlineFirmware')); + } + }); + + $('a.flash_firmware').click(function () { + if (!$(this).hasClass('locked')) { + if (!GUI.connect_lock) { // button disabled while flashing is in progress + if (parsed_hex != false) { + if (String($('div#port-picker #port').val()) != 'DFU') { + if (String($('div#port-picker #port').val()) != '0') { + var options = {}, + port = String($('div#port-picker #port').val()), + baud; + + switch (GUI.operating_system) { + case 'Windows': + case 'MacOS': + case 'ChromeOS': + case 'Linux': + case 'UNIX': + baud = 921600; + break; + + default: + baud = 115200; + } + + if ($('input.updating').is(':checked')) { + options.no_reboot = true; + } else { + options.reboot_baud = parseInt($('div#port-picker #baud').val()); + } + + if ($('input.erase_chip').is(':checked')) { + options.erase_chip = true; + } + + if ($('input.flash_manual_baud').is(':checked')) { + baud = parseInt($('#flash_manual_baud_rate').val()); + } + + + STM32.connect(port, baud, parsed_hex, options); + } else { + console.log('Please select valid serial port'); + GUI.log('Please select valid serial port'); + } + } else { + STM32DFU.connect(usbDevices.STM32DFU, parsed_hex); + } + } else { + $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFirmwareNotLoaded')); + } + } + } + }); + + $(document).on('click', 'span.progressLabel a.save_firmware', function () { + chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: 'baseflight', accepts: [{extensions: ['hex']}]}, function (fileEntry) { + if (chrome.runtime.lastError) { + console.error(chrome.runtime.lastError.message); + return; + } + + chrome.fileSystem.getDisplayPath(fileEntry, function (path) { + console.log('Saving firmware to: ' + path); + + // check if file is writable + chrome.fileSystem.isWritableEntry(fileEntry, function (isWritable) { + if (isWritable) { + var blob = new Blob([intel_hex], {type: 'text/plain'}); + + fileEntry.createWriter(function (writer) { + var truncated = false; + + writer.onerror = function (e) { + console.error(e); + }; + + writer.onwriteend = function() { + if (!truncated) { + // onwriteend will be fired again when truncation is finished + truncated = true; + writer.truncate(blob.size); + + return; + } + }; + + writer.write(blob); + }, function (e) { + console.error(e); + }); + } else { + console.log('You don\'t have write permissions for this file, sorry.'); + GUI.log('You don\'t have write permissions for this file'); + } + }); + }); + }); + }); + + chrome.storage.local.get('no_reboot_sequence', function (result) { + if (result.no_reboot_sequence) { + $('input.updating').prop('checked', true); + $('.flash_on_connect_wrapper').show(); + } else { + $('input.updating').prop('checked', false); + } + + // bind UI hook so the status is saved on change + $('input.updating').change(function() { + var status = $(this).is(':checked'); + + if (status) { + $('.flash_on_connect_wrapper').show(); + } else { + $('input.flash_on_connect').prop('checked', false).change(); + $('.flash_on_connect_wrapper').hide(); + } + + chrome.storage.local.set({'no_reboot_sequence': status}); + }); + }); + + chrome.storage.local.get('flash_manual_baud', function (result) { + if (result.flash_manual_baud) { + $('input.flash_manual_baud').prop('checked', true); + } else { + $('input.flash_manual_baud').prop('checked', false); + } + + // bind UI hook so the status is saved on change + $('input.flash_manual_baud').change(function() { + var status = $(this).is(':checked'); + + chrome.storage.local.set({'flash_manual_baud': status}); + }); + + $('input.flash_manual_baud').change(); + }); + + chrome.storage.local.get('flash_manual_baud_rate', function (result) { + $('#flash_manual_baud_rate').val(result.flash_manual_baud_rate); + + // bind UI hook so the status is saved on change + $('#flash_manual_baud_rate').change(function() { + var baud = parseInt($('#flash_manual_baud_rate').val()); + chrome.storage.local.set({'flash_manual_baud_rate': baud}); + }); + + $('input.flash_manual_baud_rate').change(); + }); + + chrome.storage.local.get('flash_on_connect', function (result) { + if (result.flash_on_connect) { + $('input.flash_on_connect').prop('checked', true); + } else { + $('input.flash_on_connect').prop('checked', false); + } + + $('input.flash_on_connect').change(function () { + var status = $(this).is(':checked'); + + if (status) { + var catch_new_port = function () { + PortHandler.port_detected('flash_detected_device', function (result) { + var port = result[0]; + + if (!GUI.connect_lock) { + GUI.log('Detected: ' + port + ' - triggering flash on connect'); + console.log('Detected: ' + port + ' - triggering flash on connect'); + + // Trigger regular Flashing sequence + GUI.timeout_add('initialization_timeout', function () { + $('a.flash_firmware').click(); + }, 100); // timeout so bus have time to initialize after being detected by the system + } else { + GUI.log('Detected ' + port + ' - previous device still flashing, please replug to try again'); + } + + // Since current port_detected request was consumed, create new one + catch_new_port(); + }, false, true); + }; + + catch_new_port(); + } else { + PortHandler.flush_callbacks(); + } + + chrome.storage.local.set({'flash_on_connect': status}); + }).change(); + }); + + chrome.storage.local.get('erase_chip', function (result) { + if (result.erase_chip) { + $('input.erase_chip').prop('checked', true); + } else { + $('input.erase_chip').prop('checked', false); + } + + // bind UI hook so the status is saved on change + $('input.erase_chip').change(function () { + chrome.storage.local.set({'erase_chip': $(this).is(':checked')}); + }); + }); + + $(document).keypress(function (e) { + if (e.which == 13) { // enter + // Trigger regular Flashing sequence + $('a.flash_firmware').click(); + } + }); + + if (callback) callback(); + }); +}; + +TABS.firmware_flasher.cleanup = function (callback) { + PortHandler.flush_callbacks(); + + // unbind "global" events + $(document).unbind('keypress'); + $(document).off('click', 'span.progressLabel a'); + + if (callback) callback(); +}; \ No newline at end of file diff --git a/tabs/firmware_flasher.html b/tabs/firmware_flasher.html index 7bf2c631..26d011d7 100755 --- a/tabs/firmware_flasher.html +++ b/tabs/firmware_flasher.html @@ -8,28 +8,28 @@
+
+
+
\ No newline at end of file
diff --git a/tabs/landing.html b/tabs/landing.html
index 635f5e12..b50bcf8b 100644
--- a/tabs/landing.html
+++ b/tabs/landing.html
@@ -22,7 +22,8 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ • MassiveRC
+
+ • Armattan Quads
+
+ • Bungeecow Multirotors
+
+ • Immersion RC
+
+ • RadioC
+
+ • MultiiWiiCopter
+
+ • OverSkyRC
+