Have presentation of Fuel settings screen settled, need to allow adjustments

This commit is contained in:
rljonesau 2018-11-27 21:44:47 +11:00
parent 885573a4dc
commit 36a0755005
16 changed files with 539 additions and 241 deletions

View file

@ -681,7 +681,8 @@ void loop()
fFilteredTemperature = fFilteredTemperature * fAlpha + (1-fAlpha) * fTemperature; fFilteredTemperature = fFilteredTemperature * fAlpha + (1-fAlpha) * fTemperature;
DefaultBTCParams.setTemperature_Actual((unsigned char)(fFilteredTemperature + 0.5)); // update [BTC] frame to send DefaultBTCParams.setTemperature_Actual((unsigned char)(fFilteredTemperature + 0.5)); // update [BTC] frame to send
TempSensor.requestTemperatures(); // prep sensor for future reading TempSensor.requestTemperatures(); // prep sensor for future reading
reqDisplayUpdate(); // reqDisplayUpdate();
ScreenManager.reqUpdate();
} }
CommState.set(CommStates::Idle); CommState.set(CommStates::Idle);
break; break;
@ -875,7 +876,8 @@ void reqTempChange(int val)
pNVStorage->setTemperature(curTemp); pNVStorage->setTemperature(curTemp);
reqDisplayUpdate(); // reqDisplayUpdate();
ScreenManager.reqUpdate();
} }
int getSetTemp() int getSetTemp()
@ -887,7 +889,7 @@ int getSetTemp()
float getFixedHz() float getFixedHz()
{ {
if(pRxFrame) { if(pRxFrame) {
return float(pRxFrame->getPump_Fixed()) / 10.f; return pRxFrame->getPump_Fixed();
} }
return 0.0; return 0.0;
} }
@ -909,19 +911,22 @@ bool getThermostatMode()
return pNVStorage->getThermostatMode() != 0; return pNVStorage->getThermostatMode() != 0;
} }
void reqDisplayUpdate() /*void reqDisplayUpdate()
{ {
bUpdateDisplay = true; bUpdateDisplay = true;
} }*/
void checkDisplayUpdate() void checkDisplayUpdate()
{ {
// only update OLED when not processing blue wire // only update OLED when not processing blue wire
if(bUpdateDisplay) { /* if(bUpdateDisplay) {
if(pTxFrame && pRxFrame) { if(pTxFrame && pRxFrame) {
ScreenManager.update(*pTxFrame, *pRxFrame); ScreenManager.update(*pTxFrame, *pRxFrame);
bUpdateDisplay = false; bUpdateDisplay = false;
} }
}*/
if(pTxFrame && pRxFrame) {
ScreenManager.checkUpdate(*pTxFrame, *pRxFrame);
} }
long tDelta = millis() - lastAnimationTime; long tDelta = millis() - lastAnimationTime;
@ -939,7 +944,7 @@ void reqPumpPrime(bool on)
float getPumpHz() float getPumpHz()
{ {
if(pRxFrame) { if(pRxFrame) {
return float(pRxFrame->getPump_Actual()) / 10.f; return pRxFrame->getPump_Actual();
} }
return 0.0; return 0.0;
} }

View file

@ -20,148 +20,5 @@
* *
*/ */
const char MAIN_PAGE[] PROGMEM = R"=====( extern const char* MAIN_PAGE PROGMEM;
<!DOCTYPE html>
<html>
<head>
<script>
var Socket;
function init() {
Socket = new WebSocket('ws://' + window.location.hostname + ':81/');
Socket.onmessage = function(event){
document.getElementById("TempCurrent").innerHTML = event.data;
}
}
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.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;
-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;
}
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%;
}
</style>
<title>Chinese Diesel Heater Web Controller Interface</title>
</head>
<body onload="javascript:init()">
<h1>Chinese Diesel Heater Web Control</h1>
<div>OFF <label class="switch">
<input type="checkbox" id="onofftoggle" onclick="OnOffCheck()">
<span class="slider round"></span>
</label> ON
</div>
<p id="text" style="display:none">Heater Is ON</p>
<div>
<h2>Temperature Control</h2>
</div>
<input id="slide" type="range" min="1" max="100" step="1" value="10">
<div>
<b>Desired Temp: </b>
<Span id="sliderAmount"></Span>
<div>
</div>
<b>Current Temp: </b><span id="TempCurrent">
<script>
// 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("onofftoggle");
// Send a message to the Devel console of web browser for debugging
console.log(document.getElementById("onofftoggle").checked);
// Get the output text
var text = document.getElementById("text");
// 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
if (checkBox.checked == true){
//Insert Code Here To Turn On The Heater
// Socket.send("P1");
Socket.send("[CMD]ON");
text.style.display = "block";
}
else{
//Insert Code Here To Turn Off The Heater
text.style.display = "none";
// Socket.send("P0");
Socket.send("[CMD]OFF");
}
}
var slide = document.getElementById('slide');
sliderDiv = document.getElementById("sliderAmount");
slide.oninput = function() {
sliderDiv.innerHTML = this.value;
}
</script>
</body>
</html>
)=====";

View file

@ -165,10 +165,10 @@ public:
void setPump_Max(unsigned short Freq) { Controller.MaxPumpFreq = Freq; }; void setPump_Max(unsigned short Freq) { Controller.MaxPumpFreq = Freq; };
void setPump_Actual(unsigned char Freq) { Heater.ActualPumpFreq = Freq; }; void setPump_Actual(unsigned char Freq) { Heater.ActualPumpFreq = Freq; };
void setPump_Fixed(unsigned char Freq) { Heater.FixedPumpFreq = Freq; }; void setPump_Fixed(unsigned char Freq) { Heater.FixedPumpFreq = Freq; };
unsigned char getPump_Min() const { return Controller.MinPumpFreq; }; // Tx side, min pump freq float getPump_Min() const { return float(Controller.MinPumpFreq) * 0.1f; }; // Tx side, min pump freq
unsigned char getPump_Max() const { return Controller.MaxPumpFreq; }; // Tx side, max pump freq float getPump_Max() const { return float(Controller.MaxPumpFreq) * 0.1f; }; // Tx side, max pump freq
unsigned char getPump_Actual() const { return Heater.ActualPumpFreq; }; // Rx style, actual float getPump_Actual() const { return float(Heater.ActualPumpFreq) * 0.1f; }; // Rx style, actual
unsigned char getPump_Fixed() const { return Heater.FixedPumpFreq; }; // Fixed mode pump frequency float getPump_Fixed() const { return float(Heater.FixedPumpFreq) * 0.1f; }; // Fixed mode pump frequency
void setPump_Prime(bool on) { Controller.Prime = on ? 0x5A : 0; }; void setPump_Prime(bool on) { Controller.Prime = on ? 0x5A : 0; };
// temperature set/get // temperature set/get
void setTemperature_Desired(unsigned char degC) { Controller.DesiredTemperature = degC; }; void setTemperature_Desired(unsigned char degC) { Controller.DesiredTemperature = degC; };

View file

@ -90,7 +90,7 @@ CScreen1::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
if(CtlFrame.isThermostat()) if(CtlFrame.isThermostat())
desiredT = CtlFrame.getTemperature_Desired(); desiredT = CtlFrame.getTemperature_Desired();
else else
desiredT = -HtrFrame.getPump_Fixed() * 0.1f; desiredT = -HtrFrame.getPump_Fixed();
} }
showThermometer(desiredT, // read values from most recently sent [BTC] frame showThermometer(desiredT, // read values from most recently sent [BTC] frame
@ -108,7 +108,7 @@ CScreen1::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
showFan(HtrFrame.getFan_Actual()); showFan(HtrFrame.getFan_Actual());
showFuel(HtrFrame.getPump_Actual() * 0.1f); showFuel(HtrFrame.getPump_Actual());
showBodyThermometer(HtrFrame.getTemperature_HeatExchg()); showBodyThermometer(HtrFrame.getTemperature_HeatExchg());
} }

View file

