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:
rljonesau 2018-12-22 08:48:39 +11:00
commit e6ea53496f
9 changed files with 156 additions and 54 deletions

View File

@ -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;
}
}

View File

@ -395,11 +395,11 @@ CProtocolPackage::getErrStateStrEx() const
return ErrstatesEx[errstate];
}
void
/*void
CProtocolPackage::setRefTime()
{
_timeStamp.setRefTime();
}
}*/
void
CProtocolPackage::reportFrames(bool isOEM)

View File

@ -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);
};

View File

@ -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);
}

View File

@ -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; };
};

View File

@ -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>

View File

@ -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 */
///////////////////////////////////////////////////////////////////////////////