/*
 * app_CAN.c
 *
 *  Created on: Aug 16, 2014
 *      Author: QTC
 */

#define GLOBALS_APP_CAN
#include "defines.h"
#include "g_includes.h"
#include "dtc_handle.h"
#include "bsp_CAN.h"

/*-------------------------------------------------------------------------
 * Function Name  : App_CheckCanDrop
 * Description    :
 * Input          :
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void App_CheckCanDrop(void)
{
	INT8U n = 1u;

	if (g_curkeyinput == KeyOFF)
	{
		g_canMsg61444.ProceF = EMPOTY;
		g_canMsg65266.ProceF = EMPOTY;
		g_canMsg65269.ProceF = EMPOTY;
		g_canMsg65262.ProceF = EMPOTY;
		g_canMsg65279.ProceF = EMPOTY;
		g_canMsg65252.ProceF = EMPOTY;
		g_canMsg64892.ProceF = EMPOTY;
		g_canMsg65265.ProceF = EMPOTY;
		g_canMsg65263.ProceF = EMPOTY;
		g_canMsg65248.ProceF = EMPOTY;
		g_canMsg61442.ProceF = EMPOTY;
		g_canMsg61445.ProceF = EMPOTY;
		g_canMsg64923.ProceF = EMPOTY;
		g_canMsg65215.ProceF = EMPOTY;
		g_canMsg61441.ProceF = EMPOTY;
		g_canMsg60439.ProceF = EMPOTY;
		g_canMsg04119.ProceF = EMPOTY;

		g_canMsg64775_00.ProceF = EMPOTY;
		g_canMsg64775_0F.ProceF = EMPOTY;
		g_canMsg61440_00.ProceF = EMPOTY;
		g_canMsg61440_29.ProceF = EMPOTY;
		g_canMsg61440_0F.ProceF = EMPOTY;
		g_canMsg61440_10.ProceF = EMPOTY;
		g_canMsg65110_00.ProceF = EMPOTY;
		g_canMsg65110_A3.ProceF = EMPOTY;
		g_canMsg61454_51.ProceF = EMPOTY;
		g_canMsg61454_52.ProceF = EMPOTY;

		g_canMsg65226ECM.ProceF = EMPOTY;
		g_canMsg65226EPS.ProceF = EMPOTY;

		g_canMsgABSDTC_EC00.ProceF = EMPOTY;
		g_canMsgECUDTC_EC00.ProceF = EMPOTY;
		g_canMsgDCUDTC_EC00.ProceF = EMPOTY;
		g_canMsgABSDTC_EB00.ProceF = EMPOTY;
		g_canMsgECUDTC_EB00.ProceF = EMPOTY;
		g_canMsgDCUDTC_EB00.ProceF = EMPOTY;
	}

	//-- 20ms Per--//
	if (g_CanTimeOut20ms >= T_20ms)
	{
		g_CanTimeOut20ms = null;
		n = 1;

		if (bRadioTypeCn > 0)
			bRadioTypeCn--;

		//-- ת�� --//
		if (g_canClock.signal.Exist61444)
		{
			if (g_canClock.ID61444Cn >= n)
			{
				g_canClock.ID61444Cn -= n;
			}
			else
			{
				g_canClock.ID61444Cn = null;
			}
			if (g_canClock.ID61444Cn == null)
			{
				g_revMeter.CurBoardVal = 0;

				Disable_signal(g_canClock.signal.Exist61444);
			}
		}

		//�ͺ�
		if (g_canClock.signal.Exist65266)
		{
			if (g_canClock.ID65266Cn >= n)
			{
				g_canClock.ID65266Cn -= n;
			}
			else
			{
				g_canClock.ID65266Cn = null;
			}
			if (g_canClock.ID65266Cn == null)
			{
				g_fuelEco.AveFuelTime = null;
				g_fuelEco.FuelSum = null;
				g_fuelEco.Dis100Km = null;
				g_fuelEco.DispAveFuel = null;
				g_fuelEco.CalAveFuel = null;
				AveFuel_Updeta;

				g_fuelEco.SRFCTime = null;
				g_fuelEco.FuelSum1 = null;
				g_fuelEco.Dis100Km1 = null;
				g_fuelEco.DispSRFC = null;
				g_fuelEco.CalSRFC = null;
				InstFuel_Updeta;

				Disable_signal(g_canClock.signal.Exist65266);
			}
		}

		//
		if (g_canClock.signal.Exist65269)
		{
			if (g_canClock.ID65269Cn >= n)
			{
				g_canClock.ID65269Cn -= n;
			}
			else
			{
				g_canClock.ID65269Cn = null;
			}
			if (g_canClock.ID65269Cn == null)
			{
				g_revMeter.CurBoardVal = 0;

				Disable_signal(g_canClock.signal.Exist65269);
			}
		}

		//-- ˮ�� --//
		if (g_canClock.signal.Exist65262)
		{
			if (g_canClock.ID65262Cn >= n)
			{
				g_canClock.ID65262Cn -= n;
			}
			else
			{
				g_canClock.ID65262Cn = null;
			}
			if (g_canClock.ID65262Cn == null)
			{

				g_Init.InitTempTime = 0;
				g_tempMeter.CurBoardVal = 0;
				if (CheckStep == 2)
					g_sysFlag.Bits.TempMeterInit = Enable;
				Disable_signal(g_canClock.signal.Exist65262);
			}
		}

		//
		if (g_canClock.signal.Exist65279)
		{
			if (g_canClock.ID65279Cn >= n)
			{
				g_canClock.ID65279Cn -= n;
			}
			else
			{
				g_canClock.ID65279Cn = null;
			}
			if (g_canClock.ID65279Cn == null)
			{
				g_CanSwith.WIF = 0;
				g_CanSwith.DriverWarn = 0;
				//g_CanSwith.DriverLimited = 0;
				Disable_signal(g_canClock.signal.Exist65279);
			}
		}

		//-- Ԥ�� --//
		if (g_canClock.signal.Exist65252)
		{
			if (g_canClock.ID65252Cn >= n)
			{
				g_canClock.ID65252Cn -= n;
			}
			else
			{
				g_canClock.ID65252Cn = null;
			}
			if (g_canClock.ID65252Cn == null)
			{
				g_CanSwith.PreHeat = 0;
				Disable_signal(g_canClock.signal.Exist65252);
			}
		}

		//-- �������ŷ�������DPF --//
		if (g_canClock.signal.Exist64892)
		{
			if (g_canClock.ID64892Cn >= n)
			{
				g_canClock.ID64892Cn -= n;
			}
			else
			{
				g_canClock.ID64892Cn = null;
			}
			if (g_canClock.ID64892Cn == null)
			{

				g_CanSwith.DPF = 0;
				g_CanSwith.DPFf = 0;
				g_CanSwith.DpfHiTemp = 0;
				g_CanSwith.DPF_Red = 0;
				g_CanSwith.InhibiteDPF = 0;

				Disable_signal(g_canClock.signal.Exist64892);
			}
		}

		//-- �������ŷŹ���OBD1 --//
		if (g_canClock.signal.Exist64775_00)
		{
			if (g_canClock.ID64775_00Cn >= n)
			{
				g_canClock.ID64775_00Cn -= n;
			}
			else
			{
				g_canClock.ID64775_00Cn = null;
			}
			if (g_canClock.ID64775_00Cn == null)
			{
			  g_CanSwith.OilLamp1 = 0;
				g_CanSwith.EngMIL1 = 0;
				g_CanSwith.EngFailure1 = 0;
				g_CanSwith.EngFailure4 = 0;
				g_CanSwith.STOP1 = 0;

				Disable_signal(g_canClock.signal.Exist64775_00);
			}
		}

		if (g_canClock.signal.Exist64775_0F)
		{
			if (g_canClock.ID64775_0FCn >= n)
			{
				g_canClock.ID64775_0FCn -= n;
			}
			else
			{
				g_canClock.ID64775_0FCn = null;
			}
			if (g_canClock.ID64775_0FCn == null)
			{
				g_CanSwith.EngMIL1 = 0;
				g_CanSwith.EngFailure1 = 0;
				g_CanSwith.EngFailure4 = 0;
				g_CanSwith.STOP1 = 0;

				Disable_signal(g_canClock.signal.Exist64775_0F);
			}
		}

		//-- ����Ѳ�� --//
		if (g_canClock.signal.Exist65265)
		{
			if (g_canClock.ID65265Cn >= n)
			{
				g_canClock.ID65265Cn -= n;
			}
			else
			{
				g_canClock.ID65265Cn = null;
			}
			if (g_canClock.ID65265Cn == null)
			{
				g_CanSwith.CruSysAct = 0;

				Disable_signal(g_canClock.signal.Exist65265);
			}
		}

		//-- ����ѹ��  --//
		if (g_canClock.signal.Exist65263)
		{
			if (g_canClock.ID65263Cn >= n)
			{
				g_canClock.ID65263Cn -= n;
			}
			else
			{
				g_canClock.ID65263Cn = null;
			}
			if (g_canClock.ID65263Cn == null)
			{
				g_CanSwith.OilLamp = 0;

				Disable_signal(g_canClock.signal.Exist65263);
			}
		}

		//
		if (g_canClock.signal.Exist61440_00)
		{
			if (g_canClock.ID61440_00Cn >= n)
			{
				g_canClock.ID61440_00Cn -= n;
			}
			else
			{
				g_canClock.ID61440_00Cn = null;
			}
			if (g_canClock.ID61440_00Cn == null)
			{
				Disable_signal(g_canClock.signal.Exist61440_00);
			}
		}

		//
		if (g_canClock.signal.Exist61440_29)
		{
			if (g_canClock.ID61440_29Cn >= n)
			{
				g_canClock.ID61440_29Cn -= n;
			}
			else
			{
				g_canClock.ID61440_29Cn = null;
			}
			if (g_canClock.ID61440_29Cn == null)
			{
	

				Disable_signal(g_canClock.signal.Exist61440_29);
			}
		}

		//
		if (g_canClock.signal.Exist61440_0F)
		{
			if (g_canClock.ID61440_0FCn >= n)
			{
				g_canClock.ID61440_0FCn -= n;
			}
			else
			{
				g_canClock.ID61440_0FCn = null;
			}
			if (g_canClock.ID61440_0FCn == null)
			{
				

				Disable_signal(g_canClock.signal.Exist61440_0F);
			}
		}

		//
		if (g_canClock.signal.Exist61440_10)
		{
			if (g_canClock.ID61440_10Cn >= n)
			{
				g_canClock.ID61440_10Cn -= n;
			}
			else
			{
				g_canClock.ID61440_10Cn = null;
			}
			if (g_canClock.ID61440_10Cn == null)
			{
			

				Disable_signal(g_canClock.signal.Exist61440_10);
			}
		}

		//-- �������ŷŹ���OBD2 --//
		if (g_canClock.signal.Exist65226ECM)
		{
			if (g_canClock.ID65226CnECM >= n)
			{
				g_canClock.ID65226CnECM -= n;
			}
			else
			{
				g_canClock.ID65226CnECM = null;
			}
			if (g_canClock.ID65226CnECM == null)
			{
				g_CanSwith.EngMIL2 = 0;
				g_CanSwith.EngFailure2 = 0;
				g_CanSwith.EngFailure3 = 0;
				g_CanSwith.STOP2 = 0;

				EcmDtcTbl[0].bFMI = 0;
				EcmDtcTbl[0].dwSPN = 0;

				Disable_signal(g_canClock.signal.Exist65226ECM);
			}
		}
		if (g_canClock.signal.Exist65226EPS)
		{
			if (g_canClock.ID65226CnEPS >= n)
			{
				g_canClock.ID65226CnEPS -= n;
			}
			else
			{
				g_canClock.ID65226CnEPS = null;
			}
			if (g_canClock.ID65226CnEPS == null)
			{
				g_CanSwith.EngMIL3 = 0;
				g_CanSwith.SCR_Y = 0;
				g_CanSwith.SCR_R = 0;

				DCUDtcTbl[0].bFMI = 0;
				DCUDtcTbl[0].dwSPN = 0;

				Disable_signal(g_canClock.signal.Exist65226EPS);
			}
		}

		//
		if (g_canClock.signal.Exist65248)
		{
			if (g_canClock.ID65248Cn >= n)
			{
				g_canClock.ID65248Cn -= n;
			}
			else
			{
				g_canClock.ID65248Cn = null;
			}
			if (g_canClock.ID65248Cn == null)
			{
				

				Disable_signal(g_canClock.signal.Exist65248);
			}
		}

		//����
		if (g_canClock.signal.Exist65110_00)
		{
			if (g_canClock.ID65110_00Cn >= n)
			{
				g_canClock.ID65110_00Cn -= n;
			}
			else
			{
				g_canClock.ID65110_00Cn = null;
			}
			if (g_canClock.ID65110_00Cn == null)
			{
				g_canClock.ID65110Start_00Cn = 0;
				g_adblueMeter.CurBoardVal = 0;
				g_adblueMeter.DispPosition = 0;
				g_adblueMeter.CurPosition = 0;
				g_adblueMeter.DestPosition = 0;

				Disable_signal(g_canClock.signal.Exist65110_00);
			}
		}

		//����
		if (g_canClock.signal.Exist65110_A3)
		{
			if (g_canClock.ID65110_A3Cn >= n)
			{
				g_canClock.ID65110_A3Cn -= n;
			}
			else
			{
				g_canClock.ID65110_A3Cn = null;
			}
			if (g_canClock.ID65110_A3Cn == null)
			{
				g_canClock.ID65110Start_A3Cn = 0;
				g_adblueMeter.CurBoardVal = 0;
				g_adblueMeter.DispPosition = 0;
				g_adblueMeter.CurPosition = 0;
				g_adblueMeter.DestPosition = 0;

				Disable_signal(g_canClock.signal.Exist65110_A3);
			}
		}

		//-- ����Һ_3D --//
		if (g_canClock.signal.Exist65110_3D)
		{
			if (g_canClock.ID65110_3DCn >= n)
			{
				g_canClock.ID65110_3DCn -= n;
			}
			else
			{
				g_canClock.ID65110_3DCn = null;
			}
			if (g_canClock.ID65110_3DCn == null)
			{
				g_canClock.ID65110Start_3DCn = 0;
				g_adblueMeter.CurBoardVal = 0;
				g_adblueMeter.DispPosition = 0;
				g_adblueMeter.CurPosition = 0;
				g_adblueMeter.DestPosition = 0;

				Disable_signal(g_canClock.signal.Exist65110_3D);
			}
		}

		//
		if (g_canClock.signal.Exist61442)
		{
			if (g_canClock.ID61442Cn >= n)
			{
				g_canClock.ID61442Cn -= n;
			}
			else
			{
				g_canClock.ID61442Cn = null;
			}
			if (g_canClock.ID61442Cn == null)
			{
				Disable_signal(g_canClock.signal.Exist61442);
			}
		}

		//
		if (g_canClock.signal.Exist61445)
		{
			if (g_canClock.ID61445Cn >= n)
			{
				g_canClock.ID61445Cn -= n;
			}
			else
			{
				g_canClock.ID61445Cn = null;
			}
			if (g_canClock.ID61445Cn == null)
			{
				Disable_signal(g_canClock.signal.Exist61445);
			}
		}

		//
		if (g_canClock.signal.Exist64923)
		{
			if (g_canClock.ID64923Cn >= n)
			{
				g_canClock.ID64923Cn -= n;
			}
			else
			{
				g_canClock.ID64923Cn = null;
			}
			if (g_canClock.ID64923Cn == null)
			{
				Disable_signal(g_canClock.signal.Exist64923);
			}
		}

		//
		if (g_canClock.signal.Exist61454_51)
		{
			if (g_canClock.ID61454_51Cn >= n)
			{
				g_canClock.ID61454_51Cn -= n;
			}
			else
			{
				g_canClock.ID61454_51Cn = null;
			}
			if (g_canClock.ID61454_51Cn == null)
			{
				g_CanSwith.CruSysAct = 0;

				Disable_signal(g_canClock.signal.Exist61454_51);
			}
		}

		//
		if (g_canClock.signal.Exist61454_52)
		{
			if (g_canClock.ID61454_52Cn >= n)
			{
				g_canClock.ID61454_52Cn -= n;
			}
			else
			{
				g_canClock.ID61454_52Cn = null;
			}
			if (g_canClock.ID61454_52Cn == null)
			{
				g_CanSwith.CruSysAct = 0;

				Disable_signal(g_canClock.signal.Exist61454_52);
			}
		}

		//
		if (g_canClock.signal.Exist65215)
		{
			if (g_canClock.ID65215Cn >= n)
			{
				g_canClock.ID65215Cn -= n;
			}
			else
			{
				g_canClock.ID65215Cn = null;
			}
			if (g_canClock.ID65215Cn == null)
			{
				g_CanSwith.CruSysAct = 0;

				Disable_signal(g_canClock.signal.Exist65215);
			}
		}

		//-- ABS --//
		if (g_canClock.signal.Exist61441)
		{
			if (g_canClock.ID61441Cn >= n)
			{
				g_canClock.ID61441Cn -= n;
			}
			else
			{
				g_canClock.ID61441Cn = null;
			}
			if (g_canClock.ID61441Cn == null)
			{
				g_CanSwith.ABSLamp = 0;
				g_CanSwith.ABSLamp1 = 0;
				g_CanSwith.ASR = 0;
				g_CanSwith.ESPoff = 0;

				Disable_signal(g_canClock.signal.Exist61441);
			}
		}

		//--
		if (g_canClock.signal.Exist60439)
		{
			if (g_canClock.ID60439Cn >= n)
			{
				g_canClock.ID60439Cn -= n;
			}
			else
			{
				g_canClock.ID60439Cn = null;
			}
			if (g_canClock.ID60439Cn == null)
			{
				Disable_signal(g_LightSts.LTurnSts);
				Disable_signal(g_LightSts.RTurnSts);
				Disable_signal(g_CanSwith.HighBeam);
				Disable_signal(g_CanSwith.LowBeam);
				Disable_signal(g_CanSwith.DrDoorStae);
				Disable_signal(g_CanSwith.PssDoorStae);
				Disable_signal(g_CanSwith.RLDoorStae);
				Disable_signal(g_CanSwith.RRDoorStae);
				Disable_signal(g_CanSwith.FrontFog);
				Disable_signal(g_CanSwith.RearFog);
				Disable_signal(g_CanSwith.PosLamp);

				Disable_signal(g_canClock.signal.Exist60439);
			}
		}

		//--
		if (g_canClock.signal.Exist04119)
		{
			if (g_canClock.ID04119Cn >= n)
			{
				g_canClock.ID04119Cn -= n;
			}
			else
			{
				g_canClock.ID04119Cn = null;
			}
			if (g_canClock.ID04119Cn == null)
			{
				Disable_signal(g_canClock.signal.Exist04119);
			}
		}

		//DTC-18ECFF00 �㲥
		if (g_canClock.signal.ExistECU60416)
		{
			if (g_canClock.IDECU60416Cn >= n)
			{
				g_canClock.IDECU60416Cn -= n;
			}
			else
			{
				g_canClock.IDECU60416Cn = null;
			}
			if (g_canClock.IDECU60416Cn == null)
			{
				MulCanMsg_ECM.bBuf[0] = 0;
				EcmDtcTbl[0].Err = 0;
				bEcmDtcCnt = 0;
				EPCLamp = 0;
				OBDLamp = 0;
				(void)memset(EcmDtcTbl, 0, sizeof(EcmDtcTbl));

				Disable_signal(g_canClock.signal.ExistECU60416);
			}
		}
		//DTC-18EBFF00 ����
		if (g_canClock.signal.ExistECU60160)
		{
			if (g_canClock.IDECU60160Cn >= n)
			{
				g_canClock.IDECU60160Cn -= n;
			}
			else
			{
				g_canClock.IDECU60160Cn = null;
			}
			if (g_canClock.IDECU60160Cn == null)
			{
				Disable_signal(g_canClock.signal.ExistECU60160);
			}
		}
		//DTC-18ECFF0B �㲥
		if (g_canClock.signal.ExistABS60416)
		{
			if (g_canClock.IDABS60416Cn >= n)
			{
				g_canClock.IDABS60416Cn -= n;
			}
			else
			{
				g_canClock.IDABS60416Cn = null;
			}
			if (g_canClock.IDABS60416Cn == null)
			{
				(void)memset(ABSDtcTbl, 0, sizeof(ABSDtcTbl));

				Disable_signal(g_canClock.signal.ExistABS60416);
			}
		}
		//DTC-18EBFF0B ����
		if (g_canClock.signal.ExistABS60160)
		{
			if (g_canClock.IDABS60160Cn >= n)
			{
				g_canClock.IDABS60160Cn -= n;
			}
			else
			{
				g_canClock.IDABS60160Cn = null;
			}
			if (g_canClock.IDABS60160Cn == null)
			{
				Disable_signal(g_canClock.signal.ExistABS60160);
			}
		}
		//DTC-18ECFF3D �㲥
		if (g_canClock.signal.ExistDCU60416)
		{
			if (g_canClock.IDDCU60416Cn >= n)
			{
				g_canClock.IDDCU60416Cn -= n;
			}
			else
			{
				g_canClock.IDDCU60416Cn = null;
			}
			if (g_canClock.IDDCU60416Cn == null)
			{
				(void)memset(DCUDtcTbl, 0, sizeof(DCUDtcTbl));

				Disable_signal(g_canClock.signal.ExistDCU60416);
			}
		}
		//DTC-18EBFF3D ����
		if (g_canClock.signal.ExistDCU60160)
		{
			if (g_canClock.IDDCU60160Cn >= n)
			{
				g_canClock.IDDCU60160Cn -= n;
			}
			else
			{
				g_canClock.IDDCU60160Cn = null;
			}
			if (g_canClock.IDDCU60160Cn == null)
			{
				Disable_signal(g_canClock.signal.ExistDCU60160);
			}
		}
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : Api_SetCanTimer
 * Description    :
 * Input          :
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void Api_SetCanTimer(INT16U Second, _Clock *T)
{
	T->TCanEnable = Enable;
	T->OverCanTime = Second;
	T->CanTime = null;
}
/*-------------------------------------------------------------------------
 * Function Name  : Api_CanTimerOver
 * Description    :
 * Input          :
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
INT8U Api_CanTimerOver(_Clock *T)
{
	if ((T->CanTime >= T->OverCanTime) && (T->TCanEnable))
	{
		T->TCanEnable = Disable;
		return 1;
	}
	else
	{
		return 0;
	}
}

/*-------------------------------------------------------------------------
 * Function Name  : App_SendCanMsg
 * Description    :
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void App_SendCanMsg(void)
{
	if (g_curkeyinput == KeyON)
	{
		//IC_TCO1	0x0CFE6CEE	65132	50

		//Tachograph output shaft speed
		//Com_vTCO1Spd

		if (g_canClock.CanSendTime >= T1_100ms)
		{
			g_canClock.CanSendTime = null;

			//IC_CCVS	0x18FEF121	65265	100

			//Parking Brake Switc
			//Cruise Control Pause Switch
			//Wheel-Based Vehicle Speed
			//Cruise Control Active
			//Brake Switch
			//Clutch Switch
			//Cruise Control Set Switch
			//Cruise Control Coast (Decelerate) Switch
			//Cruise Control Resume Switch
			//Cruise Control Accelerate Switch
			//PTO Governor State

			g_txCanMsg1.dlc = 8;
			g_txCanMsg1.id = 0x18FEF121;

			g_txCanMsg1.msg[0] = 0x01;
			g_txCanMsg1.msg[1] = 0x02;
			g_txCanMsg1.msg[2] = 0x03;
			g_txCanMsg1.msg[3] = 0x04;
			g_txCanMsg1.msg[4] = 0x05;
			g_txCanMsg1.msg[5] = 0x06;
			g_txCanMsg1.msg[6] = 0x07;
			g_txCanMsg1.msg[7] = 0x08;

			g_bReturn = bsp_CANSendExtFrame((INT32U)g_txCanMsg1.id, 3, (INT8U *)g_txCanMsg1.msg, g_txCanMsg1.dlc);
		}

		//IC_DD	0x18FEFC17	65276	1000
		//Fuel Level 1

		//IC_VDHR 	0x18FEC1EE	65217	1000
		//Vehicle Distance
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : GetConnectInfo
 * Description    :
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void GetConnectInfo(MULCANMSG *pMulCanMsg, INT8U *pCanBuf)
{
	INT16U wTemp;
	if (!pMulCanMsg->bRcvBusy)
	{
		wTemp = (((INT16U)pCanBuf[2]) << 8) | pCanBuf[1];
		if (wTemp <= MAX_MULCANDATALEN)
		{ //�����ڿɴ����ķ�Χ����.
			pMulCanMsg->bLength = pCanBuf[1];
			pMulCanMsg->bCtrByte = pCanBuf[0];
			pMulCanMsg->wPGN = (((INT16U)pCanBuf[6]) << 8) | pCanBuf[5];
			pMulCanMsg->bPackage = pCanBuf[3];
			pMulCanMsg->bRcvInfoFlg = 1;
			pMulCanMsg->bPrePckNum = 0;
		}
	}
	else
	{
		//reset MulCanMsg,ʹ���ܹ����½���������Ϣ
		pMulCanMsg->bRcvBusy = 0;
		pMulCanMsg->bPrePckNum = 0;
		pMulCanMsg->bRcvInfoFlg = 0;
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : GetMulDTC
 * Description    :
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
INT8U GetMulDTC(MULCANMSG *pMulCanMsg, INT8U *pCanBuf)
{
	if (pMulCanMsg->bRcvInfoFlg)
	{ //���յ�������ݱ���(���ӹ���)
		if (pMulCanMsg->wPGN == 65226)
		{ //����ECM������(���)
			if (pMulCanMsg->bCtrByte == 32)
			{ //BAM(�㲥������Ϣ)
				if (pMulCanMsg->bPrePckNum + 1 == pCanBuf[0])
				{							  //������кŵ�������
					pMulCanMsg->bRcvBusy = 1; //��ʼ���ն����Ϣ
					(void)memmove(&pMulCanMsg->bBuf[pMulCanMsg->bPrePckNum * 7],
								  &pCanBuf[1], 7); //move myRxData to MulCan.DataBuf.
					pMulCanMsg->bPrePckNum++;
					if (pMulCanMsg->bPrePckNum == pMulCanMsg->bPackage)
					{								 //���һ��
						pMulCanMsg->bRcvInfoFlg = 0; //�����Ϣ�������
						pMulCanMsg->bRcvBusy = 0;	 //�����Ϣ�������,�������Խ����µ�������Ϣ(pgn60416)
						pMulCanMsg->bPrePckNum = 0;
						return 1; //�����Ϣ�������
					}
				}
			}
		}
	}
	return 0;
}
/************************************************************************
  Function Name	:	UpdateDtcTbl(MULCANMSG *pMulCanMsg,DTC *pDtcTable,INT8U *pDtcCnt)
Engineer		:	bill
Date			:	2009 05 03
Parameters		:	None
Returns			:	None
Notes			:	���¹��������,�����ڶ��������ĸ���
 *************************************************************************/
