1095 lines
50 KiB
HTML
Executable File
1095 lines
50 KiB
HTML
Executable File
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<meta name="description" content="">
|
|
<meta name="author" content="M. Lehmann">
|
|
<title>CG scale by M. Lehmann</title>
|
|
<style>
|
|
body {
|
|
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
|
background: #DCDCDC;
|
|
margin:0;
|
|
}
|
|
|
|
/***** remove standard-styles *****/
|
|
input, select, textarea {
|
|
-webkit-appearance: none;
|
|
-moz-appearance: none;
|
|
appearance: none;
|
|
border:none;
|
|
border-radius: 4px;
|
|
font-size: 1em;
|
|
width: 100%
|
|
}
|
|
|
|
/***** navbar *****/
|
|
|
|
.navbar {
|
|
list-style-type: none;
|
|
margin: 0;
|
|
padding: 0;
|
|
top: 0;
|
|
width: 100%;
|
|
background-color: #555;
|
|
position: fixed;
|
|
overflow: auto;
|
|
z-index: 10;
|
|
}
|
|
|
|
.navbar logo {
|
|
float: left;
|
|
display: block;
|
|
padding: 12px;
|
|
color: white;
|
|
text-decoration: none;
|
|
font-size: 32px;
|
|
}
|
|
|
|
.navbar a {
|
|
float: right;
|
|
display: block;
|
|
padding: 12px;
|
|
color: white;
|
|
text-decoration: none;
|
|
font-size: 32px;
|
|
}
|
|
|
|
.navbar a:hover {
|
|
background-color: #000;
|
|
}
|
|
|
|
.active {
|
|
background-color: #1E90FF;
|
|
}
|
|
|
|
.navbar .icon {
|
|
display: none;
|
|
}
|
|
|
|
@media screen and (max-width: 600px) {
|
|
.navbar a:not(:first-child) {display: none;}
|
|
.navbar a.icon {
|
|
float: right;
|
|
display: block;
|
|
}
|
|
.navbar.responsive {position: relative;}
|
|
.navbar.responsive .icon {
|
|
position: absolute;
|
|
right: 0;
|
|
top: 0;
|
|
height: auto;
|
|
}
|
|
.navbar.responsive a {
|
|
float: none;
|
|
display: block;
|
|
text-align: left;
|
|
}
|
|
.navbar.responsive logo{display: none;}
|
|
}
|
|
|
|
/***** Upload *****/
|
|
|
|
.upload-btn-wrapper {
|
|
position: relative;
|
|
overflow: hidden;
|
|
display: inline-block;
|
|
}
|
|
|
|
.btn {
|
|
border: 1px solid #bbb;
|
|
color: #bbb;
|
|
background-color: white;
|
|
padding: 8px 16px;
|
|
padding-right: 100px;
|
|
border-radius: 4px 0px 0px 4px;
|
|
font-size: 16px;
|
|
}
|
|
|
|
.upload-btn-wrapper input[type=file] {
|
|
font-size: 100px;
|
|
position: absolute;
|
|
left: 0;
|
|
top: 0;
|
|
opacity: 0;
|
|
}
|
|
|
|
|
|
/***** tab *****/
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.wrapper {
|
|
width: 100%;
|
|
margin: 0 auto;
|
|
}
|
|
.tabs {
|
|
position: relative;
|
|
margin: 3rem 0;
|
|
background: #1abc9c;
|
|
}
|
|
.tabs::before,
|
|
.tabs::after {
|
|
content: "";
|
|
display: table;
|
|
}
|
|
.tabs::after {
|
|
clear: both;
|
|
}
|
|
.tab {
|
|
float: left;
|
|
}
|
|
.tab-switch {
|
|
display: none;
|
|
}
|
|
.tab-label {
|
|
position: relative;
|
|
display: block;
|
|
line-height: 2.75em;
|
|
height: 3em;
|
|
padding: 0 1.618em;
|
|
background: #1abc9c;
|
|
border-right: 0.125rem solid #16a085;
|
|
color: #2c3e50;
|
|
cursor: pointer;
|
|
top: 0;
|
|
transition: all 0.25s;
|
|
}
|
|
.tab-label:hover {
|
|
top: -0.25rem;
|
|
transition: top 0.25s;
|
|
}
|
|
.tab-content {
|
|
height: 2300px;
|
|
width: 100%;
|
|
position: absolute;
|
|
z-index: 1;
|
|
top: 2.75em;
|
|
left: 0;
|
|
padding: 1.618rem;
|
|
background: #FFFFFF;
|
|
color: #2c3e50;
|
|
opacity: 0;
|
|
transition: all 0.35s;
|
|
}
|
|
.tab-switch:checked + .tab-label {
|
|
background: #FFFFFF;
|
|
color: #2c3e50;
|
|
border-bottom: 0;
|
|
transition: all 0.35s;
|
|
z-index: 1;
|
|
top: -0.0625rem;
|
|
}
|
|
.tab-switch:checked + label + .tab-content {
|
|
z-index: 2;
|
|
opacity: 1;
|
|
transition: all 0.35s;
|
|
}
|
|
|
|
/***** button *****/
|
|
|
|
.button {
|
|
border: none;
|
|
border-radius: 4px;
|
|
color: white;
|
|
padding: 7px 16px;
|
|
text-align: center;
|
|
text-decoration: none;
|
|
display: inline-block;
|
|
font-size: 16px;
|
|
margin: 4px 2px;
|
|
-webkit-transition-duration: 0.4s; /* Safari */
|
|
transition-duration: 0.4s;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.calButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #1E90FF;
|
|
}
|
|
|
|
.calButton:hover {
|
|
background-color: #1E90FF;
|
|
color: white;
|
|
}
|
|
|
|
.tareButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #778899;
|
|
}
|
|
|
|
.tareButton:hover {
|
|
background-color: #778899;
|
|
color: white;
|
|
}
|
|
|
|
.saveButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #1abc9c;
|
|
}
|
|
|
|
.saveButton:hover {
|
|
background-color: #1abc9c;
|
|
color: white;
|
|
}
|
|
|
|
.backupButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #f04029;
|
|
}
|
|
|
|
.backupButton:hover {
|
|
background-color: #f04029;
|
|
color: white;
|
|
}
|
|
|
|
.updateButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #1E90FF;
|
|
}
|
|
|
|
.updateButton:hover {
|
|
background-color: #1E90FF;
|
|
color: white;
|
|
}
|
|
|
|
.donateButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #f7c40c;
|
|
background-color: #f7c40c;
|
|
width: 130px;
|
|
margin: auto;
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
|
|
.donateButton:hover {
|
|
border: 2px solid #f7a10c;
|
|
background-color: #f7a10c;
|
|
color: white;
|
|
}
|
|
|
|
.uploadButton {
|
|
background-color: white;
|
|
color: black;
|
|
border: 2px solid #1E90FF;
|
|
border-radius: 0px 4px 4px 0px;
|
|
margin-left: -7px;
|
|
}
|
|
|
|
.uploadButton:hover {
|
|
background-color: #1E90FF;
|
|
color: white;
|
|
}
|
|
|
|
/***** Labels *****/
|
|
|
|
big{
|
|
display: inline-block;
|
|
padding: 10px 2px;
|
|
padding-top: 15px;
|
|
font-size: 16px;
|
|
color: #3c3c3c;
|
|
}
|
|
|
|
small{
|
|
display: inline-block;
|
|
padding: 10px 2px;
|
|
font-size: 12px;
|
|
color: #808080;
|
|
}
|
|
|
|
.titlebar {
|
|
margin-left:30px;
|
|
margin-top:95px;
|
|
font-size:25px;
|
|
float: left;
|
|
width:40%;
|
|
}
|
|
|
|
.buttonbar {
|
|
margin-right:20px;
|
|
margin-top:85px;
|
|
float: right;
|
|
text-align:right;
|
|
width:50%;
|
|
}
|
|
|
|
.main_container {
|
|
padding-left:20px;
|
|
padding-right: 20px;
|
|
padding-top:105px;
|
|
padding-bottom: 2240px
|
|
}
|
|
|
|
@media screen and (max-width: 600px) {
|
|
.titlebar {
|
|
width:100%;
|
|
}
|
|
|
|
.buttonbar {
|
|
margin-left:20px;
|
|
margin-top:20px;
|
|
float: left;
|
|
text-align:left;
|
|
width:100%;
|
|
}
|
|
|
|
.main_container {
|
|
padding-top:165px;
|
|
}
|
|
}
|
|
|
|
/***** Input *****/
|
|
|
|
input{
|
|
background-color:white;
|
|
border: 1px solid #bbb;
|
|
padding:.75em 1em .5em 1em;
|
|
font-size: 16px;
|
|
color: #3c3c3c;
|
|
}
|
|
|
|
input:active,
|
|
|
|
|
|
/***** selectbox *****/
|
|
|
|
select {
|
|
border: 1px solid #bbb;
|
|
padding:.75em 1em .5em 1em;
|
|
background-color:white;
|
|
background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAKCAYAAAA6jzeaAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE0IDc5LjE1Njc5NywgMjAxNC8wOC8yMC0wOTo1MzowMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkVERjJERkRBQkVCMTFFNEFDN0Q5QjI0MDk3OTlBRjkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkVERjJERkVBQkVCMTFFNEFDN0Q5QjI0MDk3OTlBRjkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRURGMkRGQkFCRUIxMUU0QUM3RDlCMjQwOTc5OUFGOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRURGMkRGQ0FCRUIxMUU0QUM3RDlCMjQwOTc5OUFGOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuR/G+4AAAENSURBVHjatJG9agJREIVnTeIbBPIMVnmCIAhqmUpiYTp3i5Q+ihC5lUVEiYW1BGy0SJsq4AMEAoFACKSw2XwDpxB/UNh14ONw587cOcyN4jgumtkTPIcQJnZkJElyizShRd/KMkQBRtBwEzx8d6QBrxurb2gZw008wh+cw4AB9wcM+P0ALtTXy2yCVc7QOvzCGfQZ1N5jwPN91Xl9Xf2ZN2E8tEBq8KNcYODDhgE/B917XU19losJGXlFKvANEXQZ3JEB167yfl9RfS4RpWm6ufJr5AUulZrquzy+oIqBN8sxtkzISAnxv75aS39qA++WcxR2JTWoDB9KuZZPYWCvCRlZIjcwd9X5JPEvwABY010Pev8kyQAAAABJRU5ErkJggg==');
|
|
background-position: right;
|
|
background-repeat: no-repeat;
|
|
font-size: 16px;
|
|
color: #3c3c3c;
|
|
}
|
|
|
|
/* Hide browser-styling in IE10 */
|
|
select::-ms-expand {
|
|
display:none;
|
|
}
|
|
|
|
/* Hide custom-icons in lower versions of Internet Explorer (< IE10). */
|
|
.lt-ie10 select {
|
|
background-image: none;
|
|
}
|
|
|
|
/***** switch *****/
|
|
|
|
.switch {
|
|
position: relative;
|
|
display: inline-block;
|
|
width: 60px;
|
|
height: 34px;
|
|
}
|
|
|
|
.switch input {
|
|
opacity: 0;
|
|
width: 0;
|
|
height: 0;
|
|
}
|
|
|
|
.slider {
|
|
position: absolute;
|
|
cursor: pointer;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background-color: #ccc;
|
|
border-radius: 34px;
|
|
-webkit-transition: .4s;
|
|
transition: .4s;
|
|
}
|
|
|
|
.slider:before {
|
|
position: absolute;
|
|
content: "";
|
|
height: 26px;
|
|
width: 26px;
|
|
left: 4px;
|
|
bottom: 4px;
|
|
background-color: white;
|
|
border-radius: 50%;
|
|
-webkit-transition: .4s;
|
|
transition: .4s;
|
|
}
|
|
|
|
input:checked + .slider {
|
|
background-color: #1abc9c;
|
|
}
|
|
|
|
input:focus + .slider {
|
|
box-shadow: 0 0 1px #1abc9c;
|
|
}
|
|
|
|
input:checked + .slider:before {
|
|
-webkit-transform: translateX(26px);
|
|
-ms-transform: translateX(26px);
|
|
transform: translateX(26px);
|
|
}
|
|
</style>
|
|
|
|
<script>
|
|
var CG_trans_visible = true;
|
|
var batVolt_visible = true;
|
|
var curSSID_STA = "";
|
|
|
|
var translation;
|
|
var languages = {
|
|
"en":{
|
|
"settingsLabel":"Settings",
|
|
"tareBtn":"Tare",
|
|
"saveBtn":"Save",
|
|
"tabGeneral":"General",
|
|
"wifiHeading":"WiFi",
|
|
"homeWifiSSID":"Home WiFi name (SSID):",
|
|
"homeWifiSSIDdesc":"Connect to existing network",
|
|
"homeWifiPW":"WiFi password:",
|
|
"APwifiSSID":"Device name / Access point WiFi name (SSID):",
|
|
"APwifiSSIDdesc":"If no Home network is present, a access point is created",
|
|
"APwifiPW":"WiFi password:",
|
|
"APwifiPWdesc":"At least 8 characters",
|
|
"checkUpdate":"Automatically check for firmware updates at startup",
|
|
"enableOTAlabel":"Enable over the air update",
|
|
"modelDBheading":"Model database",
|
|
"modelDBdesc":"Download model database to your Computer.",
|
|
"backupBTN":"Backup",
|
|
"backupDesc":"Restore your model database. Select the 'models.json' file on your computer.",
|
|
"file-upload-filename":"Choose a file...",
|
|
"uploadBTN":"Upload",
|
|
"aboutHeading":"About CG scale",
|
|
"aboutDesc":"The CG Scale firmware is open source and available free of charge. If you like it, support the project with a donation and help it to be continuously developed.",
|
|
"donateBTN":"Donate",
|
|
"updateHeading":"Update",
|
|
"updateDesc":"A backup of the model database must be created before the firmware update! Download the latest version from https://github.com/nightflyer88/CG_scale/releases/latest, and then update the firmware (cgscale_xxx.bin) and the file system (cgscale_spiffs.bin).",
|
|
"updateBTN":"Firmware update",
|
|
"tabMechanics":"Mechanics",
|
|
"mechanicsTypeHeading":"Mechanics:",
|
|
"mechanics0":"Fixed contact surfaces",
|
|
"mechanics1":"movable contact surfaces",
|
|
"mechanics2":"2-point landing gear",
|
|
"mechanics3":"3-point landing gear",
|
|
"nLoadcellsHeading":"Number of load cells:",
|
|
"dist1label":"Distance X1 [mm]:",
|
|
"dist2label":"Distance X2 [mm]:",
|
|
"dist3label":"Distance X3 [mm]:",
|
|
"calHelpTxt":"To calibrate the cells it is recommended to use a reference object with a known weight and CG. Enter these values, check that the scale indicates 0g, then place the reference object on it and press 'Auto calibrate'. Otherwise, the calibration values can also be set manually.",
|
|
"refWgLabel":"Reference weight [g]:",
|
|
"refCGLabel":"Reference CG [mm]:",
|
|
"autoCalDesc":"The parameters must be saved before calibration.",
|
|
"autoCalBTN":"Auto calibrate",
|
|
"lc1Label":"Loadcell 1: ",
|
|
"lc2Label":"Loadcell 2: ",
|
|
"lc3Label":"Loadcell 3: ",
|
|
"cal1Label":"Calibration factor of load cell 1:",
|
|
"cal2Label":"Calibration factor of load cell 2:",
|
|
"cal3Label":"Calibration factor of load cell 3:",
|
|
"tabBattery":"Battery",
|
|
"batteryTypeLabel":"Battery type:",
|
|
"batT0":"OFF",
|
|
"batT1":"Voltage",
|
|
"batteryTypeDesc":"Select the battery type to display the percent. 'Voltage' only shows the battery voltage.",
|
|
"nBatCells":"Number of battery cells:",
|
|
"R1label":"Value of resistor R1 [ohm]:",
|
|
"R2label":"Value of resistor R2 [ohm]:"
|
|
},
|
|
"de":{
|
|
"settingsLabel":"Einstellungen",
|
|
"tareBtn":"Tare",
|
|
"saveBtn":"Speichern",
|
|
"tabGeneral":"Allgemein",
|
|
"wifiHeading":"WiFi",
|
|
"homeWifiSSID":"Home WiFi Name (SSID):",
|
|
"homeWifiSSIDdesc":"In bestehendes Netzwerk einloggen",
|
|
"homeWifiPW":"WiFi Passwort:",
|
|
"APwifiSSID":"Gerätename / Access point WiFi Name (SSID):",
|
|
"APwifiSSIDdesc":"Wenn kein Heimnetzwerk vorhanden ist, wird ein Access point erstellt",
|
|
"APwifiPW":"WiFi Passwort:",
|
|
"APwifiPWdesc":"Mindestens 8 Zeichen",
|
|
"checkUpdate":"Beim Start automatisch nach Firmware-Updates suchen",
|
|
"enableOTAlabel":"Over-the-Air Update aktivieren",
|
|
"modelDBheading":"Modell Datenbank",
|
|
"modelDBdesc":"Laden Sie die Modelldatenbank auf Ihren Computer herunter.",
|
|
"backupBTN":"Backup",
|
|
"backupDesc":"Stellen Sie Ihre Modelldatenbank wieder her. Wählen Sie die Datei 'models.json' auf Ihrem Computer.",
|
|
"file-upload-filename":"Datei wählen...",
|
|
"uploadBTN":"Upload",
|
|
"aboutHeading":"Über CG Scale",
|
|
"aboutDesc":"Die CG Scale-Firmware ist Quelloffen und kostenlos erhältlich. Wenn es Ihnen gefällt, unterstützen Sie das Projekt mit einer Spende und helfen Sie mit, dass es kontinuierlich weiterentwickelt wird.",
|
|
"donateBTN":"Spenden",
|
|
"updateHeading":"Update",
|
|
"updateDesc":"Vor dem Firmware Update muss ein Backup der Modelldatenbank erstellt werden ! Laden Sie die neuste Version von https://github.com/nightflyer88/CG_scale/releases/latest herunter, und aktualisieren Sie anschliessend die Firmware (cgscale_xxx.bin) und das Filesystem (cgscale_spiffs.bin).",
|
|
"updateBTN":"Firmware Update",
|
|
"tabMechanics":"Mechanik",
|
|
"mechanicsTypeHeading":"Mechanik:",
|
|
"mechanics0":"Feste Auflageflächen",
|
|
"mechanics1":"bewegliche Auflageflächen",
|
|
"mechanics2":"2 Punkt Fahrwerk",
|
|
"mechanics3":"3 Punkt Fahrwerk",
|
|
"nLoadcellsHeading":"Anzahl Wägezellen:",
|
|
"dist1label":"Distanz X1 [mm]:",
|
|
"dist2label":"Distanz X2 [mm]:",
|
|
"dist3label":"Distanz X3 [mm]:",
|
|
"calHelpTxt":"Zur Kalibrierung der Zellen wird empfohlen, ein Referenzobjekt mit bekanntem Gewicht und Schwerpunkt zu verwenden. Geben Sie diese Werte ein, überprüfen Sie dass die Waage 0g anzeigt, legen Sie das Referenzobjekt darauf und drücken Sie auf 'Automatisch kalibrieren'. Die Kalibrierwerte können ansonsten auch manuell eingestellt werden.",
|
|
"refWgLabel":"Referenz Gewicht [g]:",
|
|
"refCGLabel":"Referenz Schwerpunkt [mm]:",
|
|
"autoCalDesc":"Vor dem kalibrieren müssen die Parameter gespeichert werden.",
|
|
"autoCalBTN":"Automatisch kalibrieren",
|
|
"lc1Label":"Wägezelle 1: ",
|
|
"lc2Label":"Wägezelle 2: ",
|
|
"lc3Label":"Wägezelle 3: ",
|
|
"cal1Label":"Kalibrierfaktor Wägezelle 1:",
|
|
"cal2Label":"Kalibrierfaktor Wägezelle 2:",
|
|
"cal3Label":"Kalibrierfaktor Wägezelle 3:",
|
|
"tabBattery":"Batterie",
|
|
"batteryTypeLabel":"Batterie Typ:",
|
|
"batT0":"AUS",
|
|
"batT1":"Spannung",
|
|
"batteryTypeDesc":"Wählen Sie den Batterietyp aus, um den Prozentwert anzuzeigen. Mit 'Spannung' wird nur die Batteriespannung angezeigt.",
|
|
"nBatCells":"Anzahl Batteriezellen",
|
|
"R1label":"Wert des Widerstandes R1 [ohm]:",
|
|
"R2label":"Wert des Widerstandes R2 [ohm]:"
|
|
}
|
|
};
|
|
|
|
|
|
function setTranslation(defaultLang) {
|
|
var lang = navigator.languages ? navigator.languages[0] : navigator.language;
|
|
lang = lang.substr(0, 2);
|
|
|
|
translation = languages[lang] || languages[defaultLang];
|
|
|
|
for (var item in translation) {
|
|
var docElement = document.getElementById(item);
|
|
if(docElement){
|
|
docElement.innerHTML = translation[item];
|
|
}
|
|
}
|
|
}
|
|
|
|
function getHead(){
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 200){
|
|
if(this.responseText != null){
|
|
var responseString = this.responseText;
|
|
var value = responseString.split("&");
|
|
document.getElementById("ssid").innerHTML = value[0];
|
|
document.getElementById("cgscaleVersion").innerHTML = value[2];
|
|
// check if new version available
|
|
if(parseFloat(value[3]) > parseFloat(value[2])){
|
|
if (confirm("A new firmware version is available: V" + value[3] + "\nPlease download the latest version from GitHub and update the firmware.")) {
|
|
location.href='https://github.com/nightflyer88/CG_scale/releases/latest'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
request.open("GET", "getHead", true);
|
|
request.send();
|
|
}
|
|
|
|
function getParameter(func){
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 200){
|
|
if(this.responseText != null){
|
|
var responseString = this.responseText;
|
|
var value = responseString.split("&");
|
|
setValue("nLoadcells", value[0]);
|
|
setValue("distanceX1", value[1]);
|
|
setValue("distanceX2", value[2]);
|
|
setValue("distanceX3", value[3]);
|
|
setValue("refWeight", value[4]);
|
|
setValue("refCG", value[5]);
|
|
setValue("calFactorLoadcell1", value[6]);
|
|
setValue("calFactorLoadcell2", value[7]);
|
|
setValue("calFactorLoadcell3", value[8]);
|
|
setValue("resistorR1", value[9]);
|
|
setValue("resistorR2", value[10]);
|
|
setValue("batType", value[11]);
|
|
setValue("batCells", value[12]);
|
|
curSSID_STA = value[13];
|
|
setValue("ssid_STA", curSSID_STA);
|
|
setValue("password_STA", value[14]);
|
|
setValue("ssid_AP", value[15]);
|
|
setValue("password_AP", value[16]);
|
|
setValue("mechanicsType", value[23]);
|
|
if(value[24]=="1"){
|
|
document.getElementById("enableUpdate").checked = true;
|
|
}else{
|
|
document.getElementById("enableUpdate").checked = false;
|
|
}
|
|
if(value[25]=="1"){
|
|
document.getElementById("enableOTA").checked = true;
|
|
}else{
|
|
document.getElementById("enableOTA").checked = false;
|
|
}
|
|
if(value[0] == "2"){
|
|
CG_trans_visible = false;
|
|
document.getElementById("lc3Label").outerHTML = "";
|
|
}
|
|
if(value[11] == "0"){
|
|
batVolt_visible = false;
|
|
document.getElementById("batContainer").outerHTML = "";
|
|
}
|
|
return func;
|
|
}
|
|
}
|
|
}
|
|
request.open("GET", "getParameter", true);
|
|
request.send();
|
|
}
|
|
|
|
function getRawValue(){
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 200){
|
|
if(this.responseText != null){
|
|
var responseString = this.responseText;
|
|
var value = responseString.split("&");
|
|
document.getElementById("lc1").innerHTML = value[0];
|
|
document.getElementById("lc2").innerHTML = value[1];
|
|
if(CG_trans_visible == true){
|
|
document.getElementById("lc3").innerHTML = value[2];
|
|
}
|
|
if(batVolt_visible == true){
|
|
drawBattery(value[3]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
request.open("GET", "getRawValue", true);
|
|
request.send();
|
|
setTimeout('getRawValue()', 1500);
|
|
}
|
|
|
|
function getWiFiNetworks(){
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 200){
|
|
if(this.responseText != null){
|
|
var responseString = this.responseText;
|
|
var value = responseString.split("&");
|
|
var select = document.getElementById('ssid_STA');
|
|
for (var i = 0; i<value.length; ++i){
|
|
var opt = document.createElement('option');
|
|
opt.text = value[i];
|
|
select.add(opt);
|
|
}
|
|
setValue("ssid_STA", curSSID_STA);
|
|
}
|
|
}
|
|
}
|
|
request.open("GET", "getWiFiNetworks", true);
|
|
request.send();
|
|
}
|
|
|
|
function saveParameter(func){
|
|
var data = "?";
|
|
data += "nLoadcells=" + document.getElementById("nLoadcells").value;
|
|
data += "&distanceX1=" + document.getElementById("distanceX1").value;
|
|
data += "&distanceX2=" + document.getElementById("distanceX2").value;
|
|
data += "&distanceX3=" + document.getElementById("distanceX3").value;
|
|
data += "&refWeight=" + document.getElementById("refWeight").value;
|
|
data += "&refCG=" + document.getElementById("refCG").value;
|
|
data += "&calFactorLoadcell1=" + document.getElementById("calFactorLoadcell1").value;
|
|
data += "&calFactorLoadcell2=" + document.getElementById("calFactorLoadcell2").value;
|
|
data += "&calFactorLoadcell3=" + document.getElementById("calFactorLoadcell3").value;
|
|
data += "&resistorR1=" + document.getElementById("resistorR1").value;
|
|
data += "&resistorR2=" + document.getElementById("resistorR2").value;
|
|
data += "&batType=" + document.getElementById("batType").value;
|
|
data += "&batCells=" + document.getElementById("batCells").value;
|
|
data += "&ssid_STA=" + encodeURIComponent(document.getElementById("ssid_STA").value);
|
|
data += "&password_STA=" + encodeURIComponent(document.getElementById("password_STA").value);
|
|
data += "&ssid_AP=" + encodeURIComponent(document.getElementById("ssid_AP").value);
|
|
data += "&password_AP=" + encodeURIComponent(document.getElementById("password_AP").value);
|
|
data += "&mechanicsType=" + document.getElementById("mechanicsType").value;
|
|
if(document.getElementById("enableUpdate").checked){
|
|
data += "&enableUpdate=1"
|
|
}else{
|
|
data += "&enableUpdate=0"
|
|
}
|
|
if(document.getElementById("enableOTA").checked){
|
|
data += "&enableOTA=1"
|
|
}else{
|
|
data += "&enableOTA=0"
|
|
}
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 200){
|
|
alert("Parameters saved");
|
|
getParameter(func);
|
|
}else if(this.readyState == 4 && this.status == 404){
|
|
alert("Save parameter failed !");
|
|
}
|
|
}
|
|
request.open("GET", "saveParameter" + data, true);
|
|
request.send();
|
|
}
|
|
|
|
function autoCalibrate(){
|
|
if (confirm("When ready, put the reference object on the scale.")){
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 200){
|
|
alert("Calibration successful");
|
|
getParameter();
|
|
}else if(this.readyState == 4 && this.status == 404){
|
|
alert("Calibration failed !");
|
|
}
|
|
}
|
|
request.open("GET", "autoCalibrate", true);
|
|
request.send();
|
|
}
|
|
}
|
|
|
|
function setValue(id, value)
|
|
{
|
|
var element = document.getElementById(id);
|
|
element.value = value;
|
|
}
|
|
|
|
function tare(){
|
|
document.getElementById("lc1").innerHTML = "TARE";
|
|
document.getElementById("lc2").innerHTML = "TARE";
|
|
if(CG_trans_visible == true){
|
|
document.getElementById("lc3").innerHTML = "TARE";
|
|
}
|
|
var request = new XMLHttpRequest();
|
|
request.onreadystatechange = function(){
|
|
if(this.readyState == 4 && this.status == 404){
|
|
alert("Tare failed !");
|
|
}
|
|
}
|
|
request.open("GET", "tare", true);
|
|
request.send();
|
|
}
|
|
|
|
function drawBattery(value){
|
|
document.getElementById("batValue").innerHTML = value;
|
|
|
|
var canvas = document.getElementById('batCanvas');
|
|
var ctx = canvas.getContext('2d');
|
|
ctx.clearRect(0,0,canvas.width, canvas.height);
|
|
|
|
// battery icon
|
|
var r = 5;
|
|
var l = 40;
|
|
var h = 20;
|
|
var bl = 3;
|
|
var bh = 3;
|
|
var ox = 2;
|
|
var oy = 2;
|
|
// battery fill
|
|
var fr = 2;
|
|
var fl = 34; //100%
|
|
var fh = 14;
|
|
var fx = 5;
|
|
var fy = 5;
|
|
|
|
var percentpos = value.indexOf('%');
|
|
if(percentpos != -1){
|
|
var percent = Number(value.substring(0, percentpos));
|
|
fl = fl/100*percent;
|
|
}else{
|
|
fl = 0;
|
|
}
|
|
|
|
// draw icon
|
|
ctx.beginPath();
|
|
ctx.lineWidth = 2;
|
|
ctx.moveTo(ox, oy+r);
|
|
ctx.arc(ox+r, oy+r, r, (Math.PI / 180) * 180, (Math.PI / 180) * 270, false);
|
|
ctx.lineTo(ox+(l-r), oy);
|
|
ctx.arc(ox+(l-r), oy+r, r, (Math.PI / 180) * 270, 0, false);
|
|
ctx.lineTo(ox+l, h/2-bh+oy);
|
|
ctx.lineTo(ox+l+bl, h/2-bh+oy);
|
|
ctx.lineTo(ox+l+bl, h/2+bh+oy);
|
|
ctx.lineTo(ox+l, h/2+bh+oy);
|
|
ctx.lineTo(ox+l, oy+h-r);
|
|
ctx.arc(ox+(l-r), oy+h-r, r, 0, (Math.PI / 180) * 90, false);
|
|
ctx.lineTo(ox+r, oy+h);
|
|
ctx.arc(ox+r, oy+h-r, r, (Math.PI / 180) * 90, (Math.PI / 180) * 180, false);
|
|
ctx.lineTo(ox, oy+r);
|
|
ctx.strokeStyle = "#FFFFFF";
|
|
ctx.stroke();
|
|
|
|
// draw filled value
|
|
if(fl>1){
|
|
ctx.beginPath();
|
|
ctx.fillStyle = "#FFFFFF";
|
|
ctx.moveTo(fx, fy+fr);
|
|
ctx.arc(fx+fr, fy+fr, fr, (Math.PI / 180) * 180, (Math.PI / 180) * 270, false);
|
|
ctx.lineTo(fx+(fl-fr), fy);
|
|
ctx.arc(fx+(fl-fr), fy+fr, fr, (Math.PI / 180) * 270, 0, false);
|
|
ctx.lineTo(fx+fl, fy+fh-fr);
|
|
ctx.arc(fx+(fl-fr), fy+fh-fr, fr, 0, (Math.PI / 180) * 90, false);
|
|
ctx.lineTo(fx+fr, fy+fh);
|
|
ctx.arc(fx+fr, fy+fh-fr, fr, (Math.PI / 180) * 90, (Math.PI / 180) * 180, false);
|
|
ctx.lineTo(fx, fy+fr);
|
|
ctx.fill();
|
|
}
|
|
}
|
|
|
|
function mobileNavbar() {
|
|
var x = document.getElementById("Navbar");
|
|
if (x.className === "navbar") {
|
|
x.className += " responsive";
|
|
} else {
|
|
x.className = "navbar";
|
|
}
|
|
}
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div class="navbar" id="Navbar">
|
|
<logo id="batContainer">
|
|
<canvas id="batCanvas" height="24" width="50" style="vertical-align:middle;"></canvas>
|
|
<span id="batValue" style="color:#FFFF; padding-right:20px; vertical-align:middle; font-size:17px;">-</span>
|
|
</logo>
|
|
<logo id="ssid" style="vertical-align:middle; font-size:32px;"></logo>
|
|
|
|
<a class="active" href="/settings.html"><img height="32px" src="data:image/png;base64,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"></a>
|
|
|
|
<a href="/models.html"><img height="32px" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAQAAACTbf5ZAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfjARQRDAuYnHU3AAAEUUlEQVR42u2bPWsVQRSG30n8IEiwDAiSJinEUgixE2ySNG6p2KTzAxK21F+gnRAEtbJIEVFQCzEBIWClSFqNmMZEERRENBEVTY7FvWaWZHdnxsyZc+/JfSuRZe953Lu+95nZBTrppJOy0CKVJ5OejAv4SgXwCvVKz8YDPExVuSY9Gw+woXcVwH/omPR0PMg3Kq/xAnVLT8cBPELVyaWn4wDeS18qgb/RYen5OJBnaq7xA+npOIBPU10y6fniA/fSzxpgjY1Ms7XXWF8j0/laYH2NTH20Xousr5HpGdUnl54wNvAlB7C2RqZBckVbI1easdZGrjRjrY1cY8Y6G7nGjFugkbvin9IQHjkP6sYtRY1ca8YaG7nWjIUbmeErDZjfmPM4rBdT6YGZ4jBjfY3sMGONjewwY32N7DDjFmjk2MAuM7bR4shOM9bWyE4zttHhyB5mbKPDkT3M2CZLMxPLL63NPAw4dkpBI3uZsU37N7KXGdskaeQuWtr2weOxTu5lxjZpHJmmtgGv0dFoZ/czY5ucH3i05GNf0oFIZ/czYxv+RqYe+l7ywbejnX8mCDhFI1d4zXiks/uasU3GDTxZ+rGR7mRvM7bhduTKn4CR7mRvM7bhbuSSamokyp3sbcY23I1cUk3/Mh7h7P5mbMPryKXV1EiUOznAjG1yTuDyamokwp0cYMY2vI1c+x/Lju/kIDO2YWlk0xxpQtGieDFrWME8ps2LrcADWJKejTX3cdF8LAADtIQB6alYs4wx86q44jErPRFz+vGY+nYTMNCP68WvdA8+o0d6JuYQhjevsPmBp9LzsMfgbHHV8rH0PAly0tg/0yDeSM/DnlXedenWy0YReER6mgR5XwQek54mQZ7stloaslf4hHpc4J5ZsMCj0tOwZxkTxZ+W2oHfYtR82gSmAdWuRLiLIbMIAHuaf6X1+q5iGfOYNgtb/wl4l3iOtM4ST2Mg7kW8yy22iMe+TPv8P4BzNlz2hfhDtBGMy7wQz7vVciEYl3erhX0zbS4YmHczjXm79CD9CsRl3y7l3RA/E3x9M15c7kce7gTicj/ywPxQy376GoSb4KEW3seWRoNwkzy2xPhgGkA3g3Db/VFx6qIPAbjt/zIAHQ+6vgoeLr0agKvhhR56HQCcSU+7c9wQC072CgDnzkPmfeQqJlMBMybAgnPpWWPg+ltw0vbl+0qfgvE6bh3nzHo6YLZ4W3D7ty8QYMHJ25frKz2GfV7HTZrVtMBM8bRgHS/geVuwjlcsAW8LzqXnjAfsY8Ht7r4FXB8Lbn/3LQD7WLCO9m0Cuy1Yg/sWgN0WnEnPGBPXbcFa2rcJ7NoL1tO+TWCXBefSE8bFdVmwePvGlod6C9bivjYOC9bUvoDTgnW1L+DcC86k54sPXGfButoXcFiwtvYFHBacS0/HAVxtweLty4FbbcGa3LcAXG3B2tq3CVxlwfratwlcZcGZ9GSddKI6fwE0tGCKyFWJ8wAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0wMS0yMFQxNjoxMjoxMSswMTowMP08UIkAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDEtMjBUMTY6MTI6MTErMDE6MDCMYeg1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAABJRU5ErkJggg=="></a>
|
|
|
|
<a href="/index.html"><img height="32px" src="data:image/png;base64,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"></a>
|
|
|
|
<a href="javascript:void(0);" class="icon" onclick="mobileNavbar()">
|
|
<img height="32px" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAbElEQVRYhe3WsQmAMBRF0fslhZWII7j/Ki7hAoZUVj4b0RFewH8g9X1VEvi7kLQBk6nfQtIBzKYBdTCFX/YBIWk1DrlM3ZQ6EpJG94C8iq0KcD7HwdVNKX1C0oLxS5ZvgX1AAXagmvrN1O3IDf2SJImhb9e9AAAAAElFTkSuQmCC">
|
|
</a>
|
|
</div>
|
|
|
|
<div>
|
|
<div class="titlebar">
|
|
<span style="color: #808080;" id="settingsLabel"></span>
|
|
</div>
|
|
<div class="buttonbar">
|
|
<button type="button" class="button saveButton" onclick="saveParameter()" id="saveBtn"></button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="wrapper main_container">
|
|
<div class="tabs">
|
|
<div class="tab">
|
|
<input type="radio" name="css-tabs" id="tab-1" checked class="tab-switch">
|
|
<label for="tab-1" class="tab-label" id="tabGeneral"></label>
|
|
<div class="tab-content">
|
|
<h2 id="wifiHeading"></h2>
|
|
<div>
|
|
<big id="homeWifiSSID"></big>
|
|
<select id="ssid_STA">
|
|
</select>
|
|
<small id="homeWifiSSIDdesc"></small>
|
|
</div>
|
|
<div>
|
|
<big id="homeWifiPW"></big>
|
|
<input type="password" id="password_STA">
|
|
</div>
|
|
<div style="margin-top:50px;">
|
|
<big id="APwifiSSID"></big>
|
|
<input type="text" id="ssid_AP">
|
|
<small id="APwifiSSIDdesc"></small>
|
|
</div>
|
|
<div>
|
|
<big id="APwifiPW"></big>
|
|
<input type="password" id="password_AP">
|
|
<small id="APwifiPWdesc"></small>
|
|
</div>
|
|
<div style="margin-top:60px;">
|
|
<label style="vertical-align: middle; margin-right: 30px" class="switch">
|
|
<input id="enableUpdate" type="checkbox">
|
|
<span class="slider"></span>
|
|
</label>
|
|
<big id="checkUpdate"></big>
|
|
</div>
|
|
<div style="margin-top:20px;">
|
|
<label style="vertical-align: middle; margin-right: 30px" class="switch">
|
|
<input id="enableOTA" type="checkbox">
|
|
<span class="slider"></span>
|
|
</label>
|
|
<big id="enableOTAlabel"></big>
|
|
</div>
|
|
<h2 style="margin-top:100px;" id="modelDBheading"></h2>
|
|
<div style="margin-top:30px;">
|
|
<div>
|
|
<div>
|
|
<small id="modelDBdesc"></small>
|
|
</div>
|
|
<a href="/models.json" download="models.json">
|
|
<button type="button" class="button backupButton" id="backupBTN"></button>
|
|
</a>
|
|
<div style="margin-top:30px;">
|
|
<small id="backupDesc"></small>
|
|
<form method="post" enctype="multipart/form-data">
|
|
<div class="upload-btn-wrapper">
|
|
<button class="btn" id="file-upload-filename"></button>
|
|
<input type="file" name="myfile" id="file-upload"/>
|
|
</div>
|
|
<button type="submit" class="button uploadButton" id="uploadBTN"></button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
var input = document.getElementById( 'file-upload' );
|
|
var infoArea = document.getElementById( 'file-upload-filename' );
|
|
|
|
input.addEventListener( 'change', showFileName );
|
|
|
|
function showFileName( event ) {
|
|
var input = event.srcElement;
|
|
var fileName = input.files[0].name;
|
|
infoArea.textContent = fileName;
|
|
}
|
|
</script>
|
|
<h2 style="margin-top:100px;" id="updateHeading"></h2>
|
|
<div style="margin-top:20px;">
|
|
<small id="updateDesc"></small>
|
|
<div style="margin-top:20px;">
|
|
<button type="button" class="button updateButton" onclick="location.href='/update';" id="updateBTN"></button>
|
|
</div>
|
|
</div>
|
|
<h2 style="margin-top:100px;" id="aboutHeading"></h2>
|
|
<div style="margin-top:20px;">
|
|
<small id="aboutDesc"></small>
|
|
<div style="margin-top:20px;">
|
|
<button type="button" class="button donateButton" onclick="location.href='https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R69PMKTCXQBUU&source=url';" id="donateBTN"></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="tab">
|
|
<input type="radio" name="css-tabs" id="tab-2" class="tab-switch">
|
|
<label for="tab-2" class="tab-label" id="tabMechanics"></label>
|
|
<div class="tab-content">
|
|
<div>
|
|
<big id="mechanicsTypeHeading"></big>
|
|
<select id="mechanicsType">
|
|
<option value="0" id="mechanics0"></option>
|
|
<option value="1" id="mechanics1"></option>
|
|
<option value="2" id="mechanics2"></option>
|
|
<option value="3" id="mechanics3"></option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<big id="nLoadcellsHeading"></big>
|
|
<select id="nLoadcells">
|
|
<option value="2">2</option>
|
|
<option value="3">3</option>
|
|
</select>
|
|
</div>
|
|
<div>
|
|
<big id="dist1label"></big>
|
|
<input type="text" id="distanceX1">
|
|
</div>
|
|
<div>
|
|
<big id="dist2label"></big>
|
|
<input type="text" id="distanceX2">
|
|
</div>
|
|
<div>
|
|
<big id="dist3label"></big>
|
|
<input type="text" id="distanceX3">
|
|
</div>
|
|
<div style="margin-top:30px;">
|
|
<small id="calHelpTxt"></small>
|
|
</div>
|
|
<div style="margin-top:30px;">
|
|
<big id="refWgLabel"></big>
|
|
<input type="text" id="refWeight">
|
|
</div>
|
|
<div>
|
|
<big id="refCGLabel"></big>
|
|
<input type="text" id="refCG">
|
|
</div>
|
|
<div style="margin-top:20px;">
|
|
<small id="autoCalDesc"></small>
|
|
</div>
|
|
<div style="margin-top:10px;">
|
|
<button type="button" class="button calButton" onclick="autoCalibrate()" id="autoCalBTN"></button>
|
|
</div>
|
|
<div style="margin-top:10px;">
|
|
<small id="lc1Label"></small><small id="lc1">-</small>
|
|
<small id="lc2Label"></small><small id="lc2">-</small>
|
|
<small id="lc3Label"></small><small id="lc3">-</small>
|
|
</div>
|
|
<div style="margin-top:10px;">
|
|
<button type="button" class="button tareButton" onclick="tare()" id="tareBtn"></button>
|
|
</div>
|
|
<div style="margin-top:50px;">
|
|
<big id="cal1Label"></big>
|
|
<input type="text" id="calFactorLoadcell1">
|
|
</div>
|
|
<div>
|
|
<big id="cal2Label"></big>
|
|
<input type="text" id="calFactorLoadcell2">
|
|
</div>
|
|
<div>
|
|
<big id="cal3Label"></big>
|
|
<input type="text" id="calFactorLoadcell3">
|
|
</div>
|
|
<div style="margin-top:50px; margin-left: 30px;">
|
|
<img style="max-width: 100%" src="CG_scale_mechanics.png">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="tab">
|
|
<input type="radio" name="css-tabs" id="tab-3" class="tab-switch">
|
|
<label for="tab-3" class="tab-label" id="tabBattery"></label>
|
|
<div class="tab-content">
|
|
<div>
|
|
<big id="batteryTypeLabel"></big>
|
|
<select id="batType">
|
|
<option value="0" id="batT0"></option>
|
|
<option value="1" id="batT1"></option>
|
|
<option value="2">LiPo</option>
|
|
<option value="3">Li-ion</option>
|
|
<option value="4">LiFePo</option>
|
|
<option value="5">Nixx</option>
|
|
</select>
|
|
<small id="batteryTypeDesc"></small>
|
|
</div>
|
|
<div>
|
|
<big id="nBatCells"></big>
|
|
<input type="text" id="batCells">
|
|
</div>
|
|
<div>
|
|
<big id="R1label"></big>
|
|
<input type="text" id="resistorR1">
|
|
</div>
|
|
<div>
|
|
<big id="R2label"></big>
|
|
<input type="text" id="resistorR2">
|
|
</div>
|
|
<div style="margin-top:30px; margin-left: 30px;">
|
|
<img src="Resistor.png">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div style="color:#808080; text-align:center; font-size:12px;">(c) 2020 M. Lehmann - Version: <span id="cgscaleVersion">--</span></div>
|
|
<script>
|
|
setTranslation("en");
|
|
getHead();
|
|
getParameter();
|
|
getWiFiNetworks();
|
|
getRawValue();
|
|
</script>
|
|
</body>
|
|
</html>
|