	
/******************************************************************************
|  File Name : Dcm_App.c
|  Description: 诊断服务具体处理
 *****************************************************************************/

/******************************************************************************
 * Description:     : Include File Section 									
******************************************************************************/
#include "r_cg_macrodriver.h"
#include "Dcm_App.h"
#include "Dcm_extern.h"
#include "r_cg_userdefine.h"
#include "pfdl.h"

/******************************************************************************
 * Description:     : Global Variable Definition Section 									
 ******************************************************************************/
 
TsDcm_h_RquestInfo VeDcm_h_RqustInfo;             /*提取请求信息的结构体*/
uint8 VaDcm_u_NegRspTxBuffer[3];                  /*负响应发送数据的缓存数组*/



uint8* VeDcm_P_DataAddress ;                      /*TP层数据地址*/

//uint32_t ReprogmaValid = 0xAA5555AA;


/******************************************************************************
 * Description:     : Static Variable Definition Section 									
 ******************************************************************************/


static uint16 SeDcm_u_DL;                                      /*TP层数据长度*/
static uint8 SeDcm_u_RequstSty;                                /*TP层数据请求方式*/


static uint16 SeDcm_w_S3ServerTime;                            /*S3ServerTime计数*/
static uint8 SeDcm_u_S3ServerTimeSts;                          /*S3计数状态  继续 或 停止*/
static uint8 SeDcm_u_DiagnosticSession ;                       /*诊断会话模式*/    
static uint8 SeDcm_u_SecurityAccessState;                      /*安全权限状态*/
static uint8 SeDcm_u_DtcSetSts;                                /*DTC设置状态*/
static uint8 SeDcm_u_NetworkMsgSts;                            /*网络管理报文收发权限状态*/
//static 
uint8 SeDcm_u_NormalMsgSts;                             /*应用报文收发权限状态*/

static uint16 SeDcm_u_KeyErrorCount;                                     /*27 服务密钥错误次数计数*/
static uint16 SeDcm_u_KeyErrorDelayCount;                                /*27 服务密钥错误延时计数*/
static uint8 SaDcm_u_RequestCounter;	                                /*27 服务种子请求计数 */
static uint16 SaDcm_u_RequestDelayCount;

static uint8 SeDcm_u_SecurityAccessServerSts;                            /*27 服务状态*/

static uint16 CeDcm_u_P2serverTime = 0x0032;                             /* P2server 时间 标定量*/
static uint16 CeDcm_u_P2ExtserverTime = 0x00C8;                          /* P2*server 时间 标定量*/

static uint32 SeDcm_w_SecurityAccessSeed = 0x12345678;                   /*27 服务 种子*/
static uint32 SeDcm_u_SecurityAccessKey;                                /*27 服务密钥*/
static uint32 CeDcm_w_SecurityAccessFBLMask = 0xAC856D89;                /*27 服务掩码*/

static TeDcm_e_DownLoadStsType SeDcm_u_DownLoadDataSts;                       /*34 36 37  数据下载相关服务处理状态*/
static uint32 SeDcm_w_DownLoadDataLength;                                     /*34 请求下载的数据长度*/
static uint32 SeDcm_w_TransmitDataCount;                                      /*36 已传输的数据量计数*/
static uint8  SeDcm_u_BlockSequenceCountSts;                                  /*36 传输块编号*/
static uint16 CaDcm_w_SingleAllowDateLength = 0x03E8;

static TeDcm_e_RidStsType SeDcm_u_RidFF02Sts;                                              /*例程 FF02 状态*/
static TeDcm_e_RidStsType SeDcm_u_RidFF00Sts;                                              /*例程 FF00 状态*/
static TeDcm_e_RidStsType SeDcm_u_RidFF01Sts;                                              /*例程 FF01 状态*/
static TeDcm_e_RidStsType SeDcm_u_RidF001Sts;                                              /*例程 F001 状态*/
static RidRunSts_T	RidFF02RunSts;														   /*  例程 FF02 执行情况  */

static DcmReset_T DcmResetReady;
/******************************************************************************
 * Description:     : Static Function Prototype Declaration									
 *****************************************************************************/

static void MngDcm_CleanRequstInfo(void);


unsigned char DF_Write(unsigned char* write_buf,unsigned char data_num,unsigned char len);
RidRunSts_T GetRidFF02RunSts(void);
void CleanIoDid(void);

/******************************************************************************
 * Description:     : Write User Function Code								
 *****************************************************************************/

/******************************************************************************
 *函数名称    : void MngDcm_CleanRequstInfo(void)

 *参数        : void

 *返回值      : void

 *描述        : 清除请求信息

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/
void MngDcm_CleanRequstInfo(void)
{
    uint8 i;
    VeDcm_h_RqustInfo.DL= 0x00;               /*有效字节长度*/
    VeDcm_h_RqustInfo.Sid = 0x00;              /*SID*/
    VeDcm_h_RqustInfo.RequstSty = 0x00;        /*请求方式*/
    VeDcm_h_RqustInfo.Sub = 0x00;               /*子服务*/
    
    for(i = 0;i < 3;i++)                        
    {
        VeDcm_h_RqustInfo.DtcGroup[i] = 0x00;     /*DTC组*/
    }
                    
    VeDcm_h_RqustInfo.StateMask = 0x00;                   /*请求的 状态掩码*/
    
    for(i = 0;i < 4;i++)                        
    {
        VeDcm_h_RqustInfo.Key[i] = 0x00;                 /*密钥信息*/
    }
                       
    VeDcm_h_RqustInfo.CommType = 0x00;                    /*通讯类型*/
    
    for(i = 0;i < DCM_READDID_MAXNUMBER*2 ;i++)                        
    {
        VeDcm_h_RqustInfo.Did[i] = 0x00;                  /*具体DID*/
    }
      
    VeDcm_h_RqustInfo.DidCount = DCM_NULL;                    /*DID个数*/
    VeDcm_h_RqustInfo.Rid = 0x00;                           /*写操作目标DID*/
     
    for(i = 0;i < DCM_WRITEDATA_MAXLENGTH;i++)                        
    {
        VeDcm_h_RqustInfo.WriteData[i] = 0x00;                   /*写入的数据*/
    }
    
} 


/******************************************************************************
 *函数名称    : uint8 MngDcm_CollectRequstInfo(void)

 *参数        : void

 *返回值      : LeDcm_TempResult  数据获取结果 获取成功或失败

 *描述        : 从TP层获取基本信息  请求方式、DL 、sid

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/
uint8 MngDcm_CollectRequstInfo(void)
{  
    uint8 LeDcm_TempResult = DCM_CHECK_NOK;
    MngDcm_CleanRequstInfo();           /* 清请求数据*/
    
    
    if(CeCanTp_e_Full == GetCanTp_e_RxBufferSts(&SeDcm_u_RequstSty,&SeDcm_u_DL,&VeDcm_P_DataAddress))
    {
        LeDcm_TempResult = DCM_CHECK_OK;											
        if(CeCanTp_e_Physical ==SeDcm_u_RequstSty)
        {
            VeDcm_h_RqustInfo.RequstSty = DCM_PHYSICAL_ADDRESS;    
        }
        else
        {
            VeDcm_h_RqustInfo.RequstSty = DCM_FUNCTIONAL_ADDRESS;
        }
            
        VeDcm_h_RqustInfo.DL = SeDcm_u_DL;                       
        VeDcm_h_RqustInfo.Sid = VeDcm_P_DataAddress[0];
    }
    else
    {}
    
    return LeDcm_TempResult; 
            
}
 


/******************************************************************************
 *函数名称    : uint8 MngDcm_DtcAvailableCheck(uint8* LeDcm_u_Dtc,const TsDcm_h_DtcGroupType LeDcm_u_DtcTable[])

 *参数        : LeDcm_u_Dtc            需要查找的DTC
                LeDcm_u_DtcTable[]     支持的DTC列表

 *返回值      : LeDcm_u_TempResult  数据获取结果 获取成功或失败

 *描述        : 检查DTC是否支持

 *编辑时间    : 2015-10-23

 *备注        : 
 *****************************************************************************/
uint8 MngDcm_DtcAvailableCheck(uint8* LeDcm_u_Dtc,const TsDcm_h_DtcGroupType LeDcm_u_DtcTable[])
{
    uint8 i;
    uint8 LeDcm_u_TempResult = DCM_NORESULT;
    for(i=0 ; i < DCM_SUPDTC_COUNT; i++)
    {
        if((LeDcm_u_Dtc[0] == LeDcm_u_DtcTable[i].DtcHigh)&&(LeDcm_u_Dtc[1] == LeDcm_u_DtcTable[i].DtcMiddle)&&(LeDcm_u_Dtc[2] == LeDcm_u_DtcTable[i].DtcLow))
        {
             LeDcm_u_TempResult = i;
             break;
        }
    }
    
    return LeDcm_u_TempResult;
}



/******************************************************************************
 *函数名称    : uint8 MngDcm_ExtDataRecordAvailableCheck(uint8 LeDcm_u_ExtDataRecord,const DTCExtDataRecordType LeDcm_u_ExtDataRecordTable[])

 *参数        : LeDcm_u_ExtDataRecord            请求的ExtDataRecord
                ExtDataRecordTable[]             支持的ExtDataRecord信息列表

 *返回值      : LeDcm_u_TempResult  数据获取结果 获取成功或失败

 *描述        : 检查参数 ExtDataRecord 是否支持

 *编辑时间    : 2015-10-23

 *备注        : 
 *****************************************************************************/
uint8 MngDcm_ExtDataRecordAvailableCheck(uint8 LeDcm_u_ExtDataRecord,const DTCExtDataRecordType LeDcm_u_ExtDataRecordTable[])
{
    uint8 i;
    uint8 LeDcm_u_TempResult = DCM_NORESULT;
    for(i=0 ; i < DCM_19SUPDTCEXTDATARECORD_COUNT; i++)
    {
        if(LeDcm_u_ExtDataRecord == LeDcm_u_ExtDataRecordTable[i].DTCExtDataRecordNumber)
        {
             LeDcm_u_TempResult = i;
             break;
        }
    }
    
    return LeDcm_u_TempResult;
}
 
 
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_DefaultSessionDeal(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 进入 默认会话模式 处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/
 TeDcm_h_ResultType MngDcm_DefaultSessionDeal(void)
 {
     uint8 LaDcm_u_TempBuffer[6];
     TeDcm_h_ResultType LeDcm_u_Result;
     uint32  DcmResetDelay;
      
     SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_STOP;         /*S3server 计时停止*/
	 if( DCM_PROGRAMME_SESSION == SeDcm_u_DiagnosticSession)
		 DcmResetReady = DCM_RESET_READY;
     SeDcm_u_DiagnosticSession = DCM_DEFAULT_SESSION;       /*会话模式 默认模式*/
     SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT;  /*安全模式锁定*/
     SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE;                   /*DTC设置使能*/
     SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;              /*网络管理报文收发使能*/
     SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);            /*应用报文收发使能*/    
	 //CleanIoDid();
     
     if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))          /*判断正响应抑制位*/  
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;    
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
         LaDcm_u_TempBuffer[2] = (uint8)(CeDcm_u_P2serverTime>>8);
         LaDcm_u_TempBuffer[3] = (uint8)(CeDcm_u_P2serverTime&0xFF);
         LaDcm_u_TempBuffer[4] = (uint8)(CeDcm_u_P2ExtserverTime>>8);
         LaDcm_u_TempBuffer[5] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF);
     
         SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {   
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;          /*设置为不响应*/
     }
	 
	 if( DCM_RESET_READY == DcmResetReady)
	 {
		while(++DcmResetDelay < 80000);
		SetMcu_SoftReset();
     }
       
     return LeDcm_u_Result;
 }
 
  
 /******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_ProgramSessionDeal(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 进入 编程会话模式 处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/
 TeDcm_h_ResultType MngDcm_ProgramSessionDeal(void)
 {     
	 uint8 LaDcm_u_TempBuffer[6];
	 uint32 ResetDelayCnt = 0;
     TeDcm_h_ResultType LeDcm_u_Result;
      
     SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_CONTINUE;      /*S3server 计时继续*/
     SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT;               /*S3server 计时计数值重新装载*/
	 if( DCM_DEFAULT_SESSION != SeDcm_u_DiagnosticSession )
	 {	
		// 78
		//MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]);  
		//SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); 
		
		SeDcm_u_DiagnosticSession = DCM_PROGRAMME_SESSION;           /*会话模式编程模式*/
		SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT;   /*安全模式 锁定*/
		SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE;                    /*DTC设置使能*/
		SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;               /*网络管理报文收发使能*/
		SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE;             /*应用报文收发使能*/
		//ReprogmaValid = 0xAA5555AA;
		//if( 0 == DF_Write((uint8*)(&ReprogmaValid),GetIndexNumber(INDEX_REPROGMA),sizeof(ReprogmaValid)))		//R_FDL_OK => 0
		if(1)
		{
			KamData.boot_enable = RPRGRM_REQ_VALID;
			if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))           /*判断正响应抑制位*/
			{
				KamData.AckReq = ACK_REQ;
				KamData.AckLenth = 7;		
				KamData.RspData[0] = 0x06;
				KamData.RspData[1] = VeDcm_h_RqustInfo.Sid + 0x40;
				KamData.RspData[2] = VeDcm_h_RqustInfo.Sub;
				KamData.RspData[3] = (uint8)(CeDcm_u_P2serverTime>>8);
				KamData.RspData[4] = (uint8)(CeDcm_u_P2serverTime&0xFF);
				KamData.RspData[5] = (uint8)(CeDcm_u_P2ExtserverTime>>8);
				KamData.RspData[6] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF);
				KamData.RspData[7] = 0x55;
#if 0
				LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
				LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
				LaDcm_u_TempBuffer[2] = (uint8)(CeDcm_u_P2serverTime>>8);
				LaDcm_u_TempBuffer[3] = (uint8)(CeDcm_u_P2serverTime&0xFF);
				LaDcm_u_TempBuffer[4] = (uint8)(CeDcm_u_P2ExtserverTime>>8);
				LaDcm_u_TempBuffer[5] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF);
				while(++ResetDelayCnt < 100000);
				SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