void UpdateDtcTbl(MULCANMSG *pMulCanMsg, DTC *pDtcTable, INT8U *pDtcCnt)
{
	INT8U i;
	INT32U tmp32u_Can;
	*pDtcCnt = (INT8U)((pMulCanMsg->bLength - 2) >> 2);
	if (*pDtcCnt > DTCTBLLEN)
		*pDtcCnt = DTCTBLLEN;
	for (i = 0; i < *pDtcCnt; i++)
	{
		pDtcTable[0].Err = pMulCanMsg->bBuf[0];
		pDtcTable[i].bFMI = pMulCanMsg->bBuf[4 + i * 4] & 0x1f;
		tmp32u_Can = 0;
		//GET SPN
		tmp32u_Can |= (pMulCanMsg->bBuf[4 + i * 4] >> 5);
		tmp32u_Can <<= 8;
		tmp32u_Can |= pMulCanMsg->bBuf[3 + i * 4];
		tmp32u_Can <<= 8;
		tmp32u_Can |= pMulCanMsg->bBuf[2 + i * 4];
		pDtcTable[i].dwSPN = tmp32u_Can;
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : AnalysisConnectInfo
 * Description    :
 * Input          :
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void AnalysisConnectInfo(void)
{
	if (g_canMsgECUDTC_EC00.ProceF)
	{
		GetConnectInfo(&MulCanMsg_ECM, g_canMsgECUDTC_EC00.Data); //�㲥
		g_canMsgECUDTC_EC00.ProceF = EMPOTY;
	}
	//
	if (g_canMsgDCUDTC_EC00.ProceF)
	{
		GetConnectInfo(&MulCanMsg_DCU, g_canMsgDCUDTC_EC00.Data); //�㲥
		g_canMsgDCUDTC_EC00.ProceF = EMPOTY;
	}
	//
	if (g_canMsgABSDTC_EC00.ProceF)
	{
		GetConnectInfo(&MulCanMsg_ABS, g_canMsgABSDTC_EC00.Data); //�㲥
		g_canMsgABSDTC_EC00.ProceF = EMPOTY;
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : AnalysisMulDTC
 * Description    :
 * Input          :
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void AnalysisMulDTC(void)
{
	if (g_canMsgECUDTC_EB00.ProceF)
	{
		if (GetMulDTC(&MulCanMsg_ECM, g_canMsgECUDTC_EB00.Data)) //����
			UpdateDtcTbl(&MulCanMsg_ECM, EcmDtcTbl, &bEcmDtcCnt);
		g_canMsgECUDTC_EB00.ProceF = EMPOTY;
	}
	//
	if (g_canMsgDCUDTC_EB00.ProceF)
	{
		if (GetMulDTC(&MulCanMsg_DCU, g_canMsgDCUDTC_EB00.Data)) //����
			UpdateDtcTbl(&MulCanMsg_DCU, DCUDtcTbl, &bDCUDtcCnt);
		g_canMsgDCUDTC_EB00.ProceF = EMPOTY;
	}
	//
	if (g_canMsgABSDTC_EB00.ProceF)
	{
		if (GetMulDTC(&MulCanMsg_ABS, g_canMsgABSDTC_EB00.Data)) //����
			UpdateDtcTbl(&MulCanMsg_ABS, ABSDtcTbl, &bABSDtcCnt);
		g_canMsgABSDTC_EB00.ProceF = EMPOTY;
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : CheckEcmMulDTC
 * Description    :
 * Input          :
 * Output         : None
 * Return         : None
 * onther         :
 --------------------------------------------------------------------------*/
void CheckEcmMulDTC(void)
{
	AnalysisConnectInfo();
	AnalysisMulDTC();

	//������ģ��-���ϵ�(���)
	if ((((MulCanMsg_ECM.bBuf[0] & 0x03) == 1) || ((MulCanMsg_ECM.bBuf[0] & 0x0C) == 0X04)) && (g_canClock.signal.ExistECU60416 == 1)) //�㲥ID,���ܵ���
	{
		EPCLamp = 1;
	}
	else
	{
		EPCLamp = 0;
	}

	if (((MulCanMsg_ECM.bBuf[0] & 0xC0) == 0x40) && (g_canClock.signal.ExistECU60416 == 1)) //�㲥ID,���ܵ���
	{
		OBDLamp = 1;
	}
	else
	{
		OBDLamp = 0;
	}
}