207 lines
3.7 KiB
C++
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);
|
|
}
|