@ -133,6 +133,13 @@ CScreen2::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
} }
void
CScreen2::animate()
{
// do nothing!!
};
void void
CScreen2::keyHandler(uint8_t event) CScreen2::keyHandler(uint8_t event)
{ {
@ -146,7 +153,8 @@ CScreen2::keyHandler(uint8_t event)
else { else {
_showMode = millis() + 5000; _showMode = millis() + 5000;
_nModeSel = 0; _nModeSel = 0;
reqDisplayUpdate(); // reqDisplayUpdate();
_Manager.reqUpdate();
} }
} }
// press RIGHT to selecxt next screen, or Thermostat mode when in mode select // press RIGHT to selecxt next screen, or Thermostat mode when in mode select
@ -156,7 +164,8 @@ CScreen2::keyHandler(uint8_t event)
else { else {
_showMode = millis() + 5000; _showMode = millis() + 5000;
_nModeSel = 1; _nModeSel = 1;
reqDisplayUpdate(); // reqDisplayUpdate();
_Manager.reqUpdate();
} }
} }
// press UP & DOWN to toggle thermostat / fixed Hz mode // press UP & DOWN to toggle thermostat / fixed Hz mode
@ -219,7 +228,8 @@ CScreen2::keyHandler(uint8_t event)
} }
_showSetMode = millis() + 2000; _showSetMode = millis() + 2000;
} }
reqDisplayUpdate(); // reqDisplayUpdate();
_Manager.reqUpdate();
} }
repeatCount = -1; repeatCount = -1;

View file

@ -35,6 +35,6 @@ class CScreen2 : public CScreen
public: public:
CScreen2(C128x64_OLED& display, CScreenManager& mgr); CScreen2(C128x64_OLED& display, CScreenManager& mgr);
void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame); void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame);
void animate() {}; void animate();
void keyHandler(uint8_t event); void keyHandler(uint8_t event);
}; };

View file

@ -29,7 +29,7 @@ const int border = 3;
const int radius = 4; const int radius = 4;
const int Row[] = { 52, 40, 28, 16 } ; const int Row[] = { 52, 40, 28, 16 } ;
const int Col[] = { border, 70, 100}; const int Col[] = { border, 70, 100};
const char* Label0 = "Prev/Next Screen"; const char* Label0 = "<- ->";
const char* Label1[] = { "Thermostat", const char* Label1[] = { "Thermostat",
"Fixed Hz" }; "Fixed Hz" };
const char* Label2[] = { "Prime pump", const char* Label2[] = { "Prime pump",
@ -51,6 +51,7 @@ CScreen3::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
{ {
CScreen::show(CtlFrame, HtrFrame); CScreen::show(CtlFrame, HtrFrame);
// show next/prev screen navigation line
CRect extents; CRect extents;
_display.setCursor(_display.xCentre(), Row[0]); _display.setCursor(_display.xCentre(), Row[0]);
_display.printCentreJustified(Label0); _display.printCentreJustified(Label0);
@ -138,6 +139,13 @@ CScreen3::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
} }
void
CScreen3::animate()
{
// do nothing!!
};
void void
CScreen3::keyHandler(uint8_t event) CScreen3::keyHandler(uint8_t event)
{ {
@ -203,7 +211,8 @@ CScreen3::keyHandler(uint8_t event)
stopPump(); stopPump();
} }
reqDisplayUpdate(); // reqDisplayUpdate();
_Manager.reqUpdate();
} }
} }

View file

@ -34,6 +34,6 @@ class CScreen3 : public CScreen {
public: public:
CScreen3(C128x64_OLED& display, CScreenManager& mgr); CScreen3(C128x64_OLED& display, CScreenManager& mgr);
void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame); void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame);
void animate() {}; void animate();
void keyHandler(uint8_t event); void keyHandler(uint8_t event);
}; };

View file

@ -53,6 +53,13 @@ CScreen4::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
} }
void
CScreen4::animate()
{
// do nothing!!
};
void void
CScreen4::keyHandler(uint8_t event) CScreen4::keyHandler(uint8_t event)
{ {

View file

@ -29,6 +29,6 @@ class CScreen4 : public CScreen {
public: public:
CScreen4(C128x64_OLED& display, CScreenManager& mgr); CScreen4(C128x64_OLED& display, CScreenManager& mgr);
void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame); void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame);
void animate() {}; void animate();
void keyHandler(uint8_t event); void keyHandler(uint8_t event);
}; };

View file

