/*************************** (C) COPYRIGHT 2017 CXHY ****************************
 * 文件名  ：2code.c
 * 描  述  ：二维码处理程序    
 * 版  本  ：V1.0
 * 作  者  ：XuZhongPing
 * 日  期  ：2017/03/06 
*********************************************************************************/
#include "qr_code.h"
#include "usart1.h"
#include "timer.h"
#include "string.h"	 
#include "RFID_IC.h"
#include "my_math.h"

//各种有效二维码识别成功标志状态
uint8_t sweep2CodeState = 0;			//扫描二维码状态，成功后为1，由外部程序读取后清除		
uint8_t scanBarCodeState = 0;			//扫描垃圾袋条型码或二维码状态，成功后为1，由外部程序读取后清除		
uint8_t scanLabelCodeState = 0;		//扫描标签二维码状态，成功后为1，由外部程序读取后清除		
uint8_t scanIC_2CodeState = 0;		//扫描IC卡二维码开门状态，成功后为1，由外部程序读取后清除
uint8_t devSetQrCodeState = 0;		//参数设置二维码

uint8_t codeBuf[128];							//保存读取到的有效二维码内容
uint8_t codeDataLength = 0;				//保存读取到的有效二维码内容长度

uint8_t IC_Code[17];							//IC卡二维码
uint8_t IC_HEX_Code[17];					//IC卡二维码十六进制数据
uint8_t IC_HEX_ID[9];

uint8_t setParamCmd;							//设置参数指令
uint8_t setParamCount;						//参数的个数
char setParamList[16][16];				//参数缓存列表

/*
***********************************************************************
*	函 数 名: DeleteStrEndingCode
*	功能说明: 删除字符串结尾的回车及换行
*	形    参：待处理的字符串首地址
*	返 回 值: 无
***********************************************************************
*/
static void DeleteStrEndingCode(char *pStr)
{
	uint16_t i = 0;
	uint16_t len1 = 0, len2;
	
	len1 = strlen(pStr);
	
	for(i = 0; i < len1; i++)
	{
		if((*(pStr + i) == 0x0D) || ((*(pStr + i) == 0x0A)))
		{
			*(pStr + i) = '\0';
		}
	}
	
	len2 = strlen(pStr);
	printf("\r\nqrLen %d, %d\r\n", len1, len2);
}

/*
***********************************************************************
*	函 数 名: QR_CodeDecode_StandardFormat
*	功能说明: 标准格式二维码内容解析
*	形    参：pStr -> 待解析的二维码
*						pCheckStr -> 解析格式
*	返 回 值: 解码成功返回1,失败返回0
***********************************************************************
*/
uint8_t QR_CodeDecode_StandardFormat(char *pStr, char *pCheckStr)
{
	uint8_t returnMark = 0;
	uint8_t i = 0;
	uint8_t len = 0;
	char *p;
	char *pQRcode;							//符合格式的二维码
	
	pQRcode = (char*)strstr((const char*)pStr, pCheckStr);
	
	if(pQRcode != NULL)
	{
		p = (char*)strstr((const char*)pQRcode, "=");								//取出用户信息
		
		if(p != NULL)
		{
			len = strlen(p + 1);																			//计算用户信息长度
			if((len > 0) && (len <= 128))															//当为用户APP二维码才能打开门
			{
				codeDataLength = len;																		//更新用户信息长度
				memset(codeBuf, 0x00, 128);
				memcpy(codeBuf, p+1, codeDataLength);
				
				printf("\r\nLen:%d, data:%s\r\n", codeDataLength, codeBuf);
				
				returnMark = 1;																					//标志解码成功
			}
		}
	}
		
	return returnMark;
}

/*
***********************************************************************
*	函 数 名: QR_CodeDecode
*	功能说明: 二维码内容解析
*	形    参：待解析的二维码
*	返 回 值: 无（影响相应的有效二维码标志位）
***********************************************************************
*/
void QR_CodeDecode(char *pStr)
{
	uint8_t i;
	char *p;
	
	char *pAppQRcode;							//APP二维码
	char *pAppQRcode2;						//中联APP二维码
	char *pBagQRcode;							//垃圾袋二维码
	char *pBagQRcodeAtCD;					//成都垃圾袋二维码
	char *pIcCardQRcode;					//成都IC卡二维码
	char *pDevSetQRcode;					//参数设置二维码
	
	uint8_t len = 0;
	
	uint32_t IC_HEX01, IC_HEX02;
	uint8_t IC_HEX03, IC_HEX04;
	
	uint8_t successMark = 0;												//扫码有效标志
	
// 	printf("\r\n2code = %s\r\n", (const char*)pStr);
	
	DeleteStrEndingCode(pStr);		//去掉二维码内容字符串结尾的回车及换行
	
// 	pAppQRcode = (char*)strstr((const char*)pStr, "www.kinglive.com.cn");
// 	pAppQRcode2 = (char*)strstr((const char*)pStr, "zoomlion");
// 	pBagQRcode = (char*)strstr((const char*)pStr, "YN");
// 	pBagQRcodeAtCD = (char*)strstr((const char*)pStr, "yueng");
// 	pIcCardQRcode = (char*)strstr((const char*)pStr, "510104");
// 	
	pDevSetQRcode = (char*)strstr((const char*)pStr, "devSet:");

//---------------------------------------------------------------------------------------	
	if(strlen(pStr) >= 128)
	{
		printf("\r\n超出长度！\r\n");
	}else{
		if(pDevSetQRcode != NULL)		//参数设置二维码
		{
			len = strlen(pDevSetQRcode);																	//计算长度

			devSetQrCodeState = 1;																				//标志扫垃圾袋二维码成功
			successMark = 1;
			
			codeDataLength = len;																					//更新用户信息长度
			memcpy(codeBuf, pDevSetQRcode, codeDataLength);
			*(codeBuf+len) = '\0';
			
			printf("\r\n设置二维码！\r\n");
			printf("\r\ndata = %s\r\n", codeBuf);
			printf("\r\ndataLen = %d\r\n", codeDataLength);
		}if(QR_CodeDecode_StandardFormat(pStr, "https://www.wastereduction.gov.hk")){
			printf("\r\n香港客户二维码！\r\n");
			
			sweep2CodeState = 1;																	
			successMark = 1;
		}else{
			len = strlen(pStr);
			codeDataLength = len;
			memset(codeBuf, 0x00, 128);
			memcpy(codeBuf, pStr, codeDataLength);
		
			sweep2CodeState = 1;																		//标志为用户APP二维码开门
			successMark = 1;
		}
	}
//---------------------------------------------------------------------------------------
	
	if(successMark == 0)
	{
		printf("\r\n无效二维码！！！\r\n");
	}
}

// /*
// ***********************************************************************
// *	函 数 名: Get2Code
// *	功能说明: 取得身份二维码数据
// *	形    参：无
// *	返 回 值: 无
// ***********************************************************************
// */
// void Get2Code(void)
// {
// 	if(USART1_RX_STA & 0X8000)		//接收到一次数据了
// 	{
// 		QR_CodeDecode((char*)USART_RX_BUF);
// 		
// 		memset(USART_RX_BUF, 0x00, 128);														//清除缓存内容
// 		USART1_RX_STA = 0;		   																			//启动下一次接收
// 	}
// }

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