⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testpad03.c

📁 读卡器编程实例------Reader programming examples
💻 C
📖 第 1 页 / 共 3 页
字号:
	}
	else
	{
		display_ic_status();
	}

	//选择文件
	displays(3, 1, "Begin Select File...\n");

	data[0] = 0x3f;
	data[1] = 0x00;
	stat = incoming(hd_no, card_no, 0x00, 0xA4, 0, 0, 2, data);

	//stat = PSAM_Select_File ( hd_no, card_no, 0x3f, 0x00, data) ;
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}
	else
	{
		display_ic_status();
	}

	stat = power_down(hd_no, card_no);
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}

	displays(8, 1, "Press any key to continue\n");
	inkey(0);
	cls();

	return stat;
}

int test_display(unsigned char hd_no)
{
	short			ret;
	unsigned char	key;
	char			tmp_str[100];

	displays(1, 1, "display a line in PINPAD\n");
	display(2, "在PINPAD上从某一行的第一列开始显示中西文字符,并清掉后面的已有的字符\n");
	ret = display_pad(hd_no, 1, "Test Display");
	if (ret != SUCC)
	{
		display(1, "(display_pad):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(4, "在PINPAD上显示5*7小点阵ASCII字符, 不清除其它显示.\n");
	ret = disps_ascii(hd_no, 2, 4, "1234ABCD");
	if (ret != SUCC)
	{
		display(1, "(disps_ascii):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	ret = display_pad(hd_no, 6, "Display显示第6行");

	ret = pad_sound(hd_no, 500);
	if (ret != SUCC)
	{
		display(1, "(pad_sound):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	displays(5, 1, "push a key in PINPAD......\n");
	while (1)
	{
		get_push_key(hd_no, &key);	//读入键值后,下一次读入是0
		if (key != 0)
		{
			displays(6, 1, "get push key= %02x\n", key);
			break;
		}
	}

	displays(7, 1, "get kbhit of PinPad: \n");
	while (1)
	{
		kbhit_pad(hd_no, &key);		//kbhit未清缓冲区,下一次读出还是原值
		if (key != 0)
		{
			displays(8, 1, "kbhit_pad return=%02x\n", key);
			break;
		}
	}

	return SUCC;
}

int test_input_key(unsigned char hd_no)
{
	unsigned char	tmp_str[100], str_len;
	short			sRet = 0;

	memset(tmp_str, 0, sizeof(tmp_str));

	cls();
	displays(1, 1, "INPUT KEY in PINPAD\n");
	if (reader_type == READER_STAR752)
	{
		disps_ascii(hd_no, 1, 1, "INPUT:          ");
		disps_ascii(hd_no, 2, 1, "AMOUNT:123.45   ");
	}
	else
	{
		display_pad(hd_no, 1, "请输密:");
		display_pad(hd_no, 2, "金额:123.45");
	}

	//sRet = input_str ( hd_no, 1, 0, ASTERISK|VAR_LEN|PINDATA, 6, 1 );
	sRet = input_str(hd_no, 1, 8, VAR_LEN, 19, 1);
	if (sRet == 0)
	{
		do
		{
			sRet = get_str(hd_no, &str_len, tmp_str, 1);
			if (sRet == RCV_TIMEOUT)
			{
				printf("get_str timeout\n");
				return FAIL;
			}
		} while (sRet == BUSY_INPUT);
		displays(2, 1, "key length=%d ", str_len);

		//displays(3, 1, "key=%s\n", tmp_str);
		printf("key=%s\n", tmp_str);
	}

	memset(tmp_str, 0, sizeof(tmp_str));

	displays(4, 1, "INPUT Code in PINPAD\n");
	if (reader_type == READER_STAR752)
	{
		disps_ascii(hd_no, 1, 1, "INPUT CODE:     ");
		disps_ascii(hd_no, 2, 1, "                ");
	}
	else
	{
		display_pad(hd_no, 1, "请输密码:");
		display_pad(hd_no, 2, "");
	}

	input_str(hd_no, 2, 1, ASTERISK | VAR_LEN | PINDATA, 6, 0);
	if (sRet != 0)
	{
		return FAIL;
	}

	do
	{
		/*590取消键判断
		  if( kbhit( ) ){
		  if( inkey( 0 ) == CANCEL ){
		  reset_pad( );
		  return( FAIL );
		  }
		  }
		  */
		if (get_str(hd_no, &str_len, tmp_str, 0) == SUCC)
		{
			if (str_len != 6)
			{
				display_pad(hd_no, 1, "请输入密码:");
				display_pad(hd_no, 2, "");
				input_str(hd_no, 2, 1, ASTERISK | VAR_LEN, 6, 0);
				continue;
			}
			else
			{
				break;
			}
		}
	} while (1);

	displays(5, 1, "key length=%d ", str_len);

	//displays(6, 1, "key=%s\n", tmp_str);
	printf("key=%s\n", tmp_str);

	sRet = write_user_key(hd_no, "PIN_", "01234567");
	if (sRet != SUCC)
	{
		display(1, "(write_user_key):err");
		inkey(0);
	}

	sRet = X98_from_pad(hd_no, 0, "PIN_", "0000000000000000", tmp_str);

	//_DES("01234567", tmp_str, tmp_str+10);
	debug_disps(1, tmp_str + 10, 8);

	//bcd_to_asc1 ( (unsigned char*)s, tmp, 16 , 0 );
	return SUCC;
}

int test_magcard(unsigned char hd_no)
{
	short			sRet = 0;
	DevHandle		hMagHandle;
	unsigned char	ucStatus;
	ET_MAGCARD		stTrk2, stTrk3;
	char			szDispBuf[256];

	display(1, "Begin Test MagCard\n");

	sRet = OpenMagcard(hd_no, EM_RECARD, 60, &hMagHandle, &ucStatus);
	if (sRet != SUCC)
	{
		display(1, "(ucOpenMagcard):");
		GetErrorMessage(sRet, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	if (ucStatus != EM_SUCCESS)
	{
		display(1, "(ucOpenMagcard):");
		GetErrorMessage((short) ucStatus, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	display(1, "Begin ReCard\n");
	sRet = Recard(hd_no, hMagHandle, 0, 0x01, &stTrk2, &stTrk3, &ucStatus);
	if (sRet != SUCC)
	{
		display(1, "(ucRecard):");
		GetErrorMessage(sRet, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	if (ucStatus != EM_SUCCESS)
	{
		display(1, "(ucRecard):");
		GetErrorMessage((short) ucStatus, szDispBuf);
		display(2, "%s", szDispBuf);
	}
	else
	{
		display(1, "Trk2Flag=%02x\n", stTrk2.ucTrkFlag);
		display(2, "%s\n", stTrk2.ucTrkBuf);
		display(3, "Trk3Flag=%02x\n", stTrk3.ucTrkFlag);
		display(4, "%s\n", stTrk3.ucTrkBuf);
	}

	display(1, "Begin CloseMagcard\n");
	sRet = CloseMagcard(hd_no, &hMagHandle, &ucStatus);
	if (sRet != 0)
	{
		return FAIL;
	}

	sRet = OpenMagcard(hd_no, 0x01, 100, &hMagHandle, &ucStatus);
	if (sRet != SUCC)
	{
		display(1, "(ucOpenMagcard):");
		GetErrorMessage(sRet, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	if (ucStatus != EM_SUCCESS)
	{
		display(1, "(ucOpenMagcard):");
		GetErrorMessage((short) ucStatus, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	sRet = StartTrackIn(hd_no, hMagHandle, &ucStatus);
	if (sRet != SUCC)
	{
		display(1, "(ucStartTrackIn):");
		GetErrorMessage(sRet, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	if (ucStatus != EM_SUCCESS)
	{
		display(1, "(ucStartTrackIn):");
		GetErrorMessage((short) ucStatus, szDispBuf);
		display(2, "%s", szDispBuf);
	}

	while (1)
	{
		//Sleep(500);
		sRet = TrackIn(hd_no, hMagHandle, &stTrk2, &stTrk3, &ucStatus);
		SetPadTimeout(hd_no, 200);
		if (sRet != SUCC)
		{
			display(1, "(ucTrackIn):");
			GetErrorMessage(sRet, szDispBuf);
			display(2, "%s", szDispBuf);
		}

		if (ucStatus == EM_ABOLISH)
		{
			break;
		}

		if (ucStatus != EM_SUCCESS)
		{
			//display ( 1, "(ucTrackIn):" );
			GetErrorMessage((short) ucStatus, szDispBuf);

			//display ( 2, "%s", szDispBuf );
		}

		if (ucStatus == EM_SUCCESS)
		{
			display(1, "Trk2Flag=%02x\n", stTrk2.ucTrkFlag);
			display(2, "%s\n", stTrk2.ucTrkBuf);
			display(1, "Trk3Flag=%02x\n", stTrk3.ucTrkFlag);
			display(3, "%s\n", stTrk3.ucTrkBuf);
			break;
		}
	}

	sRet = CloseMagcard(hd_no, &hMagHandle, &ucStatus);
	display(2, "End Test MagCard\n");

	return SUCC;
}

WORD TestProCard(HICC hCT)
{
	unsigned short	usSW1SW2;
	unsigned char	ucStatus;
	WORD			usRet;
	unsigned char	ucTmpBuf[255], ucLen = 0;
	unsigned char	ucSndBuf[255], ucRecBuf[255];

	//对于上海复旦微电子股份有限公司的FMCOS需要做此特殊设置
	usRet = MifSetParam(hCT, 5, 1, &ucStatus);
	if (usRet != SUCC)
	{
		GetErrorMessage(usRet, ucTmpBuf);
		display(2, ucTmpBuf);
	}
	else
	{
		printf("MifSetParam[%x]\n", usSW1SW2);
	}

	usRet = MifResetPro(hCT, IDLE, 0, ucTmpBuf, &ucLen, &usSW1SW2);
	if (usRet != SUCC)
	{
		GetErrorMessage(usRet, ucTmpBuf);
		display(2, ucTmpBuf);
	}
	else
	{
		printf("MifResetPro[%x]\n", usSW1SW2);
	}

	//选择文件
	displays(3, 1, "Begin Select File...\n");

	ucSndBuf[0] = 0x3f;
	ucSndBuf[1] = 0x00;

	memset(ucRecBuf, 0, sizeof(ucRecBuf));
	usRet = MifExchangePro(hCT, 0, 0xa4, 0, 0x00, 0x02, ucSndBuf, 0x0, ucRecBuf, &ucLen, &usSW1SW2);
	if (usRet != SUCC)
	{
		GetErrorMessage(usRet, ucTmpBuf);
		display(2, ucTmpBuf);
	}
	else
	{
		printf("MifExchangePro[%x]\n", usSW1SW2);
	}

	//获得随机数
	displays(2, 1, "Begin Get Random...\n");
	memset(ucRecBuf, 0, sizeof(ucRecBuf));
	usRet = MifExchangePro(hCT, 0, 0x84, 0, 0x00, 0x00, ucSndBuf, 0x04, ucRecBuf, &ucLen, &usSW1SW2);
	if (usRet != SUCC)
	{
		GetErrorMessage(usRet, ucTmpBuf);
		display(2, ucTmpBuf);
	}
	else
	{
		printf("MifExchangePro[%x]\n", usSW1SW2);
	}

	usRet = MifDeselectPro(hCT, &usSW1SW2);
	if (usRet != SUCC)
	{
		GetErrorMessage(usRet, ucTmpBuf);
		display(2, ucTmpBuf);
	}
	else
	{
		printf("MifDeselectPro[%x]\n", usSW1SW2);
	}

	//恢复设置
	usRet = MifSetParam(hCT, 5, 0, &ucStatus);

	return SUCC;
}

WORD TestMifCard(HICC hCT)
{
	int				i;
	unsigned char	ucCardType[4], ucKey[10], ucSector = 1, ucCardId[4];
	unsigned char	ucStatus, ucSize;
	WORD			usRet;
	unsigned char	ucTmpBuf[17];
	char			szErrMessage[100];

	BuzzerMs(hCT, 5);

	memset(ucKey, 0xff, sizeof(ucKey));
	memset(ucCardId, 0, sizeof(ucCardId));

	for (i = 0; i < 2; i++)
	{
		//完成在天线范围内的TYPE A卡的激活操作
		usRet = MifRequest(hCT, 0, ucCardType, &ucStatus);
		if (ucStatus == 0)
		{
			break;
		}
	}

	//防冲突处理,在被激活的多张卡片中选择一张卡
	PubDisplays(1, 1, "MifAnticoll.......");
	usRet = MifAnticoll(hCT, ucCardId, &ucStatus);
	if (usRet != ICCER_OK)
	{
		return usRet;
	}

	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//选择指定卡号的卡
	PubDisplays(1, 1, "MifSelect.........");
	usRet = MifSelect(hCT, ucCardId, &ucSize, &ucStatus);
	if (usRet != ICCER_OK)
	{
		return usRet;
	}

	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//KEYA密钥地址=ucSector
	//KEYB密钥地址=ucSector+0x10
	//选择指定的地址的存储密钥
	PubDisplays(1, 1, "MifLoadkey........");
	usRet = MifLoadkey(hCT, ucSector, ucKey, &ucStatus);
	if (usRet != ICCER_OK)
	{
		return usRet;
	}

	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//选择指定地址的存储密钥认证卡片
	PubDisplays(1, 1, "MifAuth...........");
	usRet = MifAuth(hCT, ucSector, ucSector, &ucStatus);
	if (usRet != ICCER_OK)
	{
		return usRet;
	}

	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//根据提供的密钥对指定的扇区进行认证
	PubDisplays(1, 1, "MifAuthToRam...... ");
	usRet = MifAuthToRam(hCT, ucSector, KEYA, ucKey, &ucStatus);
	if (usRet != ICCER_OK)
	{
		return usRet;
	}

	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//读数据
	ucSector = 1;
	PubDisplays(1, 1, "MifRead...........");
	usRet = MifRead(hCT, (uchar) (4 * ucSector), ucTmpBuf, &ucStatus);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -