Commit 7134ed56 authored by 张金硕's avatar 张金硕

🐞 fix:更换故障码文件,修复故障码的bug

parent dc80ae3d
#include "FaultCode.h"
#include "CAN_CH0_CAN_Communication_Matrix.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};
FaultCodeList_t FaultCode_t;
uint32_t FaultCodeList [MaxFaultCode];
static uint8_t u8FaultCodeValid = 0;
uint32_t Get_FaultCodeDtc1(void)
{
......@@ -75,10 +70,10 @@ uint32_t Get_FaultCodeDtc1(void)
// DTC1 |= DTCM1 & 0xF;
// }
if (DTC1 == 0)
{
return 0XFFFF;
}
// if (DTC1 == 0)
// {
// return 0XFFFF;
// }
u16FaultCode = DTC1;
......@@ -148,226 +143,163 @@ uint32_t Get_FaultCodeDtc2(void)
// DTC2 |= DTCM2 & 0xF;
// }
if (DTC2 == 0)
{
return 0XFFFF;
}
// if (DTC2 == 0)
// {
// return 0XFFFF;
// }
u16FaultCode = DTC2;
return u16FaultCode;
}
uint16_t Get_FaultCodeNum(void)
/**
* @brief 故障码初始化函数
*/
void FaultCode_Init(void)
{
uint16_t u16FaultCode = 0x0000;
u16FaultCode = Get_CAN_CH0_ID_402_Sig_ECU_DTC1Amnt();
return u16FaultCode;
FaultCode_t.Get_FaultCode1_cbk = Get_FaultCodeDtc1;
FaultCode_t.Get_FaultCode2_cbk = Get_FaultCodeDtc2;
FaultCode_t.Get_FaultCodeNum_cbk = Get_CAN_CH0_ID_402_Sig_ECU_DTC1Amnt;
FaultCode_t.disp_timer = DISP_TIMER;
List_Init(&FaultCode_t, FaultCodeList, (uint8_t)MaxFaultCode);
}
uint16_t Get_FaultCodeValid(void)
uint8_t List_GetNum(FaultCodeList_t *CodeList)
{
return 1;
if(CodeList == NULL)
{
return 0;
}
return CodeList->tail - CodeList->hade;
}
/**
* @brief 故障码初始化函数
*/
void FaultCode_Init(void)
uint8_t List_Init(FaultCodeList_t *CodeList, uint32_t Arr[], uint8_t Len)
{
uint16_t i = 0;
for (i = 0; i < MaxFaultCode; i++)
if((CodeList == NULL) || (Arr == NULL))
{
stFaultCode[i].u16FaultCode = 0;
stFaultCode[i].u16FaultCodeCount = 0;
stFaultCodeBack[i].u16FaultCode = 0;
stFaultCodeBack[i].u16FaultCodeCount = 0;
stFaultCodetemp[i].u16FaultCode = 0;
stFaultCodetemp[i].u16FaultCodeCount = 0;
return 2;//空指针,初始化失败
}
FaultCodeInit.callbacks[DTC1] = Get_FaultCodeDtc1;
FaultCodeInit.callbacks[DTC2] = Get_FaultCodeDtc2;
FaultCodeInit.callbacks[DTC3] = NULL;
FaultCodeInit.FaultCodeVaildCbk = Get_FaultCodeValid;
FaultCodeInit.FaultCodeNumCbk = Get_FaultCodeNum;
u16FaultCodeDtcCountBack = 0;
u8FaultCodeValid = 0;
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;
CodeList->TimeCount = 0;
return 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)
uint8_t List_Find(FaultCodeList_t *CodeList, uint32_t FaultCode)
{
uint16_t i = 0;
uint8_t Result = 1;
if ((u32FaultCode == 0XFFFF) || (u32FaultCode == 0))
if(CodeList == NULL)
{
return 2;
}
if (len == 1)
if(List_GetNum(CodeList) == 0)
{
return 1;
return 0;
}
for (i = 0; i < len; i++)
for(int i=CodeList->hade; i<CodeList->tail; i++)
{
if (u32FaultCode == FaultCodeGrpup[i].u16FaultCode)
if(CodeList->code_list[i] == FaultCode)
{
Result = 0;
return Result;
return 1;
}
}
return Result;
return 0;
}
/**
* 添加新的故障码到故障码数组中。
* @param faultCodes 指向故障码数组的指针。
* @param count 指向当前已添加故障码数量的指针。
* @param faultCode 要添加的故障码。
* @param len 实际故障码数量,用于检测数组中是否存在当前故障码
* @note 如果故障码数组已满或者新的故障码已存在,则不添加。
*/
void AddNewFaultCode(_st_FaultCode *faultCodes, uint16_t *count, uint32_t faultCode, uint16_t len)
uint8_t List_add(FaultCodeList_t *CodeList, uint32_t FaultCode)
{
if (*count >= MaxFaultCode || FaultCode_Check(faultCode, faultCodes, len) != 1)
if(CodeList == NULL)
{
return; // 数组已满或故障码已存在,不进行添加
return 3;
}
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[DTC1] != NULL)
if(FaultCode == 0)
{
Dtc1 = FaultCodeInit.callbacks[DTC1]();
return 4;//无效值:0
}
if (FaultCodeInit.callbacks[DTC2] != NULL)
if((CodeList->tail+1) >= CodeList->len)
{
Dtc2 = FaultCodeInit.callbacks[DTC2]();
return 1;//列表满
}
if (FaultCodeInit.callbacks[DTC3] != NULL)
if(List_Find(CodeList, FaultCode) != 0)
{
Dtc3 = FaultCodeInit.callbacks[DTC3]();
return 2;//已存在
}
CodeList->code_list[CodeList->tail] = FaultCode;
CodeList->tail++;
return 0;
}
if (FaultCodeInit.FaultCodeVaildCbk != NULL)
uint8_t List_Clear(FaultCodeList_t *CodeList)
{
if(CodeList == NULL)
{
Vaild = FaultCodeInit.FaultCodeVaildCbk();
return 2;
}
CodeList->hade = 0;
CodeList->tail = 0;
//CodeList->disp = 0;
//CodeList->code_num = 0;
return 0;
}
if (FaultCodeInit.FaultCodeNumCbk != NULL)
{
FaultCodeSum = FaultCodeInit.FaultCodeNumCbk();
}
if (FaultCodeSum > MaxFaultCode)
{
FaultCodeSum = MaxFaultCode;
}
if ((Vaild) && (FaultCodeSum > 0))
{
if (u16FaultCodeDtcCountBack < FaultCodeSum) /* 当前存储故障码是否小于实际故障码数量 */
//10ms
void FaultCode_Servers(void)
{
if(FaultCode_t.TimeCount < 2*FaultCode_t.disp_timer)
{
/* 存储故障码并检查数组中是否存在 */
AddNewFaultCode(stFaultCodeBack, &u16FaultCodeDtcCountBack, Dtc1, FaultCodeSum);
AddNewFaultCode(stFaultCodeBack, &u16FaultCodeDtcCountBack, Dtc2, FaultCodeSum);
FaultCode_t.TimeCount++;
}
/* 接收故障码大于0后进行显示 */
if (u16FaultCodeDtcCountBack > 0)
uint16_t FaultCodeNum = FaultCode_t.Get_FaultCodeNum_cbk();
if(FaultCode_t.code_num != FaultCodeNum)//故障码数量变化,清空
{
/* 当前存储故障码等于实际故障码数量 用于实时更新故障码*/
if (u16FaultCodeDtcCountBack == FaultCodeSum)
{
u16FaultCodeDtcCountBack = 0;
FaultCode_t.code_num = FaultCodeNum;
List_Clear(&FaultCode_t);
}
/* 更新故障码显示 */
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++)
if((List_GetNum(&FaultCode_t) > FaultCodeNum) )//故障码变化,清空
{
stFaultCode[i].u16FaultCode = 0;
stFaultCodetemp[i].u16FaultCode = 0;
stFaultCodeBack[i].u16FaultCode = 0;
}
List_Clear(&FaultCode_t);
}
if (stFaultCode[0].u16FaultCode != 0XFFFF)
if(FaultCodeNum != 0)
{
/* 故障码计时 */
if (stFaultCode[0].u16FaultCodeCount < FaultCodeCount)
List_add(&FaultCode_t, FaultCode_t.Get_FaultCode1_cbk());
if(FaultCodeNum > 1)
{
stFaultCode[0].u16FaultCodeCount += Cycle;
List_add(&FaultCode_t, FaultCode_t.Get_FaultCode2_cbk());
}
}
else
{
/* 计时结束 更新位置 */
stFaultCode[0].u16FaultCodeCount = 0;
tempFaultCode = stFaultCode[0].u16FaultCode;
if (FaultCodeSum > 1)
{
for (i = 0; i < FaultCodeSum - 1; i++)
}
uint32_t List_Display(FaultCodeList_t *CodeList)
{
if((CodeList == NULL) || (List_GetNum(CodeList) == 0))
{
stFaultCode[i].u16FaultCode = stFaultCode[i + 1].u16FaultCode;
}
stFaultCode[FaultCodeSum - 1].u16FaultCode = tempFaultCode;
}
}
return 0;
}
}
else
if(CodeList->TimeCount >= CodeList->disp_timer)
{
u8FaultCodeValid = 0;
for (i = 0; i < MaxFaultCode; i++)
CodeList->TimeCount = 0;
if(++(CodeList->disp) >= (CodeList->tail))
{
stFaultCode[i].u16FaultCode = 0;
stFaultCode[i].u16FaultCodeCount = 0;
stFaultCodeBack[i].u16FaultCode = 0;
stFaultCodeBack[i].u16FaultCodeCount = 0;
stFaultCodetemp[i].u16FaultCode = 0;
stFaultCodetemp[i].u16FaultCodeCount = 0;
CodeList->disp = CodeList->hade;
}
u16FaultCodeDtcCountBack = 0;
}
return CodeList->code_list[CodeList->disp];
}
/**
......@@ -375,27 +307,27 @@ void FaultCode_Service(uint16_t Cycle)
*/
uint32_t Get_Current_FaultCode(void)
{
return stFaultCode[0].u16FaultCode;
return List_Display(&FaultCode_t);
}
uint8_t Get_Current_Hight_FaultCode(void)
{
uint8_t u8FaultHight = 0;
u8FaultHight = ((stFaultCode[0].u16FaultCode)&(0xFF00))>>8;
u8FaultHight = ((List_Display(&FaultCode_t))&(0xFF00))>>8;
return u8FaultHight;
}
uint8_t Get_Current_Mid_FaultCode(void)
{
uint8_t u8FaultMid = 0;
u8FaultMid = ((stFaultCode[0].u16FaultCode)&(0x00FF));
u8FaultMid = ((List_Display(&FaultCode_t))&(0x00FF));
return u8FaultMid;
}
uint8_t Get_FaultCode_Valid(void)
{
return u8FaultCodeValid;
}
// uint8_t Get_FaultCode_Valid(void)
// {
// return u8FaultCodeValid;
// }
/*
*NAME : Get_FaultCode_Lost()
*FUNCTION : 获取发送故障码的CAN是否掉线
......
......@@ -6,55 +6,40 @@
#include <string.h>
/*故障码类型A can报文轮询发送方式*/
#define FaultCodeType_A 1
#define FaultCodeType FaultCodeType_A
#define MaxFaultCode 40
#define MaxFaultCode 72
#define FaultCodeCount 5000
typedef enum
{
DTC1,
DTC2,
DTC3,
NUM_FAULT_TYPES,
} FaultCodeType_Num;
typedef uint32_t (*FaultCodeCallback)(void); /* 故障码回调函数 */
typedef uint16_t (*FaultCodeNumback)(void); /* 故障码个数回调函数 */
typedef uint16_t (*FaultCodeValidback)(void); /* 故障码有效回调函数 */
typedef struct
{
uint32_t u16FaultCode; /* 故障码 */
uint16_t u16FaultCodeCount; /* 故障码总数 */
} _st_FaultCode;
#define DISP_TIMER 500
typedef struct
typedef uint32_t(*Get_FaultCode)(void);
typedef uint8_t(*Get_FaultCodeNum)(void);
typedef struct __attribute__((aligned(4)))
{
FaultCodeCallback callbacks[NUM_FAULT_TYPES];
FaultCodeNumback FaultCodeNumCbk;
FaultCodeValidback FaultCodeVaildCbk;
} _st_Init;
uint32_t *code_list; //故障码列表
uint8_t hade; //列表头
uint8_t tail; //列表尾
uint8_t code_num; //获取的故障码数量
uint8_t len; //故障码列表最大长度
uint8_t disp; //故障码显示下标
uint16_t TimeCount; //故障码循环显示用的定时器
uint16_t disp_timer; //故障码显示的超时时间,超时显示下一个
Get_FaultCode Get_FaultCode1_cbk; //获取故障码的回调函数1
Get_FaultCode Get_FaultCode2_cbk; //获取故障码的回调函数2
Get_FaultCodeNum Get_FaultCodeNum_cbk; //获取故障码数量的回调函数
}FaultCodeList_t;
uint8_t List_Init(FaultCodeList_t *CodeList, uint32_t Arr[], uint8_t Len);
extern void FaultCode_Service(uint16_t Cycle);
extern void FaultCode_Init(void);
void FaultCode_Init(void);
void FaultCode_Servers(void);
extern uint32_t Get_Current_FaultCode(void);
extern uint8_t Get_Current_Hight_FaultCode(void);
extern uint8_t Get_Current_Hight_FaultCode(void);
extern uint8_t Get_FaultCode_Valid(void);
extern uint8_t Get_Current_Mid_FaultCode(void);
// extern uint8_t Get_FaultCode_Valid(void);
#endif
\ No newline at end of file
......@@ -33,7 +33,7 @@ void AMT630H_GUI_SETTING(void);
void AMT630H_GUI_Quit(void);
void AMT630H_GUI_Phone_Connect(void);
void AMT630H_GUI_Fault_Information(void);
void AMT630H_GUI_FaultCode(uint8_t FaultCodeLost,uint8_t FaultCodevalid,uint8_t FaultCode_hight,uint8_t FaultCode_mid);
void AMT630H_GUI_FaultCode(uint8_t FaultCodeLost);
void AMT630H_GUI_Language_Information(void);
void AMT630H_GUI_Unit_Information(void);
void AMT630H_GUI_Display_Mode_Information(void);
......@@ -142,7 +142,7 @@ void AMT630H_GUI_Fault_Information(void)
SetPagePic(GRAPHICS_PAGE_0, Pic_0168_350_290);
SetPagePic(GRAPHICS_PAGE_0, Pic_0169_353_227);/*历史故障*/
SetPagePic(GRAPHICS_PAGE_0, Pic_0170_354_162);/*当前故障*/
AMT630H_GUI_FaultCode(Get_FaultCode_Lost(),Get_FaultCode_Valid(),Get_Current_Hight_FaultCode(),Get_Current_Mid_FaultCode());
AMT630H_GUI_FaultCode(Get_FaultCode_Lost());
}
else if(g_u8Language == EN)
{
......@@ -159,7 +159,7 @@ void AMT630H_GUI_Fault_Information(void)
SetPagePic(GRAPHICS_PAGE_0, Pic_0096_338_228);/*Fault history*/
SetPagePic(GRAPHICS_PAGE_0, Pic_0097_334_163);/*current fault*/
AMT630H_GUI_FaultCode(Get_FaultCode_Lost(),Get_FaultCode_Valid(),Get_Current_Hight_FaultCode(),Get_Current_Mid_FaultCode());
AMT630H_GUI_FaultCode(Get_FaultCode_Lost());
}
/*os MCU版本*/
/* RGB 0 0 0 --- 黑*/
......@@ -186,7 +186,7 @@ void AMT630H_GUI_Fault_Information(void)
SetPagePic(GRAPHICS_PAGE_0, Pic_0356_353_227);/*历史故障*/
SetPagePic(GRAPHICS_PAGE_0, Pic_0357_354_162);/*当前故障*/
AMT630H_GUI_FaultCode(Get_FaultCode_Lost(),Get_FaultCode_Valid(),Get_Current_Hight_FaultCode(),Get_Current_Mid_FaultCode());
AMT630H_GUI_FaultCode(Get_FaultCode_Lost());
}
else if(g_u8Language == EN)
{
......@@ -203,7 +203,7 @@ void AMT630H_GUI_Fault_Information(void)
SetPagePic(GRAPHICS_PAGE_0, Pic_0284_338_228);
SetPagePic(GRAPHICS_PAGE_0, Pic_0285_334_163);/*current fault*/
AMT630H_GUI_FaultCode(Get_FaultCode_Lost(),Get_FaultCode_Valid(),Get_Current_Hight_FaultCode(),Get_Current_Mid_FaultCode());
AMT630H_GUI_FaultCode(Get_FaultCode_Lost());
}
/*os MCU版本*/
/* RGB 0 0 0 --- 黑*/
......@@ -243,11 +243,9 @@ static uint16_t NumbeList_FaultCode_night[]={
uint8_t FaultCodevalid_monitor = 2;
/*故障码显示函数*/
static void AMT630H_GUI_FaultCode(uint8_t FaultCodeLost,uint8_t FaultCodevalid,uint8_t FaultCode_hight,uint8_t FaultCode_mid)
static void AMT630H_GUI_FaultCode(uint8_t FaultCodeLost)
{
if(FaultCodeLost == 1)
{
if(FaultCodevalid == 1)
{
if(g_u8Display_Mode == ModeDAY)
{
......@@ -268,7 +266,6 @@ static void AMT630H_GUI_FaultCode(uint8_t FaultCodeLost,uint8_t FaultCodevalid,u
SetPageText(GRAPHICS_PAGE_0, 0x6009, 610 , 164 , 200, ALIGN_LEFT, 0, TEXT_COLOR(0XFF,0XFF,0XFF,0XFF),TEXT_LINE_OFFSET(1,1));
}
}
}
else if(FaultCodeLost == 0)
{
if(g_u8Display_Mode == ModeDAY)
......
......@@ -34,7 +34,7 @@ void Sys_5ms_Tasks(void)
void Sys_10ms_Tasks(void)
{
Can_BusOff_Recover(10);
FaultCode_Service(10u);
FaultCode_Servers();
Line_In_Debounce_Service(10u);
My_Key_Service();
Data_Mileage_Write_EEPROM();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment