RabbitECUTeensyMCUXpresso/source/Client/FME.c

149 lines
5.7 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:USER_APP */
/* PACKAGE TITLE: FME */
/* DESCRIPTION: This code assist with failure mode effects */
/* processing */
/* */
/* FILE NAME: FME.c */
/* REVISION HISTORY: 24-06-2020 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#define _FME_C
/******************************************************************************/
/* HEADER FILES */
/******************************************************************************/
#include "build.h"
#ifdef BUILD_USER
#include "FME.h"
/* LOCAL VARIABLE DEFINITIONS (STATIC) ****************************************/
const FME_tstDiagControlData FME_astDiagControlData[FME_enDiagCount] = FME_nControlData;
FME_tstDiagRunningData FME_astDiagRunningData[FME_enDiagCount];
//ASAM mode=readvalue name="PPS Rationality Fault" parent="FME_astDiagRunningData" type=uint16 offset=8 min=0 max=2 units="ENUMERATION NO_FAULT=0 FAULT_ACTIVE=1 FAULT_CLEARED=2" format=3.0 help="FAULT"
//ASAM mode=readvalue name="Throttle Rationality Fault" parent="FME_astDiagRunningData" type=uint16 offset=20 min=0 max=2 units="ENUMERATION NO_FAULT=0 FAULT_ACTIVE=1 FAULT_CLEARED=2" format=3.0 help="FAULT"
//ASAM mode=readvalue name="TPSM Fault" parent="FME_astDiagRunningData" type=uint16 offset=32 min=0 max=2 units="ENUMERATION NO_FAULT=0 FAULT_ACTIVE=1 FAULT_CLEARED=2" format=3.0 help="FAULT"
//ASAM mode=readvalue name="PPSM Fault" parent="FME_astDiagRunningData" type=uint16 offset=44 min=0 max=2 units="ENUMERATION NO_FAULT=0 FAULT_ACTIVE=1 FAULT_CLEARED=2" format=3.0 help="FAULT"
//ASAM mode=readvalue name="PPSS Fault" parent="FME_astDiagRunningData" type=uint16 offset=56 min=0 max=2 units="ENUMERATION NO_FAULT=0 FAULT_ACTIVE=1 FAULT_CLEARED=2" format=3.0 help="FAULT"
/* LOCAL FUNCTION PROTOTYPES (STATIC) *****************************************/
static void FME_vConditionFault(FME_tenDiags, bool);
/* GLOBAL FUNCTION DEFINITIONS ************************************************/
void FME_enUpdateDiagState(FME_tenDiags enDiags, uint32 u32Data1, uint32 u32Data2)
{
switch (FME_astDiagControlData[enDiags].enDiagtype)
{
case FME_enRelationship:
{
if (FME_enPPSPair == enDiags)
{
uint32 u32Temp = (500 * u32Data1) / u32Data2;
FME_astDiagRunningData[enDiags].u32FilterData =
u32Temp / 8 + 7 * (FME_astDiagRunningData[enDiags].u32FilterData / 8);
if ((800 > FME_astDiagRunningData[enDiags].u32FilterData) ||
(1200 < FME_astDiagRunningData[enDiags].u32FilterData))
{
FME_vConditionFault(enDiags, TRUE);
}
else
{
FME_vConditionFault(enDiags, FALSE);
}
}
if (FME_enPedalTransfer == enDiags)
{
if (u32Data1 < u32Data2)
{
FME_vConditionFault(enDiags, TRUE);
}
else
{
FME_vConditionFault(enDiags, FALSE);
}
}
break;
}
case FME_enSingle:
{
FME_astDiagRunningData[enDiags].u32FilterData =
u32Data1 / 4 + 3 * (FME_astDiagRunningData[enDiags].u32FilterData / 4);
if ((FME_astDiagControlData[enDiags].u32FilterDataMin > FME_astDiagRunningData[enDiags].u32FilterData) ||
(FME_astDiagControlData[enDiags].u32FilterDataMax < FME_astDiagRunningData[enDiags].u32FilterData))
{
FME_vConditionFault(enDiags, TRUE);
}
else
{
FME_vConditionFault(enDiags, FALSE);
}
break;
}
default:
{
break;
}
}
}
inline FME_tenFaultState FME_enGetDiagState(FME_tenDiags enDiags)
{
return FME_astDiagRunningData[enDiags].enFaultState;
}
static void FME_vConditionFault(FME_tenDiags enDiags, bool boFaultActive)
{
if (TRUE == boFaultActive)
{
FME_astDiagRunningData[enDiags].u32FaultCounts =
FME_astDiagControlData[enDiags].u32FaultCountLimit > FME_astDiagRunningData[enDiags].u32FaultCounts ?
FME_astDiagRunningData[enDiags].u32FaultCounts + 1 :
FME_astDiagRunningData[enDiags].u32FaultCounts;
}
else
{
FME_astDiagRunningData[enDiags].u32FaultCounts =
0 < FME_astDiagRunningData[enDiags].u32FaultCounts ?
FME_astDiagRunningData[enDiags].u32FaultCounts - 1 :
FME_astDiagRunningData[enDiags].u32FaultCounts;
}
if ((FME_enNoFault == FME_astDiagRunningData[enDiags].enFaultState) &&
(FME_astDiagControlData[enDiags].u32FaultCountLimit == FME_astDiagRunningData[enDiags].u32FaultCounts))
{
FME_astDiagRunningData[enDiags].enFaultState = FME_enFaultActive;
}
else if ((FME_enFaultCleared == FME_astDiagRunningData[enDiags].enFaultState) &&
(FME_astDiagControlData[enDiags].u32FaultCountLimit == FME_astDiagRunningData[enDiags].u32FaultCounts))
{
FME_astDiagRunningData[enDiags].enFaultState = FME_enFaultActive;
}
else if ((FME_enFaultActive == FME_astDiagRunningData[enDiags].enFaultState) &&
(0 == FME_astDiagRunningData[enDiags].u32FaultCounts))
{
FME_astDiagRunningData[enDiags].enFaultState = FME_enFaultCleared;
}
}
void FME_vDiagClearHistory(void)
{
uint32 u32FaultIDX;
for (u32FaultIDX = 0; u32FaultIDX < FME_enDiagCount; u32FaultIDX++)
{
FME_astDiagRunningData[u32FaultIDX].enFaultState = FME_enNoFault;
}
}
#endif //BUILD_USER