?? testpad03.c
字號:
/******************************************************************************
*
* TestPad03.C V1.0.0.0
*
* 用于測試PAD03的接口函數
*
* Author :- Shen Qun
* System :- VC 6.0 or STAR POS
* Last modified :- 2006.12.19
* Funciton :- Test Api for pinpad
*
* Copyright : Copyright 2006 LANDI
* notice : All rights reserved.
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "LD_Reader.h"
extern unsigned char CARD_STATUS, CARD_SW1, CARD_SW2;
#define CLA_CODE 0x00
void debug_disps(char line, char *_data, int len);
unsigned char reader_type = 255;
void display_ic_status(void)
{
#ifdef _POS_
displays(7, 1, "STATUS=%02x SW1SW2=%02x%02x", CARD_STATUS, CARD_SW1, CARD_SW2);
#else
printf("STATUS=%02x, SW1=%02x, SW2=%02x\n", CARD_STATUS, CARD_SW1, CARD_SW2);
#endif
}
#ifndef _POS_
// 用于Windows下函數測試
void display_cen(int line, char *data)
{
printf("%s", data);
}
void display_inv(int line, char *data)
{
printf("%s", data);
}
void displays(int line, int col, char *format, ...)
{
va_list ap;
int arg;
va_start(ap, format); /* Variable argument begin */
arg = va_arg(ap, int);
printf(format, arg);
va_end(ap); /* Variable argument end */
}
void display(int line, char *format, ...)
{
va_list ap;
int arg;
va_start(ap, format); /* Variable argument begin */
arg = va_arg(ap, int);
printf(format, arg);
va_end(ap); /* Variable argument end */
}
void debug_disps(char line, char *_data, int len)
{
int i;
for (i = 0; i < len; i++)
{
display(1, "%02X ", (unsigned char) _data[i]);
}
display(1, "\n");
}
int inkey(int time)
{
return 0;
}
void clearall()
{
}
void cls()
{
}
void ResetTime()
{
}
#else
void debug_disps(char line, char *_data, int len)
{
char str1[20], str2[20];
int i, j;
j = 0;
do
{
memset(str1, 0, 20);
for (i = 0; i < 8; i++)
{
if ((j + i) >= len)
{
str1[i * 2] = 0;
break;
}
sprintf(str1 + i * 2, "%02x", _data[j + i]);
}
sprintf(str2, "%d~%d of %d", j + 1, j + i, len);
displays(line, 1, str2);
displays(line + 1, 1, str1);
inkey(0);
j += 8;
} while (j < len);
}
#endif
#ifndef _POS_
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
va_list ap;
int arg;
va_start(ap, pszFmt); /* Variable argument begin */
arg = va_arg(ap, int);
printf(pszFmt, arg);
va_end(ap); /* Variable argument end */
}
#else
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
char szDispStr[500];
va_list VarList;
va_start(VarList, pszFmt);
vsprintf(szDispStr, pszFmt, VarList);
va_end(VarList);
displays(dln, dlc, "%s", szDispStr);
return;
}
#endif
int ReaderPowerOn(int expect_code, unsigned char ucReaderHandle)
{
short sRet;
unsigned char ucTmpBuf[100], ucBufLen;
unsigned char ucCardNo = 0;
sRet = power_up(ucReaderHandle, ucCardNo, ucTmpBuf, &ucBufLen);
display_ic_status();
debug_disps(3, (char *) ucTmpBuf, (int) ucBufLen);
return SUCC;
}
void ReaderAPDU(unsigned int uiLen_APDU, unsigned char *ucCommand_APDU)
{
unsigned char ucResponse_APDU[512];
unsigned char Lc = 0, Le = 0;
unsigned char ucCardNo = 0;
short sRet;
unsigned short usLen;
unsigned char ucReaderHandle = 1;
usLen = 0; //處理61 6C
//usLen = 2; //不處理 61 6C
if (uiLen_APDU == 4) //case 1
{
Lc = 0;
Le = 0;
}
else if (uiLen_APDU == 5) //case 2
{
Lc = 0;
Le = ucCommand_APDU[4];
}
else if (uiLen_APDU == (unsigned int) (5 + ucCommand_APDU[4])) // case 3
{
Lc = ucCommand_APDU[4];
Le = 0;
}
else if (uiLen_APDU == (unsigned int) (6 + ucCommand_APDU[4])) // case 4
{
Lc = ucCommand_APDU[4];
Le = ucCommand_APDU[4 + Lc + 1];
usLen = 0;
}
else
{
return;
}
sRet = ICCTransmit
(
ucReaderHandle,
ucCardNo,
ucCommand_APDU[0],
ucCommand_APDU[1],
ucCommand_APDU[2],
ucCommand_APDU[3],
Lc,
ucCommand_APDU + 5,
Le,
ucResponse_APDU,
&usLen
);
display_ic_status();
debug_disps(3, (char *) ucResponse_APDU, (int) usLen);
if (usLen == 0 && CARD_SW1 == 0x61)
{
Lc = 0;
Le = CARD_SW2;
memset(ucResponse_APDU, 0, sizeof(ucResponse_APDU));
sRet = ICCTransmit
(
ucReaderHandle,
ucCardNo,
0x00,
0xC0,
0x00,
0x00,
Lc,
ucCommand_APDU + 5,
Le,
ucResponse_APDU,
&usLen
);
display_ic_status();
debug_disps(3, (char *) ucResponse_APDU, (int) usLen);
}
return;
}
int test_4428(unsigned char hd_no)
{
char out[1024], length, key[256];
char tmp_str[100];
short ret;
char status, err_no;
ret = power_up_4428(hd_no, &status, &length, out);
if (CARD_STATUS != 0)
{
return FAIL;
}
if (ret != SUCC)
{
display(1, "(power_up_4442)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, length);
if (ICC_in(hd_no) == 0)
{
ret = read_SIM4428(hd_no, 0, 20, out);
if (ret != SUCC)
{
display(1, "(read_SIM4428)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, 20);
}
else
{
display(1, "No Card Insert\n");
return FAIL;
}
ret = read_ERR_SIM4428(hd_no, &err_no);
if (CARD_STATUS != 0)
{
return FAIL;
}
display(2, "err_no=%d\n", err_no);
key[0] = (char) 0x67;
key[1] = (char) 0xC6;
ret = verify_SIM4428(hd_no, key, &err_no);
if (err_no != 0)
{
return FAIL;
}
if (ret != SUCC)
{
display(1, "(verify_4428)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
display(2, "err_no=%d\n", err_no);
ret = read_SIM4428(hd_no, 1021, 500, out);
if (ret != SUCC)
{
display(1, "(read_SIM4428)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, 10);
memset(out, 0, sizeof(out));
out[0] = (char) 0x12;
out[1] = (char) 0x23;
out[2] = (char) 0x55;
out[3] = (char) 0xaa;
ret = write_SIM4428(hd_no, 10, 10, out);
if (CARD_STATUS != 0)
{
return FAIL;
}
if (ret != SUCC)
{
display(1, "(write_4428)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
return SUCC;
}
int test_4442(unsigned char hd_no)
{
char out[256], length, key[256];
char tmp_str[100];
short ret;
char status, err_no;
ret = power_up_4442(hd_no, &status, &length, out);
if (CARD_STATUS != 0)
{
return FAIL;
}
if (ret != SUCC)
{
display(1, "(power_up_4442)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, length);
if (ICC_in(hd_no) == 0)
{
ret = read_SIM4442(hd_no, 0, 20, out);
if (ret != SUCC)
{
display(1, "(read_SIM4428)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, 20);
}
else
{
display(1, "No Card Insert\n");
return FAIL;
}
key[0] = (char) 0xB6;
key[1] = (char) 0x23;
key[2] = (char) 0x07;
ret = verify_SIM4442(hd_no, key, &err_no);
if (err_no != 0)
{
return FAIL;
}
if (ret != SUCC)
{
display(1, "(verify_4442)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
display(2, "err_no=%d\n", err_no);
ret = read_SIM4442(hd_no, 32, 3, out);
status = CARD_STATUS;
if (ret != SUCC)
{
display(1, "(read_SIM4442)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, 3);
memset(out, 0, sizeof(out));
out[0] = (char) 0xab;
out[1] = (char) 0xcd;
out[2] = (char) 0xef;
out[3] = (char) 0xaa;
ret = write_SIM4442(hd_no, 32, 10, out);
if (CARD_STATUS != 0)
{
return FAIL;
}
if (ret != SUCC)
{
display(1, "(write_4442)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
ret = read_SIM4442(hd_no, 32, 3, out);
if (ret != SUCC)
{
display(1, "(read_SIM4442)");
GetErrorMessage(ret, tmp_str);
display(2, "%s", tmp_str);
}
debug_disps(3, out, 4);
return SUCC;
}
int test_cpu_card(unsigned char hd_no)
{
unsigned char data[100], len;
char card_no = 0, err_str[100];
short stat, ret;
char tmp_str[100];
cls();
displays(1, 1, "\nBegin test CPU card......! \n");
displays(1, 1, "Insert IC card\n");
do
{
ret = ICC_in(hd_no);
GetErrorMessage(ret, err_str);
} while (ret != SUCC);
stat = power_up(hd_no, card_no, data, &len);
display_ic_status();
debug_disps(3, (char *) data, len);
/*
stat = power_down(hd_no, 1);
stat = power_up(hd_no, 1, data, &len);
display_ic_status();
debug_disps(3, (char *) data, len);
stat = power_up(hd_no, 2, data, &len);
display_ic_status();
debug_disps(3, (char *) data, len);
stat = power_up(hd_no, 4, data, &len);
display_ic_status();
debug_disps(3, (char *) data, len);
*/
/*
if ( len == 0 ) {
display_ic_status();
return FAIL;
}
*/
//獲得隨機數
displays(2, 1, "Begin Get Random...\n");
stat = outgoing(hd_no, card_no, 0x00, 0x84, 0, 0, 8, data);
if (stat != SUCC)
{
GetErrorMessage(stat, tmp_str);
display(2, tmp_str);
}
else
{
display_ic_status();
debug_disps(3, (char *) data, 8);
}
//選擇文件
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);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -