/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：RFID_IC.c
 * 描  述  ：RFID_IC卡驱动程序    
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/03/06 
*********************************************************************************/
#include "RFID_IC.h"
#include "rfid_decode_yn.h"
#include "rfid_decode_yhk.h"
#include "rfid_decode_zl.h"
#include "delay.h"
#include "usart1.h"
#include "stdio.h"
#include "string.h" 
#include "stdlib.h" 
#include "my_math.h"

#define RFID_PW_CTRL_PORT_PeriphClock			RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO
#define RFID_PW_CTRL_PORT									GPIOA
#define RFID_PW_CTRL_PIN									GPIO_Pin_15


uint8_t RFID_ID[16] = {0};							//存放RFID卡号，刚从IC卡块区读出来的数据（十六进制保存）
uint8_t cardNumberBit[32] = {0};				//解析分离出来的卡号（十进制表示）
uint8_t cardNumberStr[33] = {0};				//解析分离出来的卡号（字符串表示）
uint8_t createCardNum[16] = {0};				//生成的IC卡号保存内容
uint8_t cardNumberLen = 0;							//IC卡号内容长度
uint8_t RFID_state = 0;									//RFID_IC刷卡状态（有无刷卡1：有刷卡，0：无刷卡，2：收运卡）

uint8_t cardSetWorkMode = 0;						//IC卡模块工作模式
uint8_t cardSetReadBlock = 0;						//IC卡模块读取的块号
uint8_t cardSetUploadMode = 0;					//IC卡数据上传模式

uint8_t cardSetKeyA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};				//IC卡读写KeyA
uint8_t cardSetKeyCtrlBit[4] = {0xFF, 0x07, 0x80, 0x69};							//IC卡读写控制位
uint8_t cardSetKeyB[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};				//IC卡读写KeyB

uint8_t originalPassword[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};		//IC卡原始密码

uint32_t cardNumberAreaCode = 0;				//IC卡号区号（前6位）
uint32_t cardNumberSerialNum = 0;				//IC卡号流水号（第7-14位）

//IC卡模块操作相关
uint8_t Cmd_WorkMode[8] = {0x03, 0x08, 0xC1, 0x20, 0x00, 0x00, 0x00, 0x00};
uint8_t Cmd_SECRET_KEY[21] = {0x03, 0x15, 0xC3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 	//设置IC卡读卡模块密钥
															0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 
															0xFF, 0xFF, 0xFF, 0xFF, 0x1B};
															
uint8_t Cmd_Write_Block[23] = {0x01,0x17,0xA4,0x20,0x00,0x01,0x00,0x00,
															0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
															0x00,0x00,0x00,0x00,0x00,0x00,0x00};							//写块数据
															
uint8_t Cmd_SectorEncryption[8] = {0x01, 0x08, 0xA5, 0x20, 0x00, 0x01, 0x00, 0x00};		//扇区加密

//粤能IC卡模块配参数（默认参数）
uint8_t YN_IC_MODE[8] = {0x03, 0x08, 0xC1, 0x20, 0x03, 0x09, 0x00, 0x1F};				//设置IC卡读卡模块工作模式
uint8_t YN_SECRET_KEY[21] = {0x03, 0x15, 0xC3, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 		//设置IC卡读卡模块密钥
															0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x6F, 0xFF, 
															0xFF, 0xFF, 0xFF, 0xFF, 0x0B};

//粤能IC卡模块配参数（默认参数）													
uint8_t SET_IC_MODE[8] = {0x03, 0x08, 0xC1, 0x20, 0x03, 0x09, 0x00, 0x1F};				//设置IC卡读卡模块工作模式
uint8_t SET_SECRET_KEY[21] = {0x03, 0x15, 0xC3, 0x20, 0x7F, 0xFF, 0xFF, 0xFF, 		//设置IC卡读卡模块密钥
															0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0x6F, 0xFF, 
															0xFF, 0xFF, 0xFF, 0xFF, 0x0B};

