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

📄 tc.c

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 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 + -