#include "Individual_ECU_Comm.h"
#include "CAN_Communication_Matrix.h"
//---------------------------------------------------------
//仪表→“守护神”ECU的通信式样 wangboyu 2021年8月3日09:48:26
//---------------------------------------------------------
//344 - 7
//---------------------------------------------------------

static const DefaultCommCode[COMM_CODE_MAX_NUM] = {0x01,0x40,0x41,0x81,0x40,0xD1,0x7F};

//typedef struct 
//{
//	ID18FEAE17_TYPE Data_Type[ ID18FEAE17_TYPE_MAX ] ;
//	uint32_t Data[ ID18FEAE17_TYPE_MAX ] ;
//}ReqDataStruct;


static struct
{
	en_CommSta CacheReqCode ;
	en_CommSta ReqCode ;
	en_CommSta OldReqCode ;
	en_CommSta RespCode ;
	uint8_t ErrCount ;
	uint8_t ErrSta	 ;
	uint8_t RevEvent ;
	//------------------
	ID18FEAE17_TYPE Type ;
	uint32_t Data[ID18FEAE17_TYPE_MAX] ;
	uint32_t ReqData[ID18FEAE17_TYPE_MAX] ;
}CommVariable ;

static void Set_ECU_ResponseCode(en_CommSta Code);
static void Set_ECU_Data(ID18FEAE17_TYPE Type,uint32_t Data);
/*-------------------------------------------------------------------------
 * Function Name  : Individual_ECU_Comm_KL30_Init
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
void Individual_ECU_Comm_KL30_Init(void)
{
	Set_Meter_RequestCode(METER_CODE_DATA_T_REQ,ID_TripA_AvrFuelCost,0) ;
	CommVariable.ErrCount = 1 ;
	CommVariable.ErrSta = 0 ;
	CommVariable.RevEvent = 0 ;
}
void Individual_ECU_Comm_KL15_ON_Init(void)
{

}
void Individual_ECU_Comm_KL15_OFF_Init(void)
{

}
void Individual_ECU_Comm_Wakeup_Init(void)
{

}
void Individual_ECU_Comm_Sleep_Init(void)
{

}
/*-------------------------------------------------------------------------
 * Function Name  : Individual_ECU_Comm_Processing_Service
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
void Individual_ECU_Comm_Processing_Service(void)
{
	if(CAN_MSG_Status(ID_CanMsg18EF1718_Msg_Count) == CAN_SIG_LOST)
	{
		CommVariable.RevEvent = 0 ;
		CommVariable.ErrCount = 0 ; 
		CommVariable.ErrSta = 1 ;
	}
	else
	{
		if(CommVariable.RevEvent)
		{
			CommVariable.RevEvent = 0 ;
			if(CommVariable.OldReqCode != CommVariable.ReqCode)
			{
				CommVariable.OldReqCode = CommVariable.ReqCode ;
				CommVariable.ErrCount = 0 ; 
			}
			switch(CommVariable.ReqCode)
			{
				case METER_CODE_DATA_T_REQ :
						if(CommVariable.RespCode == ECU_CODE_DATA_T_Y_RESPONSE)
						{
							CommVariable.ErrCount = 0 ; 
							CommVariable.ErrSta = 0 ;					
						}
						else
						{
							if(CommVariable.ErrCount < 10)
							{
								CommVariable.ErrCount ++ ;
								CommVariable.ErrSta = 1 ;
							}
							else
							{
								CommVariable.ErrSta = 2 ;
							}
						}
				break ;
				case METER_CODE_DATA_CLR_REQ :
						if(CommVariable.RespCode == ECU_CODE_DATA_CLR_Y_RESPONSE)
						{
							CommVariable.ErrCount = 0 ; 
							CommVariable.ErrSta = 0 ;					
						}
						else
						{
							if(CommVariable.ErrCount < 10)
							{
								CommVariable.ErrCount ++ ;
								CommVariable.ErrSta = 1 ;
							}
							else
							{
								CommVariable.ErrSta = 2 ;
							}
						}
				break ;
				case METER_CODE_DATA_W_REQ :
						if(CommVariable.RespCode == ECU_CODE_DATA_W_Y_RESPONSE)
						{
							CommVariable.ErrCount = 0 ; 
							CommVariable.ErrSta = 0 ;					
						}
						else
						{
							if(CommVariable.ErrCount < 10)
							{								
								CommVariable.ErrCount ++ ;
								CommVariable.ErrSta = 1 ;
							}
							else
							{
								CommVariable.ErrSta = 2 ;
							}
						}
				break ;
				default :
				break ;
			}
		}
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : RevMsg_ID18EF1718_Cbk
 * Description    : 放在CAN接收中断中
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
void RevMsg_ID18EF1718_Cbk(void)
{
	uint8_t i = 0 ;
	uint32_t Data = 0 ;
	ID18FEAE17_TYPE Type = 0 ;
 	CommVariable.RevEvent = 1 ;
	
	if(Get_ID_18EF1718_Sig_Response_Code() == DefaultCommCode[ECU_CODE_DATA_T_Y_RESPONSE])
	{
		Set_ECU_ResponseCode(ECU_CODE_DATA_T_Y_RESPONSE) ;
	}
	else if(Get_ID_18EF1718_Sig_Response_Code() == DefaultCommCode[ECU_CODE_DATA_CLR_Y_RESPONSE])
	{
		Set_ECU_ResponseCode(ECU_CODE_DATA_CLR_Y_RESPONSE) ;
	}
	else if(Get_ID_18EF1718_Sig_Response_Code() == DefaultCommCode[ECU_CODE_DATA_W_Y_RESPONSE])
	{
		Set_ECU_ResponseCode(ECU_CODE_DATA_W_Y_RESPONSE) ;
	}
	else
	{
		Set_ECU_ResponseCode(ECU_CODE_DATA_N_RESPONSE) ;
	}

	Type = Get_ID_18EF1718_Sig_Data_Type();
	Data = Get_ID_18EF1718_Sig_Date();
	for(i = 0 ;i < ID18FEAE17_TYPE_MAX;i ++)
	{
		if(Type == IDAE17_TYTE_DATA[i])
		{
			break ;
		}
	}
	
	Set_ECU_Data(i,Data);
}
/*-------------------------------------------------------------------------
 * Function Name  : Set_Meter_RequestCode
 * Description    : 应用发起- 清零或复位等事件
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
void Set_Meter_RequestCode(en_CommSta Code,ID18FEAE17_TYPE Type,uint32_t Data)
{
	CommVariable.CacheReqCode = Code ;
	if(Code != METER_CODE_DATA_T_REQ)
	{
		CommVariable.Type = Type ;
		CommVariable.ReqData[ Type ] = Data ;
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : Meter_RequestCode_Update
 * Description    : 放在CAN发送中断的首行
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
void Meter_RequestCode_Update(void)
{
	if(CommVariable.CacheReqCode != CommVariable.ReqCode)
	{
		CommVariable.ReqCode = CommVariable.CacheReqCode ;
	}
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_Meter_RequestID
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
en_CommSta Get_Meter_RequestID(void)
{
	return CommVariable.ReqCode ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_Meter_RequestCode
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
uint8_t Get_Meter_RequestCode(void)
{
	return DefaultCommCode[ CommVariable.ReqCode ] ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_Meter_RequestType
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
ID18FEAE17_TYPE Get_Meter_RequestType(void)
{
	return CommVariable.Type ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_Meter_RequestData
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
uint32_t Get_Meter_RequestData(ID18FEAE17_TYPE Type)
{
	return CommVariable.ReqData[ Type ]  ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Set_ECU_ResponseCode
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
static void Set_ECU_ResponseCode(en_CommSta Code)
{
	CommVariable.RespCode = Code ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_ECU_ResponseCode
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
static uint8_t Get_ECU_ResponseCode(void)
{
	return DefaultCommCode[ CommVariable.RespCode ] ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Set_ECU_Data
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
static void Set_ECU_Data(ID18FEAE17_TYPE Type,uint32_t Data)
{
	if(Type < ID18FEAE17_TYPE_MAX)
	{
		CommVariable.Data[Type] = Data ;
	}
	
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_ECU_Data
 * Description    : 
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
uint32_t Get_ECU_Data(ID18FEAE17_TYPE Type)
{
	return CommVariable.Data[Type] ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_ECU_RespErr
 * Description    : 错误计数器状态
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
uint8_t Get_ECU_RespErr(void)
{
	return CommVariable.ErrSta ;
}
/*-------------------------------------------------------------------------
 * Function Name  : Get_ECU_RespSure
 * Description    : 得到肯定应答
 * Input          : None
 * Output         : None
 * Return         : None
 * onther         : None
 --------------------------------------------------------------------------*/
uint8_t Get_ECU_RespSure(void)
{
	uint8_t u8Result = 0 ;
	if(CommVariable.ErrSta == 0)
	{
		u8Result = 1 ;
	}
	
	return u8Result ;
}