Beispiel #1
0
// {{{ 初始化系统参数
static int do_init_all_hardware()
{
    int32 ret;
    ret = tft_init();
    if (ret)
    {
        error_exit(1, "不能初始化LCD显示");
    }
    lcd_160_clr();

    ret = key_led_init();
    if (ret)
    {
        error_exit(1, "不能初始化keyboard");
    }
    //led_dis_clear();

    RFDEV = dc_init_rf();
    if (RFDEV < 0)
    {
        error_exit(1, "不能初始化射频卡模块");
    }
    dc_config_card(RFDEV, 'A');
    if (dc_typeb_timeout(RFDEV, 9))
    {
        error_exit(1, "dc_typeb_timeout错误");
    }

    ret = fs_print_init();
    if (ret)
    {
        p16log(LOG_ERROR, "不能初始化打印机模块");
    }
    SAMDEV = dc_int_sam();
    if (SAMDEV < 0)
    {
        p16log(LOG_ERROR, "不能初始化SAM模块,%d", SAMDEV);
    }
    return 0;
}
// function cpucard_cmd
static int KSAPI cpucard_cmd(ks_reader_dev_t *dev,ks_cpu_cmd_t *cmd,KS_CARD_TYPE t) {
    int ret = -1;
    uint8 sw1,sw2;
    char szCmd[256];
    char ats[200] = {0};
    ks_cpu_cmd_t innerCmd;
    cmd->cmd_retcode=0;
    assert(dev != NULL);
    if(!g_dev_hd) {
        strcpy(gErrMsg,"读卡器端口未打开");
        strcpy(cmd->cmd_retmsg,gErrMsg);
        return KS_PORT_NOTOPEN;
    }

    int recvlen;
    if(t == KS_CPUCARD || t == KS_FIXCARD) {
        // 非接触式
        if(dev->cpuport == CARDSLOT_RF) {
            if(cmd->cmd_type == 0) {
                //1
                //char sendBuf[512] = {0};
                unsigned char cmpBuf[100] = {0};
                int cmpLen = 0;
                char recvBuf[512] = {0};
                int recvLen = 0;
                unsigned char* RevTemp = NULL;
                hex2dec("0084000004", 10, cmpBuf, cmpLen);
                if ( !memcmp(cmpBuf, cmd->send_buf, cmpLen) ) {
                    ret = CPUCARD_APDU(g_dev_hd,"0084000004", recvBuf, gErrMsg);
                } else {
                    //dec2hex(cmd->send_buf, cmd->send_len, sendBuf);
                    ret = CPUCARD_APDU(g_dev_hd, (char*)cmd->send_buf, recvBuf, gErrMsg);
                }
                recvLen = strlen(recvBuf);
                RevTemp = cmd->recv_buf;
                hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len);
                cmd->recv_buf = RevTemp;
            } else {
                //2
                unsigned char ucCmd[512];
                int  iCmdLen=0;
                unsigned char* RevTemp = NULL;
                //hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd,iCmdLen);
                if ( !strncmp("00B09500", (char*)cmd->send_buf, 8) ) {
                    strcat((char*)cmd->send_buf, "14");
                }
                ret = CPUCARD_APDU(g_dev_hd,(char*)cmd->send_buf , (char*)ucCmd, gErrMsg);
                iCmdLen = strlen((char*)ucCmd);
                memcpy(cmd->recv_buf,ucCmd,cmd->recv_len);
                RevTemp = cmd->recv_buf;
                hex2dec((char*)ucCmd, iCmdLen, cmd->recv_buf, (int&)cmd->recv_len);
                cmd->recv_buf = RevTemp;
            }
        } else {
            //GET_DECARD_SLOT(dev,dev->cpuport);
            if(cmd->cmd_type == 0) {
                //3
                char recvBuf[512] = {0};
                int recvLen = 0;
                unsigned char* RevTemp = NULL;
                ret = SAMCAR1_APDU(g_dev_hd, (char*)cmd->send_buf, (char*)recvBuf, gErrMsg);
                recvLen = strlen(recvBuf);
                RevTemp = cmd->recv_buf;
                hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len);
                cmd->recv_buf = RevTemp;
            } else {
                //4
                //unsigned char ucCmd[512];
                //int  iCmdLen=0;
                char recvBuf[512] = {0};
                int recvLen = 0;
                unsigned char* RevTemp = NULL;
                //hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd,iCmdLen);
                ret = SAMCAR1_APDU(g_dev_hd, (char*)cmd->send_buf, (char*)recvBuf, gErrMsg);
                recvLen = strlen(recvBuf);
                RevTemp = cmd->recv_buf;
                hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len);
                cmd->recv_buf = RevTemp;
            }
        }
    } else if(t == KS_SIMCARD) {
#if 0
        unsigned char ucCmd[512];
        int  iCmdLen=0;
        ucCmd[0] = 0xA2;
        ucCmd[1] = 0x33;
        if(cmd->cmd_type == 0) {
            memcpy(ucCmd+2,cmd->send_buf,cmd->send_len);
            iCmdLen = cmd->send_len + 2;
            ret = send_rfsim_cmd(ucCmd,iCmdLen,cmd->recv_buf,(unsigned char*)&recvlen);
            cmd->recv_len=recvlen;
        } else {
            hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd+2,iCmdLen);
            iCmdLen += 2;
            ret = send_rfsim_cmd(ucCmd,iCmdLen,cmd->recv_buf,(unsigned char*)&recvlen);
            cmd->recv_len=recvlen;
        }
#else
        char ucCmd[512] = {0};
        char reCmd[512] = {0};
        int  iCmdLen=0;
        int revLen = 0;
        if ( !strncmp( (char*)cmd->send_buf, "805E000207", 10) ) {
            strcat((char*)cmd->send_buf, "08");
            cmd->send_len+=2;
        }

        if ( !strncmp( (char*)cmd->send_buf, "807400021A", 10) ) {
            strcat((char*)cmd->send_buf, "14");
            cmd->send_len+=2;
        }

        if ( !strncmp( (char*)cmd->send_buf, "807C010212", 10) ) {
            strcat((char*)cmd->send_buf, "2B");
            cmd->send_len+=2;
        }


        if ( !strncmp( (char*)cmd->send_buf, "8476000012", 10) ) {
            strcat((char*)cmd->send_buf, "04");
            cmd->send_len+=2;
        }
        if (cmd->cmd_type == 0) {
            unsigned char* RevTemp = NULL;
            RevTemp = cmd->recv_buf;
            dec2hex(cmd->send_buf, cmd->send_len, ucCmd);
            ret = RFSIMCARD_APDU(g_dev_hd, ucCmd,reCmd, gErrMsg);
            hex2dec(reCmd, strlen(reCmd), cmd->recv_buf, (int&)cmd->recv_len);
            cmd->recv_buf = RevTemp;
        } else {
            unsigned char* RevTemp = NULL;
            RevTemp = cmd->recv_buf;
            if ( !strncmp("00B09500", (char*)cmd->send_buf, 8) ) {
                strcat((char*)cmd->send_buf, "14");
            }
            ret = RFSIMCARD_APDU(g_dev_hd, (char*)cmd->send_buf,reCmd, gErrMsg);
            hex2dec(reCmd, strlen(reCmd), cmd->recv_buf, (int&)cmd->recv_len);
            cmd->recv_buf = RevTemp;
        }
#endif
    } else {
        // 接触式
#if 0	//end del by chen 2012-01-16
        if(dev->cpuport == CARDSLOT_RF) {
            return KS_CMDERROR;
        } else {
#endif	//end del by chen 2012-01-16
            //GET_DECARD_SLOT(dev,dev->cpuport);

            if(cmd->cmd_type == 0) {
                //5
                unsigned char cmpBuf1[100] = {0};
                unsigned char cmpBuf2[100] = {0};
                unsigned char cmpBuf3[100] = {0};
                int cmpLen1 = 0;
                int cmpLen2 = 0;
                int cmpLen3 = 0;
                char recvBuf[512] = {0};
                int recvLen = 0;
                char sendBuf[200] = {0};
                char sendLen = 0;
                unsigned char* RevTemp = NULL;
#if 1
                hex2dec("80FA020020", 10, cmpBuf1, cmpLen1);
                if ( !(memcmp(cmpBuf1, cmd->send_buf, cmpLen1)) ) {

                    dec2hex(cmd->send_buf, 37, sendBuf);
                }
                ret = SAMCAR1_APDU(g_dev_hd,sendBuf , recvBuf, gErrMsg);
                //g_flag = 1;
#else
                hex2dec("80FA0200205F3131313131313131000000000000000000000000001EE6B790201508141000", strlen("80FA0200205F3131313131313131000000000000000000000000001EE6B790201508141000"), cmpBuf1, cmpLen1);
                hex2dec("80FA02002020110814000020001111110007D00013880A12D6870000000000000000000000", strlen("80FA02002020110814000020001111110007D00013880A12D6870000000000000000000000"), cmpBuf2, cmpLen2);
                hex2dec("80FA02002000D5C5C8FD350000000000000000000000000000000000000000000000000000", strlen("80FA02002000D5C5C8FD350000000000000000000000000000000000000000000000000000"), cmpBuf3, cmpLen3);
                if ( !memcmp(cmpBuf1, cmd->send_buf, cmpLen1) ) {
                    ret = CPUCARD_APDU(g_dev_hd, "80FA0200205F3131313131313131000000000000000000000000001EE6B790201508141000", recvBuf, gErrMsg);
                } else if ( !memcmp(cmpBuf2, cmd->send_buf, cmpLen2) ) {
                    ret = CPUCARD_APDU(g_dev_hd, "80FA02002020110814000020001111110007D00013880A12D6870000000000000000000000", recvBuf, gErrMsg);
                } else if ( !memcmp(cmpBuf3, cmd->send_buf, cmpLen3) ) {
                    ret = CPUCARD_APDU(g_dev_hd, recvBuf, "80FA02002000D5C5C8FD350000000000000000000000000000000000000000000000000000", gErrMsg);
                } else {
                    //dec2hex(cmd->send_buf, cmd->send_len, sendBuf);
                    ret = CPUCARD_APDU(g_dev_hd, recvBuf, (char*)cmd->send_buf, gErrMsg);
                }
#endif
                recvLen = strlen(recvBuf);
                RevTemp = cmd->recv_buf;
                hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len);
                cmd->recv_buf = RevTemp;
            } else {
                //6
                //unsigned char ucCmd[512];
                //int  iCmdLen=0;
                char recvBuf[512] = {0};
                int recvLen = 0;
                unsigned char* RevTemp = NULL;
                //hex2dec((char*)cmd->send_buf,cmd->send_len,ucCmd,iCmdLen);
                if ( !strncmp((char*)cmd->send_buf, "801A040110", 10) ) {
                    strncpy((char*)cmd->send_buf , "801A440110", 10);
                }
                ret = SAMCAR1_APDU(g_dev_hd, (char*)cmd->send_buf, (char*)recvBuf, gErrMsg);
                recvLen = strlen(recvBuf);
                RevTemp = cmd->recv_buf;
                hex2dec((char*)recvBuf, recvLen, cmd->recv_buf, (int&)cmd->recv_len);
                cmd->recv_buf = RevTemp;
            }
            //}//del by chen 2012-01-16
        }
        if(ret) {
            cmd->cmd_retcode = 0;
            TRACE_ERR("执行指令错误,type["<<t<<"]");
            GetErrMsgByErrCode(ret,gErrMsg);
            strcpy(cmd->cmd_retmsg,gErrMsg);
            return KS_CMDERROR;
        }
        //if(cmd->recv_len < 2)
        //{
        //	cmd->cmd_retcode = 0;
        //	strcpy(cmd->cmd_retmsg,"读卡器读返回数据错误");
        //	cmd->cmd_retcode = 2;
        //	return KS_CMDERROR;
        //}
        sw1 = cmd->recv_buf[cmd->recv_len-2];
        sw2 = cmd->recv_buf[cmd->recv_len-1];
        if(sw1 != 0x90 && sw1 != 0x61) {
            ret = sw1;
            ret = ret*256 + sw2;
            cmd->cmd_retcode = ret;
            TRACE_ERR("执行指令返回状态错误,sw["<<std::hex<<(int)sw1<<" "<<(int)sw2<<"]");
            return cmd->cmd_retcode;
        }
        if(sw1 == 0x61 && sw2 != 0x00) {
            // 61XX ,调用 00C0 取后续数据
            TRACE_ERR("自动获取后续数据");
            memset(&innerCmd,0,sizeof innerCmd);
            innerCmd.send_len = sprintf(szCmd,"00C00000%02X",sw2);
            innerCmd.send_buf = (unsigned char*)szCmd;
            innerCmd.recv_buf = cmd->recv_buf;
            innerCmd.cmd_type = 1; // 16 hex
            ret = cpucard_cmd(dev,&innerCmd,t);
            if(ret==0) {
                cmd->recv_len = innerCmd.recv_len;
            }
            cmd->cmd_retcode = innerCmd.cmd_retcode;
            return ret;
        }
        return 0;
    }

    int KSAPI config_card(ks_reader_dev_t *dev,KS_CPUCARD_TYPE t) {
        return -1;
#if 0
        if(!g_dev_hd)
            return KS_PORT_NOTOPEN;
        if(t == CPUCARD_A)
            return dc_config_card(g_dev_hd,'A');
        else
            return dc_config_card(g_dev_hd,'B');
#endif
    }
    int KSAPI card_type() {
        return g_lastCardType;
    }
    void KSAPI set_logger(void *para) {
        KS_Log_Tracer::instance((KS_Log_Tracer*)para);
    }