V2.1 18.07.20 added support for ESP8266 based Wifi Kit 8

(by Pulsar07/           (https://heltec.org/project/wifi-kit-8/)
   R.Stransky             is a ESP8266 with
                          * a build in OLED 128x32
                          * battery connector with charging management
                          * reset and GPIO0 button
                        support for a tare button (PIN_TARE_BUTTON)
                        bug fixed: wifi password now with up to 64 chars
                        bug fixed: wifi data (ssid/passwd) with special
                          character (e.g. +) is now supported
                        for specified battery type, voltage is displayed
                        using uncompressed html files makes WEB GUI much faster
This commit is contained in:
Rainer Stransky 2020-07-18 12:31:16 +02:00
parent 1ce3c18ada
commit 3cf22bb65a
9 changed files with 2759 additions and 135 deletions

View File

@ -4,11 +4,23 @@
(c) 2019 by M. Lehmann
------------------------------------------------------------------
*/
#define CGSCALE_VERSION "2.0"
#define CGSCALE_VERSION "2.1"
/*
******************************************************************
history:
V2.1 18.07.20 added support for ESP8266 based Wifi Kit 8
(by Pulsar07/ (https://heltec.org/project/wifi-kit-8/)
R.Stransky is a ESP8266 with
* a build in OLED 128x32
* battery connector with charging management
* reset and GPIO0 button
support for a tare button (PIN_TARE_BUTTON)
bug fixed: wifi password now with up to 64 chars
bug fixed: wifi data (ssid/passwd) with special
character (e.g. +) is now supported
for specified battery type, voltage is displayed
using uncompressed html files makes WEB GUI much faster
V2.0 26.01.20 Webpage rewritten, no bootstrap framework needed
add translation to webpage (en, de)
optimized for measuring with landinggears
@ -155,6 +167,206 @@ void(* resetCPU) (void) = 0;
void resetCPU() {}
#endif
void initOLED() {
oledDisplay.begin();
const uint8_t *font;
font = u8g2_font_6x12_tr;
int displayHeight = oledDisplay.getDisplayHeight();
int displayWidth = oledDisplay.getDisplayWidth();
if (displayHeight <= 32) {
font = u8g2_font_6x12_tr;
}
int ylineHeight = displayHeight/3;
oledDisplay.firstPage();
do {
if (displayHeight <= 32) {
oledDisplay.drawXBMP(5, 0, 18, 18, CGImage);
} else {
oledDisplay.drawXBMP(20, 12, 18, 18, CGImage);
}
oledDisplay.setFont(u8g2_font_helvR12_tr);
if (displayHeight <= 32) {
oledDisplay.setCursor(30, 12);
} else {
oledDisplay.setCursor(45, 28);
}
oledDisplay.print(F("CG scale"));
oledDisplay.setFont(u8g2_font_5x7_tr);
if (displayHeight <= 32) {
oledDisplay.setCursor(30, 22);
} else {
oledDisplay.setCursor(35, 55);
}
oledDisplay.print(F("Version: "));
oledDisplay.print(CGSCALE_VERSION);
if (displayHeight <= 32) {
oledDisplay.setCursor(5, 31);
} else {
oledDisplay.setCursor(20, 64);
}
oledDisplay.print(F("(c) 2019 M.Lehmann et al."));
} while ( oledDisplay.nextPage() );
}
void printOLED(String aLine1, String aLine2, String aLine3=String(""));
void printOLED(String aLine1, String aLine2, String aLine3) {
const uint8_t *font;
font = u8g2_font_6x12_tr;
int displayHeight = oledDisplay.getDisplayHeight();
int displayWidth = oledDisplay.getDisplayWidth();
font = u8g2_font_helvR10_tr;
if (displayHeight <= 32) {
font = u8g2_font_6x12_tr;
}
int ylineHeight = displayHeight/3;
oledDisplay.firstPage();
do {
oledDisplay.setFont(u8g2_font_6x12_tr);
oledDisplay.setCursor(0, ylineHeight*1);
oledDisplay.print(aLine1);
oledDisplay.setCursor(0, ylineHeight*2);
oledDisplay.print(aLine2);
if (aLine3 == "") {
oledDisplay.drawLine(0, ylineHeight*2 + 2, displayWidth, ylineHeight*2+2);
oledDisplay.setFont(u8g2_font_4x6_tr);
oledDisplay.setCursor(0, displayHeight);
String signature = "CG scale: V" + String(CGSCALE_VERSION);
oledDisplay.setCursor(displayWidth - oledDisplay.getStrWidth(signature.c_str()), displayHeight);
oledDisplay.print(signature);
} else {
oledDisplay.setCursor(0, displayHeight);
oledDisplay.print(aLine3);
}
} while ( oledDisplay.nextPage() );
}
void printScaleOLED() {
// print to display
char buff[8];
int pos_weightTotal = 7;
int pos_CG_length = 28;
if (nLoadcells == 2) {
pos_weightTotal = 17;
pos_CG_length = 45;
if (batType == 0) {
pos_weightTotal = 12;
pos_CG_length = 40;
}
}
const uint8_t *font;
int linestart = 14;
int linedist = 25;
int col0=0;
int col1=28;
font = u8g2_font_helvR12_tr;
if (oledDisplay.getDisplayHeight() <=32) {
font = u8g2_font_6x12_tr;
linestart = 8;
linedist = 12;
col0=0;
col1=28;
}
oledDisplay.firstPage();
do {
if (errMsgCnt == 0) {
// print battery
if (batType > B_OFF) {
oledDisplay.drawXBMP(48, 1, 12, 6, batteryImage);
float percentVolt = percentBat(batVolt / batCells);
dtostrf(percentVolt, 3, 0, buff);
oledDisplay.drawBox(49, 2, (percentVolt / (100 / 8)), 4);
oledDisplay.setFont(u8g2_font_5x7_tr);
oledDisplay.setCursor(78 - oledDisplay.getStrWidth(buff), 7);
if (batType > B_VOLT) {
dtostrf(percentVolt, 3, 0, buff);
oledDisplay.print(buff);
oledDisplay.print(F("%/"));
}
dtostrf(batVolt, 2, 2, buff);
oledDisplay.print(buff);
oledDisplay.print(F("V"));
}
// print total weight
oledDisplay.setFont(font);
if (oledDisplay.getDisplayHeight() <= 32) {
oledDisplay.setCursor(1, 18);
oledDisplay.print(F("M = "));
} else {
oledDisplay.drawXBMP(2, pos_weightTotal, 18, 18, weightImage);
oledDisplay.setCursor(93 - oledDisplay.getStrWidth(buff), pos_weightTotal + 17);
}
dtostrf(weightTotal, 5, 1, buff);
oledDisplay.print(buff);
oledDisplay.print(F("g"));
// print CG longitudinal axis
if (oledDisplay.getDisplayHeight() <=32) {
oledDisplay.setCursor(1, 32);
oledDisplay.print(F("CG = "));
} else {
oledDisplay.drawXBMP(2, pos_CG_length, 18, 18, CGImage);
oledDisplay.setCursor(93 - oledDisplay.getStrWidth(buff), pos_CG_length + 16);
}
dtostrf(CG_length, 5, 1, buff);
oledDisplay.print(buff);
oledDisplay.print(F("mm"));
// print CG transverse axis
if (nLoadcells == 3) {
if (oledDisplay.getDisplayHeight() <=32) {
oledDisplay.setCursor(78, 32);
oledDisplay.print(F("LR="));
dtostrf(CG_trans, 3, 0, buff);
} else {
oledDisplay.drawXBMP(2, 47, 18, 18, CGtransImage);
oledDisplay.setCursor(93 - oledDisplay.getStrWidth(buff), 64);
dtostrf(CG_trans, 5, 1, buff);
}
oledDisplay.print(buff);
oledDisplay.print(F("mm"));
}
} else {
oledDisplay.setFont(u8g2_font_5x7_tr);
for (int i = 1; i <= errMsgCnt; i++) {
oledDisplay.setCursor(0, 7 * i);
oledDisplay.print(errMsg[i]);
}
}
} while ( oledDisplay.nextPage() );
}
#ifdef PIN_TARE_BUTTON
void handleTareBtn() {
static unsigned long lastTaraBtn = 0;
if ((millis() - lastTaraBtn) > 20) {
lastTaraBtn = millis();
static int tareBtnCnt = 0;
if(digitalRead(PIN_TARE_BUTTON)) {
tareBtnCnt = 0;
} else {
tareBtnCnt++;
if (tareBtnCnt > 10) {
Serial.println("tare button pressed");
printOLED("TARE ==>"," tare load cells ...");
// avoid keybounce
tareBtnCnt = -1000;
tareLoadcells();
delay(2000);
}
}
}
}
#endif
// save calibration factor
void saveCalFactor(int nLC) {
@ -278,8 +490,9 @@ int percentBat(float cellVoltage) {
void setup() {
// init serial
Serial.begin(9600);
Serial.begin(115200);
Serial.println();
delay(1000);
#if defined(ESP8266)
printConsole(T_BOOT, "startup CG scale V" + String(CGSCALE_VERSION));
@ -367,23 +580,9 @@ void setup() {
// init OLED display
#if defined(ESP8266)
printConsole(T_BOOT, "init OLED display");
printConsole(T_BOOT, "init OLED display: " + String(oledDisplay.getDisplayWidth())+ String("x") + String(oledDisplay.getDisplayHeight()));
#endif
oledDisplay.begin();
oledDisplay.firstPage();
do {
oledDisplay.drawXBMP(20, 12, 18, 18, CGImage);
oledDisplay.setFont(u8g2_font_helvR12_tr);
oledDisplay.setCursor(45, 28);
oledDisplay.print(F("CG scale"));
oledDisplay.setFont(u8g2_font_5x7_tr);
oledDisplay.setCursor(35, 55);
oledDisplay.print(F("Version: "));
oledDisplay.print(CGSCALE_VERSION);
oledDisplay.setCursor(20, 64);
oledDisplay.print(F("(c) 2019 M. Lehmann"));
} while ( oledDisplay.nextPage() );
initOLED();
// init & tare Loadcells
for (int i = LC1; i <= LC3; i++) {
@ -408,6 +607,7 @@ void setup() {
#if defined(ESP8266)
// Start by connecting to a WiFi network
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid_STA, password_STA);
@ -417,18 +617,20 @@ void setup() {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (WiFi.status() == WL_NO_SSID_AVAIL) {
printConsole(T_ERROR, "Wifi: No SSID available");
printConsole(T_ERROR, "\nWifi: No SSID available");
break;
} else if (WiFi.status() == WL_CONNECT_FAILED) {
printConsole(T_ERROR, "Wifi: Connection failed");
printConsole(T_ERROR, "\nWifi: Connection failed");
break;
} else if ((millis() - timeoutWiFi) > TIMEOUT_CONNECT) {
printConsole(T_ERROR, "Wifi: Timeout");
printConsole(T_ERROR, "\nWifi: Timeout");
break;
}
}
if (WiFi.status() != WL_CONNECTED) {
// if WiFi not connected, switch to access point mode
wifiSTAmode = false;
@ -457,34 +659,16 @@ void setup() {
}
#endif
if (wifiSTAmode) {
printOLED("WiFi: " + String(ssid_STA),
"Host: " + String(hostname),
"IP : " + WiFi.localIP().toString());
} else {
printOLED("WiFi: " + String(ssid_AP),
"Host: " + String(hostname),
"IP : " + WiFi.softAPIP().toString());
}
// print wifi status
oledDisplay.firstPage();
do {
oledDisplay.setFont(u8g2_font_5x7_tr);
oledDisplay.setCursor(0, 14);
oledDisplay.print(F("WiFi:"));
oledDisplay.setCursor(0, 39);
oledDisplay.print(F("Host:"));
oledDisplay.setCursor(0, 64);
oledDisplay.print(F("IP:"));
oledDisplay.setFont(u8g2_font_helvR10_tr);
oledDisplay.setCursor(28, 14);
if (wifiSTAmode) {
oledDisplay.print(ssid_STA);
} else {
oledDisplay.print(ssid_AP);
}
oledDisplay.setCursor(28, 39);
oledDisplay.print(hostname);
oledDisplay.setCursor(28, 64);
if (wifiSTAmode) {
oledDisplay.print(WiFi.localIP());
} else {
oledDisplay.print(WiFi.softAPIP());
}
} while ( oledDisplay.nextPage() );
delay(3000);
// When the client requests data
@ -589,6 +773,10 @@ void loop() {
server.handleClient();
#endif
#ifdef PIN_TARE_BUTTON
handleTareBtn();
#endif
updateLoadcells();
// update loadcell values
@ -606,6 +794,7 @@ void loop() {
}
}
// update display and serial menu
if ((millis() - lastTimeMenu) > UPDATE_INTERVAL_OLED_MENU) {
@ -642,80 +831,10 @@ void loop() {
// read battery voltage
if (batType > B_OFF) {
batVolt = (analogRead(VOLTAGE_PIN) / 1024.0) * V_REF * ((resistor[R1] + resistor[R2]) / resistor[R2]) / 1000.0;
#if ENABLE_PERCENTLIST
if (batType > B_VOLT) {
batVolt = percentBat(batVolt / batCells);
}
#endif
}
// print to display
char buff[8];
int pos_weightTotal = 7;
int pos_CG_length = 28;
if (nLoadcells == 2) {
pos_weightTotal = 17;
pos_CG_length = 45;
if (batType == 0) {
pos_weightTotal = 12;
pos_CG_length = 40;
}
}
printScaleOLED();
oledDisplay.firstPage();
do {
if (errMsgCnt == 0) {
// print battery
if (batType > B_OFF) {
oledDisplay.drawXBMP(88, 1, 12, 6, batteryImage);
if (batType == B_VOLT) {
dtostrf(batVolt, 2, 2, buff);
} else {
dtostrf(batVolt, 3, 0, buff);
oledDisplay.drawBox(89, 2, (batVolt / (100 / 8)), 4);
}
oledDisplay.setFont(u8g2_font_5x7_tr);
oledDisplay.setCursor(123 - oledDisplay.getStrWidth(buff), 7);
oledDisplay.print(buff);
if (batType == B_VOLT) {
oledDisplay.print(F("V"));
} else {
oledDisplay.print(F("%"));
}
}
// print total weight
oledDisplay.drawXBMP(2, pos_weightTotal, 18, 18, weightImage);
dtostrf(weightTotal, 5, 1, buff);
oledDisplay.setFont(u8g2_font_helvR12_tr);
oledDisplay.setCursor(93 - oledDisplay.getStrWidth(buff), pos_weightTotal + 17);
oledDisplay.print(buff);
oledDisplay.print(F(" g"));
// print CG longitudinal axis
oledDisplay.drawXBMP(2, pos_CG_length, 18, 18, CGImage);
dtostrf(CG_length, 5, 1, buff);
oledDisplay.setCursor(93 - oledDisplay.getStrWidth(buff), pos_CG_length + 16);
oledDisplay.print(buff);
oledDisplay.print(F(" mm"));
// print CG transverse axis
if (nLoadcells == 3) {
oledDisplay.drawXBMP(2, 47, 18, 18, CGtransImage);
dtostrf(CG_trans, 5, 1, buff);
oledDisplay.setCursor(93 - oledDisplay.getStrWidth(buff), 64);
oledDisplay.print(buff);
oledDisplay.print(F(" mm"));
}
} else {
oledDisplay.setFont(u8g2_font_5x7_tr);
for (int i = 1; i <= errMsgCnt; i++) {
oledDisplay.setCursor(0, 7 * i);
oledDisplay.print(errMsg[i]);
}
}
} while ( oledDisplay.nextPage() );
// serial connection
if (Serial) {
@ -838,7 +957,7 @@ void loop() {
switch (menuPage)
{
case MENU_HOME: {
Serial.print(F("\n\n********************************************\nCG scale by M.Lehmann - V"));
Serial.print(F("\n\n********************************************\nCG scale by M.Lehmann et al. - V"));
Serial.print(CGSCALE_VERSION);
Serial.print(F("\n\n"));
@ -1111,10 +1230,16 @@ void getValue() {
response += buff;
response += "V";
} else {
dtostrf(batVolt, 5, 0, buff);
float percentVolt = percentBat(batVolt / batCells);
dtostrf(percentVolt, 5, 0, buff);
response += buff;
response += "%";
response += "%/";
dtostrf(batVolt, 5, 2, buff);
response += buff;
response += "V";
}
Serial.print("send response: ");
Serial.println(response);
server.send(200, "text/html", response);
}
@ -1137,9 +1262,13 @@ void getRawValue() {
response += buff;
response += "V";
} else {
dtostrf(batVolt, 5, 0, buff);
float percentVolt = percentBat(batVolt / batCells);
dtostrf(percentVolt, 5, 0, buff);
response += buff;
response += "%";
response += "%/";
dtostrf(batVolt, 5, 2, buff);
response += buff;
response += "V";
}
server.send(200, "text/html", response);
}

View File

@ -7,7 +7,7 @@ Schwerpunktwaage auf Arduinobasis zum auswiegen von Flugmodellen. Es werden rela
Die wichtigsten Funktionen:
- unterstützt Waagen mit 2 oder 3 Wiegezellen
- unterstützt ESP8266 und Arduino mit ATmega328, ATmega32u4
- unterstützt ESP8266 (auch Wifi Kit 8) und Arduino mit ATmega328, ATmega32u4
- automatische Kalibrierung anhand eines Referenzobjekts, dadurch kein mühsames eruieren der Kalibrierwerte
- Anzeige durch OLED Display
- Batteriespannnung kann gemessen werden

880
data/index.html Executable file
View File

@ -0,0 +1,880 @@
<!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;
}
.navbar .badge {
position: absolute;
top: 0px;
right: 0px;
padding: 5px 8px;
border-radius: 30%;
background: red;
color: white;
font-size: 20px;
}
@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;}
}
/***** 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: 1320px;
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;
}
.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;
}
/***** Labels *****/
big{
display: inline-block;
padding: 10px 2px;
padding-top: 15px;
font-size: 16px;
color: #3c3c3c;
}
.big_short{
width: 12%;
text-align: left;
color: #808080;
}
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: 1300px
}
.basic_img {
height:50px;
padding-left:30px;
vertical-align:middle
}
.basic_text_cont{
padding-left:20px;
vertical-align:middle;
float: right;
width: 70%;
}
.basic_value{
color:#000000;
font-size:40px;
width: 100%;
}
.basic_value_saved{
color:#808080;
font-size:17px;
width: 100%;
}
@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_short{
float: right;
width: 86%;
}
input:active,
/***** selectbox *****/
select {
/*width:100%;*/
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;
}
</style>
<script>
var CG_trans_visible = true;
var batVolt_visible = true;
var curModelName = "";
var targetCGmin = 0;
var targetCGmax = 0;
var mType = 0;
var imgFW190 = new Image();
imgFW190.src = "fw190.png";
var translation;
var languages = {
"en":{
"measure":"Measure",
"tareBtn":"Tare",
"saveBtn":"Save",
"tabConfig":"Config",
"gearTyp":"Landing gear type:",
"gearTyp2":"2 point with tailspur",
"gearTyp3":"3 point with nosewheel",
"distances":"Distances in mm:",
"tabBasic":"Basic",
"weightTotalSaved":"not saved",
"CG_lengthSaved":"not saved",
"CG_transSaved":"not saved",
"tabExpert":"Extended",
"targetCG":"Target CG in mm:"
},
"de":{
"measure":"Messen",
"tareBtn":"Tare",
"saveBtn":"Speichern",
"tabConfig":"Konfig",
"gearTyp":"Fahrwerktyp:",
"gearTyp2":"2 Punkt mit Hecksporn",
"gearTyp3":"3 Punkt mit Bugrad",
"distances":"Distanzen in mm:",
"tabBasic":"Basis",
"weightTotalSaved":"nicht gespeichert",
"CG_lengthSaved":"nicht gespeichert",
"CG_transSaved":"nicht gespeichert",
"tabExpert":"Erweitert",
"targetCG":"Soll CG in mm:"
}
};
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("errMsg").innerHTML = value[1];
document.getElementById("cgscaleVersion").innerHTML = value[2];
// check if new version available
if(parseFloat(value[3]) > parseFloat(value[2])){
var a = document.getElementById('settingsBtn');
a.insertAdjacentHTML('beforeend', '<span class="badge">1</span>');
}
}
}
}
request.open("GET", "getHead", true);
request.send();
}
function getParameter(){
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("&");
if(value[0] == "2"){
CG_trans_visible = false;
document.getElementById("cglrContainer").outerHTML = "";
}
if(value[11] == "0"){
batVolt_visible = false;
document.getElementById("batContainer").outerHTML = "";
}
curModelName = value[17];
if (curModelName != "") {
document.getElementById("modelName").innerHTML = curModelName;
setValue("distanceX1", value[1]);
setValue("distanceX2", value[2]);
setValue("distanceX3", value[3]);
document.getElementById("weightTotalSaved").innerHTML = value[18];
document.getElementById("CG_lengthSaved").innerHTML = value[19];
if(CG_trans_visible == true){
document.getElementById("CG_transSaved").innerHTML = value[20];
}
setValue("targetCGmin", value[21]);
setValue("targetCGmax", value[22]);
targetCGmin = parseFloat(value[21]);
targetCGmax = parseFloat(value[22]);
mType = parseInt(value[23]);
if(mType == 0){
document.getElementById("tab-2").checked = true;
}else if(mType == 1){
document.getElementById("tab-config").hidden = false;
document.getElementById("tab-1").checked = true;
document.getElementById("gearTyp").outerHTML = "";
document.getElementById("gearTypeImg").src = "CG_scale_mechanics.png";
}else if(mType > 1){
document.getElementById("tab-config").hidden = false;
document.getElementById("tab-1").checked = true;
document.getElementById("mechanicsType").hidden = false;
setValue("mechanicsType", value[23]);
changeGearImg();
}
}
}
}
}
request.open("GET", "getParameter", true);
request.send();
}
function getValue(){
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("weightTotal").innerHTML = value[0];
document.getElementById("CG_length").innerHTML = value[1];
if(CG_trans_visible == true){
document.getElementById("CG_trans").innerHTML = value[2];
}
if(batVolt_visible == true){
drawBattery(value[3]);
}
drawExpert(value[0],value[1],value[2]);
}
}
}
request.open("GET", "getValue", true);
request.send();
setTimeout('getValue()', 1200);
}
function saveModel(){
if (curModelName != "") {
var data = "?";
data += "modelname=" + curModelName;
data += "&targetCGmin=" + document.getElementById("targetCGmin").value;
data += "&targetCGmax=" + document.getElementById("targetCGmax").value;
if(parseInt(mType) > 0){
data += "&distanceX1=" + document.getElementById("distanceX1").value;
data += "&distanceX2=" + document.getElementById("distanceX2").value;
data += "&distanceX3=" + document.getElementById("distanceX3").value;
}
data += "&mechanicsType=" + mType;
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
alert(curModelName + " saved");
location.reload();
}else if(this.readyState == 4 && this.status == 404){
alert("Model not saved !");
}
}
request.open("GET", "saveModel" + data, true);
request.send();
}
}
function setValue(id, value)
{
var element = document.getElementById(id);
element.value = value;
}
function tare(){
document.getElementById("weightTotal").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 drawExpert(weight,cg,cglr){
var tolerance = (targetCGmax-targetCGmin)/2;
var centerVal = parseFloat(cg) - (tolerance + targetCGmin);
var canvas = document.getElementById("expertCanvas");
var ctx = canvas.getContext("2d");
ctx.clearRect(0,0,canvas.width, canvas.height);
// print profil
var pHeight = 400;
var pHeightOffset = 170;
ctx.beginPath();
ctx.lineWidth = 3;
ctx.moveTo(canvas.width/1000*5, pHeight/500*100+pHeightOffset);
ctx.bezierCurveTo(canvas.width/1000*20, pHeight/500*-40+pHeightOffset, canvas.width/1000*1000, pHeight/500*95+pHeightOffset, canvas.width/1000*995, pHeight/500*100+pHeightOffset);
ctx.moveTo(canvas.width/1000*5, pHeight/500*100+pHeightOffset);
ctx.bezierCurveTo(canvas.width/1000*5, pHeight/500*140+pHeightOffset, canvas.width/1000*1000, pHeight/500*104+pHeightOffset, canvas.width/1000*995, pHeight/500*100+pHeightOffset);
ctx.stroke();
// print difference
ctx.font = "25px Trebuchet MS";
var strCenterVal = centerVal.toFixed(1)+"mm";
var maxProgresPx = 100;
var progresPx = (maxProgresPx / 2 / tolerance) * centerVal;
if(progresPx > 0){
if(progresPx < maxProgresPx/2){
ctx.fillStyle = "#00b300";
}else{
ctx.fillStyle = "#FF0000";
if(progresPx > maxProgresPx){
progresPx = maxProgresPx;
}
}
ctx.fillRect(225, 125+pHeightOffset, progresPx, 25);
ctx.fillStyle = "#808080";
ctx.textAlign = "left";
ctx.fillText(strCenterVal, 232 + progresPx, 147+pHeightOffset);
}else if(progresPx < 0){
if(progresPx > maxProgresPx / 2 * -1){
ctx.fillStyle = "#00b300";
}else{
ctx.fillStyle = "#FF0000";
if(progresPx < maxProgresPx * -1){
progresPx = maxProgresPx * -1;
}
}
ctx.fillRect(225 + progresPx, 125+pHeightOffset, progresPx * -1, 25);
ctx.fillStyle = "#808080";
ctx.textAlign = "right";
ctx.fillText(strCenterVal, 218 + progresPx, 147+pHeightOffset);
}else{
ctx.fillStyle = "#808080";
ctx.textAlign = "left";
ctx.fillText(strCenterVal, 190, 147+pHeightOffset);
}
// print CG
var cgimg = document.getElementById("cgimg");
ctx.drawImage(cgimg, 198, 180+pHeightOffset,55,55);
ctx.font = "42px Trebuchet MS";
ctx.fillStyle = "#000000";
ctx.textAlign = "left";
ctx.fillText(cg, 300, 224+pHeightOffset);
// print weight
var weightimg = document.getElementById("weightimg");
ctx.drawImage(weightimg, 198, 50,55,55);
ctx.font = "42px Trebuchet MS";
ctx.fillStyle = "#000000";
ctx.textAlign = "left";
ctx.fillText(weight, 300, 94);
// print CG L-R
if(CG_trans_visible == true){
var cglrHeightOffset = 550;
ctx.drawImage(imgFW190, 50, cglrHeightOffset);
// print difference
ctx.font = "25px Trebuchet MS";
maxProgresPx = 100;
progresPx = (maxProgresPx / 2 / tolerance) * parseFloat(cglr);
if(progresPx > 0){
ctx.fillStyle = "#FF0000";
if(progresPx > maxProgresPx){
progresPx = maxProgresPx;
}
ctx.fillRect(362, cglrHeightOffset+175, progresPx, 25);
ctx.fillStyle = "#808080";
ctx.textAlign = "left";
ctx.fillText(cglr, 369 + progresPx, cglrHeightOffset+197);
}else if(progresPx < 0){
ctx.fillStyle = "#FF0000";
if(progresPx < maxProgresPx * -1){
progresPx = maxProgresPx * -1;
}
ctx.fillRect(362 + progresPx, cglrHeightOffset+175, progresPx * -1, 25);
ctx.fillStyle = "#808080";
ctx.textAlign = "right";
ctx.fillText(cglr, 355 + progresPx, cglrHeightOffset+197);
}else{
ctx.fillStyle = "#808080";
ctx.textAlign = "left";
ctx.fillText(cglr, 320, cglrHeightOffset+197);
}
}
}
function mobileNavbar() {
var x = document.getElementById("Navbar");
if (x.className === "navbar") {
x.className += " responsive";
} else {
x.className = "navbar";
}
}
function changeGearImg() {
mType = document.getElementById("mechanicsType").value;
if(mType == 2){
document.getElementById("gearTypeImg").src="pc6.png";
}else if(mType == 3){
document.getElementById("gearTypeImg").src="pc7.png";
}
}
</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 id="settingsBtn" href="/settings.html"><img height="32" src="data:image/png;base64,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"></a>
<a href="/models.html"><img height="32" 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 class="active" href="/index.html"><img height="32" 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="measure"></span><span id="modelName" style="padding-left:10px; color: #1abc9c;"></span>
</div>
<div class="buttonbar">
<button type="button" class="button tareButton" onclick="tare()" id="tareBtn"></button>
<button type="button" class="button saveButton" onclick="saveModel()" id="saveBtn"></button>
</div>
</div>
<div class="wrapper main_container">
<div class="tabs">
<div class="tab" hidden id="tab-config">
<input type="radio" name="css-tabs" id="tab-1" class="tab-switch">
<label for="tab-1" class="tab-label" id="tabConfig"></label>
<div class="tab-content">
<div>
<big id="gearTyp"></big>
<select hidden id="mechanicsType" onchange="changeGearImg()">
<option value="2" id="gearTyp2"></option>
<option value="3" id="gearTyp3"></option>
</select>
</div>
<div style="margin-top:50px; margin-left: 30px; margin-bottom: 50px;">
<img style="max-width: 100%" id="gearTypeImg" src="">
</div>
<div>
<big id="distances"></big>
</div>
<div style="margin-bottom: 10px">
<big class="big_short">X1:</big>
<input type="text" id="distanceX1" class="input_short">
</div>
<div style="margin-bottom: 10px">
<big class="big_short">X2:</big>
<input type="text" id="distanceX2" class="input_short">
</div>
<div>
<big class="big_short">X3:</big>
<input type="text" id="distanceX3" class="input_short">
</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="tabBasic"></label>
<div class="tab-content">
<div style="padding-bottom:50px; padding-top: 30px;">
<img id="weightimg" class="basic_img" src="data:image/png;base64,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">
<div class="basic_text_cont" >
<div class="basic_value" id="weightTotal">-</div>
<div class="basic_value_saved" id="weightTotalSaved"></div>
</div>
</div>
<div style="padding-bottom:50px">
<img id="cgimg" class="basic_img" src="data:image/png;base64,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">
<div class="basic_text_cont" >
<div class="basic_value" id="CG_length">-</div>
<div class="basic_value_saved" id="CG_lengthSaved"></div>
</div>
</div>
<div id="cglrContainer">
<img class="basic_img" src="data:image/png;base64,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">
<div class="basic_text_cont" >
<div class="basic_value" id="CG_trans">-</div>
<div class="basic_value_saved" id="CG_transSaved"></div>
</div>
</div>
<div style="color:#FF0000; padding-left:30px; padding-top:20px; font-size:17px;">
<span id="errMsg"></span>
</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="tabExpert"></label>
<div class="tab-content">
<div>
<big id="targetCG"></big>
</div>
<div style="margin-bottom: 10px">
<big class="big_short">min:</big>
<input type="text" id="targetCGmin" class="input_short" onchange="targetCGmin = parseFloat(this.value)">
</div>
<div>
<big class="big_short">max:</big>
<input type="text" id="targetCGmax" class="input_short" onchange="targetCGmax = parseFloat(this.value)">
</div>
<div style="margin-top:50px; text-align: center;">
<canvas id="expertCanvas" width="700" height="1000" style="max-width: 100%"></canvas>
</div>
</div>
</div>
</div>
</div>
<div style="color:#808080; text-align:center; font-size:12px;">(c) 2019 M. Lehmann - Version: <span id="cgscaleVersion">--</span></div>
<script>
setTranslation("en");
drawExpert("-","-","-");
getHead();
getParameter();
getValue();
</script>
</body>
</html>

Binary file not shown.

531
data/models.html Executable file
View File

@ -0,0 +1,531 @@
<!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;
}
/***** 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;
}
.navbar .badge {
position: absolute;
top: 0px;
right: 0px;
padding: 5px 8px;
border-radius: 30%;
background: red;
color: white;
font-size: 20px;
}
@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;}
}
/***** Table *****/
table {
border-collapse: collapse;
width: 100%;
cursor: pointer;
}
th {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
background-color:#1abc9c;
}
td {
height: 40px;
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
background-color:#ffffff;
}
tr:hover td{background-color:#f5f5f5;}
/***** button *****/
.button {
border: none;
border-radius: 3px;
color: white;
padding: 3px 10px;
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;
}
.openButton {
background-color: white;
color: black;
border: 2px solid #1abc9c;
}
.openButton:hover {
background-color: #1abc9c;
color: white;
}
.deleteButton {
background-color: white;
color: black;
border: 2px solid #DC143C;
}
.deleteButton:hover {
background-color: #DC143C;
color: white;
}
.newButton {
padding: 7px 16px;
background-color: white;
color: black;
border: 2px solid #778899;
}
.newButton:hover {
background-color: #778899;
color: white;
}
/***** Labels *****/
.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:152px;
}
@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:212px;
}
}
</style>
<script>
var CG_trans_visible = true;
var batVolt_visible = true;
var curModelName = "";
var translation;
var languages = {
"en":{
"modeltitle":"Model",
"saveBtn":"New model",
"thName":"Name"
},
"de":{
"modeltitle":"Modell",
"saveBtn":"Neues Modell",
"thName":"Name"
}
};
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])){
var a = document.getElementById('settingsBtn');
a.insertAdjacentHTML('beforeend', '<span class="badge">1</span>');
}
}
}
}
request.open("GET", "getHead", true);
request.send();
}
function getParameter(){
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("&");
if(value[0] == "2"){
CG_trans_visible = false;
}
if(value[11] == "0"){
batVolt_visible = false;
document.getElementById("batContainer").outerHTML = "";
}
curModelName = value[17];
if (curModelName != "") {
document.getElementById("modelName").innerHTML = curModelName;
}
}
}
}
request.open("GET", "getParameter", true);
request.send();
}
function getValue(){
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("&");
if(batVolt_visible == true){
drawBattery(value[3]);
}
}
}
}
request.open("GET", "getValue", true);
request.send();
setTimeout('getValue()', 5000);
}
function getModels(){
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
var root = JSON.parse(this.responseText);
var table = document.getElementById("models");
if(CG_trans_visible == false){
document.getElementById("cgLRrow").outerHTML = "";
}
for (name in root) {
var row = table.insertRow();
var cellName = row.insertCell(0);
var cellWeight = row.insertCell(1);
var cellCG = row.insertCell(2);
cellName.innerHTML = name;
cellWeight.innerHTML = root[name].wt;
cellCG.innerHTML = root[name].cg;
if(CG_trans_visible == true){
var cellcglr = row.insertCell(3);
var cellButton = row.insertCell(4);
cellcglr.innerHTML = root[name].cglr;
}else{
var cellButton = row.insertCell(3);
}
if(name != curModelName){
var htmlbutton = '<div><button type="button" class="button openButton" onclick="openModel(\'';
htmlbutton += name;
htmlbutton += '\')"><img style="height:20px; vertical-align:middle" src="data:image/png;base64,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"></button><button type="button" class="button deleteButton" onclick="deleteModel(\'';
htmlbutton += name;
htmlbutton += '\')"><img style="height:20px; vertical-align:middle" src="data:image/png;base64,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"></button></div>';
cellButton.innerHTML = htmlbutton;
}else{
row.setAttribute("class", "table-active");
}
}
}
}
request.open("GET", "models.json", true);
request.send();
}
function saveModel(){
var modelname = prompt("Please enter new model name:");
if (modelname != "") {
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
location.reload();
}else if(this.readyState == 4 && this.status == 404){
alert("Model not saved !");
}
}
request.open("GET", "saveModel?modelname=" + modelname, true);
request.send();
}
}
function openModel(modelname){
if (modelname != "") {
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
location.reload();
}else if(this.readyState == 4 && this.status == 404){
alert("Model not open !");
}
}
request.open("GET", "openModel?modelname=" + modelname, true);
request.send();
}
}
function deleteModel(modelname){
if (modelname != "" && confirm("Do you want to delete: " + modelname + "?")){
var request = new XMLHttpRequest();
request.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
location.reload();
}else if(this.readyState == 4 && this.status == 404){
alert("Model not deleted !");
}
}
request.open("GET", "deleteModel?modelname=" + modelname, true);
request.send();
}
}
function download(file)
{
window.location=file;
}
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 id="settingsBtn" href="/settings.html"><img height="32" src="data:image/png;base64,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"></a>
<a class="active" href="/models.html"><img height="32" 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="32" 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="modeltitle"></span><span id="modelName" style="padding-left:10px; color: #1abc9c;"></span>
</div>
<div class="buttonbar">
<button type="button" class="button newButton" onclick="saveModel()" id="saveBtn"></button>
</div>
</div>
<div class="main_container">
<table id="models">
<tr>
<th id="thName"></th>
<th><img style="height:30px; vertical-align:middle" src="data:image/png;base64,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"></th>
<th><img style="height:30px; vertical-align:middle" src="data:image/png;base64,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"></th>
<th id="cgLRrow"><img style="height:30px; vertical-align:middle" src="data:image/png;base64,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"></th>
<th></th>
</tr>
</table>
</div>
<div style="color:#808080; text-align:center; font-size:12px; padding-top:30px;">(c) 2019 M. Lehmann - Version: <span id="cgscaleVersion">--</span></div>
<script>
setTranslation("en");
getHead();
getParameter();
getModels();
getValue();
</script>
</body>
</html>