//中联IC卡模块参数
// uint8_t SET_IC_MODE[8] = {0x03, 0x08, 0xC1, 0x20, 0x03, 0x02, 0x00, 0x14};			//设置IC卡读卡模块工作模式
// uint8_t SET_SECRET_KEY[21] = {0x03, 0x15, 0xC3, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 	//设置IC卡读卡模块密钥
// 															0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x69, 0xFF, 0xFF, 
// 															0xFF, 0xFF, 0xFF, 0xFF, 0x1B};

// //成都										
// uint8_t SET_IC_MODE[8] = {0x03, 0x08, 0xC1, 0x20, 0x03, 0x16, 0x00, 0x00};			//设置IC卡读卡模块工作模式
// uint8_t SET_SECRET_KEY[21] = {0x03, 0x15, 0xC3, 0x20, 0x8F, 0x7F, 0x6F, 0x5F, 	//设置IC卡读卡模块密钥
// 															0x4F, 0x3F, 0xFF, 0x07, 0x80, 0x69, 0x1F, 0x2F, 
// 															0x3F, 0x4F, 0x5F, 0x6F, 0xDB};

void showCardHex(uint8_t *buf, uint8_t len)
{
	uint8_t i;
	
	printf("\r\n");
	for(i=0; i<len; i++)
	{
		printf("%02X ",buf[i]);
	}
	printf("\r\n");
}

/*
***********************************************************************
*	函 数 名: RFID_Init
*	功能说明: RFID设备初始化
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void RFID_Init(void)
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RFID_PW_CTRL_PORT_PeriphClock, ENABLE);

	GPIO_InitStructure.GPIO_Pin = RFID_PW_CTRL_PIN;				 				
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(RFID_PW_CTRL_PORT, &GPIO_InitStructure);
	
	GPIO_SetBits(RFID_PW_CTRL_PORT, RFID_PW_CTRL_PIN);
}

/*
***********************************************************************
*	函 数 名: RFID_PowerON
*	功能说明: 打开RFID设备电源
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void RFID_PowerON(void)
{
	GPIO_SetBits(RFID_PW_CTRL_PORT, RFID_PW_CTRL_PIN);
}

/*
***********************************************************************
*	函 数 名: RFID_PowerOFF
*	功能说明: 关闭RFID设备电源
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void RFID_PowerOFF(void)
{
	GPIO_ResetBits(RFID_PW_CTRL_PORT, RFID_PW_CTRL_PIN);
}

/*
***********************************************************************
*	函 数 名: IC_CardDecode
*	功能说明: IC卡解码
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void IC_CardDecode(void)
{
	if(IC_CardDecode_YN())
	{
		printf("\r\n粤能IC卡！\r\n");
	}else if(IC_CardDecode_YHK()){
		printf("\r\n银行卡！\r\n");
	}else if(IC_CardDecode_ZL()){
		printf("\r\n中联IC卡！\r\n");
	}else{
		printf("\r\n无效卡！\r\n");
	}
}


//-------------------------------------------------------------------------------------
//IC卡模块相关操作

void TxCheckSum(uint8_t *ptr, uint8_t len)
{
	uint8_t i = 0;
	uint8_t checksum = 0;

	checksum = 0;
	for(i=0; i<(len-1); i++)
	{
		checksum ^= ptr[i];
	}
	checksum = ~checksum;
	ptr[len-1] = checksum;
}

/*
***********************************************************************
*	函 数 名: IC_CardReset
*	功能说明: IC模块参数恢复出厂默认值
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void IC_CarderReset(void)
{
	delay_ms(300);
	USART1_SendFrameData(YN_IC_MODE, 8);
	delay_ms(300);
	USART1_SendFrameData(YN_SECRET_KEY, 21);
	delay_ms(300);
}

/*
***********************************************************************
*	函 数 名: IC_CardWorkModeSet
*	功能说明: IC模块工作模式设置
*	形    参：mode -> 工作模式
*						block -> 读取的块号
*						outputMode -> 输出模式
*	返 回 值: 无
***********************************************************************
*/
void IC_CarderWorkModeSet(uint8_t mode, uint8_t block, uint8_t outputMode)
{	
	Cmd_WorkMode[4] = mode;
	Cmd_WorkMode[5] = block;
	Cmd_WorkMode[6] = outputMode;
	TxCheckSum(Cmd_WorkMode, 8);
	
	delay_ms(300);
	USART1_SendFrameData(Cmd_WorkMode, 8);
	delay_ms(300);
}

