/******************************************************************************/ /* 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