#endif
				LeDcm_u_Result = CeDcm_e_ResultPosRsp;
			}
			else
			{
				KamData.AckReq = 0;
				SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
				LeDcm_u_Result = CeDcm_e_ResultNoRsp;          /*设置为不响应*/
			}
			//ResetDelayCnt = 0;
			//while(++ResetDelayCnt < 10000);
			SetMcu_SoftReset();
		}
		else
		{
			/*设置NRC 22*/
			MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]);    /*整理负响应数据*/
			SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
			LeDcm_u_Result = CeDcm_e_ResultNegRsp;
		}
	}
	else
	{
		if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty)
         {
            SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
            LeDcm_u_Result = CeDcm_e_ResultNoRsp; 
         }
         else
         {
    		MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC7E]);    /*整理负响应数据*/
    		SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
    		LeDcm_u_Result = CeDcm_e_ResultNegRsp;
		}
	}
     return LeDcm_u_Result;
 }
 
 /******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_ExtendedSessionDeal(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 进入 扩展会话模式 处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/
 TeDcm_h_ResultType MngDcm_ExtendedSessionDeal(void)
 {
     uint8 LaDcm_u_TempBuffer[6];
     TeDcm_h_ResultType LeDcm_u_Result;
      
     SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_CONTINUE;         /*S3server 计时继续*/
     SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT;                  /*S3server 计时计数值重新装载*/
	 if(SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION)
	 {
		SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE;                       /*DTC设置使能*/
		SeDcm_u_DiagnosticSession = DCM_EXTEND_SESSION;              /*会话模式 扩展模式*/
		SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;                  /*网络管理报文收发使能*/
		SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);                /*应用报文收发使能*/
	 }
	 
	 SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT;      /*安全模式 锁定*/
     
     if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))              /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
         LaDcm_u_TempBuffer[2] = (uint8)(CeDcm_u_P2serverTime>>8);
         LaDcm_u_TempBuffer[3] = (uint8)(CeDcm_u_P2serverTime&0xFF);
         LaDcm_u_TempBuffer[4] = (uint8)(CeDcm_u_P2ExtserverTime>>8);
         LaDcm_u_TempBuffer[5] = (uint8)(CeDcm_u_P2ExtserverTime&0xFF);
         
         //SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L2_UNLOCK;    /*置安全权限为 解锁状态 */
     
         SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;          /*设置为不响应*/
     }
       
     return LeDcm_u_Result;
}
 
/******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_SoftResetDeal(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 11 03 请求软件复位 处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
TeDcm_h_ResultType MngDcm_SoftResetDeal(void)
{
    uint8 LaDcm_u_TempBuffer[2];
    TeDcm_h_ResultType LeDcm_u_Result;
	static uint32 ResetDelayCnt;
     
    //重启ECU接口
	if(SeDcm_u_DiagnosticSession != DCM_DEFAULT_SESSION)
	{
        if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))              /*判断正响应抑制位*/
        {  
    		KamData.AckReq = ACK_REQ;
    		KamData.AckLenth = 3;		
    		KamData.RspData[0] = 0x02;
    		KamData.RspData[1] = VeDcm_h_RqustInfo.Sid + 0x40;
    		KamData.RspData[2] = VeDcm_h_RqustInfo.Sub;
    		KamData.RspData[3] = 0x55;
    		KamData.RspData[4] = 0x55;
    		KamData.RspData[5] = 0x55;
    		KamData.RspData[6] = 0x55;
    		KamData.RspData[7] = 0x55;
#if 0
            LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
            LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;     
         
            SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
#endif
    		LeDcm_u_Result = CeDcm_e_ResultPosRsp;
        }
    	else
        {
    		KamData.AckReq = 0;
            SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
            LeDcm_u_Result = CeDcm_e_ResultNoRsp;          /*设置为不响应*/
        }
        if(LeDcm_u_Result == CeDcm_e_ResultPosRsp)
    	{
#if 0
    		while(ResetDelayCnt < 0x80000)
    		{	
    			ResetDelayCnt++;
    		}
#endif
    		SetMcu_SoftReset();
    	}
    	else
    		SetMcu_SoftReset();
	}
	else
	{
	    if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty)
         {
            SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
            LeDcm_u_Result = CeDcm_e_ResultNoRsp; 
         }
         else
         {
    		MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC7F]);    /*整理负响应数据*/
    		SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
    		LeDcm_u_Result = CeDcm_e_ResultNegRsp;
		}
	}
    return LeDcm_u_Result;
}
 
 
 

 
 
 
 
 
 
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_RequestSeekDeal( uint8 SecurityLevel)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 27  请求种子 处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RequestSeekDeal( uint8 SecurityLevel)
 {
     uint8 LaDcm_u_TempBuffer[6],savebuf[4];
     TeDcm_h_ResultType LeDcm_u_Result;
		 //SeDcm_u_KeyErrorDelayCount = 0;

	 if(SaDcm_u_RequestCounter < 5)
	 {
    	 SaDcm_u_RequestCounter++;
    	 KamData.SeedReqTimes = SaDcm_u_RequestCounter | 0x10;
    	 if(SaDcm_u_RequestCounter == 5)
    	 {
    	    SaDcm_u_RequestDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT;
    	    SeDcm_u_KeyErrorCount = 3;
    	    KamData.KeyErrTimes = SeDcm_u_KeyErrorCount | 0x10;
    	 }
    	 
    	 ReadFlashData(savebuf,0x000F1800,4);
    	 savebuf[0] = SaDcm_u_RequestCounter;
    	 savebuf[1] = SeDcm_u_KeyErrorCount;
    	 WriteDataflash(savebuf,0x000F1800,4);
    	 
	 }//fcb
	 
     if(0==SeDcm_u_KeyErrorDelayCount && 0==SaDcm_u_RequestDelayCount)
     {   
         if(SaDcm_u_RequestCounter == 5)
         {
            SaDcm_u_RequestCounter=0;
            KamData.SeedReqTimes = 0;
            
            ReadFlashData(savebuf,0x000F1800,4);
        	savebuf[0] = SaDcm_u_RequestCounter;
        	savebuf[1] = SeDcm_u_KeyErrorCount;
        	WriteDataflash(savebuf,0x000F1800,4);
        	
         }
         
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))                  /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
			 if(MngDcm_GetSecurityAccessSts() != DCM_SECURITYACCESS_DEFAULT)
			 {
				 LaDcm_u_TempBuffer[2] = 0;
				 LaDcm_u_TempBuffer[3] = 0;
				 LaDcm_u_TempBuffer[4] = 0;
				 LaDcm_u_TempBuffer[5] = 0;	 
			 }
			 else
			 {
				SeDcm_w_SecurityAccessSeed = GetSeed();
				LaDcm_u_TempBuffer[2] = (uint8)(SeDcm_w_SecurityAccessSeed>>24)&0xFF;
				LaDcm_u_TempBuffer[3] = (uint8)(SeDcm_w_SecurityAccessSeed>>16)&0xFF;
				LaDcm_u_TempBuffer[4] = (uint8)(SeDcm_w_SecurityAccessSeed>>8)&0xFF;
				LaDcm_u_TempBuffer[5] = (uint8)SeDcm_w_SecurityAccessSeed&0xFF;
			 }
             SeDcm_u_SecurityAccessServerSts |= DCM_SASERVERSTS_REQUESTKEY;  /*置27 服务为 已请求种子*/
             
             SeDcm_u_SecurityAccessKey = GENERIC_ALGORITHM(SeDcm_w_SecurityAccessSeed,SecurityLevel);
         
             SetCanTp_TxBuffer(6U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;          /*设置为不响应*/
         }
         
     }
     else
     {
         /*设置NRC 37*/
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC37]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
       
     return LeDcm_u_Result;
 }
 
 
  /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_KeyCkeckDeal(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 27  密钥校验 处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_KeyCkeckDeal(uint8 dummy)
 {
     uint8 i;
     uint8 LaDcm_u_TempBuffer[2],savebuf[4];
     TeDcm_h_ResultType LeDcm_u_Result;
     uint32 LeDcm_w_Key;
   
     
     if(DCM_SASERVERSTS_REQUESTKEY & SeDcm_u_SecurityAccessServerSts)
     {
         SaDcm_u_RequestCounter = 0;
         KamData.SeedReqTimes = SaDcm_u_RequestCounter;
         for(i = 0;i < DCM_SASERVER_KEYLENGTH;i++)                   /*获取客户端发送过来的密钥*/
         {
             VeDcm_h_RqustInfo.Key[i] = VeDcm_P_DataAddress[i+2];
         }
     
         LeDcm_w_Key = ((uint32)VeDcm_h_RqustInfo.Key[0]<<24) + ((uint32)VeDcm_h_RqustInfo.Key[1]<<16) + ((uint32)VeDcm_h_RqustInfo.Key[2]<<8) + VeDcm_h_RqustInfo.Key[3];
         
         if(LeDcm_w_Key != SeDcm_u_SecurityAccessKey)               /*密钥校验*/
		 //if(LeDcm_w_Key != SeDcm_w_SecurityAccessSeed)               /*密钥校验*/
         {
             SeDcm_u_KeyErrorCount++;                             /*密钥不符合 密钥错误数加1*/                             
             KamData.KeyErrTimes = SeDcm_u_KeyErrorCount | 0x10;
             
             ReadFlashData(savebuf,0x000F1800,4);
        	 savebuf[0] = SaDcm_u_RequestCounter;
        	 savebuf[1] = SeDcm_u_KeyErrorCount;
        	 WriteDataflash(savebuf,0x000F1800,4);
        	 
         }
         else                               /*密钥验证通过*/
         {
             SeDcm_u_KeyErrorCount = 0U;                                /*密钥错误次数清零*/
             KamData.KeyErrTimes = SeDcm_u_KeyErrorCount;
             
             ReadFlashData(savebuf,0x000F1800,4);
        	 savebuf[0] = SaDcm_u_RequestCounter;
        	 savebuf[1] = SeDcm_u_KeyErrorCount;
        	 WriteDataflash(savebuf,0x000F1800,4);
        	 
			 if(dummy == 0x02)
				 SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L1_UNLOCK;    /*置安全权限为 解锁状态 */
			 else if(dummy == 0x12)
				 SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_L2_UNLOCK;    /*置安全权限为 解锁状态 */
         }
     
         if(0 == SeDcm_u_KeyErrorCount)                                /*密钥没有错误*/
         {
             if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))
             {
                 LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
                 LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
             
                 SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT;  /*置27 服务为 默认状态 */
                 SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
                 LeDcm_u_Result = CeDcm_e_ResultPosRsp;
             }
             else
             {
                 SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
                 LeDcm_u_Result = CeDcm_e_ResultNoRsp;    
             }
             
     
         }
         else if(SeDcm_u_KeyErrorCount>0&&SeDcm_u_KeyErrorCount<DCM_SASERVER_KEYERRORCOUNT)    /*密钥错误次数在允许范围*/
         {
             /*设置NRC 35*/
             SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT;  /*置27 服务为 默认状态 */
             MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC35]);    /*整理负响应数据*/
             SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultNegRsp;
         
         }
         else                              
         {
             /*密钥错误次数超出允许范围*/ /*设置NRC 36*/
             SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT;       /*置27 服务为 默认状态 */
             SeDcm_u_KeyErrorDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT;    /*开启密钥错误次数超出后 27服务允许访问延时 */
             MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC36]);    /*整理负响应数据*/
             SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultNegRsp;
         }
                  
     }
     else
     {
         /*设置NRC 24*/
         SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT;                 /*置27 服务为 默认状态 */
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
      
     
     return LeDcm_u_Result;
 }
 
 
