mirror of
https://github.com/betaflight/betaflight-configurator.git
synced 2025-07-26 09:45:28 +03:00
switchery integration
This commit is contained in:
parent
9489b13c13
commit
968e10feeb
12 changed files with 1042 additions and 24 deletions
18
js/libraries/switchery/dist/switchery.css
vendored
18
js/libraries/switchery/dist/switchery.css
vendored
|
@ -13,10 +13,10 @@
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 30px;
|
height: 17px;
|
||||||
position: relative;
|
position: relative;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
width: 50px;
|
width: 42px;
|
||||||
|
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
-khtml-user-select: none;
|
-khtml-user-select: none;
|
||||||
|
@ -31,23 +31,25 @@
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
|
||||||
height: 30px;
|
height: 17px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
width: 30px;
|
width: 17px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Switchery sizes. */
|
/* Switchery sizes. */
|
||||||
|
|
||||||
.switchery-small {
|
.switchery-small {
|
||||||
border-radius: 20px;
|
border-radius: 20px;
|
||||||
height: 20px;
|
height: 10px;
|
||||||
width: 33px;
|
width: 20px;
|
||||||
|
margin-top:-3px;
|
||||||
|
margin-right:3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.switchery-small > small {
|
.switchery-small > small {
|
||||||
height: 20px;
|
height: 10px;
|
||||||
width: 20px;
|
width: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.switchery-large {
|
.switchery-large {
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
<link type="text/css" rel="stylesheet" href="./styles/opensans_webfontkit/fonts.css" media="all" />
|
<link type="text/css" rel="stylesheet" href="./styles/opensans_webfontkit/fonts.css" media="all" />
|
||||||
<link type="text/css" rel="stylesheet" href="./styles/dropdown-lists/css/style_lists.css" media="all" />
|
<link type="text/css" rel="stylesheet" href="./styles/dropdown-lists/css/style_lists.css" media="all" />
|
||||||
<link type="text/css" rel="stylesheet" href="./js/libraries/switchery/switchery.css" media="all" />
|
<link type="text/css" rel="stylesheet" href="./js/libraries/switchery/dist/switchery.css" media="all" />
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript" src="./js/libraries/q.js"></script>
|
<script type="text/javascript" src="./js/libraries/q.js"></script>
|
||||||
|
@ -86,7 +86,7 @@
|
||||||
<script type="text/javascript" src="./tabs/dataflash.js"></script>
|
<script type="text/javascript" src="./tabs/dataflash.js"></script>
|
||||||
<script type="text/javascript" src="./tabs/firmware_flasher.js"></script>
|
<script type="text/javascript" src="./tabs/firmware_flasher.js"></script>
|
||||||
|
|
||||||
<script type="text/javascript" src="./js/libraries/switchery/switchery.js"></script>
|
<script type="text/javascript" src="./js/libraries/switchery/dist/switchery.js"></script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -125,7 +125,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label>
|
<label>
|
||||||
<input class="auto_connect" type="checkbox" />
|
<input class="auto_connect" type="checkbox" id="togglesmall" />
|
||||||
<span class="auto_connect" i18n="autoConnect"></span>
|
<span class="auto_connect" i18n="autoConnect"></span>
|
||||||
</label>
|
</label>
|
||||||
<div class="connect_contols">
|
<div class="connect_contols">
|
||||||
|
|
18
main.js
18
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'
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
220
tabs/firmware_flasher Kopie.css
Executable file
220
tabs/firmware_flasher Kopie.css
Executable file
|
@ -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;
|
||||||
|
}
|
96
tabs/firmware_flasher Kopie.html
Executable file
96
tabs/firmware_flasher Kopie.html
Executable file
|
@ -0,0 +1,96 @@
|
||||||
|
<div class="tab-firmware_flasher">
|
||||||
|
<div class="options">
|
||||||
|
<div class="option releases">
|
||||||
|
<select name="release">
|
||||||
|
<option value="0">Loading ...</option>
|
||||||
|
</select>
|
||||||
|
<span class="description" i18n="firmwareFlasherOnlineReleasesDescription"></span>
|
||||||
|
</div>
|
||||||
|
<div class="option">
|
||||||
|
<label>
|
||||||
|
<input class="updating" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherNoReboot"></span>
|
||||||
|
</label>
|
||||||
|
<span class="description" i18n="firmwareFlasherNoRebootDescription"></span>
|
||||||
|
</div>
|
||||||
|
<div class="option flash_on_connect_wrapper">
|
||||||
|
<label>
|
||||||
|
<input class="flash_on_connect" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherFlashOnConnect"></span>
|
||||||
|
</label>
|
||||||
|
<span class="description" i18n="firmwareFlasherFlashOnConnectDescription"></span>
|
||||||
|
</div>
|
||||||
|
<div class="option">
|
||||||
|
<label>
|
||||||
|
<input class="erase_chip" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherFullChipErase"></span>
|
||||||
|
</label>
|
||||||
|
<span class="description" i18n="firmwareFlasherFullChipEraseDescription"></span>
|
||||||
|
</div>
|
||||||
|
<div class="option manual_baud_rate">
|
||||||
|
<label>
|
||||||
|
<input class="flash_manual_baud" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherManualBaud"></span>
|
||||||
|
<select id="flash_manual_baud_rate" title="Baud Rate">
|
||||||
|
<option value="921600">921600</option>
|
||||||
|
<option value="460800">460800</option>
|
||||||
|
<option value="256000" selected="selected">256000</option>
|
||||||
|
<option value="230400">230400</option>
|
||||||
|
<option value="115200">115200</option>
|
||||||
|
<option value="57600">57600</option>
|
||||||
|
<option value="38400">38400</option>
|
||||||
|
<option value="28800">28800</option>
|
||||||
|
<option value="19200">19200</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<span class="description" i18n="firmwareFlasherManualBaudDescription"></span>
|
||||||
|
</div>
|
||||||
|
<div class="option">
|
||||||
|
<label>
|
||||||
|
<input class="show_development_releases" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherShowDevelopmentReleases"></span>
|
||||||
|
</label>
|
||||||
|
<span class="description" i18n="firmwareFlasherShowDevelopmentReleasesDescription"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clear-both"></div>
|
||||||
|
<div class="git_info">
|
||||||
|
<div class="title" i18n="firmwareFlasherGithubInfoHead"></div>
|
||||||
|
<p>
|
||||||
|
<strong i18n="firmwareFlasherHash"></strong> <a i18n_title="firmwareFlasherUrl" class="hash" href="#" target="_blank"></a><br />
|
||||||
|
<strong i18n="firmwareFlasherCommiter"></strong> <span class="committer"></span><br />
|
||||||
|
<strong i18n="firmwareFlasherDate"></strong> <span class="date"></span><br />
|
||||||
|
<strong i18n="firmwareFlasherMessage"></strong> <span class="message"></span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="release_info">
|
||||||
|
<div class="title" i18n="firmwareFlasherReleaseSummaryHead"></div>
|
||||||
|
<p>
|
||||||
|
<strong i18n="firmwareFlasherReleaseTarget"></strong> <span class="target"></span><br />
|
||||||
|
<strong i18n="firmwareFlasherReleaseName"></strong> <a i18n_title="firmwareFlasherReleaseUrl" class="name" href="#" target="_blank"></a><br />
|
||||||
|
<strong i18n="firmwareFlasherReleaseFile"></strong> <a i18n_title="firmwareFlasherReleaseFileUrl" class="file" href="#" target="_blank"></a><br />
|
||||||
|
<strong i18n="firmwareFlasherReleaseDate"></strong> <span class="date"></span><br />
|
||||||
|
<strong i18n="firmwareFlasherReleaseStatus"></strong> <span class="status"></span><br />
|
||||||
|
<strong i18n="firmwareFlasherReleaseNotes"></strong> <br />
|
||||||
|
<div class=notes></div>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="warning">
|
||||||
|
<div class="title" i18n="firmwareFlasherWarninghead"></div>
|
||||||
|
<p i18n="firmwareFlasherWarningText">
|
||||||
|
<p i18n="firmwareFlasherTargetWarning">
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="info">
|
||||||
|
<progress class="progress" value="0" min="0" max="100"></progress>
|
||||||
|
<span class="progressLabel" i18n="firmwareFlasherLoadFirmwareFile"></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="buttons">
|
||||||
|
<a class="load_file" href="#" i18n="firmwareFlasherButtonLoadLocal"></a>
|
||||||
|
<a class="load_remote_file locked" href="#" i18n="firmwareFlasherButtonLoadOnline"></a>
|
||||||
|
<a class="flash_firmware locked" href="#" i18n="firmwareFlasherFlashFirmware"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
529
tabs/firmware_flasher Kopie.js
Executable file
529
tabs/firmware_flasher Kopie.js
Executable file
|
@ -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($("<option value='0'>{0}</option>".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<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);
|
||||||
|
}
|
||||||
|
).
|
||||||
|
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("<b>GITHUB Query Failed: <code>{0}</code></b>".format(data["responseJSON"].message));
|
||||||
|
}
|
||||||
|
$('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) {
|
||||||
|
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("<b>No firmware selected to load</b>");
|
||||||
|
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('<a class="save_firmware" href="#" title="Save Firmware">Loaded Online Firmware: (' + parsed_hex.bytes_total + ' bytes)</a>');
|
||||||
|
|
||||||
|
$('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, '<br />');
|
||||||
|
$('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('<span style="color: red">Please select valid serial port</span>');
|
||||||
|
}
|
||||||
|
} 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 <span style="color: red">write permissions</span> 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: <strong>' + port + '</strong> - 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 <strong>' + port + '</strong> - 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();
|
||||||
|
};
|
|
@ -8,28 +8,28 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="option">
|
<div class="option">
|
||||||
<label>
|
<label>
|
||||||
<input class="updating" type="checkbox" />
|
<input class="updating" type="checkbox" id="toggle" />
|
||||||
<span i18n="firmwareFlasherNoReboot"></span>
|
<span i18n="firmwareFlasherNoReboot"></span>
|
||||||
</label>
|
</label>
|
||||||
<span class="description" i18n="firmwareFlasherNoRebootDescription"></span>
|
<span class="description" i18n="firmwareFlasherNoRebootDescription"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="option flash_on_connect_wrapper">
|
<div class="option flash_on_connect_wrapper">
|
||||||
<label>
|
<label>
|
||||||
<input class="flash_on_connect" type="checkbox" />
|
<input class="flash_on_connect" type="checkbox" id="toggle" />
|
||||||
<span i18n="firmwareFlasherFlashOnConnect"></span>
|
<span i18n="firmwareFlasherFlashOnConnect"></span>
|
||||||
</label>
|
</label>
|
||||||
<span class="description" i18n="firmwareFlasherFlashOnConnectDescription"></span>
|
<span class="description" i18n="firmwareFlasherFlashOnConnectDescription"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="option">
|
<div class="option">
|
||||||
<label>
|
<label>
|
||||||
<input class="erase_chip" type="checkbox" />
|
<input class="erase_chip" type="checkbox" id="toggle" />
|
||||||
<span i18n="firmwareFlasherFullChipErase"></span>
|
<span i18n="firmwareFlasherFullChipErase"></span>
|
||||||
</label>
|
</label>
|
||||||
<span class="description" i18n="firmwareFlasherFullChipEraseDescription"></span>
|
<span class="description" i18n="firmwareFlasherFullChipEraseDescription"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="option manual_baud_rate">
|
<div class="option manual_baud_rate">
|
||||||
<label>
|
<label>
|
||||||
<input class="flash_manual_baud" type="checkbox" />
|
<input class="flash_manual_baud" type="checkbox" id="toggle" />
|
||||||
<span i18n="firmwareFlasherManualBaud"></span>
|
<span i18n="firmwareFlasherManualBaud"></span>
|
||||||
<select id="flash_manual_baud_rate" title="Baud Rate">
|
<select id="flash_manual_baud_rate" title="Baud Rate">
|
||||||
<option value="921600">921600</option>
|
<option value="921600">921600</option>
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="option">
|
<div class="option">
|
||||||
<label>
|
<label>
|
||||||
<input class="show_development_releases" type="checkbox" />
|
<input class="show_development_releases" type="checkbox" id="toggle" />
|
||||||
<span i18n="firmwareFlasherShowDevelopmentReleases"></span>
|
<span i18n="firmwareFlasherShowDevelopmentReleases"></span>
|
||||||
</label>
|
</label>
|
||||||
<span class="description" i18n="firmwareFlasherShowDevelopmentReleasesDescription"></span>
|
<span class="description" i18n="firmwareFlasherShowDevelopmentReleasesDescription"></span>
|
||||||
|
|
|
@ -9,6 +9,7 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
googleAnalytics.sendAppView('Firmware Flasher');
|
googleAnalytics.sendAppView('Firmware Flasher');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var intel_hex = false, // standard intel hex in string format
|
var intel_hex = false, // standard intel hex in string format
|
||||||
parsed_hex = false; // parsed raw hex in array format
|
parsed_hex = false; // parsed raw hex in array format
|
||||||
|
|
||||||
|
@ -16,6 +17,18 @@ TABS.firmware_flasher.initialize = function (callback) {
|
||||||
// translate to user-selected language
|
// translate to user-selected language
|
||||||
localize();
|
localize();
|
||||||
|
|
||||||
|
// 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) {
|
function parse_hex(str, callback) {
|
||||||
// parsing hex in different thread
|
// parsing hex in different thread
|
||||||
var worker = new Worker('./js/workers/hex_parser.js');
|
var worker = new Worker('./js/workers/hex_parser.js');
|
||||||
|
@ -527,3 +540,6 @@ TABS.firmware_flasher.cleanup = function (callback) {
|
||||||
|
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
66
tabs/landing kopie.html
Normal file
66
tabs/landing kopie.html
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
<div class="tab-landing">
|
||||||
|
<div class="section optional_permissions">
|
||||||
|
<div class="title" i18n="default_optional_permissions_head"></div>
|
||||||
|
<p i18n="default_optional_permissions_text"></p>
|
||||||
|
<a id="requestOptionalPermissions" href="#" i18n="default_request_optional_permissions"></a>
|
||||||
|
<div class="clear-both"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row welcome_and_sponsors">
|
||||||
|
<div class="left">
|
||||||
|
<div class="section welcome">
|
||||||
|
<div class="section-content" i18n="defaultWelcomeText"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right">
|
||||||
|
<div class="section changelog configurator">
|
||||||
|
<div class="title" i18n="defaultChangelogHead"></div>
|
||||||
|
<div class="wrapper">
|
||||||
|
<!-- changelog content will be loaded here -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row contributing_and_sponsors">
|
||||||
|
<div class="left">
|
||||||
|
<div class="section contributing">
|
||||||
|
<div class="title" i18n="defaultContributingHead"></div>
|
||||||
|
<div class="section-content" i18n="defaultContributingText"></div>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="section donate">
|
||||||
|
<div class="title" i18n="defaultDonateHead"></div>
|
||||||
|
<div class="section-content" i18n="defaultDonateText"></div>
|
||||||
|
<div class="buttons">
|
||||||
|
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TSQKVT6UYKGL6" target="_blank" title="Donate"><img src="./images/btn_donate_SM.gif" alt="Paypal" /></a></li>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="right">
|
||||||
|
<div class="section sponsors">
|
||||||
|
<div class="title" i18n="defaultSponsorsHead"></div>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.massiverc.com" title="www.massiverc.com" target="_blank">MassiveRC</a><br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.armattanquads.com" title="www.armattanquads.com" target="_blank">Armattan Quads</a><br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.bcmultirotors.com" title="www.bcmultirotors.com" target="_blank">Bungeecow Multirotors</a><br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.immersionrc.com" title="www.immersionrc.com" target="_blank">Immersion RC</a><br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.radioc.co.uk" title="www.radioc.co.uk" target="_blank">RadioC</a><br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.multiwiicopter.com" title="www.multiwiicopter.com" target="_blank">MultiiWiiCopter</a><br />
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
• <a href="http://www.overskyrc.com" title="www.overskyrc.com" target="_blank">OverSkyRC</a><br />
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -23,6 +23,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="row contributing_and_sponsors">
|
<div class="row contributing_and_sponsors">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
|
|
||||||
<div class="section contributing">
|
<div class="section contributing">
|
||||||
<div class="title" i18n="defaultContributingHead"></div>
|
<div class="title" i18n="defaultContributingHead"></div>
|
||||||
<div class="section-content" i18n="defaultContributingText"></div>
|
<div class="section-content" i18n="defaultContributingText"></div>
|
||||||
|
|
|
@ -12,7 +12,8 @@ TABS.landing.initialize = function (callback) {
|
||||||
$('#content').load("./tabs/landing.html", function () {
|
$('#content').load("./tabs/landing.html", function () {
|
||||||
//check_usb_permissions(); // temporary enabled in dev branch, should be commented out untill DFU support goes live
|
//check_usb_permissions(); // temporary enabled in dev branch, should be commented out untill DFU support goes live
|
||||||
|
|
||||||
// translate to user-selected language
|
|
||||||
|
// translate to user-selected language
|
||||||
localize();
|
localize();
|
||||||
|
|
||||||
// load changelog content
|
// load changelog content
|
||||||
|
@ -29,3 +30,9 @@ TABS.landing.initialize = function (callback) {
|
||||||
TABS.landing.cleanup = function (callback) {
|
TABS.landing.cleanup = function (callback) {
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
63
test.html
Normal file
63
test.html
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Unbenanntes Dokument</title>
|
||||||
|
|
||||||
|
<link type="text/css" rel="stylesheet" href="./js/libraries/switchery/dist/switchery.css" media="all" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" src="./js/libraries/switchery/dist/switchery.js"></script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="option">
|
||||||
|
<label>
|
||||||
|
<input class="updating" id="toggle" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherNoReboot"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<input class="updating" id="togglesmall" type="checkbox" />
|
||||||
|
<span i18n="firmwareFlasherNoReboot"></span>
|
||||||
|
</label>
|
||||||
|
<span class="description" i18n="firmwareFlasherNoRebootDescription"></span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<input class="updating" id="togglesmall" type="checkbox" />
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var elems = Array.prototype.slice.call(document.querySelectorAll('#toggle'));
|
||||||
|
|
||||||
|
elems.forEach(function(html) {
|
||||||
|
var switchery = new Switchery(html,
|
||||||
|
{
|
||||||
|
color: '#59aa29',
|
||||||
|
secondaryColor: '#c4c4c4'
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var elems = Array.prototype.slice.call(document.querySelectorAll('#togglesmall'));
|
||||||
|
|
||||||
|
elems.forEach(function(html) {
|
||||||
|
var switchery = new Switchery(html,
|
||||||
|
{
|
||||||
|
size: 'small',
|
||||||
|
color: '#59aa29',
|
||||||
|
secondaryColor: '#c4c4c4'
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Add table
Add a link
Reference in a new issue