ESP32_ChinaDieselHeater_Con.../Arduino/SenderTrial2/SmartError.cpp

93 lines
2.3 KiB
C++
Raw Normal View History

#include "SmartError.h"
CSmartError::CSmartError()
{
reset();
}
void
CSmartError::reset()
{
m_prevRunState = 0;
m_Error = 0;
m_bInhibit = false;
}
// we use inhibit when we manually command the heater off during preheat
// otherwise we'll register an ignition fail event
void
CSmartError::inhibit()
{
m_bInhibit = true;
m_Error = 0;
}
// accept a fresh heater frame
// inpsect the advertised run state, tracking when and how it transitions out
// of preheat especially.
// abnormal transitions are registered and becoem our smart m_Error
// In addition, the hetaer frame has the ErrState updated to track the
// smart error, providing no heater error exists!
void
CSmartError::monitor(CProtocol& heaterFrame)
{
if(heaterFrame.verifyCRC()) {
// only accept valid heater frames!
monitor(heaterFrame.getRunState());
unsigned char HtrErr = heaterFrame.getErrState();
if((HtrErr & 0xfe) == 0) {
// heater is Idle or Normal running state (E-0X + 1 in protocol!!)
unsigned char smartErr = getError();
if(smartErr) {
heaterFrame.setErrState(smartErr); // 10 = ign fail, 11 = retry
heaterFrame.setCRC(); // changed the message, fix the CRC!
}
}
}
}
// test the new run state value, comparing to previous
// detect abnormal transitions
void
CSmartError::monitor(unsigned char newRunState)
{
// check if moving away from heater Idle state (S0)
// especially useful if an OEM controller exists
if((m_prevRunState == 0) && newRunState) {
// reset the smart error
m_Error = 0;
m_bInhibit = false;
}
if(!m_bInhibit) {
if(m_prevRunState == 2) { // preheat state (S2)
if(newRunState == 4) {
// transitioned from preheat to ignited
// - all good!
m_Error = 0;
}
else if(newRunState > 5) {
// transitioned from preheat to post glow
// - second ignition attempt failed, heater is shutting down
m_Error = 11;
}
else if(newRunState == 3) {
// transitioned from preheat to retry
// - first ignition attempt failed, heater will retry
m_Error = 12;
}
}
}
m_prevRunState = newRunState;
}
// return our smart error, if it exists, as the registered code
unsigned char
CSmartError::getError()
{
if(m_Error) {
return m_Error;
}
return 0;
}