@ -0,0 +1,263 @@
/*
* This file is part of the "bluetoothheater" distribution
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
*
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include "128x64OLED.h"
#include "display.h"
#include "KeyPad.h"
#include "helpers.h"
#include "Screen5.h"
#include "BTCWifi.h"
CScreen5::CScreen5(C128x64_OLED& display, CScreenManager& mgr) : CScreen(display, mgr)
{
_bPWOK = false;
_rowSel = 0;
_colSel = 0;
for(int i= 0; i < 4; i++)
_PWdig[i] = -1;
}
void
CScreen5::show(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
{
CScreen::show(CtlFrame, HtrFrame);
CRect extents;
_display.setCursor(0, 16);
_display.print("Fuel Settings:");
if(_rowSel == 1) {
_display.setCursor(0, 30);
_display.print("Enter password...");
_showPassword();
}
else {
char str[16];
int yPos = 28;
const int border = 4;
const int radius = 4;
const int col2 = 90;
const int col3 = _display.width() - border;
CRect extents;
_display.setCursor(0, yPos);
_display.print("Pump (Hz)");
_display.setCursor(col2, yPos);
sprintf(str, "%.1f", CtlFrame.getPump_Min());
_display.printRightJustified(str);
if(_rowSel == 3 && _colSel == 0) {
_display.getTextExtents(str, extents);
extents.xPos = col2 - extents.width;
extents.yPos = yPos;
extents.Expand(border);
_display.drawRoundRect(extents.xPos, extents.yPos, extents.width, extents.height, radius, WHITE);
}
_display.setCursor(col3, yPos);
sprintf(str, "%.1f", CtlFrame.getPump_Max());
_display.printRightJustified(str);
if(_rowSel == 3 && _colSel == 1) {
_display.getTextExtents(str, extents);
extents.xPos = col3 - extents.width;
extents.yPos = yPos;
extents.Expand(border);
_display.drawRoundRect(extents.xPos, extents.yPos, extents.width, extents.height, radius, WHITE);
}
yPos = 40;
_display.setCursor(0, yPos);
_display.print("Fan (RPM)");
_display.setCursor(col2, yPos);
sprintf(str, "%d", CtlFrame.getFan_Min());
_display.printRightJustified(str);
if(_rowSel == 2 && _colSel == 0) {
_display.getTextExtents(str, extents);
extents.xPos = col2 - extents.width;
extents.yPos = yPos;
extents.Expand(border);
_display.drawRoundRect(extents.xPos, extents.yPos, extents.width, extents.height, radius, WHITE);
}
_display.setCursor(col3, yPos);
sprintf(str, "%d", CtlFrame.getFan_Max());
_display.printRightJustified(str);
if(_rowSel == 2 && _colSel == 1) {
_display.getTextExtents(str, extents);
extents.xPos = col3 - extents.width;
extents.yPos = yPos;
extents.Expand(border);
_display.drawRoundRect(extents.xPos, extents.yPos, extents.width, extents.height, radius, WHITE);
}
}
_display.display();
}
void
CScreen5::animate()
{
// do nothing!!
};
void
CScreen5::keyHandler(uint8_t event)
{
if(event & keyPressed) {
// press CENTRE
if(event & key_Centre) {
if(_rowSel == 1) {
// match "1688"
if((_PWdig[0] == 1) &&
(_PWdig[1] == 6) &&
(_PWdig[2] == 8) &&
(_PWdig[3] == 8)) {
_bPWOK = true;
_rowSel = 2;
_colSel = 0;
}
else {
for(int i= 0; i < 4; i++)
_PWdig[i] = -1;
}
}
else {
_bPWOK = false;
_rowSel = 0;
}
return;
}
// press LEFT
if(event & key_Left) {
switch(_rowSel) {
case 0:
_Manager.prevScreen();
break;
case 1:
_colSel--;
LOWERLIMIT(_colSel, 0);
break;
case 2:
case 3:
_colSel = 0;
break;
}
}
// press RIGHT
if(event & key_Right) {
switch(_rowSel) {
case 0:
_Manager.nextScreen();
break;
case 1:
_colSel++;
UPPERLIMIT(_colSel, 3);
break;
case 2:
case 3:
_colSel = 1;
break;
}
}
// press UP
if(event & key_Up) {
switch(_rowSel) {
case 0:
_rowSel = 1;
_colSel = 0;
break;
case 1:
_PWdig[_colSel]++;
ROLLUPPERLIMIT(_PWdig[_colSel], 9, 0);
break;
case 2:
_rowSel = 3;
break;
}
}
// press DOWN
if(event & key_Down) {
switch(_rowSel) {
case 1:
_PWdig[_colSel]--;
ROLLLOWERLIMIT(_PWdig[_colSel], 0, 9);
break;
case 2:
_rowSel--; // force skip over line 1 (password)
// deliberately not breaking
case 3:
_rowSel--;
break;
}
}
_Manager.reqUpdate();
}
// escape PW entry by holding centre button
if(event & keyRepeat) {
if(event & key_Centre) {
_rowSel == 0;
}
}
}
void
CScreen5::_showPassword()
{
// determine metrics of character sizing
CRect extents;
_display.getTextExtents("X", extents);
int charWidth = extents.width;
_display.getTextExtents(" ", extents);
int spaceWidth = extents.width;
const int border = 3;
const int radius = 4;
for(int i =0 ; i < 4; i++) {
int xPos = _display.xCentre() - (2 - i) * (charWidth + spaceWidth);
// Serial.print(" xPos="); Serial.print(xPos);
char str[8];
if(_PWdig[i] < 0) {
strcpy(str, "-");
}
else {
sprintf(str, "%d", _PWdig[i]);
}
_display.getTextExtents(str, extents);
extents.xPos = xPos;
extents.yPos = 46;
if(_rowSel == 1 && _colSel == i) {
// draw selection box
extents.Expand(border);
_display.drawRoundRect(extents.xPos, extents.yPos, extents.width, extents.height, radius, WHITE);
// // draw white background
// extents.Expand(1);
// _display.fillRect(extents.xPos, extents.yPos, extents.width, extents.height, WHITE);
extents.Expand(-border);
}
_display.setCursor(extents.xPos, extents.yPos);
_display.print(str);
}
// Serial.println("");
}

View file

@ -0,0 +1,39 @@
/*
* This file is part of the "bluetoothheater" distribution
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
*
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include "stdint.h"
class C128x64_OLED;
class CScreenManager;
class CProtocol;
class CScreen5 : public CScreen {
bool _bPWOK;
int _PWdig[4];
int _rowSel;
int _colSel;
void _showPassword();
public:
CScreen5(C128x64_OLED& display, CScreenManager& mgr);
void show(const CProtocol& CtlFrame, const CProtocol& HtrFrame);
void animate();
void keyHandler(uint8_t event);
};

View file

@ -35,6 +35,7 @@
#include "Screen2.h" #include "Screen2.h"
#include "Screen3.h" #include "Screen3.h"
#include "Screen4.h" #include "Screen4.h"
#include "Screen5.h"
#include "KeyPad.h" #include "KeyPad.h"
#include "helpers.h" #include "helpers.h"
#include "clock.h" #include "clock.h"
@ -65,6 +66,15 @@
// 128 x 64 OLED support // 128 x 64 OLED support
SPIClass SPI; // default constructor opens HSPI on standard pins : MOSI=13,CLK=14,MISO=12(unused) SPIClass SPI; // default constructor opens HSPI on standard pins : MOSI=13,CLK=14,MISO=12(unused)
////////////////////////////////////////////////////////////////////////////////////////////////
// splash creen created using image2cpp http://javl.github.io/image2cpp/
// Settings:
// Black background
// Invert [X]
// Arduino code, single bitmap
// Identifier: DieselSplash
// Draw Mode: Horizontal
//
const unsigned char DieselSplash [] PROGMEM = { const unsigned char DieselSplash [] PROGMEM = {
// 'Splash2, 128x64px // 'Splash2, 128x64px
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@ -132,75 +142,7 @@ const unsigned char DieselSplash [] PROGMEM = {
0x11, 0x49, 0x92, 0x94, 0xa1, 0x21, 0x14, 0x25, 0x10, 0x80, 0x85, 0x29, 0x44, 0x25, 0x50, 0x80, 0x11, 0x49, 0x92, 0x94, 0xa1, 0x21, 0x14, 0x25, 0x10, 0x80, 0x85, 0x29, 0x44, 0x25, 0x50, 0x80,
0x11, 0x39, 0x8e, 0x93, 0x18, 0xe1, 0x13, 0x1c, 0xcc, 0x80, 0x78, 0xc9, 0x34, 0x19, 0x4c, 0x80 0x11, 0x39, 0x8e, 0x93, 0x18, 0xe1, 0x13, 0x1c, 0xcc, 0x80, 0x78, 0xc9, 0x34, 0x19, 0x4c, 0x80
}; };
/*
// 'Splash2', 128x64px
const uint8_t DieselSplash[SH1106_LCDHEIGHT * SH1106_LCDWIDTH / 8] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x88, 0x48, 0x48, 0x48, 0x48, 0x48, 0x88,
0x10, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40,
0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80,
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x02, 0x12, 0x02, 0x04, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xc0, 0x40, 0xc0, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10,
0x10, 0x08, 0x08, 0x08, 0x18, 0x68, 0x88, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02,
0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x02, 0x02, 0x0c, 0x10, 0x20, 0xe0, 0x20, 0x20, 0x20, 0x60, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0xfe, 0x44, 0xa8, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0x70, 0x0e, 0x01, 0x00, 0x00, 0x01, 0x02, 0x04, 0x18, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00,
0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20,
0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02,
0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x3e, 0xc0, 0x00, 0x00, 0x03, 0x1c, 0xe0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x04, 0x02, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x60, 0x60, 0xd0, 0x90, 0x0c,
0x13, 0x60, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x20, 0x20, 0x10, 0x13, 0xfc, 0x08, 0x08,
0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x03,
0x05, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x40,
0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0xff, 0x20, 0x20, 0x20, 0x10, 0x0f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, 0x80, 0x00, 0x00, 0x01, 0x07,
0xfe, 0x02, 0x02, 0x03, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0c, 0x0c, 0x0e,
0x0f, 0x08, 0x08, 0x08, 0x1f, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0xe0,
0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04,
0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x08, 0x1e, 0x11, 0x10,
0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x1e, 0x22, 0x22, 0x22,
0x21, 0x31, 0x1f, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x06, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xfc, 0x12, 0x11, 0x12, 0xfc, 0x00, 0x70, 0x88, 0x88, 0xfe, 0x00, 0x38, 0xc0,
0xc0, 0x38, 0x00, 0x70, 0x88, 0x88, 0xf8, 0x00, 0xf0, 0x08, 0x08, 0xf8, 0x00, 0x70, 0x88, 0x88,
0x50, 0x00, 0x70, 0xa8, 0xa8, 0x30, 0x00, 0x70, 0x88, 0x88, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff,
0x10, 0x10, 0x10, 0xff, 0x00, 0x70, 0xa8, 0xa8, 0x30, 0x00, 0x70, 0x88, 0x88, 0xf8, 0x00, 0x7e,
0x88, 0x88, 0x00, 0x70, 0xa8, 0xa8, 0x30, 0x00, 0xf8, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,
0x7e, 0x81, 0x81, 0x81, 0x81, 0x42, 0x00, 0x70, 0x88, 0x88, 0x70, 0x00, 0xf0, 0x08, 0x08, 0xf8,
0x00, 0x7e, 0x88, 0x88, 0x00, 0xf8, 0x10, 0x08, 0x08, 0x00, 0x70, 0x88, 0x88, 0x70, 0x00, 0xfe,
0x00, 0xfe, 0x00, 0x70, 0xa8, 0xa8, 0x30, 0x00, 0xf8, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00
};
*/
CScreenManager::CScreenManager() CScreenManager::CScreenManager()
{ {
_pDisplay = NULL; _pDisplay = NULL;
@ -208,6 +150,7 @@ CScreenManager::CScreenManager()
for(int i = 0; i < _maxScreens; i++) for(int i = 0; i < _maxScreens; i++)
_pScreen[i] = NULL; _pScreen[i] = NULL;
_currentScreen = 1; _currentScreen = 1;
_bReqUpdate = false;
} }
CScreenManager::~CScreenManager() CScreenManager::~CScreenManager()
@ -250,16 +193,28 @@ CScreenManager::init()
_pScreen[1] = new CScreen2(*_pDisplay, *this); _pScreen[1] = new CScreen2(*_pDisplay, *this);
_pScreen[2] = new CScreen3(*_pDisplay, *this); _pScreen[2] = new CScreen3(*_pDisplay, *this);
_pScreen[3] = new CScreen4(*_pDisplay, *this); _pScreen[3] = new CScreen4(*_pDisplay, *this);
_pScreen[4] = new CScreen5(*_pDisplay, *this);
_switchScreen(); _switchScreen();
} }
void void
CScreenManager::update(const CProtocol& CtlFrame, const CProtocol& HtrFrame) CScreenManager::checkUpdate(const CProtocol& CtlFrame, const CProtocol& HtrFrame)
{ {
if(_pActiveScreen) _pActiveScreen->show(CtlFrame, HtrFrame); if(_bReqUpdate) {
if(_pActiveScreen) {
_pActiveScreen->show(CtlFrame, HtrFrame);
_bReqUpdate = false;
}
}
} }
void
CScreenManager::reqUpdate()
{
_bReqUpdate = true;
}
void void
CScreenManager::animate() CScreenManager::animate()
{ {
@ -272,7 +227,8 @@ CScreenManager::_switchScreen()
if(_currentScreen < _maxScreens) if(_currentScreen < _maxScreens)
_pActiveScreen = _pScreen[_currentScreen]; _pActiveScreen = _pScreen[_currentScreen];
reqDisplayUpdate(); // reqDisplayUpdate();
reqUpdate();
} }
void void

