Fixed raw blue wire data reporting, now shows true raw data received (and sent by us)
Added state machine reporting toggle to debug menu New state machine diagram
This commit is contained in:
commit
e6ea53496f
|
@ -162,7 +162,8 @@ bool bReportJSONData = REPORT_JSON_TRANSMIT;
|
|||
bool bReportRecyleEvents = REPORT_BLUEWIRE_RECYCLES;
|
||||
bool bReportOEMresync = REPORT_OEM_RESYNC;
|
||||
|
||||
CProtocolPackage HeaterData;
|
||||
CProtocolPackage reportHeaterData;
|
||||
CProtocolPackage primaryHeaterData;
|
||||
|
||||
unsigned long moderator;
|
||||
bool bUpdateDisplay = false;
|
||||
|
@ -426,6 +427,7 @@ void loop()
|
|||
// have not seen any receive data for a second.
|
||||
// OEM controller is probably not connected.
|
||||
// Skip state machine immediately to BTC_Tx, sending our own settings.
|
||||
bHasHtrData = false;
|
||||
bHasOEMController = false;
|
||||
bHasHtrData = false;
|
||||
bool isBTCmaster = true;
|
||||
|
@ -527,20 +529,35 @@ void loop()
|
|||
|
||||
HeaterFrame1.setTime();
|
||||
|
||||
if(digitalRead(ListenOnlyPin)) { // pin open, pulled high (STANDARD OPERATION)
|
||||
bool isBTCmaster = false;
|
||||
while(BlueWireSerial.available()) {
|
||||
DebugPort.println("DUMPED ROGUE RX DATA");
|
||||
BlueWireSerial.read();
|
||||
}
|
||||
BlueWireSerial.flush();
|
||||
TxManage.PrepareFrame(OEMCtrlFrame, isBTCmaster); // parrot OEM parameters, but block NV modes
|
||||
TxManage.Start(timenow);
|
||||
CommState.set(CommStates::BTC_Tx);
|
||||
while(BlueWireSerial.available()) {
|
||||
DebugPort.println("DUMPED ROGUE RX DATA");
|
||||
BlueWireSerial.read();
|
||||
}
|
||||
else { // pin shorted to ground
|
||||
HeaterData.set(HeaterFrame1, OEMCtrlFrame);
|
||||
CommState.set(CommStates::TemperatureRead); // "Listen Only" input is held low, don't send out Tx
|
||||
BlueWireSerial.flush();
|
||||
|
||||
primaryHeaterData.set(HeaterFrame1, OEMCtrlFrame); // OEM is always *the* controller
|
||||
if(bReportBlueWireData) {
|
||||
primaryHeaterData.reportFrames(true);
|
||||
CommState.setDelay(20); // let serial get sent before we send blue wire
|
||||
}
|
||||
else {
|
||||
CommState.setDelay(0);
|
||||
}
|
||||
CommState.set(CommStates::HeaterReport1);
|
||||
break;
|
||||
|
||||
|
||||
case CommStates::HeaterReport1:
|
||||
if(CommState.delayExpired()) {
|
||||
if(digitalRead(ListenOnlyPin)) { // pin open, pulled high (STANDARD OPERATION)
|
||||
bool isBTCmaster = false;
|
||||
TxManage.PrepareFrame(OEMCtrlFrame, isBTCmaster); // parrot OEM parameters, but block NV modes
|
||||
TxManage.Start(timenow);
|
||||
CommState.set(CommStates::BTC_Tx);
|
||||
}
|
||||
else { // pin shorted to ground
|
||||
CommState.set(CommStates::TemperatureRead); // "Listen Only" input is held low, don't send our Tx
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -582,7 +599,7 @@ void loop()
|
|||
|
||||
case CommStates::HeaterValidate2:
|
||||
#if RX_LED == 1
|
||||
digitalWrite(LED_Pin, LOW);
|
||||
digitalWrite(LED_Pin, LOW);
|
||||
#endif
|
||||
|
||||
// test for valid CRC, abort and restart Serial1 if invalid
|
||||
|
@ -598,10 +615,28 @@ void loop()
|
|||
// if abnormal transitions, introduce a smart error!
|
||||
SmartError.monitor(HeaterFrame2);
|
||||
|
||||
CommState.set(CommStates::TemperatureRead);
|
||||
HeaterData.set(HeaterFrame2, TxManage.getFrame());
|
||||
if(!bHasOEMController) // no OEM controller - BTC is *the* controller
|
||||
primaryHeaterData.set(HeaterFrame2, TxManage.getFrame());
|
||||
|
||||
if(bReportBlueWireData) {
|
||||
reportHeaterData.set(HeaterFrame2, TxManage.getFrame());
|
||||
reportHeaterData.reportFrames(false);
|
||||
CommState.setDelay(20); // let serial get sent before we send blue wire
|
||||
}
|
||||
else {
|
||||
CommState.setDelay(0);
|
||||
}
|
||||
CommState.set(CommStates::HeaterReport2);
|
||||
break;
|
||||
|
||||
|
||||
case CommStates::HeaterReport2:
|
||||
if(CommState.delayExpired()) {
|
||||
CommState.set(CommStates::TemperatureRead);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case CommStates::TemperatureRead:
|
||||
// update temperature reading,
|
||||
// synchronised with serial reception as interrupts do get disabled in the OneWire library
|
||||
|
@ -621,8 +656,6 @@ void loop()
|
|||
}
|
||||
CommState.set(CommStates::Idle);
|
||||
updateJSONclients(bReportJSONData);
|
||||
if(bReportBlueWireData)
|
||||
HeaterData.reportFrames(bHasOEMController);
|
||||
break;
|
||||
} // switch(CommState)
|
||||
|
||||
|
@ -668,7 +701,7 @@ bool validateFrame(const CProtocol& frame, const char* name)
|
|||
DebugPort.println(" frame - restarting blue wire's serial port");
|
||||
DebugReportFrame("BAD CRC:", frame, "\r\n");
|
||||
initBlueWireSerial();
|
||||
CommState.set(CommStates::Idle);
|
||||
CommState.set(CommStates::TemperatureRead);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -679,19 +712,19 @@ void requestOn()
|
|||
{
|
||||
TxManage.queueOnRequest();
|
||||
SmartError.reset();
|
||||
HeaterData.setRefTime();
|
||||
// HeaterData.setRefTime();
|
||||
}
|
||||
|
||||
void requestOff()
|
||||
{
|
||||
TxManage.queueOffRequest();
|
||||
SmartError.inhibit();
|
||||
HeaterData.setRefTime();
|
||||
// HeaterData.setRefTime();
|
||||
}
|
||||
|
||||
void ToggleOnOff()
|
||||
{
|
||||
if(HeaterData.getRunState()) {
|
||||
if(primaryHeaterData.getRunState()) {
|
||||
DebugPort.println("ToggleOnOff: Heater OFF");
|
||||
requestOff();
|
||||
}
|
||||
|
@ -807,7 +840,7 @@ void saveNV()
|
|||
|
||||
const CProtocolPackage& getHeaterInfo()
|
||||
{
|
||||
return HeaterData;
|
||||
return primaryHeaterData;
|
||||
}
|
||||
|
||||
bool isWebClientConnected()
|
||||
|
@ -846,6 +879,7 @@ void checkDebugCommands()
|
|||
DebugPort.print(" <J> - toggle output JSON reporting, currently "); DebugPort.println(bReportJSONData ? "ON" : "OFF");
|
||||
DebugPort.print(" <W> - toggle reporting of blue wire timeout/recycling event, currently "); DebugPort.println(bReportRecyleEvents ? "ON" : "OFF");
|
||||
DebugPort.print(" <O> - toggle reporting of OEM resync event, currently "); DebugPort.println(bReportOEMresync ? "ON" : "OFF");
|
||||
DebugPort.print(" <S> - toggle reporting of state machine transits "); DebugPort.println(bReportOEMresync ? "ON" : "OFF");
|
||||
DebugPort.println(" <+> - request heater turns ON");
|
||||
DebugPort.println(" <-> - request heater turns OFF");
|
||||
DebugPort.println(" <R> - restart the ESP");
|
||||
|
@ -898,13 +932,16 @@ void checkDebugCommands()
|
|||
bReportOEMresync = !bReportOEMresync;
|
||||
DebugPort.print("Toggled OEM resync event reporting "); DebugPort.println(bReportOEMresync ? "ON" : "OFF");
|
||||
}
|
||||
else if(rxVal == 's') {
|
||||
CommState.toggleReporting();
|
||||
}
|
||||
else if(rxVal == '+') {
|
||||
TxManage.queueOnRequest();
|
||||
HeaterData.setRefTime();
|
||||
// HeaterData.setRefTime();
|
||||
}
|
||||
else if(rxVal == '-') {
|
||||
TxManage.queueOffRequest();
|
||||
HeaterData.setRefTime();
|
||||
// HeaterData.setRefTime();
|
||||
}
|
||||
else if(rxVal == 'r') {
|
||||
ESP.restart(); // reset the esp
|
||||
|
@ -955,4 +992,4 @@ const char* getBlueWireStatStr()
|
|||
bool hasOEMcontroller()
|
||||
{
|
||||
return bHasOEMController;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -395,11 +395,11 @@ CProtocolPackage::getErrStateStrEx() const
|
|||
return ErrstatesEx[errstate];
|
||||
}
|
||||
|
||||
void
|
||||
/*void
|
||||
CProtocolPackage::setRefTime()
|
||||
{
|
||||
_timeStamp.setRefTime();
|
||||
}
|
||||
}*/
|
||||
|
||||
void
|
||||
CProtocolPackage::reportFrames(bool isOEM)
|
||||
|
|
|
@ -235,7 +235,7 @@ public:
|
|||
float getGlow_Voltage() const { return Heater.getGlowPlug_Voltage(); };
|
||||
float getGlow_Current() const { return Heater.getGlowPlug_Current(); };
|
||||
|
||||
void setRefTime();
|
||||
// void setRefTime();
|
||||
void reportFrames(bool isOEM);
|
||||
};
|
||||
|
||||
|
|
|
@ -30,36 +30,53 @@
|
|||
void
|
||||
CommStates::set(eCS eState)
|
||||
{
|
||||
m_State = eState;
|
||||
m_Count = 0;
|
||||
#if SHOW_STATE_MACHINE_TRANSITIONS == 1
|
||||
DebugPort.print("State");DebugPort.println(m_State);
|
||||
#endif
|
||||
_State = eState;
|
||||
_Count = 0;
|
||||
if(_report) {
|
||||
static const char* stateNames[] = {
|
||||
"Idle", "OEMCtrlRx", "OEMCtrlValidate", "HeaterRx1", "HeaterValidate1", "HeaterReport1",
|
||||
"BTC_Tx", "HeaterRx2", "HeaterValidate2", "HeaterReport2", "TemperatureRead"
|
||||
};
|
||||
if(_State == Idle) DebugPort.println(""); // clear screen
|
||||
DebugPort.print("State:");DebugPort.println(stateNames[_State]);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
CommStates::collectData(CProtocol& Frame, unsigned char val, int limit) { // returns true when buffer filled
|
||||
Frame.Data[m_Count++] = val;
|
||||
return m_Count >= limit;
|
||||
Frame.Data[_Count++] = val;
|
||||
return _Count >= limit;
|
||||
}
|
||||
|
||||
bool
|
||||
CommStates::collectDataEx(CProtocol& Frame, unsigned char val, int limit) { // returns true when buffer filled
|
||||
// guarding against rogue rx kernel buffer stutters....
|
||||
if((m_Count == 0) && (val != 0x76)) {
|
||||
if((_Count == 0) && (val != 0x76)) {
|
||||
DebugPort.println("First heater byte not 0x76 - SKIPPING");
|
||||
return false;
|
||||
}
|
||||
Frame.Data[m_Count++] = val;
|
||||
return m_Count >= limit;
|
||||
Frame.Data[_Count++] = val;
|
||||
return _Count >= limit;
|
||||
}
|
||||
|
||||
bool
|
||||
CommStates::checkValidStart(unsigned char val)
|
||||
{
|
||||
if(m_Count)
|
||||
if(_Count)
|
||||
return true;
|
||||
else
|
||||
return val == 0x76;
|
||||
}
|
||||
|
||||
void
|
||||
CommStates::setDelay(int ms)
|
||||
{
|
||||
_delay = millis() + ms;
|
||||
}
|
||||
|
||||
bool
|
||||
CommStates::delayExpired()
|
||||
{
|
||||
long test = millis() - _delay;
|
||||
return(test >= 0);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <Arduino.h>
|
||||
#include <string.h>
|
||||
#include "DebugPort.h"
|
||||
#include "../cfg/BTCConfig.h"
|
||||
|
||||
class CProtocol;
|
||||
|
||||
|
@ -33,28 +34,34 @@ class CommStates {
|
|||
public:
|
||||
// comms states
|
||||
enum eCS {
|
||||
Idle, OEMCtrlRx, OEMCtrlValidate, HeaterRx1, HeaterValidate1, BTC_Tx, HeaterRx2, HeaterValidate2, TemperatureRead
|
||||
Idle, OEMCtrlRx, OEMCtrlValidate, HeaterRx1, HeaterValidate1, HeaterReport1, BTC_Tx, HeaterRx2, HeaterValidate2, HeaterReport2,TemperatureRead
|
||||
};
|
||||
|
||||
private:
|
||||
eCS m_State;
|
||||
int m_Count;
|
||||
|
||||
eCS _State;
|
||||
int _Count;
|
||||
unsigned long _delay;
|
||||
bool _report;
|
||||
public:
|
||||
CommStates() {
|
||||
m_State = Idle;
|
||||
m_Count = 0;
|
||||
_State = Idle;
|
||||
_Count = 0;
|
||||
_delay = millis();
|
||||
_report = REPORT_STATE_MACHINE_TRANSITIONS;
|
||||
}
|
||||
void set(eCS eState);
|
||||
eCS get() {
|
||||
return m_State;
|
||||
return _State;
|
||||
}
|
||||
bool is(eCS eState) {
|
||||
return m_State == eState;
|
||||
return _State == eState;
|
||||
}
|
||||
bool collectData(CProtocol& Frame, unsigned char val, int limit = 24);
|
||||
bool collectDataEx(CProtocol& Frame, unsigned char val, int limit = 24);
|
||||
bool checkValidStart(unsigned char val);
|
||||
void setDelay(int ms);
|
||||
bool delayExpired();
|
||||
bool toggleReporting() { _report = !_report; };
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -69,6 +69,30 @@ const char* MAIN_PAGE PROGMEM = R"=====(
|
|||
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 "Thermostat":
|
||||
if(heater[key] != 0) {
|
||||
document.getElementById("FixedDiv").hidden = true;
|
||||
|
@ -442,16 +466,32 @@ body {
|
|||
}
|
||||
|
||||
.active0 {
|
||||
background-color: #00f0f0;
|
||||
background-color: #5e4fa2;
|
||||
color: black;
|
||||
}
|
||||
.active21 {
|
||||
background-color: #5f9ea0;
|
||||
background-color: #427bb1;
|
||||
color: #ffffff;
|
||||
}
|
||||
.active41 {
|
||||
background-color: #4CAF50;
|
||||
color: white;
|
||||
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 {
|
||||
|
@ -497,6 +537,7 @@ MainPage {
|
|||
|
||||
<!-- 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>
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
#define TERMINATE_OEM_LINE 0 /* when an OEM controller exists */
|
||||
#define TERMINATE_BTC_LINE 0 /* when an OEM controller does not exist */
|
||||
#define REPORT_OEM_RESYNC 0 /* report idle time if OEM controller detected */
|
||||
#define SHOW_STATE_MACHINE_TRANSITIONS 0 /* state machine changes reported to DebugPort */
|
||||
#define REPORT_STATE_MACHINE_TRANSITIONS 0 /* state machine changes reported to DebugPort */
|
||||
#define REPORT_BLUEWIRE_RECYCLES 1 /* best default on as this is abnormal behaviour can toggle using <W> on debug console */
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue