#include "Data_Coolant\Data_Coolant.h" #include "Application.h" DataCoolantTempStruct DataCoolantTemp ; DataCoolantTempDisStruct DataCoolantTemp_Dis; void Data_Coolant_Temp_KL30_Init ( void ) { DataCoolantTemp.Value = 0; DataCoolantTemp.Valid = 0; DataCoolantTemp_Dis.u8_CurSeg = 0; DataCoolantTemp_Dis.u8_DestSeg = 0; DataCoolantTemp_Dis.u8_UpFlashtimer = CoolantFlashtimer; DataCoolantTemp_Dis.u8_DownFlashtimer = CoolantFlashtimer; DataCoolantTemp_Dis.u8_Warnflg = 0; DataCoolantTemp_Dis.u8_Flg = 0; } void Data_Coolant_Temp_KL15_Init ( void ) { DataCoolantTemp_Dis.u8_CurSeg = 0; DataCoolantTemp_Dis.u8_DestSeg = 0; DataCoolantTemp_Dis.u8_UpFlashtimer = 0; DataCoolantTemp_Dis.u8_DownFlashtimer = 0; DataCoolantTemp_Dis.u8_Warnflg = 0; DataCoolantTemp_Dis.u8_Flg = 0; } #define COOLANT_NUM_TIME 5 // 数显多久变化一次,暂定100ms typedef struct { /*该段的下限值*/ uint16_t u16HYSSegLow; /*该段的上限值*/ uint16_t u16HYSSegHigh; } HYS_Seg_Table_st_t; const HYS_Seg_Table_st_t stHYSSegTableTemp[7] = { {0U, 4700U}, // 0 {5000U, 5900U}, // 1 {6200U, 7700U}, // 2 {8000U, 9500U}, // 3 {9800U, 11200U}, // 4 {11500U, 19900U}, // 5 {19900U, 20000U}, // 6 }; uint32_t u32CoolantDataTimeCount = 0UL; uint32_t u32ColCurNum = 0UL; /*阻尼数显*/ uint32_t u32CoolantNum = 0UL;/*当前实际数据,与显示数值不完全一致*/ /* u32CoolantDir:0:下行,1:上行 2:无变化 */ uint32_t Data_Coolant_Cal_Num(uint32_t u32CoolantCurSeg, uint32_t u32CoolantDir, uint32_t u32CoolantRemTime, uint32_t u32CoolantCurNum, uint32_t u32CoolantDesNum) { uint32_t u32CoolantNumMax = 0UL; uint32_t u32CoolantNumMin = 0UL; uint32_t u32CoolantSegDesNum = 0UL; uint32_t u32CoolantCalBuf = 0UL; uint32_t u32CoolantCalBuf1 = 0UL; uint32_t u32CoolantCalResult = u32CoolantCurNum; /*计算当前格对应的目标数值*/ /*当前格数对应的数值范围,目标数值是否在这个范围内,如果在就直接用目标值。如果不在就根据上下行选择该范围内的极大和极小值。*/ /*这样就找到了当前格对应的目标数值*/ u32CoolantNumMax = stHYSSegTableTemp[u32CoolantCurSeg + 1].u16HYSSegLow; if (u32CoolantCurSeg) { u32CoolantNumMin = stHYSSegTableTemp[u32CoolantCurSeg - 1].u16HYSSegHigh; } else { u32CoolantNumMin = stHYSSegTableTemp[u32CoolantCurSeg].u16HYSSegLow; } if ((u32CoolantDesNum >= u32CoolantNumMin) && (u32CoolantDesNum <= u32CoolantNumMax)) { u32CoolantSegDesNum = u32CoolantDesNum; } else { if (u32CoolantDir == 1) // UP { u32CoolantSegDesNum = u32CoolantNumMax; } else if (u32CoolantDir == 0) // down { u32CoolantSegDesNum = u32CoolantNumMin; } else { u32CoolantSegDesNum = u32CoolantDesNum; } } if (u32CoolantDataTimeCount < COOLANT_NUM_TIME) { u32CoolantDataTimeCount++; } else { u32CoolantDataTimeCount = 0UL; u32CoolantCalBuf = u32CoolantRemTime / COOLANT_NUM_TIME; if (u32CoolantCalBuf) { if (u32CoolantNum < u32CoolantSegDesNum) { u32CoolantCalBuf1 = u32CoolantSegDesNum - u32CoolantNum; u32CoolantCalBuf1 = u32CoolantCalBuf1 / u32CoolantCalBuf; u32CoolantNum += u32CoolantCalBuf1; if (u32CoolantNum > u32CoolantSegDesNum) { u32CoolantNum = u32CoolantSegDesNum; } } else { u32CoolantCalBuf1 = u32CoolantNum - u32CoolantSegDesNum; u32CoolantCalBuf1 = u32CoolantCalBuf1 / u32CoolantCalBuf; u32CoolantNum -= u32CoolantCalBuf1; if (u32CoolantNum < u32CoolantSegDesNum) { u32CoolantNum = u32CoolantSegDesNum; } } u32CoolantCalResult = u32CoolantNum; if (u32CoolantDir == 0) // down { // uint32_t u32CoolantCalBuf2 = 0UL; // if (u32CoolantNum>u32CoolantCurNum) // { // u32CoolantCalBuf2 = u32CoolantNum-u32CoolantCurNum; // } // else // { // u32CoolantCalBuf2 = u32CoolantCurNum-u32CoolantNum; // } // if (u32CoolantCalBuf2>=100) // { // u32CoolantNum+=99UL; // } if ((u32CoolantNum+99)>=u32CoolantCurNum) { u32CoolantCalResult= u32CoolantCurNum; } else { u32CoolantCalResult= ((u32CoolantNum+99)/100*100); } } } else // 0 { u32CoolantNum = u32CoolantSegDesNum; u32CoolantCalResult = u32CoolantNum; } } /*根据目标数值计算每个变化周期内数值变化的大小,*/ /*根据目标数值以及剩余时间,修改当前显示值*/ // return u32CoolantNum; return u32CoolantCalResult; } void Data_Coolant_Temp_Processing_Service(void) { uint16_t Coolant_Temperature = 0; uint8_t Coolant_Temperature_State = 0; uint32_t Temp = 0; uint8_t i = 0; Coolant_Temperature = Get_CAN_CH0_ID_101_Sig_ECU_Engine_Temperature(); Coolant_Temperature_State = Get_CAN_CH0_ID_101_Sig_ECU_Engine_Temperature_State(); if (Common_Get_IG_Sts( ) == COMMON_POWER_ON ) { if(CAN_MSG_Status(&CAN_CH0_CanMsgOp, CAN_CH0_ID_CAN_0x101_Msg_Count) == CAN_SIG_LOST) { DataCoolantTemp.Valid = 0; DataCoolantTemp.Value = 0; } else { if(Coolant_Temperature_State == 1) { DataCoolantTemp.Valid = 0; DataCoolantTemp.Value = 0; } else { DataCoolantTemp.Valid = 1; if(Coolant_Temperature >= 2730) { Coolant_Temperature -= 2730; } else { Coolant_Temperature = 0; } if ((Coolant_Temperature % 10) >= 5) { Coolant_Temperature += 5; } if(Coolant_Temperature > 1990) { Coolant_Temperature = 1990 ; } DataCoolantTemp.Value = Coolant_Temperature / 10; } } } else { DataCoolantTemp.Valid = 0; DataCoolantTemp.Value = 0; } //显示 Data_Coolant_Temp_Display(); } void Data_Coolant_Temp_Display ( void ) { if(Common_Get_IG_Sts( ) == COMMON_POWER_ON) { if (Common_GetIgnOnTime() < 3030) { DataCoolantTemp_Dis.u8_Uptimer = CoolantSelfCheckFlashtimer; DataCoolantTemp_Dis.u8_Downtimer = CoolantSelfCheckFlashtimer; if(DataCoolantTemp_Dis.u8_CurSeg == 0) { DataCoolantTemp_Dis.u8_DestSeg = 5; } if(DataCoolantTemp_Dis.u8_CurSeg == 5) { DataCoolantTemp_Dis.u8_DestSeg = 0; } DataCoolantTemp_Dis.u8_Warnflg = 0; DataCoolantTemp_Dis.u8_Flg = 0; DataCoolantTemp_Dis.Dis_Valid = 0; } else { DataCoolantTemp_Dis.u8_Uptimer = CoolantFlashtimer; DataCoolantTemp_Dis.u8_Downtimer = CoolantFlashtimer; Get_Coolant_Temp_Seg(DataCoolantTemp.Value); if(DataCoolantTemp.Valid == 0) { DataCoolantTemp_Dis.Dis_Valid = 0; DataCoolantTemp_Dis.u8_UpFlashtimer = DataCoolantTemp_Dis.u8_Uptimer; DataCoolantTemp_Dis.u8_DownFlashtimer = DataCoolantTemp_Dis.u8_Downtimer; DataCoolantTemp_Dis.u8_CurSeg = 0; DataCoolantTemp_Dis.u8_DestSeg = 0 ; DataCoolantTemp_Dis.u8_Flg = 0; u32ColCurNum = DataCoolantTemp.Value * 100 ; DataCoolantTemp_Dis.u8_Holdtimer = CoolantFlashtimer; } else { DataCoolantTemp_Dis.Dis_Valid = 1; if (DataCoolantTemp_Dis.u8_Flg == 2) { DataCoolantTemp_Dis.u8_Flg = 1; DataCoolantTemp_Dis.u8_UpFlashtimer = 0; DataCoolantTemp_Dis.u8_DownFlashtimer = 0; } else if(DataCoolantTemp_Dis.u8_Flg == 0) { DataCoolantTemp_Dis.u8_Flg = 2; DataCoolantTemp_Dis.u8_CurSeg = DataCoolantTemp_Dis.u8_DestSeg; DataCoolantTemp_Dis.u8_UpFlashtimer = DataCoolantTemp_Dis.u8_Uptimer; DataCoolantTemp_Dis.u8_DownFlashtimer = DataCoolantTemp_Dis.u8_Downtimer; u32ColCurNum = DataCoolantTemp.Value * 100; DataCoolantTemp_Dis.u8_Holdtimer = CoolantFlashtimer; } else { ; } } } if (Common_GetIgnOnTime() >= 3030) { if(DataCoolantTemp_Dis.u8_CurSeg > DataCoolantTemp_Dis.u8_DestSeg ) { u32ColCurNum = Data_Coolant_Cal_Num(DataCoolantTemp_Dis.u8_CurSeg, 0, (DataCoolantTemp_Dis.u8_Downtimer - DataCoolantTemp_Dis.u8_DownFlashtimer), u32ColCurNum, DataCoolantTemp.Value*100); DataCoolantTemp_Dis.u8_UpFlashtimer = 0; DataCoolantTemp_Dis.u8_Holdtimer = 0; DataCoolantTemp_Dis.u8_DownFlashtimer++; if(DataCoolantTemp_Dis.u8_DownFlashtimer >= DataCoolantTemp_Dis.u8_Downtimer) { DataCoolantTemp_Dis.u8_DownFlashtimer = 0; DataCoolantTemp_Dis.u8_CurSeg--; } } else if (DataCoolantTemp_Dis.u8_CurSeg < DataCoolantTemp_Dis.u8_DestSeg) { u32ColCurNum = Data_Coolant_Cal_Num(DataCoolantTemp_Dis.u8_CurSeg, 1, (DataCoolantTemp_Dis.u8_Uptimer - DataCoolantTemp_Dis.u8_UpFlashtimer), u32ColCurNum, DataCoolantTemp.Value*100); DataCoolantTemp_Dis.u8_DownFlashtimer = 0; DataCoolantTemp_Dis.u8_Holdtimer = 0; DataCoolantTemp_Dis.u8_UpFlashtimer++; if (DataCoolantTemp_Dis.u8_UpFlashtimer >= DataCoolantTemp_Dis.u8_Uptimer) { DataCoolantTemp_Dis.u8_UpFlashtimer = 0; DataCoolantTemp_Dis.u8_CurSeg++; } } else { DataCoolantTemp_Dis.u8_DownFlashtimer = 0; DataCoolantTemp_Dis.u8_UpFlashtimer = 0; DataCoolantTemp_Dis.u8_Holdtimer = CoolantFlashtimer;//++; // if (DataCoolantTemp_Dis.u8_Holdtimer >= CoolantFlashtimer) // { // DataCoolantTemp_Dis.u8_Holdtimer = CoolantFlashtimer; // } /*目标格和当前格一致时,数显如何处理*/ /*5S后更新为目标数值*/ u32ColCurNum = Data_Coolant_Cal_Num(DataCoolantTemp_Dis.u8_CurSeg, 2, (CoolantFlashtimer-DataCoolantTemp_Dis.u8_Holdtimer ), u32ColCurNum, DataCoolantTemp.Value*100); // if(u32ColCurNum < DataCoolantTemp.Value*100) // { // u32ColCurNum += 100; // } // else if (u32ColCurNum > DataCoolantTemp.Value*100) // { // u32ColCurNum -= 100; // } // else // { // u32ColCurNum = DataCoolantTemp.Value*100; // } } } else { u32ColCurNum = DataCoolantTemp.Value * 100; } // warning if (DataCoolantTemp.Valid == 0) { DataCoolantTemp_Dis.u8_Warnflg = 1; } else { if (GET_DataCoolantSegValue() >= 115) { DataCoolantTemp_Dis.u8_Warnflg = 2; } else if (GET_DataCoolantSegValue() <= 112) { DataCoolantTemp_Dis.u8_Warnflg = 0; } else { if(DataCoolantTemp_Dis.u8_Warnflg == 1) { DataCoolantTemp_Dis.u8_Warnflg = 0; } } } } else { DataCoolantTemp_Dis.Dis_Valid = 0; DataCoolantTemp_Dis.u8_UpFlashtimer = DataCoolantTemp_Dis.u8_Uptimer; DataCoolantTemp_Dis.u8_DownFlashtimer = DataCoolantTemp_Dis.u8_Downtimer; DataCoolantTemp_Dis.u8_Warnflg = 0; DataCoolantTemp_Dis.u8_Flg = 0; } } uint8_t Get_Coolant_Temp_Seg(uint16_t Temp_Value) { // uint8_t CurTempSeg; if (Temp_Value < 50) { if (DataCoolantTemp_Dis.u8_CurSeg > 1) { DataCoolantTemp_Dis.u8_DestSeg = 1; } else if (DataCoolantTemp_Dis.u8_CurSeg > 0) { if (Temp_Value <= 47) { DataCoolantTemp_Dis.u8_DestSeg = 0; } } else { DataCoolantTemp_Dis.u8_DestSeg = 0; } } else if ((Temp_Value < 62) && (Temp_Value >= 50)) { if (DataCoolantTemp_Dis.u8_CurSeg > 2) { DataCoolantTemp_Dis.u8_DestSeg = 2; } else if (DataCoolantTemp_Dis.u8_CurSeg > 1) { if (Temp_Value <= 59) { DataCoolantTemp_Dis.u8_DestSeg = 1; } } else { DataCoolantTemp_Dis.u8_DestSeg = 1; } } else if ((Temp_Value < 80) && (Temp_Value >= 62)) { if (DataCoolantTemp_Dis.u8_CurSeg > 3) { DataCoolantTemp_Dis.u8_DestSeg = 3; } else if (DataCoolantTemp_Dis.u8_CurSeg > 2) { if (Temp_Value <= 77) { DataCoolantTemp_Dis.u8_DestSeg = 2; } } else { DataCoolantTemp_Dis.u8_DestSeg = 2; } } else if ((Temp_Value < 98) && (Temp_Value >= 80)) { if (DataCoolantTemp_Dis.u8_CurSeg > 4) { DataCoolantTemp_Dis.u8_DestSeg = 4; } else if (DataCoolantTemp_Dis.u8_CurSeg > 3) { if (Temp_Value <= 95) { DataCoolantTemp_Dis.u8_DestSeg = 3; } } else { DataCoolantTemp_Dis.u8_DestSeg = 3; } } else if ((Temp_Value < 115) && (Temp_Value >= 98)) { if (DataCoolantTemp_Dis.u8_CurSeg > 4) { if (Temp_Value <= 112) { DataCoolantTemp_Dis.u8_DestSeg = 4; } } else { DataCoolantTemp_Dis.u8_DestSeg = 4; } } else { DataCoolantTemp_Dis.u8_DestSeg = 5; } return DataCoolantTemp_Dis.u8_DestSeg; } // 水温显示格数 uint8_t GET_DataCoolantTempSegDisp(void) { return DataCoolantTemp_Dis.u8_CurSeg; } // 水温显示有效标志 uint8_t GET_DataCollantTempSegValid(void) { return DataCoolantTemp_Dis.Dis_Valid; } // 水温数显。作为外发使用的时候+40 uint16_t GET_DataCoolantTempValueDisp(void) { return DataCoolantTemp.Value; } uint16_t GET_DataCoolantSegValue(void) { return (uint16_t)((u32ColCurNum)/100); } uint8_t GET_DataCollantTempValueValid(void) { return DataCoolantTemp.Valid; } // 水温灯及显示的报警信号 0:无报警,正常显示 1:掉线或者state无效,白色闪烁 2:高温,红色闪烁 uint8_t GET_DataCollantTempWarnflg(void) { return DataCoolantTemp_Dis.u8_Warnflg; }