Reset to original Arduino min_spiffs partition layout.

Fixed a residual screen refresh issue with cyclic enabled and max temp dialed up - marker stuck.
SPIFFS upload added to bootload.zip COM.bat
This commit is contained in:
Ray Jones 2019-07-30 19:21:55 +10:00
parent a52143479f
commit 1b3b478a49
18 changed files with 37 additions and 839 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1 +1,5 @@
esptool.exe --chip esp32 --port COM14 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 boot_app0.bin 0x1000 bootloader_qio_80m.bin 0x10000 AfterburnerV3.0.0.bin 0x8000 Afterburner.partitions.bin
REM Firmware
esptool.exe --chip esp32 --port COM16 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 boot_app0.bin 0x1000 bootloader_qio_80m.bin 0x10000 AfterburnerV3.0.1.bin 0x8000 Afterburner.partitions.bin
REM SPIFFS
esptool.exe --chip esp32 --port COM16 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_size detect 0x3d0000 spiffs.bin

View File

@ -1 +0,0 @@
esptool.exe --chip esp32 --port COM14 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 boot_app0.bin 0x1000 bootloader_qio_80m.bin 0x10000 BTCDieselHeater.ino.bin 0x8000 Afterburner.partitions.bin

View File

@ -1 +0,0 @@
esptool.exe --chip esp32 --port COM14 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size detect 0xe000 boot_app0.bin 0x1000 bootloader_qio_80m.bin 0x10000 AfterburnerV2.3.5.bin 0x8000 Afterburner.partitions.bin

View File

@ -1 +1 @@
espota.exe -i 192.168.1.1 -p 3232 --auth= -f Afterburner.bin
espota.exe -i 192.168.1.1 -p 3232 --auth= -f AfterburnerV3.0.1.bin

View File

@ -1 +1 @@
espota.exe -i 192.168.4.1 -p 3232 --auth= -f Afterburner.bin
espota.exe -i 192.168.4.1 -p 3232 --auth= -f AfterburnerV3.0.1.bin

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
data/gauge.min.js.gz Normal file

Binary file not shown.

View File

@ -1,609 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<!-- <link rel="icon" href="data;,"> -->
<script>
var Socket;
function init() {
Socket = new WebSocket('ws://' + window.location.hostname + ':81/');
Socket.onmessage = function(event){
var heater = JSON.parse(event.data);
var key;
for(key in heater) {
console.log("JSON decode:", key, heater[key]);
switch(key) {
case "RunState":
if (heater[key] == 0) {
document.getElementById("myonoffswitch").checked = false;
document.getElementById("myonoffswitch").style = "block";
document.getElementById("onoffswitch").style.visibility = "visible";
} else if(heater[key] >= 7 && heater[key] <= 8) { // new runstates 9+ for heat plug & suspend mode
document.getElementById("myonoffswitch").checked = false;
document.getElementById("myonoffswitch").style = "none";
document.getElementById("onoffswitch").style.visibility = "hidden";
} else {
document.getElementById("myonoffswitch").checked = true;
document.getElementById("myonoffswitch").style = "block";
document.getElementById("onoffswitch").style.visibility = "visible";
}
document.getElementById("RunString").style.visibility = (heater[key] == 5 || heater[key] == 0) ? "hidden" : "visible";
break;
case "ErrorString":
case "RunString":
document.getElementById(key).innerHTML = heater[key];
break;
case "MEn":
document.getElementById(key).value = heater[key];
break;
case "MPort":
document.getElementById(key).value = heater[key];
break;
case "MHost":
document.getElementById(key).value = heater[key];
break;
case "MUser":
document.getElementById(key).value = heater[key];
break;
case "MPasswd":
document.getElementById(key).value = heater[key];
break;
case "PumpFixed":
case "TempCurrent":
document.getElementById(key).innerHTML = parseFloat(heater[key]).toFixed(1);
break;
case "TempDesired":
document.getElementById(key).value = heater[key];
var ValKey = key + 'Val'; // eg 'PumpMinVal'
document.getElementById(ValKey).innerHTML = heater[key];
break;
case "ErrorState":
document.getElementById("ErrorDiv").hidden = heater[key] <= 1;
break;
case "TempBody":
//The threshold levels for each bar to come on are: 21°C, 41°C, 61°C, 81°C, 101°C, 121°C
if(heater[key] > 120){
document.getElementById("TopBar").className = "active121";
}
else if(heater[key] > 100){
document.getElementById("TopBar").className = "active101";
}
else if(heater[key] > 80){
document.getElementById("TopBar").className = "active81";
}
else if(heater[key] > 60){
document.getElementById("TopBar").className = "active61";
}
else if(heater[key] > 40){
document.getElementById("TopBar").className = "active41";
}
else if(heater[key] > 20){
document.getElementById("TopBar").className = "active21";
}
else {
document.getElementById("TopBar").className = "active0";
}
break;
case "PumpMin":
case "PumpMax":
var OneDecimalPlace = parseFloat(heater[key]).toFixed(1);
var ValKey = key + 'Val'; // eg 'PumpMinVal'
document.getElementById(key).value = OneDecimalPlace;
document.getElementById(key).innerHTML = OneDecimalPlace;
document.getElementById(ValKey).innerHTML = OneDecimalPlace;
break;
case "FanMin":
case "FanMax":
var RPM = heater[key];
var ValKey = key + 'Val'; // eg 'FanMinVal'
document.getElementById(key).value = RPM;
document.getElementById(key).innerHTML = RPM;
document.getElementById(ValKey).innerHTML = RPM;
break;
case "Thermostat":
if(heater[key] != 0) {
document.getElementById("FixedDiv").hidden = true;
document.getElementById("ThermoDiv").hidden = false;
}
else {
document.getElementById("FixedDiv").hidden = false;
document.getElementById("ThermoDiv").hidden = true;
}
break;
}
}
}
}
function setSchedule(){
//clearly need to add some code here to send the Json formatted data to the esp
console.log("Set Schedule Button Press")
}
Date.prototype.toDateInputValue = (function() {
var local = new Date(this);
local.setMinutes(this.getMinutes() - this.getTimezoneOffset());
return local.toJSON().slice(0,10);
});
function sendJSONobject(obj){
var str = JSON.stringify(obj);
console.log("JSON Tx:", str);
Socket.send(str);
}
// Scripts for date handling
Date.prototype.today = function () {
return ((this.getDate() < 10)?"0":"") + this.getDate() +"/"+(((this.getMonth()+1) < 10)?"0":"") + (this.getMonth()+1) +"/"+ this.getFullYear();
}
// Scripts for setting date and time
function setcurrenttime(){
var cmd = {};
cmd.Time = document.getElementById("curtime").value;
sendJSONobject(cmd);
}
/*
function setMQTTDetails(){
var cmd = {};
cmd.MEn = document.getElementById("MEn").checked ? 1 : 0;
sendJSONobject(cmd);
cmd.MHost = document.getElementById("MHost").value;
sendJSONobject(cmd);
cmd.MPasswd = document.getElementById("MPasswd").value;
sendJSONobject(cmd);
cmd.MUser = document.getElementById("MUser").value;
sendJSONobject(cmd);
}
*/
function setcurrentdate(){
var cmd = {};
cmd.Date = document.getElementById("curdate").value;
sendJSONobject(cmd);
}
function funcNavLinks() {
var x = document.getElementById("myLinks");
if (x.style.display === "block") {
x.style.display = "none";
} else {
x.style.display = "block";
}
}
function checkTime(i)
{
if (i<10)
{
i="0" + i;
}
return i;
}
function funcdispSettings() {
document.getElementById("Settings").style.display = "block";
currentTime = new Date();
var h = currentTime.getHours();
var m = currentTime.getMinutes();
var s = currentTime.getSeconds();
// add a zero in front of numbers<10
h = checkTime(h);
m = checkTime(m);
s = checkTime(s);
console.log("Hours",h);
console.log("Minutes",m);
console.log("Seconds",s);
document.getElementById("curtime").value = h + ":" + m + ":" + s;
document.getElementById("curdate").value = currentTime.today()
document.getElementById("Home").style.display = "none";
document.getElementById("Advanced").style.display = "none";
document.getElementById("myLinks").style.display ="none";
document.getElementById('curdate').valueAsDate = new Date();
}
function funcdispHome(){
document.getElementById("Settings").style.display = "none";
document.getElementById("Home").style.display = "block";
document.getElementById("Advanced").style.display = "none";
document.getElementById("myLinks").style.display ="none";
}
function funcdispAdvanced(){
document.getElementById("Settings").style.display = "none";
document.getElementById("Home").style.display = "none";
document.getElementById("Advanced").style.display = "block";
document.getElementById("myLinks").style.display ="none";
}
// Function to check the power on/off slide switch.
function OnOffCheck(){
// Get the checkbox status and place in the checkbox variable
var checkBox = document.getElementById("myonoffswitch");
// Send a message to the Devel console of web browser for debugging
console.log("OnOffCheck:", document.getElementById("myonoffswitch").checked);
// If the checkbox is checked, display the output text
// We also need to send a message back into the esp as we cannot directly run Arduino Functions from within the javascript
var cmd = {};
if (checkBox.checked){
//Insert Code Here To Turn On The Heater
console.log("Turning On Heater");
cmd.RunState = 1;
sendJSONobject(cmd);
}
else{
//Insert Code Here To Turn Off The Heater
console.log("Turning Off Heater");
cmd.RunState = 0;
sendJSONobject(cmd);
}
}
function onSlideDone(newVal, JSONKey) {
//elementid must equal the JSON name for each setting
document.getElementById(JSONKey).innerHTML = newVal;
var cmd = {};
cmd[JSONKey] = newVal; // note: variable name needs []
cmd.NVsave = 8861; // named variable DOESN'T !!
sendJSONobject(cmd);
}
function UpdateMQTTSettings() {
var cmd = {};
cmd.MPort = document.getElementById("MPort").value;
cmd.MEn = document.getElementById("MEn").checked ? 1 : 0;
cmd.MHost = document.getElementById("MHost").value;
cmd.MUser = document.getElementById("MUser").value;
cmd.MPasswd = document.getElementById("MPasswd").value;
sendJSONobject(cmd);
var cmd = {};
cmd.NVsave = 8861;
sendJSONobject(cmd);
}
function onSlideUpdate(newVal, JSONKey) {
//elementid must equal the JSON name for each setting
document.getElementById(JSONKey).innerHTML = newVal;
}
function SetPumpMin(){
var cmd = {};
cmd['PumpMin'] = document.getElementById("PumpMin").value;
cmd.NVsave = 8861;
sendJSONobject(cmd);
}
function funcShowMQTT() {
var checkbox = document.getElementById("MEn");
if (checkbox.checked == false) {
document.getElementById("DIVMPort").style.display = "none";
}
else {
document.getElementById("DIVMPort").style.display = "block";
}
}
</script>
<meta name="viewport" content="height=device-height, width=device-width, initial-scale=1">
<style>
.throb_me {
animation: throbber 1s linear infinite;
}
@keyframes throbber {
50% {
opacity: 0;
}
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
body {
font-family: Arial, Helvetica, sans-serif;
}
.onoffswitch {
position: relative; width: 90px;
-webkit-user-select:none; -moz-user-select:none; -ms-user-select: none;
}
.onoffswitch-checkbox {
display: none;
}
.onoffswitch-label {
display: block; overflow: hidden; cursor: pointer;
border: 2px solid #999999; border-radius: 20px;
}
.onoffswitch-inner {
display: block; width: 200%; margin-left: -100%;
transition: margin 0.3s ease-in 0s;
}
.onoffswitch-inner:before, .onoffswitch-inner:after {
display: block; float: left; width: 50%; height: 30px; padding: 0; line-height: 30px;
font-size: 14px; color: white; font-family: Trebuchet, Arial, sans-serif; font-weight: bold;
box-sizing: border-box;
}
.onoffswitch-inner:before {
content: "ON";
padding-left: 10px;
background-color: #34A7C1; color: #FFFFFF;
}
.onoffswitch-inner:after {
content: "OFF";
padding-right: 10px;
background-color: #EEEEEE; color: #999999;
text-align: right;
}
.onoffswitch-switch {
display: block; width: 18px; margin: 6px;
background: #FFFFFF;
position: absolute; top: 0; bottom: 0;
right: 56px;
border: 2px solid #999999; border-radius: 20px;
transition: all 0.3s ease-in 0s;
}
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
margin-left: 0;
}
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
right: 0px;
}
.mobile-container {
margin: auto;
background-color: #555;
height: 500px;
color: white;
border-radius: 10px;
}
.topnav {
overflow: hidden;
background-color: #333;
position: relative;
}
.topnav #myLinks {
display: none;
}
.topnav a {
color: white;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
display: block;
}
.topnav a.icon {
background: black;
display: block;
position: absolute;
left: 0;
top: 0;
}
.topnav a:hover {
background-color: #ddd;
color: black;
}
.active0 {
background-color: #5e4fa2;
color: black;
}
.active21 {
background-color: #427bb1;
color: #ffffff;
}
.active41 {
background-color: #36c0a3;
color: #ffffff;
}
.active61 {
background-color: #29cf38;
color: #000000;
}
.active81 {
background-color: #92df1b;
color: #ffffff;
}
.active101 {
background-color: #efab0e;
color: #ffffff;
}
.active121 {
background-color: #ff0000;
color: #ffffff;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
MainPage {
display: block
}
#Advanced {
display: none
}
#Settings {
display: none
}
#DIVMPort {
display: none
}
</style>
<title>Chinese Diesel Heater Web Controller Interface</title>
</head>
<body onload="javascript:init()">
<div class="mobile-container">
<!-- Top Navigation Menu -->
<div class="topnav">
<div id="TopBar" style="padding-left:30px"><a href="javascript:void(0);" onclick="funcdispHome()" >Chinese Diesel Heater Web Control</a></div>
<div id="myLinks">
<a href="javascript:void(0);" onclick="funcdispHome()">Home</a>
<a href="javascript:void(0);" onclick="funcdispSettings()">Settings</a>
<a href="javascript:void(0);" onclick="funcdispAdvanced()">Advanced Settings</a>
</div>
<a href="javascript:void(0);" class="icon" onclick="funcNavLinks()">
</i>
</a>
</div>
<div style="padding-left:16px">
<span class="MaingPage" id="Home">
<div><H2>Power Control</H2></div>
<div class="onoffswitch" id="onoffswitch">
<input type="checkbox" onclick="OnOffCheck()" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch" clicked>
<label class="onoffswitch-label" for="myonoffswitch">
<span class="onoffswitch-inner"></span>
<span class="onoffswitch-switch"></span>
</label>
</div>
<span class="throb_me" id="RunString" style="visibility:hidden"></span>
<div>
<h2>Temperature Control</h2>
</div>
<input type="range" id="TempDesired" min="8" max="35" step="1" value="22" oninput="onSlideUpdate(this.value, 'TempDesiredVal')" onchange="onSlideDone(this.value, 'TempDesired')">
<div id="ThermoDiv">
<b>Desired Temp: </b> <span id="TempDesiredVal"></span>
</div>
<div id="FixedDiv">
<b>Fixed Hz: </b>
<span id="PumpFixed"></span>
</div>
<div>
<b>Current Temp: </b><span id="TempCurrent">
</div>
<div id="ErrorDiv" style="color:crimson" hidden>
<b>Error <span id="ErrorString"> </b>
</div>
</span>
<div id="Advanced">
<h2><b>Advanced Settings</b></h2>
<br>
<h3><b>Minimum Fuel Settings</b></h3>
<div>
<b>Pump Min: </b><span id="PumpMinVal"> </span>
<input type="range" id="PumpMin" min="1" max="10" step=".1" oninput="onSlideUpdate(parseFloat(this.value).toFixed(1), 'PumpMinVal')" onchange="onSlideDone(this.value, 'PumpMin')">
</div>
<div>
<b>Fan Min: </b><span id="FanMinVal"> </span>
<input type="range" id="FanMin" min="1000" max="5000" step="10" oninput="onSlideUpdate(this.value, 'FanMinVal')" onchange="onSlideDone(this.value, 'FanMin')">
</div>
<br>
<h3><b>Maximum Fuel Settings</b></h3>
<div>
<b>Pump Max: </b><span id="PumpMaxVal"> </span>
<input type="range" id="PumpMax" min=".5" max="10" step=".1" oninput="onSlideUpdate(parseFloat(this.value).toFixed(1), 'PumpMaxVal')" onchange="onSlideDone(this.value, 'PumpMax')">
</div>
<div>
<b>Fan Max: </b><span id="FanMaxVal"> </span>
<input type="range" id="FanMax" min="1000" max="5000" step="10" oninput="onSlideUpdate(this.value, 'FanMaxVal')" onchange="onSlideDone(this.value, 'FanMax')">
</div>
</div>
<div id="Settings">
Current Date:<br>
<input type="date" id="curdate"><input type="button" Value="Set Date" onclick="setcurrentdate()">
<br>
Current Time (24 Hour Format):<br>
<input type="time" id="curtime"> <input type="button" Value="Set Time" onclick="setcurrenttime()">
<br><br>
<hr></hr>
<H2>MQTT Settings</H2>
<b>Enabled: </b><input type="checkbox" border-radius="4px" name="MEn" id="MEn" onclick="funcShowMQTT()">
<div id="DIVMPort">
<b>Host/Server: </b><input type="text" name="MHost" id="MHost" value=""></br>
<b>Port: </b><input type="text" name="MPort" id="MPort" defaultvalue="1883" value="1883"></br>
<b>Username: </b><input type="text" name="MUser" id="MUser" value=""></br>
<b>Password: </b><input type="text" name="MPasswd" id="MPasswd" value=""></br></br>
<input type="button" name="mqttsubmit" value="Save/Update Settings" onclick="UpdateMQTTSettings()">
</div>
<br><br>
<hr></hr>
<br><br>
<div id="Timer"
Timer1: <input type="checkbox" border-radius="4px" name="Timer" id="Timer1onoff"> <input type="text" class="schedule" id="Timer1Start"> <input type="text" id="Timer1End"> <br>
Timer2: <input type="checkbox" border-radius="4px" name="Tue"> <input type="text" class="schedule" id="Timer2Start"> <input type="text" id="Timer2End"><br>
<input type="button" Value="Save Schedule" onclick="setSchedule()">
</Div>
</div>
</body>
</html>