/******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_RoutineFF02Start(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF02 开始   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF02Start(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
    
     if(CeDcm_e_RidStop == SeDcm_u_RidFF02Sts)
     {
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))                /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
			 LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
             
             SeDcm_u_RidFF02Sts = CeDcm_e_RidStart;                 /*置例程当前状态*/
             
             //必要的化 插 78
             //处理函数
			 RidFF02RunSts = Rid_Finish;
              
             SeDcm_u_RidFF02Sts = CeDcm_e_RidStop;                 /*置例程当前状态*/
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
			 SeDcm_u_RidFF02Sts = CeDcm_e_RidStart;                 /*置例程当前状态*/
             
             //必要的化 插 78
             //处理函数
			 RidFF02RunSts = Rid_Finish;
			 
             SeDcm_u_RidFF02Sts = CeDcm_e_RidStop;                 /*置例程当前状态*/
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
RidRunSts_T GetRidFF02RunSts(void)
{
	return RidFF02RunSts;
}
 
  /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_RoutineFF00Start(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF00 开始   处理函数

 *编辑时间    : 2015-11-03

 *备注        : 
 *****************************************************************************/ 
TeDcm_h_ResultType MngDcm_RoutineFF00Start(void)
{
	TeDcm_h_ResultType LeDcm_u_Result;
#if 0
    uint8 LaDcm_u_TempBuffer[5];
    TeDcm_h_ResultType LeDcm_u_Result;
     
    if(CeDcm_e_RidStop == SeDcm_u_RidFF00Sts)
    {
		// 78
		MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]);  
		SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer); 
		
		if(CeFCC_Programing_e_Succeed == SetFCC_Programing_EraseFlash(FCC_PROGRAMING_APPCODE_SECTORONE))
		{
			SetWd_FeedWdg();
		    // 78
			MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]);  
			SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer);    
			//处理函数
			SetFCC_Programing_EraseFlash(FCC_PROGRAMING_APPCODE_SECTORTWO);
			SetWd_FeedWdg();
			// 78
			MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]);  
			SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer);    
			//处理函数
			SetFCC_Programing_EraseFlash(FCC_PROGRAMING_APPCODE_SECTORTHR);
			
			if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))                /*判断正响应抑制位*/
			{
				LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
				LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
		
				LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
				LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
				LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
				 
				SeDcm_u_RidFF00Sts = CeDcm_e_RidStart;                 /*置例程当前状态*/
				 
				
				SeDcm_u_RidFF00Sts = CeDcm_e_RidStop;                 /*置例程当前状态*/
		 
				SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
				LeDcm_u_Result = CeDcm_e_ResultPosRsp;
			}
			else
			{
				SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
				LeDcm_u_Result = CeDcm_e_ResultNoRsp;
			}
		}
		else
		{
			MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC72]);    /*整理负响应数据*/
			SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
			LeDcm_u_Result = CeDcm_e_ResultNegRsp;
		}
    }
    else
    {
        /*设置NRC 24*/
        MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
        SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
        LeDcm_u_Result = CeDcm_e_ResultNegRsp;
    }
#endif     
    return LeDcm_u_Result;
 }
 
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_RoutineFF01Start(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF01 开始   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
*****************************************************************************/ 
TeDcm_h_ResultType MngDcm_RoutineFF01Start(void)
{
    uint8 LaDcm_u_TempBuffer[5];
    TeDcm_h_ResultType LeDcm_u_Result;
#if 0    
    if(CeDcm_e_RidStop == SeDcm_u_RidFF01Sts)
    {
		//处理函数
		MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]);  
		SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer);
		LeDcm_u_Result = CeDcm_e_ResultNegRsp;
		
		if(CeFCC_Programing_e_Succeed == SetFCC_Programing_Check())
		{
			if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))                /*判断正响应抑制位*/
			{
				LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
				LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
		 
				LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
				LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
				LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
				 
				SeDcm_u_RidFF01Sts = CeDcm_e_RidStart;                 /*置例程当前状态*/
				  
				SeDcm_u_RidFF01Sts = CeDcm_e_RidStop;                 /*置例程当前状态*/
		 
				SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
				LeDcm_u_Result = CeDcm_e_ResultPosRsp;
			}
			else
			{
				SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
				LeDcm_u_Result = CeDcm_e_ResultNoRsp;
			}
		}
		else
		{
			MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC72]);    /*整理负响应数据*/
			SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
			LeDcm_u_Result = CeDcm_e_ResultNegRsp;
		}		
    }
    else
    {
        /*设置NRC 24*/
        MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
        SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
        LeDcm_u_Result = CeDcm_e_ResultNegRsp;
    }
#endif    
    return LeDcm_u_Result;
}
 
 
  /******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_RoutineFF02Stop(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF02 停止   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF02Stop(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
      
     if(CeDcm_e_RidStart == SeDcm_u_RidFF02Sts)
     { 
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))      /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
		     LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 
  /******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_RoutineFF02Stop(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF00 停止   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF00Stop(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(CeDcm_e_RidStart == SeDcm_u_RidFF00Sts)
     { 
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))      /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
		     LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 
/******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_RoutineFF02Result(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF01 停止   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF01Stop(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(CeDcm_e_RidStart == SeDcm_u_RidFF01Sts)
     { 
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))      /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
		     LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 
 
/******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_RoutineFF02Result(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF02 请求结果   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF02Result(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(CeDcm_e_RidStop == SeDcm_u_RidFF02Sts)
     {
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))     /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
			 LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 
 /******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_RoutineFF00Result(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF00 请求结果   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF00Result(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(CeDcm_e_RidStop == SeDcm_u_RidFF00Sts)
     {
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))     /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
			 LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 /******************************************************************************
 *函数名称    :  TeDcm_h_ResultType MngDcm_RoutineFF01Result(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 31 服务 FF01 请求结果   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_RoutineFF01Result(void)
 {
     uint8 LaDcm_u_TempBuffer[5];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(CeDcm_e_RidStop == SeDcm_u_RidFF01Sts)
     {
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))     /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
             LaDcm_u_TempBuffer[3] = VeDcm_h_RqustInfo.Rid&0xFF;
             LaDcm_u_TempBuffer[2] = VeDcm_h_RqustInfo.Rid>>8;
			 LaDcm_u_TempBuffer[4] = DCM_RIDRESULT_SUCCESS;
     
             SetCanTp_TxBuffer(5U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
     else
     {
         /*设置NRC 24*/
      
         MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
         SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultNegRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 
 
TeDcm_h_ResultType MngDcm_RoutineF001Start(void) 
{

}
TeDcm_h_ResultType MngDcm_RoutineF001Stop(void)   
{

}
TeDcm_h_ResultType MngDcm_RoutineF001Result(void) 
{

}

 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_EnableCommunication(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 28 允许通讯   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_CtrlCommunication(uint8  CommunicationType)
 {
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;

     
     if(SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION)
     {
         if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty)
         {
            SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
            return  CeDcm_e_ResultNoRsp; 
         }
         else
         {
            MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC7F]);    /*整理负响应数据*/
            SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
            return  CeDcm_e_ResultNoRsp; 
            
         }
     }
     
     if( (CommunicationType >= 1) && ( CommunicationType <= 3))
	 {
         if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))      /*判断正响应抑制位*/
         {
             LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
             LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
    		
    		if( CommunicationType == 3)
    		{
    			SeDcm_u_NetworkMsgSts = 3 - VeDcm_h_RqustInfo.Sub;      /*网络管理报文收发使能*/
    			SeDcm_u_NormalMsgSts = 3 - VeDcm_h_RqustInfo.Sub;      /*应用报文收发使能*/
    		}
    		else if(CommunicationType == 1)
    			SeDcm_u_NormalMsgSts = 3 - VeDcm_h_RqustInfo.Sub;      /*应用报文收发使能*/
    		else 
    			SeDcm_u_NetworkMsgSts = 3 - VeDcm_h_RqustInfo.Sub;      /*网络管理报文收发使能*/
         
             SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
             LeDcm_u_Result = CeDcm_e_ResultPosRsp;
         }
         else
         {
             SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
             LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         }
     }
	 else
	 {
		 /*设置NRC 31*/
		 
         if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty)
         {
            SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
            LeDcm_u_Result =   CeDcm_e_ResultNoRsp; 
         }
         else
         {
            MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]);    /*整理负响应数据*/
            SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);                              /*调用接口发送响应数据*/
            LeDcm_u_Result =   CeDcm_e_ResultNoRsp; 
            
         }
	 }
     
     return LeDcm_u_Result;
 }
 
 
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_DisenableCommunication(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 28 禁止通讯   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_DisenableCommunication(void)
 {
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))        /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
         SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_DISENABLE;      /*网络管理报文收发关闭*/
         SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE;       /*应用报文收发关闭*/
     
     
         SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_DISENABLE;      /*网络管理报文收发关闭*/
         SeDcm_u_NormalMsgSts = DCM_MSGTXRX_DISENABLE;       /*应用报文收发关闭*/
         
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;
     }
     
     return LeDcm_u_Result;
 }
 
 TeDcm_h_ResultType MngDcm_EnableCommunication(void)
 {
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(0x02 != VeDcm_h_RqustInfo.Sub)        /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
         SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;      /*网络管理报文收发关闭*/
         SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);       /*应用报文收发关闭*/
     
     
         SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;      /*网络管理报文收发关闭*/
         SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);      /*应用报文收发关闭*/
         
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         
     }
     
     return LeDcm_u_Result;
 }
 
 TeDcm_h_ResultType MngDcm_EnableCommunication_SID_0x29(void)
 {
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     if(0x02 != VeDcm_h_RqustInfo.Sub)        /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
         SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;      /*网络管理报文收发关闭*/
         SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);       /*应用报文收发关闭*/
     
     
         SetCanTp_TxBuffer(1U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;      /*网络管理报文收发关闭*/
         SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);      /*应用报文收发关闭*/
         
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;
         
     }
     
     return LeDcm_u_Result;
 }
 
 uint8 GetNormalMsgSts(void)
 {
	return (SeDcm_u_NormalMsgSts);

 }
 
 uint8 GetNetworkMsgSts(void)
 {
	return(SeDcm_u_NetworkMsgSts);
 }
 
  unsigned char SX11GetNormalMsgSts(void)
 {
	return (3 - SeDcm_u_NormalMsgSts);
 }
 
 unsigned char SX11GetNetworkMsgSts(void)
 {
	return(3 - SeDcm_u_NetworkMsgSts);
 }
 
 

 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_TesterPresentDeal(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 3E 诊断在线   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_TesterPresentDeal(void)
 {
     
     
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;
     
     SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT;     /*重置S3server计时*/
     
     if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))   /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
     
         SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;
     }
     
     return LeDcm_u_Result;
 }
 void resetS3Server(void)
 {
    SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT;     /*重置S3server计时*/
 }
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_DTCSettingEnable(void)

 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 85   DTC 设置使能   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_DTCSettingEnable(void)
 {
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;
	 uint8 temp;

     if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty && (SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION))
     {
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         return  CeDcm_e_ResultNoRsp; 
     }
     
     SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE;
	 DtcStutasInit();
     
     if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))     /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
         SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;
     }
    
     return LeDcm_u_Result;
 }
 
 
  /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_DTCSettingDisenable(void)
 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 85   DTC 设置禁止   处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 TeDcm_h_ResultType MngDcm_DTCSettingDisenable(void)
 {
     uint8 LaDcm_u_TempBuffer[2];
     TeDcm_h_ResultType LeDcm_u_Result;

     if(DCM_FUNCTIONAL_ADDRESS == VeDcm_h_RqustInfo.RequstSty && (SeDcm_u_DiagnosticSession != DCM_EXTEND_SESSION))
     {
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         return  CeDcm_e_ResultNoRsp; 
     }
     
     SeDcm_u_DtcSetSts = DCM_DTCSET_DISENABLE; 
     
     if(DCM_FALSE == (VeDcm_h_RqustInfo.Sub&0x80))     /*判断正响应抑制位*/
     {
         LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
         LaDcm_u_TempBuffer[1] = VeDcm_h_RqustInfo.Sub;
     
         SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据*/
         LeDcm_u_Result = CeDcm_e_ResultPosRsp;
     }
     else
     {
         SetCanTp_TxBuffer(0U,LaDcm_u_TempBuffer);      /*调用接口发送响应数据 0数据为不响应*/
         LeDcm_u_Result = CeDcm_e_ResultNoRsp;
     }
    
     return LeDcm_u_Result;
 }
 
 
 uint8 GetDtcEnable(void)
 {
	return SeDcm_u_DtcSetSts;
 }
 
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_DynamicaDefineNewDid(void)
 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 2C  创建新动态DID   处理函数

 *编辑时间    : 2016-12-25

 *备注        : 
 *****************************************************************************/  
 
 TeDcm_h_ResultType MngDcm_DynamicaDefineNewDid(void)
 {
	 TeDcm_h_ResultType LeDcm_u_Result;
	 /*设置NRC22*/
	 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]);    /*整理负响应数据*/
	 SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
	 LeDcm_u_Result = CeDcm_e_ResultNegRsp;      /*负响应*/
	return LeDcm_u_Result;
 }
 
 /******************************************************************************
 *函数名称    : TeDcm_h_ResultType MngDcm_ClearDynamicaDid(void)
 *参数        : void

 *返回值      : LeDcm_u_Result    处理结果

 *描述        : 2C  创建新动态DID   处理函数

 *编辑时间    : 2016-12-25

 *备注        : 
 *****************************************************************************/  
 
 TeDcm_h_ResultType MngDcm_ClearDynamicaDid(void)
 {
	 TeDcm_h_ResultType LeDcm_u_Result;
	 /*设置NRC22*/
	 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC22]);    /*整理负响应数据*/
	 SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
	 LeDcm_u_Result = CeDcm_e_ResultNegRsp;      /*负响应*/
	 return LeDcm_u_Result;
 }
 
 /******************************************************************************
 *函数名称    : void MngDcm_ChangeToDefaltSession(void)
 
 *参数        : void

 *返回值      : void   

 *描述        : 跳转到 默认会话模式    处理函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/  
void MngDcm_ChangeToDefaltSession(void)
{
    SeDcm_u_S3ServerTimeSts = DCM_S3SEVERTIMER_STOP;         /*S3server 计时停止*/
    SeDcm_u_DiagnosticSession = DCM_DEFAULT_SESSION;       /*会话模式 默认模式*/
    SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT;  /*安全模式锁定*/
    SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE;                   /*DTC设置使能*/
    SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;              /*网络管理报文收发使能*/
    SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE | (DCM_MSGTXRX_ENABLE<<1);              /*应用报文收发使能*/      
	//CleanIoDid();
}

 /******************************************************************************
 *函数名称    : void MngDcmS3ServerAndKeyErrorCountCutDown(void)
 
 *参数        : void

 *返回值      : void   

 *描述        : S3ServerTime 计数自减    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/  
void MngDcmS3ServerCountCutDown(void)
{
    if(SeDcm_w_S3ServerTime > 0)
    {
        SeDcm_w_S3ServerTime--;
    }   
    
} 


/******************************************************************************
 *函数名称    : void MngDcmKeyErrorDelayCountCutDown(void)
 
 *参数        : void

 *返回值      : void   

 *描述        : 密钥错误超出允许次数 延时 计数自减    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/  
void MngDcmKeyErrorDelayCountCutDown(void)
{
    unsigned char savebuf[4];
    if(SeDcm_u_KeyErrorDelayCount > 0)
    {
        SeDcm_u_KeyErrorDelayCount--; 
        if(SeDcm_u_KeyErrorDelayCount == 0)
        {
            SeDcm_u_KeyErrorCount = 0U;  
            KamData.KeyErrTimes = SeDcm_u_KeyErrorCount;
            ReadFlashData(savebuf,0x000F1800,4);
        	 savebuf[0] = SaDcm_u_RequestCounter;
        	 savebuf[1] = SeDcm_u_KeyErrorCount;
        	 WriteDataflash(savebuf,0x000F1800,4);
        }
    }
    if(SaDcm_u_RequestDelayCount > 0)
    {
        SaDcm_u_RequestDelayCount--;
        if(SaDcm_u_RequestDelayCount == 0)
        {
            SaDcm_u_RequestCounter = 0U;
            KamData.SeedReqTimes = SaDcm_u_RequestCounter;
            ReadFlashData(savebuf,0x000F1800,4);
        	 savebuf[0] = SaDcm_u_RequestCounter;
        	 savebuf[1] = SeDcm_u_KeyErrorCount;
        	 WriteDataflash(savebuf,0x000F1800,4);
        }
    }
} 





/******************************************************************************
 *函数名称    : void MngDcm_PrepareNegRsp(uint8 LeDcm_u_Sid,uint8 LeDcm_u_Nrc)
 
 *参数        : LeDcm_u_Sid 请求的sid  要回应的NRC的索引

 *返回值      : void   

 *描述        : 整理负响应数据 
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/  
void MngDcm_PrepareNegRsp(uint8 LeDcm_u_Sid,uint8 LeDcm_u_Nrc)
{
   VaDcm_u_NegRspTxBuffer[0] = 0x7F;                   /*负响应*/
   VaDcm_u_NegRspTxBuffer[1] = LeDcm_u_Sid;            /*sid*/
   VaDcm_u_NegRspTxBuffer[2] = LeDcm_u_Nrc;            /*NRC*/
}



/******************************************************************************
 *函数名称    : void MngDcm_PrepareNegRsp(uint8 LeDcm_u_Sid,uint8 LeDcm_u_Nrc)
 
 *参数        : TargetAddress  目标数组，TargetPost 目标数组的起始位置，SourceAddress 源数组，SourcePost 源数组位置，
                DataLength     需移动的数据长度

 *返回值      : void   

 *描述        : 移动数据  处理 
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/  
void MngDcm_DataMoveDeal(uint8* TargetAddress,uint8 TargetPost,uint8* SourceAddress,uint8 SourcePost,uint8 DataLength)
{
    
    uint8 i;
 
    for(i = 0;i < DataLength; i ++)
    {
        TargetAddress[TargetPost + i] = SourceAddress[SourcePost + i];
              
    }
   
}


 /******************************************************************************
 *函数名称    :TeDcm_h_ResultType MngDcm_RequestDownloadService(void)
 
 *参数        : void
               
 *返回值      : LeDcm_u_FinallyResult  处理结果

 *描述        : 34 服务函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
TeDcm_h_ResultType MngDcm_RequestDownloadService(void)
{
    uint8 LeDcm_u_dataFomatldentifier;                 /*数据格式*/  
    uint8 LeDcm_u_addressAndLengthFomatldentifier;     /*地址和数据长度格式*/ 
    uint32 LeDcm_w_Address;                            /*地址*/ 
    uint32 LeDcm_w_DataLength;                         /*数据长度*/    
    uint8 LeDcm_u_SidIndex;
    uint8 LeDcm_u_SecurityAccessCheckResult;
    uint8 LaDcm_u_TempBuffer[6];
    TeDcm_h_ResultType LeDcm_u_FinallyResult; 
#if 0   
    
    LeDcm_u_dataFomatldentifier = VeDcm_P_DataAddress[1];  
    LeDcm_u_addressAndLengthFomatldentifier = VeDcm_P_DataAddress[2];
    
    /*提取地址参数*/ 
    LeDcm_w_Address = (((uint32)VeDcm_P_DataAddress[3])<<24U) + (((uint32)VeDcm_P_DataAddress[4])<<16U) + (((uint32)VeDcm_P_DataAddress[5])<<8U) + VeDcm_P_DataAddress[6];
    /*提取数据长度数*/ 
    LeDcm_w_DataLength = (((uint32)VeDcm_P_DataAddress[7])<<24U) + (((uint32)VeDcm_P_DataAddress[8])<<16U) + (((uint32)VeDcm_P_DataAddress[9])<<8U) + VeDcm_P_DataAddress[10];
    
    if((DCM_DATAFOMATLDENTIFER == LeDcm_u_dataFomatldentifier)&&(LeDcm_u_addressAndLengthFomatldentifier == DCM_ADDRESSANDLENGTHFOMATLDENTIFER))
    {
        if(VeDcm_h_RqustInfo.DL == 11U)
        {
            if(CeFCC_Programing_e_Succeed == SetFCC_Programing_AddrSize(LeDcm_w_Address,LeDcm_w_DataLength))
            {
                LeDcm_u_SidIndex = MngDcm_SIDCheckAvailable(VeDcm_h_RqustInfo.Sid);
                LeDcm_u_SecurityAccessCheckResult = MngDcm_SIDCheckSecurityAccess(LeDcm_u_SidIndex);
                if(DCM_CHECK_OK == LeDcm_u_SecurityAccessCheckResult)
                {
                    LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
                    LaDcm_u_TempBuffer[1] = DCM_LENGTHFOMATLDENTIFER; 
                    LaDcm_u_TempBuffer[3] = CaDcm_w_SingleAllowDateLength&0xFF;      /*单次允许的最大数据 低字节*/
                    LaDcm_u_TempBuffer[2] = CaDcm_w_SingleAllowDateLength>>8;         /*单次允许的最大数据 高字节*/
                    SetCanTp_TxBuffer(4U,LaDcm_u_TempBuffer);                         /*调用接口发送响应数据*/
                    SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadRequested;              /*置数据下载状态为  已请求下载*/
                    SeDcm_w_DownLoadDataLength = LeDcm_w_DataLength;                  /*记录 34 请求下载的数据长度*/
                    SeDcm_w_TransmitDataCount = 0U;
                    LeDcm_u_FinallyResult = CeDcm_e_ResultPosRsp;
                } 
                else
                {
                     MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC33]);    /*整理负响应数据*/
                     SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
                     LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
                }
             }
             else
             {
                 MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]);    /*整理负响应数据*/
                 SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
                 LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
             }
        }
        else
        {
            MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC13]);    /*整理负响应数据*/
            SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
            LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
        }
    }
    else
    {
        MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]);    /*整理负响应数据*/
        SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
        LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
    }
#endif    
    return  LeDcm_u_FinallyResult;
}


 /******************************************************************************
 *函数名称    :
 
 *参数        : void
               
 *返回值      : LeDcm_u_FinallyResult  处理结果

 *描述        : 36 服务函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 

TeDcm_h_ResultType MngDcm_TransmitDataService(void)
{
    uint16 LeDcm_w_SingleTransmitDataCount;
    uint8  LeDcm_u_BlockSequenceCount;
	uint8  LeDcm_u_BlockExpect;
    uint8  LaDcm_u_TempBuffer[6];                                 /*响应数据缓存数组*/
    TeDcm_h_ResultType LeDcm_u_FinallyResult;
#if 0
	TeFCC_Programing_e_Result LeDcm_FCC_Ret;
    
    if(CeDcm_e_DownLoadRequested==SeDcm_u_DownLoadDataSts||CeDcm_e_DownLoadDuringTransmit == SeDcm_u_DownLoadDataSts)
    {
        LeDcm_w_SingleTransmitDataCount = VeDcm_h_RqustInfo.DL - 2U;               /*提取传输的数据量  剔除服务参数字节*/
        SeDcm_w_TransmitDataCount = SeDcm_w_TransmitDataCount + LeDcm_w_SingleTransmitDataCount;     /*记录传输数据量*/
        /*判断传输数据累计是否超过 请求下载的数据量   单次传输长度是否超出 34服务回应的允许的数据量*/
        if(SeDcm_w_TransmitDataCount <= SeDcm_w_DownLoadDataLength)
        {
            LeDcm_u_BlockSequenceCount = VeDcm_P_DataAddress[1];                  /*提取 36 请求参数 BlockSequenceCount*/
			LeDcm_u_BlockExpect = (uint8)(((uint16)SeDcm_u_BlockSequenceCountSts + 1)&0x00ff);
			
            if(((0x01 == LeDcm_u_BlockSequenceCount)&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadRequested))
            || ((LeDcm_u_BlockSequenceCount== LeDcm_u_BlockExpect)&&(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadDuringTransmit)))
            {
				if(VeDcm_h_RqustInfo.DL <= CaDcm_w_SingleAllowDateLength)/*MaxNumberofBlockLength*/
				{
					SeDcm_u_BlockSequenceCountSts = LeDcm_u_BlockSequenceCount;
					SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadDuringTransmit;     /*置数据下载状态为  正在传输*/
					
					 if(SeDcm_w_TransmitDataCount == SeDcm_w_DownLoadDataLength)  
					{
						SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadTransmited;     /*置数据下载状态为  传输完毕*/
						SeDcm_w_TransmitDataCount = 0U;  
					}
					
					//78响应
					MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC78]);    /*整理负响应数据*/
					SetCanTp_Tx_78Neg(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
					LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
					
					//调用接口 编程
					LeDcm_FCC_Ret = SetFCC_Programing_Code(VeDcm_h_RqustInfo.DL-2,&VeDcm_P_DataAddress[2]);
					
					if(LeDcm_FCC_Ret == CeFCC_Programing_e_Succeed)
					{
						LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
						LaDcm_u_TempBuffer[1] = LeDcm_u_BlockSequenceCount;
						SetCanTp_TxBuffer(2U,LaDcm_u_TempBuffer);                         /*调用接口发送响应数据*/
						LeDcm_u_FinallyResult = CeDcm_e_ResultPosRsp;
					}
					else
					{
						MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]);    /*整理负响应数据*/
						SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
						LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
					}		
				}
				else
				{
					MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC31]);    /*整理负响应数据*/
					SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
					LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
				}
            }
            else
            {
                MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC73]);    /*整理负响应数据*/
                SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
                LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
                
            }
        
        }
        else
        {
            MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC71]);    /*整理负响应数据*/
            SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
            LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
        }
    }
    else
    {
        MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
        SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
        LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
    }
