ESP32_ChinaDieselHeater_Con.../Arduino/BTCDieselHeater/UtilClasses.h
rljonesau a36af395ea OLED working with small fonts, update @100ms
Now restart Serial1 if CRC errors or other issues with reception
2018-11-17 22:59:16 +11:00

129 lines
2.6 KiB
C++

#ifndef __UTIL_CLASSES_H__
#define __UTIL_CLASSES_H__
#include <Arduino.h>
#include <string.h>
#include "Protocol.h"
#include "debugport.h"
// a class to track the blue wire receive / transmit states
class CommStates {
public:
// comms states
enum eCS {
Idle, OEMCtrlRx, OEMCtrlReport, HeaterRx1, HeaterReport1, BTC_Tx, HeaterRx2, HeaterReport2, TemperatureRead
};
CommStates() {
set(Idle);
}
void set(eCS eState) {
m_State = eState;
m_Count = 0;
}
eCS get() {
return m_State;
}
bool is(eCS eState) {
return m_State == eState;
}
bool collectData(CProtocol& Frame, unsigned char val, int limit = 24) { // returns true when buffer filled
Frame.Data[m_Count++] = val;
return m_Count >= limit;
}
bool collectDataEx(CProtocol& Frame, unsigned char val, int limit = 24) { // returns true when buffer filled
// guarding against rogue rx kernel buffer stutters....
if((m_Count == 0) && (val != 0x76)) {
Serial.println("First heater byte not 0x76 - SKIPPING");
return false;
}
Frame.Data[m_Count++] = val;
return m_Count >= limit;
}
bool checkValidStart(unsigned char val)
{
if(m_Count)
return true;
else
return val == 0x76;
}
private:
eCS m_State;
int m_Count;
};
// a class to collect a new data byte from the blue wire
class sRxData {
bool newData;
int Value;
public:
sRxData() {
reset();
}
void reset() {
newData = false;
}
void setValue(int value) {
newData = true;
Value = value;
}
bool available() {
return newData;
}
int getValue() {
return Value;
}
};
// a class to collect rx bytes into a string, typ. until a line terminator (handled elsewhere)
struct sRxLine {
char Line[64];
int Len;
sRxLine() {
clear();
}
bool append(char val) {
if(Len < (sizeof(Line) - 1)) {
Line[Len++] = val;
Line[Len] = 0;
return true;
}
return false;
}
void clear() {
Line[0] = 0;
Len = 0;
}
};
// a class to generate time stamps depending if a heater or otherwise frame header is presented
class CContextTimeStamp {
unsigned long prevTime;
unsigned long refTime;
public:
CContextTimeStamp() {
refTime = 0;
prevTime = 0;
};
void setRefTime() {
refTime = millis();
};
void report(const char* pHdr) {
char msg[32];
if(strncmp(pHdr, "[HTR]", 5) == 0) {
unsigned delta = millis() - prevTime;
sprintf(msg, "%+8dms ", delta);
}
else {
prevTime = millis();
sprintf(msg, "%8dms ", prevTime - refTime);
}
DebugPort.print(msg);
};
};
#endif // __UTIL_CLASSES_H__