/*
***********************************************************************
*	函 数 名: IC_CarderWorkModeSet
*	功能说明: IC模块读写密码设置
*	形    参：keyA -> keyA密码
*						keyCtrlBit -> 密码控制位
*						keyB -> keyB密码
*	返 回 值: 无
***********************************************************************
*/
void IC_CarderKeySet(uint8_t *keyA, uint8_t *keyCtrlBit, uint8_t *keyB)
{	
	memcpy(&Cmd_SECRET_KEY[4], keyA, 6);
	memcpy(&Cmd_SECRET_KEY[10], keyCtrlBit, 4);
	memcpy(&Cmd_SECRET_KEY[14], keyA, 6);
	TxCheckSum(Cmd_SECRET_KEY, 21);
	
	delay_ms(300);
	USART1_SendFrameData(Cmd_SECRET_KEY, 21);
	delay_ms(300);
}

/*
***********************************************************************
*	函 数 名: RFID_SectorEncrypt
*	功能说明: 扇区加密
*	形    参：blockNumber -> 扇区块号
*	返 回 值: 无
***********************************************************************
*/
void RFID_SectorEncrypt(uint8_t blockNumber)
{
	Cmd_SectorEncryption[4] = blockNumber;
	TxCheckSum(Cmd_SectorEncryption, Cmd_SectorEncryption[1]);	//计算数据校验位
	
	delay_ms(500);
	USART1_SendFrameData(Cmd_SectorEncryption, Cmd_SectorEncryption[1]);
	delay_ms(500);
}

/*
***********************************************************************
*	函 数 名: RFID_WriteDataToBlock
*	功能说明: 写卡数据
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void RFID_WriteDataToBlock(uint8_t *datain, uint8_t block)
{
	uint8_t i;
	
	Cmd_Write_Block[4] = block;
	
	for(i=0; i<16; i++)
	{
		Cmd_Write_Block[6+i] = datain[i];
	}
	TxCheckSum(Cmd_Write_Block, Cmd_Write_Block[1]);	//计算数据校验位
	
	delay_ms(500);
	USART1_SendFrameData(Cmd_Write_Block, Cmd_Write_Block[1]);
	delay_ms(500);
}

/*
***********************************************************************
*	函 数 名: SetRFID_Param
*	功能说明: 设置IC卡模块参数
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void SetRFID_Param(void)
{
	delay_ms(200);
	USART1_SendFrameData(SET_IC_MODE, 8);
	delay_ms(200);
	USART1_SendFrameData(SET_SECRET_KEY, 21);
	delay_ms(200);
}

/*
***********************************************************************
*	函 数 名: ConfigureDoorKey
*	功能说明: 配置收运IC卡钥匙
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
void ConfigureDoorKey(uint32_t id)
{
	IC_CardEncode_YN(id, 1, 55);
	RFID_WriteDataToBlock(createCardNum, 9);
	printf("\r\n配置收运IC卡钥匙！\r\n");
}

/*
***********************************************************************
*	函 数 名: WriteIC_CardNumber
*	功能说明: 写IC卡号
*	形    参：areaCode -> IC卡区号（前6位）
*						serialNum -> IC卡流水号（第7-14位）
*	返 回 值: 无
***********************************************************************
*/
void WriteIC_CardNumber(uint32_t areaCode, uint32_t serialNum)
{
	IC_CardEncode_YN(areaCode, serialNum, 1);
	RFID_WriteDataToBlock(createCardNum, 9);
	printf("\r\n写IC卡！\r\n");
}

/******************** (C) COPYRIGHT 2017 ping *****END OF FILE*******************/