View file

@ -30,21 +30,23 @@ class C128x64_OLED;
class CScreen; class CScreen;
class CScreenManager { class CScreenManager {
static const int _maxScreens = 4; static const int _maxScreens = 5;
CScreen* _pScreen[_maxScreens]; CScreen* _pScreen[_maxScreens];
CScreen* _pActiveScreen; CScreen* _pActiveScreen;
C128x64_OLED* _pDisplay; C128x64_OLED* _pDisplay;
int _currentScreen; int _currentScreen;
bool _bReqUpdate;
void _switchScreen(); void _switchScreen();
public: public:
CScreenManager(); CScreenManager();
~CScreenManager(); ~CScreenManager();
void init(); void init();
void update(const CProtocol& CtlFrame, const CProtocol& HtrFrame); void checkUpdate(const CProtocol& CtlFrame, const CProtocol& HtrFrame);
void animate(); void animate();
void nextScreen(); void nextScreen();
void prevScreen(); void prevScreen();
void keyHandler(uint8_t event); void keyHandler(uint8_t event);
void reqUpdate();
}; };
class CScreen { class CScreen {

View file

@ -27,7 +27,7 @@ extern int getRunState();
extern int getErrState(); extern int getErrState();
extern void reqTempChange(int val); extern void reqTempChange(int val);
extern int getSetTemp(); extern int getSetTemp();
extern void reqDisplayUpdate(); //extern void reqDisplayUpdate();
extern void reqThermoToggle(); extern void reqThermoToggle();
extern void setThermostatMode(unsigned char); extern void setThermostatMode(unsigned char);
extern bool getThermostatMode(); extern bool getThermostatMode();
@ -37,4 +37,6 @@ extern void reqPumpPrime(bool on);
extern float getActualTemperature(); extern float getActualTemperature();
#define LOWERLIMIT(A, B) if(A < B) A = B #define LOWERLIMIT(A, B) if(A < B) A = B
#define UPPERLIMIT(A, B) if(A > B) A = B #define UPPERLIMIT(A, B) if(A > B) A = B
#define ROLLUPPERLIMIT(A, B, C) if(A > B) A = C
#define ROLLLOWERLIMIT(A, B, C) if(A < B) A = C

View file

@ -0,0 +1,148 @@
#include <Arduino.h>
const char* MAIN_PAGE PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<script>
var Socket;
function init() {
Socket = new WebSocket('ws://' + window.location.hostname + ':81/');
Socket.onmessage = function(event){
document.getElementById("TempCurrent").innerHTML = event.data;
}
}
</script>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.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;
-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;
}
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%;
}
</style>
<title>Chinese Diesel Heater Web Controller Interface</title>
</head>
<body onload="javascript:init()">
<h1>Chinese Diesel Heater Web Control</h1>
<div>OFF <label class="switch">
<input type="checkbox" id="onofftoggle" onclick="OnOffCheck()">
<span class="slider round"></span>
</label> ON
</div>
<p id="text" style="display:none">Heater Is ON</p>
<div>
<h2>Temperature Control</h2>
</div>
<input id="slide" type="range" min="1" max="100" step="1" value="10">
<div>
<b>Desired Temp: </b>
<Span id="sliderAmount"></Span>
<div>
</div>
<b>Current Temp: </b><span id="TempCurrent">
<script>
// 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("onofftoggle");
// Send a message to the Devel console of web browser for debugging
console.log(document.getElementById("onofftoggle").checked);
// Get the output text
var text = document.getElementById("text");
// 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
if (checkBox.checked == true){
//Insert Code Here To Turn On The Heater
// Socket.send("P1");
Socket.send("[CMD]ON");
text.style.display = "block";
}
else{
//Insert Code Here To Turn Off The Heater
text.style.display = "none";
// Socket.send("P0");
Socket.send("[CMD]OFF");
}
}
var slide = document.getElementById('slide');
sliderDiv = document.getElementById("sliderAmount");
slide.oninput = function() {
sliderDiv.innerHTML = this.value;
}
</script>
</body>
</html>
)=====";