#endif    
    return  LeDcm_u_FinallyResult;
}

 /******************************************************************************
 *函数名称    :
 
 *参数        : void
               
 *返回值      : LeDcm_u_FinallyResult  处理结果

 *描述        : 37 服务函数

 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/ 
 
TeDcm_h_ResultType MngDcm_TransmitExitService(void)
{
    uint8 LaDcm_u_TempBuffer[2];
    TeDcm_h_ResultType LeDcm_u_FinallyResult;
    if(SeDcm_u_DownLoadDataSts == CeDcm_e_DownLoadTransmited)
    {
        if(VeDcm_h_RqustInfo.DL == 1U)
        {   
            LaDcm_u_TempBuffer[0] = LaDcm_u_TempBuffer[0] = VeDcm_h_RqustInfo.Sid + 0x40;
            SetCanTp_TxBuffer(1U,LaDcm_u_TempBuffer);                         /*调用接口发送响应数据*/
            SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadRelax;                  /*置数据下载状态为  退出传输 空闲状态*/
#if 0			
			SetFCC_Programing_Finish();
#endif
        }
        else
        {
            MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC13]);    /*整理负响应数据*/
            SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
            LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
        }
        
    }
    else
    {
        MngDcm_PrepareNegRsp(VeDcm_h_RqustInfo.Sid,CaDcm_u_NRCData[DCM_NRC24]);    /*整理负响应数据*/
        SetCanTp_TxBuffer(3U,VaDcm_u_NegRspTxBuffer);      /*调用接口发送响应数据*/
        LeDcm_u_FinallyResult = CeDcm_e_ResultNegRsp;      /*负响应*/
    }
    
    return  LeDcm_u_FinallyResult;
}


/******************************************************************************
 *函数名称    : void InitDcm_Parameter (void)
 
 *参数        : void 
 
 *返回值      : void   

 *描述        : DCM 初始化函数
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/  
 void InitDcm_Parameter (void)
 {
    unsigned char readbuf[33];
    SeDcm_u_DiagnosticSession = DCM_DIAGNOSTIC_SESSION_DEFAULT;     /*会话模式  默认会话*/
    SeDcm_u_SecurityAccessState = DCM_SECURITYACCESS_DEFAULT;     /*安全模式  锁定状态*/
    SeDcm_u_DtcSetSts = DCM_DTCSET_ENABLE;                        /*DTC设置使能*/
    SeDcm_u_NetworkMsgSts = DCM_MSGTXRX_ENABLE;                   /*网络管理报文收发使能*/
    SeDcm_u_NormalMsgSts = DCM_MSGTXRX_ENABLE |(DCM_MSGTXRX_ENABLE<<1);                  /*应用报文收发使能*/   
    SeDcm_u_KeyErrorDelayCount = 0;//DCM_SASERVERSTS_ERRORDELAY_COUNT_DEFAULT;  /*默认27服务上电延时*/  
    SeDcm_u_SecurityAccessServerSts = DCM_SECURITYACCESS_DEFAULT;  /*置27 服务为 默认状态 */
    SeDcm_u_KeyErrorCount = 0U;                                 /*置27 密钥错误次数初始为0 */

    //SaDcm_u_RequestCounter = KamData.SeedReqTimes;
    //SeDcm_u_KeyErrorCount = KamData.KeyErrTimes;            /*读取储存的次数*/
    ReadFlashData(readbuf,0x000F1800,4);

    SaDcm_u_RequestCounter = readbuf[0];
    SeDcm_u_KeyErrorCount = readbuf[1];            /*读取储存的次数*/
    
    if(SaDcm_u_RequestCounter > 6)SaDcm_u_RequestCounter=0;
    if(SeDcm_u_KeyErrorCount > 4)SeDcm_u_KeyErrorCount=0;
    /*
    if((SaDcm_u_RequestCounter>>4)==0x01)SaDcm_u_RequestCounter &= 0x0F; 
    else SaDcm_u_RequestCounter = 0;

    if((SeDcm_u_KeyErrorCount>>4)==0x01)SeDcm_u_KeyErrorCount &= 0x0F; 
    else SeDcm_u_KeyErrorCount = 0;
    */
    if(SeDcm_u_KeyErrorCount >= 3  )
    {
        SeDcm_u_KeyErrorDelayCount = DCM_SASERVERSTS_ERRORDELAY_COUNT;
	//SaDcm_u_RequestCounter=5;
    }
    
    SeDcm_u_DownLoadDataSts = CeDcm_e_DownLoadRelax;             /*置下载处理状态为 空闲*/
    
    SeDcm_u_RidFF02Sts = CeDcm_e_RidStop;                       /*置例程初始状态*/
    SeDcm_u_RidFF00Sts = CeDcm_e_RidStop;
    SeDcm_u_RidFF01Sts = CeDcm_e_RidStop;
	
	RidFF02RunSts = Rid_Idle;
	//DtcInit();
 }

/******************************************************************************
 *函数名称    : uint16 MngDcm_GetS3serverTime()
 
 *参数        : void 
 
 *返回值      : SeDcm_w_S3ServerTime     S3ServerTime当前计数值 

 *描述        : 获取S3ServerTime当前计数值
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/   
uint16 MngDcm_GetS3serverTime(void)
{
    return SeDcm_w_S3ServerTime;
} 

void MngDcm_ResetS3serverTime(void)
{
	SeDcm_w_S3ServerTime = DCM_S3SEVERTIMEOUT;
}
/******************************************************************************
 *函数名称    : uint8 MngDcm_GetS3serverTimeSts(void)
 
 *参数        : void 
 
 *返回值      : SeDcm_u_S3ServerTimeSts     S3ServerTime当前计数  计数状态 

 *描述        : 获取S3ServerTime当前计数  计数状态
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/   
uint8 MngDcm_GetS3serverTimeSts(void)
{
    return SeDcm_u_S3ServerTimeSts;
} 


/******************************************************************************
 *函数名称    :uint8 MngDcm_GetDiagnosticSession(void)
 
 *参数        : void 
 
 *返回值      : SeDcm_u_DiagnosticSession     当前会话模式

 *描述        : 获取当前会话模式
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/   
uint8 MngDcm_GetDiagnosticSession(void)
{
    return SeDcm_u_DiagnosticSession;
}

/******************************************************************************
 *函数名称    :uint8 MngDcm_GetSecurityAccessSts(void)
 
 *参数        : void 
 
 *返回值      : SeDcm_u_SecurityAccessState     当前安全权限

 *描述        : 获取当前安全权限
    
 *编辑时间    : 2015-10-10

 *备注        : 
 *****************************************************************************/   
uint8 MngDcm_GetSecurityAccessSts(void)
{
    return SeDcm_u_SecurityAccessState;
}
 