BIN
data/index.html.gz Normal file

Binary file not shown.

View File

@ -1,191 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
<style>
body { font-family: Arial, Helvetica, sans-serif; }
th { text-align: left; }
.throb { animation: throbber 1s linear infinite; }
@keyframes throbber { 50% { opacity: 0; } }
</style>
<script>
// globals
var sendSize;
var ws;
var CRCTable = new Uint16Array([
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,
0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,
0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,
0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,
0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,
0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,
0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,
0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,
0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,
0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,
0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,
0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,
0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,
0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,
0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,
0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,
0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,
0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,
0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,
0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,
0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,
0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040
]);
function calcCRC(data) { // expect Uint8Array input
// calculate a CRC-16/MODBUS checksum using the all except the last 2 bytes of the data array
var CRCWord = 0xFFFF;
var Length = data.length - 2;
var idx = 0;
while (idx < Length)
{
var nTemp = (data[idx] ^ CRCWord) & 0xff;
CRCWord >>= 8;
CRCWord ^= CRCTable[nTemp];
idx++;
}
return CRCWord;
}
function _(el) {
return document.getElementById(el);
}
function onWebSocket(event) {
var response = JSON.parse(event.data);
var key;
for(key in response) {
switch(key) {
case "progress":
// actual data bytes received as fed back via web socket
var bytes = response[key];
_("loaded_n_total").innerHTML = "Uploaded " + bytes + " bytes of " + sendSize;
var percent = Math.round( 100 * (bytes / sendSize));
_("progressBar").value = percent;
_("status").innerHTML = percent+"% uploaded.. please wait";
break;
}
}
}
function init() {
ws = new WebSocket('ws://' + window.location.hostname + ':81/');
ws.onmessage = onWebSocket;
}
function uploadFile() {
_("cancel").hidden = true;
var file = _("file1").files[0];
sendSize = file.size;
var reader = new FileReader();
reader.onload = function(event) {
var buffer = event.target.result;
var uint8 = new Uint8Array(buffer);
console.log("Array length: " + uint8.length);
console.log("Buffer length: " + buffer.size);
console.log("CRC: " + calcCRC(uint8));
}
reader.onerror = function(event) {
console.error("File could not be read! Code " + event.target.error);
}
reader.readAsArrayBuffer(file);
/* var JSONmsg = {};
JSONmsg['UploadSize'] = sendSize;
var str = JSON.stringify(JSONmsg);
console.log("JSON Tx:", str);
ws.send(str);
var formdata = new FormData();
formdata.append("update", file);
var ajax = new XMLHttpRequest();
// progress is handled via websocket JSON sent from controller
// using server side progress only shows the buffer filling, not actual delivery.
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", "/updatenow");
ajax.send(formdata);*/
}
function completeHandler(event) {
_("status").innerHTML = event.target.responseText;
_("progressBar").value = 0;
_("loaded_n_total").innerHTML = "Uploaded " + sendSize + " bytes of " + sendSize;
var file = _("file1").files[0];
if(file.name.endsWith(".bin")) {
setTimeout( function() { window.location.assign('/'); }, 5000);
}
else {
setTimeout( function() { location.assign('/update'); }, 500);
}
}
function errorHandler(event) {
_("status").innerHTML = "Upload Failed";
}
function abortHandler(event) {
_("status").innerHTML = "Upload Aborted";
}
function onErase(fn) {
if(confirm('Do you really want to erase ' + fn +' ?')) {
var formdata = new FormData();
formdata.append("filename", fn);
var ajax = new XMLHttpRequest();
ajax.open("POST", "/erase");
ajax.send(formdata);
setTimeout(function () { location.reload(); }, 500);
}
}
function onBrowseChange() {
_("upload").hidden = false;
_("progressBar").hidden = false;
_("status").hidden = false;
_("loaded_n_total").hidden = false;
_("spacer").hidden = false;
}
</script>
<title>Afterburner update</title>
</head>
<body onload="javascript:init()">
<h1>Afterburner update</h1>
<form id='upload_form' method="POST" enctype="multipart/form-data" autocomplete="off">
<label for='file1'>Select a file to upload:<br></label>
<input type="file" name="file1" id="file1" size="50" onchange="onBrowseChange()">
<p>
<input id="upload" type='button' onclick='uploadFile()' value='Upload' >
<progress id='progressBar' value='0' max='100' style='width:300px;' hidden></progress>
<p id='spacer' hidden> </p>
<input type='button' onclick=window.location.assign('/') id='cancel' value='Cancel'>
<h3 id='status' hidden></h3>
<div id='loaded_n_total' hidden></div>
</form>
<p><button onclick=window.location.assign('/formatspiffs')>Format SPIFFS</button>
</body>
</html>

