📄 tc.c
字号:
/****************************************
* tc.c *
* excute touched card command *
* designed by liulixun *
* last update: 04-09-2007 *
****************************************/
#include "includes.h"
static bit fNotice; // Notice on card in/out
static bit fStopOnACK; // stop notice when get ack
static bit fCardIn = 0;
static bit fWaitCmd = 0; // flag of waiting for host command
static unsigned int WaitCmdTime; // time before a host command come
void TcInit(void)
{
int ch;
ch = ParaRead(PARA_SWITCHS);
if(ch >= 0)
{
fNotice = ch & F_NOTICE;
fStopOnACK = ch & F_SNOA;
}
else
{
fNotice = 1;
fStopOnACK = 1;
}
// IC card
IccInit(248);
IccSetTimeout(1200);
}
// ticc command
void TcCommand(unsigned char *cmd, unsigned int len)
{
int i;
// todo: for every command, sync card should be thinking
IccSelect(cmd[0]);
if(cmd[0] == IC_USER)
fWaitCmd = 0;
if(cmd[1] == CMD_RESET)
{
if(len != 2)
{
cmd[0] = ERRORCMDLEN;
CommSend(cmd, 1);
}
else
{
// send reset infomation to host
i = IccOpen(cmd+1);
if(i > 0)
{
cmd[0] = SUCCESS;
CommSend(cmd, i+1);
}
else
{
cmd[0] = FAIL;
CommSend(cmd, 1);
}
}
}
else if(cmd[1] == CMD_PACKEDCMD)
{
if(len < 6)
{
cmd[0] = ERRORCMDLEN;
CommSend(cmd, 1);
}
else
{
i = IccSendCmd(cmd[2], len-2, cmd+1);
if(i <= 0)
{
// command failed
cmd[0] = FAIL;
CommSend(cmd, 1);
}
else
{
// command success, send command excute result
// pdu: response_data*n + response_sw*2
cmd[0] = SUCCESS;
CommSend(cmd, i+1);
}
}
}
else if(cmd[0] == IC_USER)
{
switch(cmd[1])
{
case CMD_SYNC_RESET:
if(len != 2)
{
cmd[0] = ERRORCMDLEN;
CommSend(cmd, 1);
break;
}
i = IccSyncReset(cmd+1);
if(i <= 0)
{
cmd[0] = FAIL;
cmd[1] = i;
CommSend(cmd, 2);
break;
}
cmd[0] = SUCCESS;
CommSend(cmd, i+1);
break;
case CMD_SYNC_START:
break;
case CMD_SYNC_STOP:
break;
case CMD_SYNC_PUTCHAR:
break;
case CMD_SYNC_GETCHAR:
break;
case CMD_SYNC_WR:
break;
case CMD_SYNC_POLL_ACK:
break;
case CMD_SET_CARD_TYPE:
break;
case CMD_153_WR_EEPROM:
break;
case CMD_153_RD_EEPROM:
break;
case CMD_153_VRF_PSWD:
break;
case CMD_153_INIT_AUTH:
break;
case CMD_153_VRF_AUTH:
break;
case CMD_153_WR_FUSE:
break;
case CMD_153_RD_FUSE:
break;
default:
break;
}
}
else
{
cmd[0] = ERRORCMD;
CommSend(cmd, 1);
}
}
// check if a card is inserted into the slot and beep and led
// and send notice to host
// return: 1 on card in and 2 on card out and 0 on no action 0x1N card in slot
unsigned char CardSlot(void)
{
unsigned char cret = 0;
if(IccUserTest())
{
cret |= 0x10;
if(!fCardIn)
{
fCardIn = 1;
starttime = GetTickCount();
// 通知主机有卡
if(fNotice)
{
buf[0] = HASCARD;
buf[1] = fCardIn;
buf[2] = rfcardin;
if(!StopOnACK)
{
CommSendNotWaitAck(buf, 3); ///////////////////////////////////////////
waitcmdtime = GetTickCount();
fWaitCmd = 1;
}
else if(!CommSend(buf, 3))
{
fCardIn = 0;
IccUserEject();
}
}
// card in
cret |= 0x01;
}
}
else if(fCardIn)
{
fCardIn = 0;
if(fNotice)
{
buf[0] = HASCARD;
buf[1] = fCardIn;
buf[2] = rfcardin;
#if 1
CommSendNotWaitAck(buf, 3); //////////////////////////////////////
#else
CommSend(buf, 3);
#endif
}
// card out
cret = 2;
}
if(fWaitCmd)
{
if(GetTickCount() - WaitCmdTime >= 1000)
{
fCardIn = 0;
fWaitCmd = 0;
IccUserEject();
}
}
return cret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -