📄 tc.c.bak
字号:
/****************************************
* tc.c *
* excute touched card command *
* designed by liulixun *
* last update: 05-01-2007 *
****************************************/
#include "includes.h"
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();
IccSetTimeout(1200);
}
// ticc command
unsigned int TcCommand(unsigned char *cmd, unsigned int len)
{
int i;
unsigned char ci;
// 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;
return 1;
}
else
{
// send reset infomation to host
i = IccOpen(cmd+1);
if(i > 0)
{
cmd[0] = SUCCESS;
return i+1;
}
else
{
cmd[0] = FAIL;
return 1;
}
}
}
else if(cmd[1] == CMD_PACKEDCMD)
{
if(len < 6)
{
cmd[0] = ERRORCMDLEN;
cmd[1] = 0xff;
return 2;
}
else
{
i = IccSendCmd(cmd+2, len-2, cmd+1);
if(i <= 0)
{
// command failed
cmd[0] = FAIL;
return 1;
}
else
{
// command success, send command excute result
// pdu: response_data*n + response_sw*2
cmd[0] = SUCCESS;
return i+1;
}
}
}
else if(cmd[0] == IC_USER)
{
switch(cmd[1])
{
case CMD_SYNC_RESET:
if(len != 2)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = IccSyncReset(cmd+1);
if(i <= 0)
{
cmd[0] = FAIL;
cmd[1] = i;
return 2;
}
cmd[0] = SUCCESS;
return i+1;
case CMD_SYNC_START:
if(len != 2)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
IccSyncStart();
cmd[0] = SUCCESS;
return 1;
case CMD_SYNC_STOP:
if(len != 2)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
IccSyncStop();
cmd[0] = SUCCESS;
return 1;
case CMD_SYNC_PUTCHAR:
if(len != 3)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = IccSyncPutChar(cmd[2]);
if(i == 0)
{
cmd[0] = SUCCESS;
return 1;
}
else
{
cmd[0] = FAIL;
return 1;
}
break;
case CMD_SYNC_GETCHAR:
if(len != 3)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
cmd[1] = IccSyncGetChar(cmd[2]?0:1);
cmd[0] = SUCCESS;
return 2;
case CMD_SYNC_WR:
if(len > 13)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
ci = cmd[len-1];
if(IccSyncWR(cmd+2, len-3, cmd+1, ci))
{
cmd[0] = SUCCESS;
return ci+1;
}
else
{
cmd[0] = FAIL;
cmd[1] = 0; // error ?
return 2;
}
case CMD_153_WR_EEPROM:
if(len > 68)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153WriteEE(cmd[2], cmd[3], cmd+4, len-4);
if(i >= 0)
{
cmd[0] = SUCCESS;
cmd[1] = (unsigned char)i;
return 2;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i; // error ?
return 2;
}
case CMD_153_RD_EEPROM:
if(len != 5)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153ReadEE(cmd[2], cmd[3], cmd+1, cmd[4]);
if(i >= 0)
{
cmd[0] = SUCCESS;
return i+1;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i; // error ?
return 2;
}
case CMD_153_VRF_PSWD:
if(len != 6)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153VerifyPasswd(cmd[2], cmd+3);
if(i >= 0)
{
cmd[0] = SUCCESS;
cmd[1] = (unsigned char)i;
return 2;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i;
return 2;
}
case CMD_153_INIT_AUTH:
if(len != 10)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153InitAuth(cmd+2);
if(i >= 0)
{
cmd[0] = SUCCESS;
cmd[1] = (unsigned char)i;
return 2;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i;
return 2;
}
case CMD_153_VRF_AUTH:
if(len != 10)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153VerifyAuth(cmd+2);
if(i >= 0)
{
cmd[0] = SUCCESS;
cmd[1] = (unsigned char)i;
return 2;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i;
return 2;
}
case CMD_153_WR_FUSE:
if(len != 3)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153WriteFS(cmd[2]);
if(i >= 0)
{
cmd[0] = SUCCESS;
cmd[1] = (unsigned char)i;
return 2;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i;
return 2;
}
case CMD_153_RD_FUSE:
if(len != 2)
{
cmd[0] = ERRORCMDLEN;
return 1;
}
i = At153ReadFS();
if(i >= 0)
{
cmd[0] = SUCCESS;
cmd[1] = (unsigned char)i;
return 2;
}
else
{
cmd[0] = FAIL;
cmd[1] = (char)i;
return 2;
}
default:
cmd[0] = ERRORCMD;
return 1;
}
}
else
{
cmd[0] = ERRORCMD;
return 1;
}
}
// check if a card is inserted into the slot and beep and led
// and send notice to host
void CardSlot(void)
{
static bit fCardIn = 0;
unsigned char buf[3];
static unsigned char cnt = 0;
// todo: check overload
if(IccUserOverLoad())
{
// todo: notice host ?
// power off
IccUserPower(0);
// eject card
IccUserEject();
// beep
beep(10, 5);
// notice host
#ifdef TCOVERLOAD
buf[0] = TCOVERLOAD;
CommSend(buf, 1);
#endif
}
if(IccUserTest())
{
if(!fCardIn)
{
fCardIn = 1;
// starttime = GetTickCount();
if(fTCBeep)
{
beep(2, 10);
}
CardLed(0, 1);
// 通知主机有卡
if(fNotice)
{
buf[0] = TCARD;
buf[1] = 1;
if(!fStopOnACK)
{
CommSendNotWaitAck(buf, 2); ///////////////////////////////////////////
WaitCmdTime = GetTickCount();
fWaitCmd = 1;
}
else if(!CommSend(buf, 2))
{
fCardIn = 0;
CardLed(0, 0);
cnt ++;
// if 3 times host no response, eject card
if(cnt > 3)
{
IccUserEject();
beep(3, 25);
}
}
}
}
}
else
{
cnt = 0;
if(fCardIn)
{
fCardIn = 0;
if(fTCBeep)
{
beep(1, 40);
}
CardLed(0, 0);
if(fNotice)
{
buf[0] = TCARD;
buf[1] = 0;
#if 1
CommSendNotWaitAck(buf, 2); //////////////////////////////////////
#else
CommSend(buf, 2);
#endif
}
}
}
if(fWaitCmd)
{
if(GetTickCount() - WaitCmdTime >= 1000)
{
fCardIn = 0;
fWaitCmd = 0;
IccUserEject();
beep(3, 25);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -