// [03/24/2015 shizd DJ] 用通用接口读非接卡数据 int PubReadCardM1( void) { uchar ucRet; uchar ucConfig; uint uiLen; DevHandle hDevHandle; uchar ucDataout[256]; uchar ucKey[6] = {0x11, 0x11, 0x22, 0x22, 0x33, 0x33}; char szTrack2Buf[256]; ET_MAGCARD szTrack2; int nTrack2StxLen; // 保存二磁道SS标志的长度 int nTrack2FsPos; // 保存二磁道分隔符FS的位置 int i; ucRet = EA_ucOpenRfCardDevEI((char *)"COM1", &hDevHandle, &ucConfig);// by shizd20150324 内外置射频统一打开接口 if( ucRet != EM_SUCCESS ) { EA_vDisplay(2 ,"打开RFCARD失败!"); EA_ucCloseRfCardDevEI(&hDevHandle); // by shizd20150324 内外置射频统一关闭接口 PubuiInkey(2); return EXCEPTION; } EA_vDisplay(2 ,"请放卡"); uiLen = 0; BUFCLR(ucDataout); ucRet = EA_ucMIFActivateLib(hDevHandle, 5, &uiLen, ucDataout); EA_ucSetRFParamLib(hDevHandle,7,11);// by shizd20150324 统一在EA_ucMIFActivateLib之后调用 /* // 根据卡片类型进行激活 switch(ucMifType) { case EM_mifs_S50: ucRet = EA_ucMIFActivateLib(hDevHandle, EM_mifs_S50, &uiLen, ucDataout); break; case EM_mifs_S70: ucRet = EA_ucMIFActivateLib(hDevHandle, EM_mifs_S70, &uiLen, ucDataout); break; case EM_mifs_PROCARD: ucRet = EA_ucMIFActivateLib(hDevHandle, EM_mifs_PROCARD, &uiLen, ucDataout); break; case EM_mifs_PRO_S50: // 对于这种卡片,如果按照S50存储卡方式激活,则后继该卡只能做为S50存 储卡使用 // ucRet = EA_ucMIFCardActivate(hDevHandle, EM_mifs_S50, &uiLen, ucDataout); // 如果按照Pro卡方式激活,则后继该卡做为Pro卡使用 ucRet = EA_ucMIFCardActivate(hDevHandle, EM_mifs_PROCARD, &uiLen, ucDataout); break; case EM_mifs_PRO_S70: // 对于这种卡片,如果按照S70存储卡方式激活,则后继只能做为S70存储卡 使用 // ucRet = EA_ucMIFCardActivate(hDevHandle, EM_mifs_S70, &uiLen, ucDataout); // 如果按照Pro卡方式激活,则后继只能做为Pro卡使用 ucRet = EA_ucMIFCardActivate(hDevHandle, EM_mifs_PROCARD, &uiLen, ucDataout); break; case EM_mifs_TYPEBCARD: ucRet = EA_ucMIFCardActivate(hDevHandle, EM_mifs_TYPEBCARD, &uiLen, ucDataout); break; default: ucRet = EM_ERROR; break; } */ if( ucRet != EM_SUCCESS ) { EA_vDisplay(2 ,"激活卡片失败=%d!", ucRet); EA_ucCloseRfCardDevEI(&hDevHandle); PubuiInkey(2); return EXCEPTION; } else { // by shizd20150324 读取非接卡二磁道数据 ucRet = EA_ucMIFAuthToRamLib(hDevHandle, 2, EM_mifs_KEYA, ucKey); if (ucRet != EM_mifs_SUCCESS) { EA_vDisplay(2 ,"卡片认证失败!"); EA_ucCloseRfCardDevEI(&hDevHandle); PubuiInkey(2); return EXCEPTION; } BUFCLR(szTrack2Buf); BUFCLR(ucDataout); ucRet = EA_ucMIFReadLib(hDevHandle, 8, ucDataout); if (ucRet != EM_SUCCESS) { EA_vDisplay(2 ,"读卡片失败!"); EA_ucCloseRfCardDevEI(&hDevHandle); PubuiInkey(2); return EXCEPTION; } memcpy(szTrack2Buf, ucDataout, 16); BUFCLR(ucDataout); ucRet = EA_ucMIFReadLib(hDevHandle, 9, ucDataout); if (ucRet != EM_SUCCESS) { EA_vDisplay(2 ,"读卡片失败!"); EA_ucCloseRfCardDevEI(&hDevHandle); PubuiInkey(2); return EXCEPTION; } memcpy(szTrack2Buf+16, ucDataout, 16); BUFCLR(ucDataout); ucRet = EA_ucMIFReadLib(hDevHandle, 10, ucDataout); if (ucRet != EM_SUCCESS) { EA_vDisplay(2 ,"读卡片失败!"); EA_ucCloseRfCardDevEI(&hDevHandle); PubuiInkey(2); return EXCEPTION; } memcpy(szTrack2Buf+32, ucDataout, 2); EA_ucMIFHalt(hDevHandle);//by shizd20150324 挂起卡片 } memset ((char *) &szTrack2, 0, sizeof (ET_MAGCARD)); memcpy(szTrack2.aucTrkBuf , szTrack2Buf,strlen(szTrack2Buf)); szTrack2.ucTrkFlag = EM_mag_SUCCESS; szTrack2.ucTrkLength = strlen(szTrack2Buf); nTrack2StxLen = 0; for (i = 0; i < szTrack2.ucTrkLength; i++) // 确定分隔符FS的位置,如果不是0-9,就认为是FS,Mastercard的FS为符号'=' { if ((szTrack2.aucTrkBuf[i] < '0') || (szTrack2.aucTrkBuf[i] > '9')) break; } if (i >= szTrack2.ucTrkLength) // 若没找到分隔符,按PAN长度位最长算即19推算,FS的位置 { i = nTrack2StxLen + 19;//chenjs20061025 add } nTrack2FsPos = i; memcpy (GBTRANSDATA.stPosLs.szCardNo, szTrack2.aucTrkBuf + nTrack2StxLen, nTrack2FsPos - nTrack2StxLen); EA_vDisplay(2 ,"卡号:%s",GBTRANSDATA.stPosLs.szCardNo); EA_vDisplay(3 ,"请确认"); EA_uiInkey(10); EA_ucCloseRfCardDevEI(&hDevHandle); return NORMAL; }
void vHaveNoDialNum(void) { INT8 cTempNo[DIALNOLEN]; UINT8 i,ucAct,ucKeyValue; UINT8 ucReFlag=0,ucKeyFlag=0; vClearCallNo(); memset(cTempNo,0x00,sizeof(cTempNo)); while(1) { ucAct=ucGetActAndKey(&ucKeyValue); if(ucAct==KEYHIT) { switch(ucKeyValue) { case KEY_X07: ucKeyValue='#'; case KEY_X08: if(ucKeyValue==KEY_X08) { ucKeyValue='*'; } case KEY_0: case KEY_1: case KEY_2: case KEY_3: case KEY_4: case KEY_5: case KEY_6: case KEY_7: case KEY_8: case KEY_9: EA_cPhoneDial((char)ucKeyValue); vSetCallNo(ucKeyValue); vGetCallNo(cTempNo); display(3,cTempNo); ucKeyFlag=1; break; case KEY_REDIAL: if(ucKeyFlag==0) { cls(); EA_vDisplay(3, "无号码不可以重拨"); break; } vCallEnd();//挂机 ucReFlag=0; if(EA_cPhoneGetHs()) { vSwitchHandSet(); } else { vSwitchHandFree(); } EA_vDelayMs(400); memset(cTempNo, 0x00, sizeof(cTempNo)); vGetReDialNo(cTempNo); vClearCallNo(); EA_ucTeleDialStr(cTempNo); for(i = 0 ; i < strlen(cTempNo); i ++) { vSetCallNo(cTempNo[i]); } ucReFlag = 1; EA_vDisplay(1, " 重拨电话"); display(3, cTempNo); break; default: break; } } else if(ucAct==CALLON_SET) { vSwitchHandSet(); } else if(ucAct==CALLON_FREE) { vSwitchHandFree(); } else if(ucAct==CALLEND) { vCallEnd(); ucReFlag=0; return; } } }
int read_from_EFT(int *pLen, char *readstr) { char buffer[512]; ET_ProductInfo tProductInfo; uint unActLen; uchar ucRet; DevHandle hRS232Handle = EM_INVALID_HANDLE; unActLen = 0; #ifdef EPT_A9L memset(&tProductInfo, 0x00, sizeof(ET_ProductInfo)); EA_ucGetProductInfo(&tProductInfo); if ( memcmp(tProductInfo.acName , "E520" , 4) == 0 && tProductInfo.ucMachType == 2) { ucRet = EA_ucOpenDevice("COM3", 0, &hRS232Handle); } else { ucRet = EA_ucOpenDevice(SERIAL_PORT, 0, &hRS232Handle); } #else ucRet = EA_ucOpenDevice("COM", EM_io_PORT1, &hRS232Handle); #endif if (ucRet != EM_SUCCESS || hRS232Handle == EM_INVALID_HANDLE) { EA_vCls(); EA_vDisplay(2, "打开RS232口出错[%02x]", ucRet); EA_ucCloseDevice(&hRS232Handle); PubuiInkey(3); return (EXCEPTION); } ucRet = EA_ucInitRS232(hRS232Handle, EM_232_9600BPS, EM_232_NOPAR, EM_232_8DBS); if (ucRet != EM_SUCCESS) { EA_vCls(); EA_vDisplay(2, "RS232初始化错[%02x]", ucRet); EA_ucCloseDevice(&hRS232Handle); PubuiInkey(3); return (EXCEPTION); } while (1) { *pLen = 0; /* * read STX 0x02 until time out */ memset (buffer ,0 ,sizeof(buffer)); do { if(EM_key_HIT == EA_ucKBHit()) { EA_ucCloseDevice(&hRS232Handle); return (EXCEPTION); } EA_ucReadDeviceMs(hRS232Handle, 1, 10, buffer, &unActLen); } while (buffer[0] != 0x02); //read left data ucRet = EA_ucReadDeviceMs(hRS232Handle, 200, 10, buffer+1, &unActLen); if (ucRet != EM_SUCCESS || unActLen > 200) continue; // debug_print((char*)"SERIAL CMD", buffer, unActLen + 1);//FIXME *pLen = unActLen + 1; memcpy(readstr, buffer, *pLen); break; } //end of while EA_ucCloseDevice(&hRS232Handle); return (NORMAL); }
/***************************************************************** 函数原型:Device_Handle_Init() 功能描述:设备所有句柄初始化 参数描述: 返回值: OK ? NOTOK 作 者: 刘及华 日 期: 2012-11-24 修改历史: 日期 修改人 修改描述 ------ --------- ------------- *****************************************************************/ INT8U Device_Handle_Init(void) { uchar ucRet; uint cap_sd; if (EA_ucOpenDevice("RFCARD", EM_mifs_TYPEA, &hMifsHandle) != EM_SUCCESS) { lcddisperr("读卡器初始化失败"); return notok; } if ( EA_ucOpenDevice("PRINT", EM_io_REALMODE, &hDprinterHandle) != EM_SUCCESS ) { lcddisperr("获得打印操作句柄失败!"); return notok; } if ( EA_ucOpenDevice("USBD", EM_io_REALMODE, &hUSBDHandle) != EM_SUCCESS ) { lcddisperr("获得打印操作句柄失败!"); return notok; } // if ( EA_ucOpenDevice("WLM", 0, &hWLMHandle) != EM_SUCCESS ) // { // lcddisperr("获得GPRS句柄失败!"); // return notok; // } ///////////////////////////////////////////////打印机设置参数 ucRet = EA_ucInitPrinter(hDprinterHandle); if ( ucRet != EM_SUCCESS ) { EA_vDisplay(2, "初始化打印机芯失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_XSPACE, 0); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印字符间距设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_YSPACE, 8); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印行距设置失败"); return notok; } // ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE, 578); ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PAGESPACE , 180); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印页长度设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_DOTTYPE, EM_prn_ASCIIDOT24X12); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印ASCII字符设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_ASCII_PRNTYPE, EM_prn_ASCIIPRN1X1); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印ASCII字符大小失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_DOTTYPE, EM_prn_HZDOT24X24); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印汉字设置失败!"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_HZ_PRNTYPE, EM_prn_HZPRN1X1); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印汉字大小设置失败"); return notok; } ucRet = EA_ucSetPrinterFormat(hDprinterHandle, EM_prn_PRNGRAY, 4); if ( ucRet != EM_SUCCESS ) { lcddisperr("打印灰度设置失败"); return notok; } /////////////////////////////////////////////////////////////////////////////初始化时候只设置一次 if (EA_ucOpenDevice("SAM1CARD", 0, &hSam1Handle) != EM_SUCCESS) { lcddisperr("PSAM卡初始化失败"); return notok; } // if (EA_ucOpenDevice("USERCARD", 0, &hCpuHandle) != EM_SUCCESS) // { // lcddisperr("CPU卡初始化失败"); // return notok; // } // if (EA_ucICInitModule(hCpuHandle, EM_ic_VOLDEFAULT, EM_ic_TCRMODE) != EM_SUCCESS) // { // lcddisperr("设置CPU规范失败"); // return notok; // } ucRet = EA_ucOpenDevice("USBD", 0, &hRS232Handle); if ( ucRet != EM_SUCCESS ) { (void)EA_ucCloseDevice(&hRS232Handle); lcddisperr("COM口初始化失败!"); return notok; } ucRet = EA_ucInitRS232(hRS232Handle, EM_232_115200BPS, EM_232_NOPAR, EM_232_8DBS); if ( ucRet != EM_SUCCESS ) { (void)EA_ucCloseDevice(&hRS232Handle); lcddisperr("COM口设置失败!"); return notok; } //获取SD卡信息 ucRet = EA_ucGetDiskInfo(EM_DISK_SDCARD, &ptDiskInfo); if ( ucRet != EM_SUCCESS ) { lcddisperr("请插入SD卡!"); return notok; } cap_sd = ptDiskInfo.ullSize / 0x100000; EA_vDisplay(3, " SD卡可用容量%dM", cap_sd); SleepMs(2000); if(cap_sd < 1) { lcddisperr("请及时清理SD中数据!"); Beeperr(); } // // 分配空间来存储磁盘的分区列表 // ptPartList = EA_pvMalloc(ptDiskInfo.uiPartNum * sizeof(ptPartList)); // if (!ptPartList) // { // lcddisperr("分配SD卡缓存区失败!"); // return notok; // } // // 获取磁盘的分区列表 // ucRet = EA_ucGetPartList(EM_DISK_SDCARD, ptDiskInfo.uiPartNum, &uiRealPartNum, ptPartList); // if (ucRet != EM_SUCCESS) // { // EA_vFree(ptPartList); // lcddisperr("获取SD卡列表失败!"); // return notok; // } // // EA_vDisplay(1, "分区数目:%d", ptDiskInfo.uiPartNum); // SleepMs(3000); ucRet = EA_ucGetPartInfo(EM_DISK_SDCARD, 0, &ptPartInfo); if (ucRet != EM_SUCCESS) { lcddisperr("获取SD卡分区信息失败!"); return notok; } return ok; }
/****************************************************************************** 函数名称:print_work_note_history 功能描述:打印日结算历史票据 参数名称:输入/输出? 类型 描述 输入 返 回 值: 作 者 :于福勇 日 期:2004-09-02 修改历史: 日期 修改人 修改描述 ------ --------- ------------- ******************************************************************************/ void print_work_note_his(INT8U * rec) { uchar ucRet; INT8U RecBuff[70]; INT8U strbuff[50]; INT8U time[7+2]; _BANLANCE_IN_HAND * prec = (_BANLANCE_IN_HAND *)rec; EA_vCls(); EA_vDisplay(1, " 历史日结帐单打印 ");//(int qx, int qy, char * ceStr, int xyFlag) EA_vDisplay(2, " 请等待... ");//(int qx, int qy, char * ceStr, int xyFlag) SleepMs(1500); memset(RecBuff, 0, sizeof(RecBuff)); ucRet = EA_ucGetPrinterStatus(hDprinterHandle); //打印前必须判断打印机的状态 if( ucRet == EM_prn_PAPERENDED ) { EA_vCls(); EA_vDisplay(1, " 缺纸,打印失败! "); EA_vDisplay(2, " 请放入纸张后 "); EA_vDisplay(3, " 按确认任意键 "); EA_uiInkey(0); } if( ucRet == EM_prn_OVERHEAT ) { EA_vDisplay(2, " 机芯温度过高 "); EA_vDisplay(3, " 请稍后再打印 "); EA_uiInkeyMs(500); return; } if( ucRet == EM_prn_LOWVOL ) { EA_vDisplay(2, " 电池电量过低 "); EA_vDisplay(3, " 请充电后再打印 "); EA_uiInkeyMs(500); return; } (void)EA_ucPrinterAutoFeeding(hDprinterHandle); ///打印头 (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"淄博市公共汽车公司\r\n"); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"日结帐单历史记录\r\n"); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"------------------------------\r\n"); //消费次数 sprintf((void *)strbuff, "天然气加气次数 :%6d次\r\n", prec->consume_cnt[0]); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "汽油93#加油次数:%6d次\r\n", prec->consume_cnt[1]); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "汽油97#加油次数:%6d次\r\n", prec->consume_cnt[2]); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "柴油加油次数 :%6d次\r\n", prec->consume_cnt[3]); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"------------------------------\r\n"); //消费体积 sprintf((void *)strbuff, "天然气体积 :%6.2lf元\r\n", (double)(prec->consume_cap[0])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "汽油93#体积:%6.2lf元\r\n", (double)(prec->consume_cap[1])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "汽油97#体积:%6.2lf元\r\n", (double)(prec->consume_cap[2])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "柴 油 体 积:%6.2lf元\r\n", (double)(prec->consume_cap[3])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"------------------------------\r\n"); //消费金额 sprintf((void *)strbuff, "天然气金额 :%6.2lf元\r\n", (double)(prec->consume_amt[0])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "汽油93#金额:%6.2lf元\r\n", (double)(prec->consume_amt[1])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "汽油97#金额:%6.2lf元\r\n", (double)(prec->consume_amt[2])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); sprintf((void *)strbuff, "柴 油 金 额:%6.2lf元\r\n", (double)(prec->consume_amt[3])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"------------------------------\r\n"); sprintf((void *)strbuff, "总 金 额 :%6.2lf元\r\n", (double)(prec->consume_amt[0]+prec->consume_amt[1]+prec->consume_amt[2] +prec->consume_amt[3])/100); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)"------------------------------\r\n"); //上班时间 memcpy(time, (INT8U*)&prec->work_datetime, 7); sprintf((void *)strbuff, "上班时间:\r\n"); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char*)strbuff); sprintf((void *)strbuff, "%02X%02X-%02X-%02X %02X:%02X:%02X\r\n", time[0],time[1],time[2],time[3],time[4],time[5],time[6]); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char*)strbuff); //下班时间 memcpy(time, (INT8U*)&prec->down_datetime,7); sprintf((void *)strbuff, "下班时间:\r\n"); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char*)strbuff); sprintf((void *)strbuff, "%02X%02X-%02X-%02X %02X:%02X:%02X\r\n", time[0],time[1],time[2],time[3],time[4],time[5],time[6]); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char*)strbuff); //分行符号 strcpy((void *)strbuff, "---------------------------------- \r\r\r"); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); //设备编号 htoa(RecBuff, &prec->equ_id[0], 3); sprintf((void *)strbuff, "设备编号 :%s\r\n", RecBuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); //商户号 htoa(RecBuff, &prec->acnt_id[0], 2); sprintf((void *)strbuff, "站 点 号:%s\r\n", RecBuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); //操作员号 htoa(RecBuff, &prec->oper_id[0], 1); sprintf((void *)strbuff, "加油员工号:%s\r\n", RecBuff); (void)EA_ucLinePrinter(hDprinterHandle, 0, (char *)strbuff); // 打印最后调用换页命令 ucRet = EA_ucLinePrinter(hDprinterHandle, 0, "\f"); if ( ucRet == EM_SUCCESS ) { EA_vDisplay(2, "本次打印结束!"); Beep(1000); EA_uiInkeyMs(2000); } }
// ***************************************************************** // 功能: man_set_busnum // 说明: 手动输入车号 // 入口参数: // 出口参数: Null // 作者: // 返回值: Null // ***************************************************************** void man_set_busnum(void) { INT8U i = 0; INT8U input1[20]; uchar uckey; uint uikey; uchar ret; uchar temp_uc[5]; // if ( strcmp((void *)&DevStat.bus_number[0], "12345") == 0 ) // { // goto set_bus_number; // } EA_vCls(); lcddisp(2, 1, (void *)"输入车号: "); strcpy((void *)input1, ""); for ( ;; ) { i = EA_ucGetInputStr(2, 10, 20, EM_BIG_FONT | EM_MODE_CHAR | EM_ALIGN_LEFT | EM_SHOW_ORIGINALLY , 5, 5, 0, (void *)input1); //刘及华,修改只能输入数字和字母 if ( i == EM_SUCCESS ) break; if ( i == EM_ABOLISH ) return; //do nothing } memcpy((void *)&CardInfo.bus_number[0], (void *)input1, 5); WriteParam(); EA_ucSetInverse(EM_lcd_INVON); lcddisp(3, 1, (void *)" 输入成功 "); EA_ucSetInverse(EM_lcd_INVOFF); SleepMs(1500); RESELECT: memcpy(temp_uc, &CardInfo.bus_number[0], 5); i = BlackName_Find((char *)temp_uc); //白名单判断 if ( i != ok ) //不是白名单 { lcddisperr("该卡不在白名单中"); Beeperr(); return; } EA_vCls(); EA_vDisplay(1, "车 号 :鲁C-%s", CardInfo.bus_number); lcddisp(4, 1, (void *)" 请刷员工卡 "); while(1) { if( CardInit() == ok ) break; uckey = EA_ucKBHit(); if ( uckey == EM_key_HIT ) //按下取消键 { uikey = EA_uiInkey(0); if ( uikey == EM_key_CANCEL ) //按下取消键 { return ; } } } ret = M1CardProcess(); //再检测员工卡 if(ret == ok) { ; } else { goto RESELECT; } return; }
/* ucKeyFileID : 密钥文件ID ucBossNo[] : 商户号,有效长度15 ucTermNo[] : 终端号,有效长度8 返回值 uiRecID : 记录号(第几组密钥) uiState : 状态,0表示可用,1表示已用 uiKEKIndex : KEK索引 ucKeyInfo[] : 密钥信息,有效长度24 步骤: 1、通过 商户号+终端号,搜索密钥文件是否存在该记录,返回记录号uiRecID 2、若存在该记录,读取该记录信息。返回 EM_SUCCESS 3、若不存在该记录,返回 EM_ERROR */ uchar ucKeyExtract(uchar ucKeyFileID,uchar ucBossNo[],uchar ucTermNo[],uint *uiRecID,uint *uiState,uint *uiKEKIndex, uchar ucKeyInfo[] ,uchar * ucTMKIndex) { uchar ucResult; //返回API函数的结果 ushort usLen,usOffset; //用于搜索 uchar ucSearchArr[23]; //存放 商户号+终端号,用于搜索 uchar ucBuff[30]; //搜索关键字格式 uint iIndex; //用于循环 uchar ucRecInfo[100]; //ucKeyInfo[]+1字节的状态字(初始为0x00) uint uiRecCntW; uint uiTmkIndex; //搜索是否有同一 (商户号+终端号) for( iIndex = 0; iIndex < 15; iIndex++) ucSearchArr[iIndex] = ucBossNo[iIndex]; for( iIndex = 0; iIndex < 8; iIndex++) ucSearchArr[15 + iIndex] = ucTermNo[iIndex]; //先构造搜索关键字 usLen = 23; // 要查找数据的长度 An23: 商户号An15 + 终端号An8 usOffset = 0; // 从版本号 N4 字符串后面开始,strlen("0001") memcpy(ucBuff, &usLen, sizeof(ushort)); // 拷贝要查找的关键字长度 memcpy(&ucBuff[sizeof(ushort)], &usOffset, sizeof(ushort)); // 拷贝要查找数据在记录中的偏移 memcpy(&ucBuff[2*sizeof(ushort)], ucSearchArr, usLen); // 拷贝要查找的关键字 usOffset = 0; // 结束查找数据 memcpy(&ucBuff[2*sizeof(ushort)+usLen], &usOffset, sizeof(ushort)); *uiRecID=0; //从文件头信息文件中 第一条记录 开始查找 ucResult =EA_ucPFFindRec( ucKeyFileID, 1, ucBuff, uiRecID); if( ucResult == EM_SUCCESS && uiRecID != 0 ) { //读取记录信息 if(EA_ucPFReadRec( ucKeyFileID, *uiRecID, 1, &uiRecCntW, ucRecInfo) ==EM_SUCCESS) { //提取记录信息供返回 //状态 *uiState = ucRecInfo[48] - '0'; //KEY索引 *uiKEKIndex = ucRecInfo[47]/16*10 + ucRecInfo[47] % 16; uiTmkIndex = ucRecInfo[49]/16*10 + ucRecInfo[49] % 16; sprintf(ucTMKIndex , "%02d" , uiTmkIndex); #ifdef SET_DEBUG PubDisplay(1 , "[%ld]tmk[%ld]", *uiKEKIndex ,uiTmkIndex ); PubDisplay(2 , "[%02x][%02x]" , ucRecInfo[47] , ucRecInfo[49]); PubuiInkey(0); #endif //密钥密文 for( iIndex = 0; iIndex < 24; iIndex++) ucKeyInfo [iIndex] = ucRecInfo [23 + iIndex]; } } else if( ucResult == EM_ffs_NOTFIND || ucResult == EM_ffs_INPUTERR) { //记录未找到,或者输入参数错误 PubClearAll(); PubDisplayInv(1, "错误"); PubDisplayCen(3,"没有找到匹配的密钥"); PubuiInkey(3); return EM_ERROR; } else { //其他出错 PubClearAll(); if(ucResult == EM_ffs_CHECKERR) EA_vDisplay(4,"内存变量校验出错"); if(ucResult == EM_ffs_FLASHERR) EA_vDisplay(4,"flash坏"); if(ucResult == EM_ffs_NOTFMT) EA_vDisplay(4,"未格式化"); if(ucResult == EM_ffs_SYSCLP) EA_vDisplay(4,"文件系统崩溃"); if(ucResult == EM_ffs_NOTOPEN) EA_vDisplay(4,"未打开文件"); PubuiInkey(3); //关闭文件 ucResult = EA_ucPFClose( ucKeyFileID ); return EM_ERROR; } return EM_SUCCESS; }