/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：rfid_decode_yhk.c
 * 描  述  ：银行卡解码程序
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/03/06 
*********************************************************************************/
#include "rfid_decode_yhk.h"
#include "RFID_IC.h"
#include "string.h" 
#include "stdlib.h" 
#include "stdbool.h"
#include "my_math.h"
#include "data_typedef.h"


void showBufHex1(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");
}

/*
***********************************************************************
*	函 数 名: CheckLuhn
*	功能说明: 检测卡号校验位
*	形    参：无
*	返 回 值: 无
***********************************************************************
*/
static bool CheckLuhn(const char *pPurported)
{
	uint8_t i = 0;
	int nSum = 0;
	int nDigit = 0;
	int nDigits = 0;
	int nParity = 0;
	char cDigit[2] = {0};
	
	nDigits = strlen(pPurported);
	nParity = (nDigits-1) % 2;
	
	for (i = nDigits; i > 0 ; i--)
	{
		cDigit[0]  = pPurported[i-1];
		nDigit = atoi(cDigit);

		if (nParity == i % 2)
		{
			nDigit = nDigit * 2;
		}

		nSum += nDigit/10;
		nSum += nDigit%10;
	}
	return 0 == nSum % 10;
}
	
/*
***********************************************************************
*	函 数 名: IC_CardDecode_YHK
*	功能说明: 银行IC卡解码
*	形    参：无
*	返 回 值: 解码成功返回1，不成功返回0
***********************************************************************
*/
uint8_t IC_CardDecode_YHK(void)
{
	uint8_t res = 0;
	uint8_t i, j;
	uint32_t dataTemp;
	uint8_t icCardBitBuf[32] = {0};
	uint8_t icCardLen = 0;				//卡号内容长度
	uint32_t supplierID = 0;			//供应商代码
	
	//卡号分离
	//卡号分离
	j = 0;
	memset(cardNumberStr, 0x00, 33);
	memset(cardNumberBit, 0x00, 32);
	for(i = 0; i < 16; i++)
	{
		sprintf((char*)&cardNumberStr[j], "%01X", RFID_ID[i] >> 4);
		cardNumberBit[j++] = RFID_ID[i] >> 4;
		
		sprintf((char*)&cardNumberStr[j], "%01X", RFID_ID[i] & 0x0F);
		cardNumberBit[j++] = RFID_ID[i] & 0x0F;
	}
	
	//计算卡号长度
	for(i = 0; i < 32; i++)
	{
		if(cardNumberStr[i] == 'F')
		{
			cardNumberLen = i;
			break;
		}
	}
	
	printf("\r\nlen = %d\r\n", cardNumberLen);
	showBufHex1(cardNumberBit, cardNumberLen);
	printf("\r\nIC = %s\r\n", cardNumberStr);
	
	if((cardNumberLen >= 10) && (cardNumberLen <= 20))		//IC卡头部信息校验
	{
		memcpy(icCardBitBuf, cardNumberStr, cardNumberLen);
		if(CheckLuhn((const char*)icCardBitBuf))
		{
			RFID_state = 3;						//RFID_IC刷卡状态
			printf("\r\n银行卡用户！\r\n");
			res = 1;
		}else{
			printf("\r\n校验错误！\r\n");
		}
	}else{
// 		printf("\r\n中联卡解码无效！！！\r\n");
	}
	
	return res;
}
/******************** (C) COPYRIGHT 2017 ping *****END OF FILE*******************/