View File

@ -16,8 +16,10 @@ board = esp32dev
framework = arduino
board_build.partitions = min_spiffs.csv
upload_speed = 921600
upload_port = 192.168.20.40
upload_protocol = espota
;upload_port = 192.168.20.40
;upload_protocol = espota
upload_port = COM16
upload_protocol = esptool
upload_flags =
--port=3232
monitor_speed = 115200

View File

@ -122,8 +122,8 @@
#define RX_DATA_TIMOUT 50
const int FirmwareRevision = 30;
const int FirmwareSubRevision = 0;
const char* FirmwareDate = "28 Jul 2019";
const int FirmwareSubRevision = 1;
const char* FirmwareDate = "30 Jul 2019";
#ifdef ESP32

View File

@ -37,9 +37,9 @@
#define MINIFONT miniFontInfo
#define X_BT_ICON 10
#define X_BT_ICON 12
#define Y_BT_ICON 0
#define X_WIFI_ICON 19
#define X_WIFI_ICON 22
#define Y_WIFI_ICON 0
#define X_CLOCK 50
#define Y_CLOCK 0
@ -48,18 +48,27 @@
#define X_BATT_ICON 103
#define Y_BATT_ICON 0
/*#define X_BT_ICON 20
#define Y_BT_ICON 0
#define X_WIFI_ICON 29
#define Y_WIFI_ICON 0
#define X_GPIO_ICON 9
#define X_CLOCK 56
#define Y_CLOCK 0
#define X_TIMER_ICON 84
#define Y_TIMER_ICON 0
#define X_BATT_ICON 103
#define Y_BATT_ICON 0*/
// |0 |10 |20 |30 |40 |50 |60 |70 |80 |90 |100 |110 |120
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWOOOOOOOOOOOO xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWOOOOOOOOOOOO xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWOOOOOOOOOOOO xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWOOOOOOOOOOOO xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWOOOOOOOOOOOO xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWW xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWAAAAAAAAAAAA xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWAAAAAAAAAAAA xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWAAAAAAAAAAAA xxxxxxxxx
// xxxxxxxxxxxxBBBBBB WWWWWWWWWWWWAAAAAAAAAAAA xxxxxxxxx
// xxxxxxxxxxxxBBBBBB AAAAAAAAAAAA xxxxxxxxx
// xxxxxxxxxxxx xxxxxxxxx
// xxxxxxxxxxxx xxxxxxxxx
// xxxxxxxxxxxx xxxxxxxxx
// xxxxxxxxxxxx xxxxxxxxx
// xxxxxxxxxxxx xxxxxxxxx
// xxxxxxxxxxxx xxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
CScreenHeader::CScreenHeader(C128x64_OLED& disp, CScreenManager& mgr) : CScreen(disp, mgr)
{
@ -74,7 +83,7 @@ CScreenHeader::show(bool erase)
else {
_display.fillRect(0, 17, 128, 47, BLACK); // only erase below the header
_display.fillRect(119, 0, 9, 17, BLACK); // erase top of body thermo
_display.fillRect(0, 0, 9, 17, BLACK); // erase top of ambient thermo
_display.fillRect(0, 0, X_BT_ICON, 17, BLACK); // erase top of ambient thermo
}
// standard header items
@ -167,21 +176,6 @@ CScreenHeader::animate()
break;
}
/*
switch(_batteryCount) {
case 3:
if(SmartError.checkVolts(FilteredSamples.FastipVolts.getValue(), FilteredSamples.FastGlowAmps.getValue(), false) == 0) { // check but do not fault
showBatteryIcon(getBatteryVoltage(true));
}
else {
_display.fillRect(xPos, yPos, BatteryIconInfo.width, BatteryIconInfo.height, BLACK);
}
break;
case 0:
showBatteryIcon(getBatteryVoltage(true));
break;
}
*/
}
showWifiIcon();