EVOG2-Spiffs-Avery/Faults_ADI.ino

207 lines
3.7 KiB
C++

/*
0 No Flow fault
1 Flow fault (leak)
2 Power Up
3 Expansion comms fault
4 Display Ping fault
5 Wifi Timeout
6 No AT200 RX Timeout
*/
#define MAXFAULTS 100
int faultCount[MAXFAULTS];
const int faultLimits[MAXFAULTS] = // how many consective faults befor it's real
{
1, // 0 powerup
2, // 1 SD card error
1, // 2 low battery
4, // 3
1, // 4
1, // 5
1, // 6
1,
1,
1,
1, // 10
1,
1,
1,
1,
1, // 15
1,
1,
1,
1,
1, // 20
1,
1,
1,
1, // 24
1, // 25 Obstruction Fault
1,
1,
1,
1,
1, // 30
1,
1,
1, // 33 Get motor error
1, // 34 motor fault
1, // 35 Lidar obstruction fault
1, // 36 No display 1
1,
1,
1,
1, // 40
1,
1,
1,
1,
1, // 45
1,
1,
1,
1, // 49
1, // 50
1,
1,
1,
1,
1, // 55
1,
1,
1,
1,
1, // 60
1,
1,
1,
1,
1, // 65
1,
1,
1,
1, // 69
1, // 70
1,
1,
1,
1,
1, // 75
1,
1,
1,
1,
1, // 80
1,
1,
1,
1,
1, // 85
1,
1,
1,
1, // 89
1, // 90
1,
1,
1,
1,
1, // 95
1,
1,
1,
1 // 99
};
#define fault_QSIZ 40
struct faultQ
{
uint16_t faultnum;
uint32_t etime;
int32_t data[6];
} fault_Q[fault_QSIZ], fault_Qtempdata;
int fault_Qhead = 0;
int fault_Qtail = 0;
#define RENLITAOFFSET 400 // Renlita fault num offset in cloud
void initFaults(void)
{
// int fi;
// for (fi = 0; fi < MAXFAULTS; fi++) faultCount[fi] = 0;
memset(faultCount, 0, sizeof(faultCount));
memset(fault_Q, 0, sizeof(fault_Q));
fault_Qhead = 0;
fault_Qtail = 0;
}
void qualifyFault(int fnum, int32_t fdat)
{
if (fnum < MAXFAULTS)
{
if (faultCount[fnum] < faultLimits[fnum]) // no fault last time
if (++faultCount[fnum] >= faultLimits[fnum]) // no previous fault
{
faultQ_push(fnum + RENLITAOFFSET, fdat);
}
}
}
void restoreFault(int fnum)
{
if (fnum < MAXFAULTS)
if (faultCount[fnum] > 0)
{
faultCount[fnum] = 0;
Serial.print("Fault Restored ");
Serial.println(fnum);
}
}
void faultQ_push(int fnum, int32_t fdat) // load tempdata struct first.. pointer sits on next one to add
{
fault_Q[fault_Qhead].faultnum = fnum;
fault_Q[fault_Qhead].etime = getEpochRtc();
fault_Q[fault_Qhead].data[0] = fdat;
Serial.println("Fault Push");
Serial.println(fnum);
if (++fault_Qhead >= fault_QSIZ)
fault_Qhead = 0; // if at end then wrap
if (fault_Qhead == fault_Qtail)
fault_Qtail++; // if hit other pointer then we full
if (fault_Qtail == fault_QSIZ)
fault_Qtail = 0; // if at end then wrap
}
void faultQ_pull(void) // dumps into tempdata struct pointer sits on next on to pull
{
int f;
fault_Qtempdata.faultnum = fault_Q[fault_Qtail].faultnum;
fault_Qtempdata.etime = fault_Q[fault_Qtail].etime;
for (f = 0; f < 6; f++)
fault_Qtempdata.data[f] = fault_Q[fault_Qtail].data[f];
Serial.println("Fault Pull");
Serial.println(fault_Qtempdata.faultnum);
if (++fault_Qtail == fault_QSIZ)
fault_Qtail = 0; // if at end then wrap
}
int faultQ_size(void)
{
if (fault_Qhead >= fault_Qtail)
return (fault_Qhead - fault_Qtail);
else
return ((fault_QSIZ - fault_Qtail) + fault_Qhead);
}