Binary file not shown.

1062
data/settings.html Executable file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -45,15 +45,33 @@ CG scale with 3 Loadcells:
*/
#define PIN_LOADCELL1_DOUT D6
#define PIN_LOADCELL1_PD_SCK D5
#define PIN_LOADCELL2_DOUT D2
#define PIN_LOADCELL2_PD_SCK D1
// Wifi Kit 8 (https://heltec.org/project/wifi-kit-8/)
// is a ESP8266 based board, with integrated OLED and battery management
// #define WIFI_KIT_8 1
#ifdef WIFI_KIT_8
#define PIN_LOADCELL1_DOUT D6
#define PIN_LOADCELL1_PD_SCK D7
#define PIN_LOADCELL3_DOUT D7
#define PIN_LOADCELL3_PD_SCK D0
#define PIN_LOADCELL2_DOUT D3
#define PIN_LOADCELL2_PD_SCK D8
#define PIN_LOADCELL3_DOUT D0
#define PIN_LOADCELL3_PD_SCK D0
// D3 can be used in parallel to the load cell with Wifi Kit 8
#define PIN_TARE_BUTTON D3
#else
#define PIN_LOADCELL1_DOUT D6
#define PIN_LOADCELL1_PD_SCK D5
#define PIN_LOADCELL2_DOUT D2
#define PIN_LOADCELL2_PD_SCK D1
#define PIN_LOADCELL3_DOUT D7
#define PIN_LOADCELL3_PD_SCK D0
#endif
// **** Measurement settings ****
@ -81,9 +99,13 @@ CG scale with 3 Loadcells:
// Please UNCOMMENT the display used
U8G2_SH1106_128X64_NONAME_1_HW_I2C oledDisplay(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ D3, /* data=*/ D4);
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C oledDisplay(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ D3, /* data=*/ D4);
#ifdef WIFI_KIT_8
// Wifi Kit 8 has a fixed wired 128x32 display
U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C oledDisplay(U8G2_R0, /* reset=*/ 16, /* clock=*/ 5, /* data=*/ 4);
#else
U8G2_SH1106_128X64_NONAME_1_HW_I2C oledDisplay(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ D3, /* data=*/ D4);
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C oledDisplay(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ D3, /* data=*/ D4);
#endif
// **** Voltage measurement settings ****
@ -129,7 +151,7 @@ U8G2_SH1106_128X64_NONAME_1_HW_I2C oledDisplay(U8G2_R0, /* reset=*/ U8X8_PIN_NON
// **** Wifi settings ****
#define MAX_SSID_PW_LENGHT 32
#define MAX_SSID_PW_LENGHT 64
// Station mode: connect to available network
#define SSID_STA "myWiFi"