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

📄 tc.c.bak

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