#include "code.h" //static _st_Init FaultCodeInit; //static uint16_t u16FaultCodeDtcCount = 0; //static uint16_t u16FaultCodeDtcCountBack = 0; //static uint16_t u16FaultCodeDtcCounttemp = 0; //static _st_FaultCode stFaultCode[MaxFaultCode] = {0}; //static _st_FaultCode stFaultCodeBack[MaxFaultCode] = {0}; //static _st_FaultCode stFaultCodetemp[MaxFaultCode] = {0}; //static uint8_t u8FaultCodeValid = 0; FaultCodeList_t FaultCode_t; uint16_t FaultCodeList [MaxFaultCode]; uint32_t Get_FaultCodeDtc1(void) { uint32_t u16FaultCode = 0x0000; uint8_t DTCH1 = 0; uint8_t DTCM1 = 0; uint32_t DTC1 = 0; DTCH1 = Get_CAN_CH0_ID_402_Sig_ECU_DTCH1(); DTCM1 = Get_CAN_CH0_ID_402_Sig_ECU_DTCM1(); if (((DTCH1 & 0xF0) >> 4) >= 0xA) { DTC1 |= ((DTCH1 & 0xF0) >> 4) + 3; } else { DTC1 |= (DTCH1 & 0xF0) >> 4; } DTC1 <<= 8; if ((DTCH1 & 0xF) >= 0xA) { DTC1 |= (DTCH1 & 0xF) + 3; } else { DTC1 |= DTCH1 & 0xF; } DTC1 <<= 8; if (((DTCM1 & 0xF0) >> 4) >= 0xA) { DTC1 |= ((DTCM1 & 0xF0) >> 4) + 3; } else { DTC1 |= (DTCM1 & 0xF0) >> 4; } DTC1 <<= 8; if ((DTCM1 & 0xF) >= 0xA) { DTC1 |= (DTCM1 & 0xF) + 3; } else { DTC1 |= DTCM1 & 0xF; } if (DTC1 == 0) { return 0XFFFF; } u16FaultCode = DTC1; return u16FaultCode; } uint32_t Get_FaultCodeDtc2(void) { uint32_t u16FaultCode = 0x0000; uint8_t DTCH2 = 0; uint8_t DTCM2 = 0; uint32_t DTC2 = 0; DTCH2 = Get_CAN_CH0_ID_402_Sig_ECU_DTCH2(); DTCM2 = Get_CAN_CH0_ID_402_Sig_ECU_DTCM2(); if (((DTCH2 & 0xF0) >> 4) >= 0xA) { DTC2 |= ((DTCH2 & 0xF0) >> 4) + 3; } else { DTC2 |= (DTCH2 & 0xF0) >> 4; } DTC2 <<= 8; if ((DTCH2 & 0xF) >= 0xA) { DTC2 |= (DTCH2 & 0xF) + 3; } else { DTC2 |= DTCH2 & 0xF; } DTC2 <<= 8; if (((DTCM2 & 0xF0) >> 4) >= 0xA) { DTC2 |= ((DTCM2 & 0xF0) >> 4) + 3; } else { DTC2 |= (DTCM2 & 0xF0) >> 4; } DTC2 <<= 8; if ((DTCM2 & 0xF) >= 0xA) { DTC2 |= (DTCM2 & 0xF) + 3; } else { DTC2 |= DTCM2 & 0xF; } if (DTC2 == 0) { return 0XFFFF; } u16FaultCode = DTC2; return u16FaultCode; } //uint16_t Get_FaultCodeNum(void) //{ // uint16_t u16FaultCode = 0x0000; // // u16FaultCode = Get_CAN_CH0_ID_402_Sig_ECU_DTCAmnt(); // return u16FaultCode; //} // //uint16_t Get_FaultCodeValid(void) //{ // return 1; //} /** * @brief 故障码初始化函数 */ void FaultCode_Init(void) { #if 0 uint16_t i = 0; for (i = 0; i < MaxFaultCode; i++) { stFaultCode[i].u16FaultCode = 0; stFaultCode[i].u16FaultCodeCount = 0; stFaultCodeBack[i].u16FaultCode = 0; stFaultCodeBack[i].u16FaultCodeCount = 0; stFaultCodetemp[i].u16FaultCode = 0; stFaultCodetemp[i].u16FaultCodeCount = 0; } FaultCodeInit.callbacks[DTC_1] = Get_FaultCodeDtc1; FaultCodeInit.callbacks[DTC_2] = Get_FaultCodeDtc2; FaultCodeInit.callbacks[DTC_3] = NULL; FaultCodeInit.FaultCodeVaildCbk = Get_FaultCodeValid; FaultCodeInit.FaultCodeNumCbk = Get_FaultCodeNum; u16FaultCodeDtcCountBack = 0; u8FaultCodeValid = 0; #endif List_Init(&FaultCode_t, FaultCodeList, (uint8_t)MaxFaultCode); } #if 0 /** * @brief 查询当前故障码是否存在 * @param u32FaultCode 故障码 * @param FaultCodeGrpup 故障码组 * @param len 故障码组长度 * @return 0:存在 1:不存在 2:无效故障码不存储 */ uint8_t FaultCode_Check(const uint32_t u32FaultCode, const _st_FaultCode *FaultCodeGrpup, const uint16_t len) { uint16_t i = 0; uint8_t Result = 1; if ((u32FaultCode == 0XFFFF) || (u32FaultCode == 0)) { return 2; } if (len == 1) { return 1; } for (i = 0; i < len; i++) { if (u32FaultCode == FaultCodeGrpup[i].u16FaultCode) { Result = 0; return Result; } } return Result; } /** * 添加新的故障码到故障码数组中。 * @param faultCodes 指向故障码数组的指针。 * @param count 指向当前已添加故障码数量的指针。 * @param faultCode 要添加的故障码。 * @param len 实际故障码数量,用于检测数组中是否存在当前故障码 * @note 如果故障码数组已满或者新的故障码已存在,则不添加。 */ void AddNewFaultCode(_st_FaultCode *faultCodes, uint16_t *count, uint32_t faultCode, uint16_t len) { if (*count >= MaxFaultCode || FaultCode_Check(faultCode, faultCodes, len) != 1) { return; // 数组已满或故障码已存在,不进行添加 } faultCodes[*count].u16FaultCode = faultCode; (*count)++; } /** * @brief 故障码服务函数 * @param Cycle 建议10ms调用 防止故障码数量过多 接收缓慢 */ void FaultCode_Service(uint16_t Cycle) { uint32_t Dtc1 = 0XFFFF; uint32_t Dtc2 = 0XFFFF; uint32_t Dtc3 = 0XFFFF; uint16_t FaultCodeSum = 0; uint16_t i = 0; uint32_t tempFaultCode = 0; uint16_t Vaild = 0; if (FaultCodeInit.callbacks[DTC_1] != NULL) { Dtc1 = FaultCodeInit.callbacks[DTC_1](); } if (FaultCodeInit.callbacks[DTC_2] != NULL) { Dtc2 = FaultCodeInit.callbacks[DTC_2](); } if (FaultCodeInit.callbacks[DTC_3] != NULL) { Dtc3 = FaultCodeInit.callbacks[DTC_3](); } if (FaultCodeInit.FaultCodeVaildCbk != NULL) { Vaild = FaultCodeInit.FaultCodeVaildCbk(); } if (FaultCodeInit.FaultCodeNumCbk != NULL) { FaultCodeSum = FaultCodeInit.FaultCodeNumCbk(); } if (FaultCodeSum > MaxFaultCode) { FaultCodeSum = MaxFaultCode; } if ((Vaild) && (FaultCodeSum > 0)) { if (u16FaultCodeDtcCountBack < FaultCodeSum) /* 当前存储故障码是否小于实际故障码数量 */ { /* 存储故障码并检查数组中是否存在 */ AddNewFaultCode(stFaultCodeBack, &u16FaultCodeDtcCountBack, Dtc1, FaultCodeSum); AddNewFaultCode(stFaultCodeBack, &u16FaultCodeDtcCountBack, Dtc2, FaultCodeSum); } /* 接收故障码大于0后进行显示 */ if (u16FaultCodeDtcCountBack > 0) { /* 当前存储故障码等于实际故障码数量 用于实时更新故障码*/ if (u16FaultCodeDtcCountBack == FaultCodeSum) { u16FaultCodeDtcCountBack = 0; } /* 更新故障码显示 */ for (i = 0; i < FaultCodeSum; i++) { if (stFaultCodetemp[i].u16FaultCode != stFaultCodeBack[i].u16FaultCode) { stFaultCodetemp[i].u16FaultCode = stFaultCodeBack[i].u16FaultCode; stFaultCode[i].u16FaultCode = stFaultCodetemp[i].u16FaultCode; } } u8FaultCodeValid = 1; /* 大于故障码数量的数组进行清0处理 */ for (i = FaultCodeSum; i < MaxFaultCode; i++) { stFaultCode[i].u16FaultCode = 0; stFaultCodetemp[i].u16FaultCode = 0; stFaultCodeBack[i].u16FaultCode = 0; } } if (stFaultCode[0].u16FaultCode != 0XFFFF) { /* 故障码计时 */ if (stFaultCode[0].u16FaultCodeCount < FaultCodeCount) { stFaultCode[0].u16FaultCodeCount += Cycle; } else { /* 计时结束 更新位置 */ stFaultCode[0].u16FaultCodeCount = 0; tempFaultCode = stFaultCode[0].u16FaultCode; if (FaultCodeSum > 1) { for (i = 0; i < FaultCodeSum - 1; i++) { stFaultCode[i].u16FaultCode = stFaultCode[i + 1].u16FaultCode; } stFaultCode[FaultCodeSum - 1].u16FaultCode = tempFaultCode; } } } } else { u8FaultCodeValid = 0; for (i = 0; i < MaxFaultCode; i++) { stFaultCode[i].u16FaultCode = 0; stFaultCode[i].u16FaultCodeCount = 0; stFaultCodeBack[i].u16FaultCode = 0; stFaultCodeBack[i].u16FaultCodeCount = 0; stFaultCodetemp[i].u16FaultCode = 0; stFaultCodetemp[i].u16FaultCodeCount = 0; } u16FaultCodeDtcCountBack = 0; } } #endif #if 1 uint8_t List_Init(FaultCodeList_t *CodeList, uint16_t Arr[], uint8_t Len) { if(Len < 1) { return 1;//列表空 } CodeList->code_list = Arr; CodeList->len = Len; CodeList->hade = 0; CodeList->code_num = 0; CodeList->tail = 0; CodeList->disp = 0; return 0; } uint8_t List_Find(FaultCodeList_t *CodeList, uint16_t FaultCode) { for(int i=CodeList->hade; i<CodeList->tail; i++) { if(CodeList->code_list[i] == FaultCode) { return 1; } } return 0; } uint8_t List_add(FaultCodeList_t *CodeList, uint16_t FaultCode) { if((CodeList->tail+1) >= CodeList->len) { return 1;//列表满 } if(List_Find(CodeList, FaultCode) != 0) { return 2;//已存在 } // if(CodeList->code_num <= (CodeList->tail - CodeList->hade)) // { // return 3; // } CodeList->code_list[CodeList->tail] = FaultCode; CodeList->tail++; return 0; } uint8_t List_Clear(FaultCodeList_t *CodeList) { CodeList->hade = 0; CodeList->tail = 0; //CodeList->disp = 0; //CodeList->code_num = 0; return 0; } uint8_t List_GetNum(FaultCodeList_t *CodeList) { return CodeList->tail - CodeList->hade; } uint16_t FaultTimeCount = 0; //10ms void FaultCode_Servers(void) { FaultTimeCount++; uint16_t FaultCodeNum = Get_CAN_CH0_ID_402_Sig_ECU_DTCAmnt(); if(FaultCode_t.code_num != FaultCodeNum)//故障码数量变化,清空 { FaultCode_t.code_num = FaultCodeNum; List_Clear(&FaultCode_t); } if((List_GetNum(&FaultCode_t) > FaultCodeNum) )//故障码变化,清空 { List_Clear(&FaultCode_t); } if(FaultCodeNum != 0) { List_add(&FaultCode_t, Get_FaultCodeDtc1()); if(FaultCodeNum > 1) { List_add(&FaultCode_t, Get_FaultCodeDtc2()); } } //else //{ // //List_Clear(&FaultCode_t);//故障码 //} } uint16_t List_Display(FaultCodeList_t *CodeList, uint16_t TimeCount) { if(CodeList->hade == CodeList->tail) { return 0; } if(TimeCount >= 500) { FaultTimeCount = 0; if(++(CodeList->disp) >= (CodeList->tail)) { CodeList->disp = CodeList->hade; } } return CodeList->code_list[CodeList->disp]; } #endif /** * @brief 获取当前故障码 */ uint32_t Get_Current_FaultCode(void) { //return stFaultCode[0].u16FaultCode; return List_Display(&FaultCode_t, FaultTimeCount); } // uint8_t Get_FaultCode_Valid(void) // { // return u8FaultCodeValid; // }