#include "extern.h"
#include "hwCtrl.h"
#include "PINdef.h"

#pragma section const DID_TBL

__far const unsigned char HD_VERSION[]={
	'H' ,		//AC_HD_VERSION_00
	'W' ,		//AC_HD_VERSION_01
    '.' ,		//AC_HD_VERSION_06
	'0' ,		//AC_HD_VERSION_02
	'.' ,		//AC_HD_VERSION_03
	'0' ,		//AC_HD_VERSION_04
	'1' ,		//AC_HD_VERSION_05
	'.' ,		//AC_HD_VERSION_06
	'0' ,		//AC_HD_VERSION_07
	'1' ,		//AC_HD_VERSION_08
	' ' ,		//AC_HD_VERSION_09
	' ' ,		//AC_HD_VERSION_10
	' ' ,		//AC_HD_VERSION_11
	' ' ,		//AC_HD_VERSION_12
	' ' ,		//AC_HD_VERSION_13
	' ' ,		//AC_HD_VERSION_14
};

__far const unsigned char SW_VERSION[]={
    'S' ,		//AC_SW_VERSION_00
	'W' ,		//AC_SW_VERSION_01
	'.' ,		//AC_SW_VERSION_02
	'0' ,		//AC_SW_VERSION_03
	'.' ,		//AC_SW_VERSION_04
	'0' ,		//AC_SW_VERSION_05
	'1' ,		//AC_SW_VERSION_06
	'.' ,		//AC_SW_VERSION_07
	'0' ,		//AC_SW_VERSION_08
	'3' ,		//AC_SW_VERSION_09
	' ' ,		//AC_SW_VERSION_10
	' ' ,		//AC_SW_VERSION_11
	' ' ,		//AC_SW_VERSION_12
	' ' ,		//AC_SW_VERSION_13
	' ' ,		//AC_SW_VERSION_14
    ' ' ,		//AC_SW_VERSION_14
};

__far const unsigned char SUP_ECU_SW_VERSION[]={
	'B' ,		//
	'T' ,		//
	'.' ,		//
	'0' ,		//
	'.' ,		//
	'0' ,		//
	'0' ,		//
	'.' ,		//
	'0' ,		//
	'0' ,		//
	' ' ,		//
	' ' ,		//
	' ' ,		//
	' ' ,		//
	' ' ,		//
	' ' ,		//
};


#pragma section


IO_parameter_t io_parameter[8];

const unsigned char DID_0xF110_VehicleNetworkConfiguration[8]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
const unsigned char DID_0xF190_vehicleIdentificationNumber[17]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
const unsigned char DID_0xF197_SystemNameOrEngineType[8]={0x44,0x41,0x4D,0x49,0x4e,0x47,0x41,0x43};
const unsigned char DID_0xF198_RepairShopCodeOrTesterSerialNumber[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
const unsigned char DID_0xF199_ProgrammingOrConfigurationDate[4]={0x20,0x00,0x01,0x01};
const unsigned char DID_0xF19D_ECUInstallationDateDataIdentifier[4]={0x20,0x00,0x01,0x01};
const unsigned char DID_0xF112_VehicleName[8]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
 can_frame_t TxCanMessageT;
//const unsigned char DID_0xF15A[]={};
/****************************************************************************************/
/* 		输入参数 ch :  								*/
/*	     	0: 压缩机温度                  					    	*/
/*          	1: 室外温度                                   			    	*/
/*          	2: 室内温度                                   			    	*/
/* 	    	返回值：                                               			*/
/*          	对应的电压*10（即返回的电压值精度是0.1V的）        				*/
/*                                            						*/

unsigned char GetVoltage(unsigned char ch)
{

	/* 这里可以做数组的方式返回，但尽量不要在这里计算，例如下 return Voltage[ch]; */
//	switch(ch)
//	{
//		case EVA_SENSOR:
//		return uiDuctAdVal;
//		break;
//		case OUTSIDE_SENSOR:
//		return uiAmbAdVal;
//		break;
//		case INSIDE_SENSOR:
//		return uiIncarAdVal;
//		break;
//		default:
//			return 0;
//		break;
//	}
}

/************************************************************************************/
/* 输入参数 motor :  																*/
/*          1: 驾驶员侧温度调节电机                                         		*/
/*          2: 出风模式电机电机                                        		 		*/
/*          3: 循环风门调节电机                                             		*/
/*                                                                                  */
/* 返回值：                                                                         */
/*          0: 电机正常 1：电机堵转                             					*/
/*                                                                                  */
unsigned char GetMotorLockStatus(unsigned char motor)
{
//	switch(motor)
//	{
//		case 1:
//			return temprunErr;
//		break;
//		case 2:
//			return moderunErr;
//		break;
//		case 3:
//			return 0;
//		break;
//		default:
//			return 0;
//		break;
//	}
}

/************************************************************************************/
/* 输入参数 p :  																	*/
/* 				0: TEMP 	驾驶员侧温度风门位置 	     							*/
/* 				1: REC		内外循环模式		                            		*/
/* 				2: FAN		鼓风机档位		                            			*/
/* 				3: MODE		模式风门位置		            */
/* 				4: DEFROST	除霜开关	                            				*/
/* 				5: REARDEF	后除霜控制	                            				*/
/* 				6: AC 		A/C制冷按键按键	                            			*/
/* 				7: K30		ECU Supplier voltage  		                            */
/*                                                                                  */
/* 返回值：                                                                         */
/*          0: 对应的data,具体见22，2F服务                             				*/
/************************************************************************************/
unsigned char GetIoParameter(unsigned char p)
{
	switch(p)
	{
		case 0:

		break;
		case 1:

		break;
		case 2:

		break;
		case 3:

		break;
		case 4:

		break;
		case 5:

		break;
		case 6:

		break;
		case 7:

		break;
		default:
			return 0;
		break;
	}
	return (io_parameter[p].data);
}

/************************************************************************************/
/*                                   主函数查询                                  */
/*输入参数 p :  																	*/
/* 				0: TEMP 	驾驶员侧温度风门位置 	     							*/
/* 				1: REC		内外循环模式		                            		*/
/* 				2: FAN		鼓风机档位		                            			*/
/* 				3: MODE		模式风门位置		                            		*/
/* 				4: DEFROST	无效	                            					*/
/* 				5: REARDEF	后除霜控制	                            				*/
/* 				6: AC 		无效	                            					*/
/* 				7: K30		无效  		                            				*/
/* 返回值：                                                                         */
/*                                        											*/
/************************************************************************************/
void WriteIoParameter(unsigned char p,unsigned char data)
{
	io_parameter[p].write = 1;		//此值为1，代表着需要对对应用的参数写入data。APP完成写入操作后面把这个清零。
	io_parameter[p].data = data;
}

/************************************************************************************/
/* 输入参数 p :  																	*/
/*                                                   								*/
/*                                                                                  */
/* 返回值：                                                                         */
/*          0: IGN电源正常     1：IGN > 16V 或 IGN < 9V                         	*/
/*                                                                                  */
/************************************************************************************/
unsigned char GetIgnVoltStatus(void)
{
//	if(*Power_Protect.mark == 1)
//	{
//		return 0;
//	}
//	else
//	{
//		return 1;
//	}
	return 0;
}


unsigned char TransmitCAN_Message(unsigned int ID,unsigned char Dlc,unsigned char *Data)
{
	
	Can_RtnType re_flag;
	TxCanMessageT.IDL=ID;
	TxCanMessageT.DLC=Dlc;
	TxCanMessageT.IDE = 0;     	 /* IDE  0:Standard 1:Extend           */
	TxCanMessageT.RTR = 0;     	 /* RTR  0:Data 1:Remote               */
	TxCanMessageT.THDSE = 0;   	 /* Transmit History Data Store Enable */
	TxCanMessageT.IDH = 0;       /* ID Data (high)                     */
	TxCanMessageT.DLC = 8;     	 /* DLC Data                           */
	TxCanMessageT.LBL = 0;     	 /* Label Data                         */
	TxCanMessageT.TS = 0;      	 /* Timestamp Data                     */
	Copy_Array_to_Array(TxCanMessageT.DB,Data,Dlc);
	re_flag=R_CAN_TrmByTRFIFO0_CH0(&TxCanMessageT);
	if(re_flag == CAN_RTN_OK)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

unsigned char DF_Write(unsigned char* write_buf,unsigned char data_num,unsigned char len)
{
	unsigned char DID_Buf[0x50],i;
	i=0;
	switch(data_num)
	{
		case 1:
			ReadFlashData(DID_Buf,0x000F1000+0x400,0x50);
			for(i=0;i<len;i++)
			{
				DID_Buf[i+0]=*write_buf;
				write_buf++;
			}
			if(WriteDataflash(DID_Buf,0x000F1000+0x400,0x50) == 0x11)
			{
				return 0;
			}
		break;
		case 2:
			ReadFlashData(DID_Buf,0x000F1000+0x400,0x50);
			for(i=0;i<len;i++)
			{
				DID_Buf[i+0x40]=*write_buf;
				write_buf++;
			}
			if(WriteDataflash(DID_Buf,0x000F1000+0x400,0x50) == 0x11)
			{
				return 0;
			}
		break;
		case 3:
			ReadFlashData(DID_Buf,0x000F1000+0x400,0x50);
			for(i=0;i<len;i++)
			{
				DID_Buf[i+0x30]=*write_buf;
				write_buf++;
			}
			if(WriteDataflash(DID_Buf,0x000F1000+0x400,0x50) == 0x11)
			{
				return 0;
			}
		break;
		case 4:
			ReadFlashData(DID_Buf,0x000F1000+0x400,0x50);
			for(i=0;i<len;i++)
			{
				DID_Buf[i+0x38]=*write_buf;
				write_buf++;
			}
			if(WriteDataflash(DID_Buf,0x000F1000+0x400,0x50) == 0x11)
			{
				return 0;
			}
		break;
		
		default:
		break;

	}
	return 0;
}

unsigned char DF_Read(unsigned char* read_buf,unsigned char data_num,unsigned char len)
{
	switch(data_num)
	{
		case 1:
			ReadFlashData(read_buf,0x000F1000+0x400,len);
			return 0;
		break;
		case 2:
			ReadFlashData(read_buf,0x000F1000+0x420,len);
			return 0;
		break;
		case 3:
			ReadFlashData(read_buf,0x000F1000+0x430,len);
			return 0;
		break;
		case 4:
			ReadFlashData(read_buf,0x000F1000+0x438,len);
			return 0;
		break;
		
		default:
		break;
	}
	return 0;
}

uint32 GetTimerCnt(void)
{
	return Can_1ms_count_alive;
}
/************************************************************************************
// 获取data Flash数据存取索引号														//
// 输入参数 code :  																//
//			0 : 获取APP重编程请求标志索引号											//
//			1 : 获取2E服务0xF110的索引号                                            //
//			2 : 获取2E服务0xF190的索引号                                            //
//			3 : 获取2E服务0xF197的索引号                                            //
//			4 : 获取2E服务0xF198的索引号                                            //
//			5 : 获取2E服务0xF199的索引号                                            //
//			6 : 获取2E服务0xF19D的索引号                                    		//
//                      7 : 获取2E服务0xF112的索引号                                                            //
//                      8 : 获取19服务0xF00616的索引号
//                      9 : 获取19服务0xF00617的索引号
//                      10: 获取19服务0x918112的索引号
//                      11: 获取19服务0x918114的索引号
//                      12: 获取19服务0x918171的索引号
//                      13: 获取19服务0x918312的索引号
//                      14: 获取19服务0x918314的索引号
//                      15: 获取19服务0x918371的索引号
//                      16: 获取19服务0x918412的索引号
//                      17: 获取19服务0x918414的索引号
//                      18: 获取19服务0x918471的索引号
//                      19: 获取19服务0x918611的索引号
//                      20: 获取19服务0x918614的索引号
//                      21: 获取19服务0xC07300的索引号
// 返回值：                                                                         //
//          2E 服务数据索引号                         								//
//                                                                                  //
************************************************************************************/

const unsigned char DF_INDEX_TAB[]={
	0U , 		//APP REProgrammer Request
	1U , 		//BLOCK_0xF110,
	2U , 		//BLOCK_0xF190,
	3U , 		//BLOCK_0xF197,
	4U , 		//BLOCK_0xF198,
	5U , 		//BLOCK_0xF199,
	6U , 		//BLOCK_0xF19D,
	7U ,        //BLOCK_0xF112,
	8U ,            //19服务0xF00616
	9U ,            //19服务0xF00617
	10U ,           //19服务0x918112
	11U ,           //19服务0x918114
	12U ,           //19服务0x918171
	13U ,           //19服务0x918312
	14U ,           //19服务0x918314
	15U ,           //19服务0x918371
	16U ,           //19服务0x918412
	17U ,           //19服务0x918414
	18U ,           //19服务0x918471
	19U ,           //19服务0x918611
	20U ,           //19服务0x918614
	21U             //19服务0xC07300
};


unsigned char GetIndexNumber(unsigned char code)
{
	return(DF_INDEX_TAB[code]);
}

/************************************************************************************
// 获取AC硬件版本																	//
// 输入参数 hdv :  																	//
//			指向读取数据存入的缓冲区的地址											//
//                                                                                  //
// 返回值：                                                                         //
//                                                  								//
//                                                                                  //
************************************************************************************/



void GetHardwareVersion(unsigned char* hdv)
{
	unsigned char cnt;

	for(cnt=0;cnt<16;cnt++){
		hdv[cnt]  = HD_VERSION[cnt];
	}

}

/************************************************************************************
// 获取AC软件版本																	//
// 输入参数 swv :  																	//
//			指向读取数据存入的缓冲区的地址											//
//                                                                                  //
// 返回值：                                                                         //
//                                                  								//
//                                                                                  //
************************************************************************************/

void GetSoftwareVersion(unsigned char* swv)
{
	unsigned char cnt;

	for(cnt=0;cnt<10;cnt++){
		swv[cnt]  = SW_VERSION[cnt];
	}
}

/************************************************************************************
// 获取AC供应商软件版本																	//
// 输入参数 swv :  																	//
//			指向读取数据存入的缓冲区的地址											//
//                                                                                  //
// 返回值：                                                                         //
//                                                  								//
//                                                                                  //
************************************************************************************/

void GetSupplierSoftwareVersion(unsigned char* swv)
{
	unsigned char cnt;

	for(cnt=0;cnt<16;cnt++){
		swv[cnt]  = SUP_ECU_SW_VERSION[cnt];
	}

}



/************************************************************************************
// 获取AC生产日期																	//
// 输入参数 *date :  																//
//			data[0] = YEAR															//
//			data[1] = MONTH															//
//			data[0] = DAY															//
//                                                                                  //
// 返回值：                                                                         //
//                                                  								//
//                                                                                  //
************************************************************************************/

const unsigned char MANUFACTURING_DATE[]={
	0x23,		//Year
	0x07,		//Month
	0x10,		//Day
};

void GetManufacturingDate(unsigned char* date)
{
	date[0] = MANUFACTURING_DATE[0];
	date[1] = MANUFACTURING_DATE[1];
	date[2] = MANUFACTURING_DATE[2];
}

/******************************/
//获取can总线出错状态
//返回值
/******************************/
unsigned char GetCanBusOffErr(void)
{
//	if(BusOff_flag==0)
//		return 0;
//	else
//		return 1;
}
/******************************/
//获取BCM节点丢失状态
//返回值
/******************************/

unsigned char GetBcmCommFault(void)
{
//	if(uiBcmCommFaultCnt < 500)
//	{
//		return 0;
//	}
//	else
//	{
//		BCM_Recover=0;
//		BCM=0;
//		return 1;
//	}
}
/******************************/
//获取ACP节点丢失状态
//返回值
/******************************/
unsigned char GetAcpCommFault(void)
{
//	if(uiAcpCommFaultCnt < 500)
//	{
//		return 0;
//	}
//	else
//	{
//		ACP_Recover=0;
//		ACP=0;
//		return 1;
//	}
}

/******************************/
//获取历史成功编程次数
//输入参数
//
//返回值：历史成功编程次数
/******************************/
unsigned char GetProgrammingCounter(void)
{
	return 0;
}
/******************************/
//获取历史编程次数
//输入参数
//
//返回值：历史编程次数
/******************************/
unsigned char GetProgrammingAttempCounter(void)
{
	return 0;
}

/******************************/
//清除DTC
//目前仅BusOff
//
//返回值：0
/******************************/
unsigned char Clear_DTC_Data(void)
{
	//Clear_DTC_Data_Command=1;
	return 0;
}



//S51EV




void getInputState(unsigned char* data)
{
 

}

void getOutputState(unsigned char* data)
{

}
extern uint16_t SupplyVoltage;
void getSupplyVoltage(unsigned char* data)
{
    data[0] = SupplyVoltage;
}
