Commite9bfd6a0 by developer4

project skeleton (initial)

Do not use this revision. This is just one of the first steps in creating a project.
家长 97a87ebe
This diff is collapsed.Click to expand it.
[submodule "lib"]
path = lib
url = https://git.d-logic.net/nfc-rfid-reader-sdk/ufr-lib.git
ufr-apdu-credit_card_reader
org.eclipse.cdt.managedbuilder.core.genmakebuilder
clean,full,incremental,
org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
full,incremental,
org.eclipse.cdt.core.cnature
org.eclipse.cdt.managedbuilder.core.managedBuildNature
org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
eclipse.preferences.version=1
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/MINGW_HOME/delimiter=;
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/MINGW_HOME/operation=replace
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/MINGW_HOME/value=C\:\\mingw-w64\\x86_64-5.1.0-posix-seh-rt_v4-rev0\\mingw64
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/append=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/appendContributed=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/MINGW_HOME/delimiter=;
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/MINGW_HOME/operation=replace
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/MINGW_HOME/value=C\:\\mingw-w64\\i686-5.1.0-posix-dwarf-rt_v4-rev0\\mingw32
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/append=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/appendContributed=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/MINGW_HOME/delimiter=;
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/MINGW_HOME/operation=replace
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/MINGW_HOME/value=C\:\\mingw-w64\\i686-5.1.0-posix-dwarf-rt_v4-rev0\\mingw32
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/append=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/appendContributed=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/MINGW_HOME/delimiter=;
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/MINGW_HOME/operation=replace
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/MINGW_HOME/value=C\:\\mingw-w64\\x86_64-5.1.0-posix-seh-rt_v4-rev0\\mingw64
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/append=true
环境/项目/ cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/appendContributed=true
eclipse.preferences.version=1
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/CPATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/C_INCLUDE_PATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/appendContributed=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/CPATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/C_INCLUDE_PATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/appendContributed=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/CPATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/C_INCLUDE_PATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/appendContributed=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/CPATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/CPATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/C_INCLUDE_PATH/delimiter=;
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/C_INCLUDE_PATH/operation=remove
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/append=true
环境/ buildEnvironmentInclude / cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/LIBRARY_PATH/delimiter=;
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1226322284/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/LIBRARY_PATH/delimiter=;
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369.2075570673/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/LIBRARY_PATH/delimiter=;
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958.1777558369/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/LIBRARY_PATH/delimiter=;
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.mingw.exe.release.1272368177.226908958/appendContributed=true
lib@a964c443
Subproject commit a964c443c5dcf60371f3be82935dfef65b8d589f
/*
* ini.h
*/
#ifndef INI_H_
#define INI_H_
#define APP_VERSION "1.0"
#define EXIT_ON_WRONG_FW_DEPENDENCY
#define MIN_DEPEND_FW_VER_MAJOR 3
#define MIN_DEPEND_FW_VER_MINOR 9
#define MIN_DEPEND_FW_VER_BUILD 39
#define EXIT_ON_WRONG_LIB_DEPENDENCY
#define MIN_DEPEND_LIB_VER_MAJOR 4
#define MIN_DEPEND_LIB_VER_MINOR 0
#define MIN_DEPEND_LIB_VER_BUILD 26
#endif/* INI_H_ */
/*
============================================================================
Project Name: uFR APDU Credit Card Reader Example
Name : main.c
作者:d-logic
Version :
Copyright : 2017.
Description : uFR APDU Credit Card Reader Example in C, (C99)
Dependencies: uFR firmware - min. version 3.9.39
uFRCoder library - min. version 4.0.26
============================================================================
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include "ini.h"
#include "uFR.h"
#include "utils.h"
//------------------------------------------------------------------------------
#define MAX_BUFF_LEN 256
//------------------------------------------------------------------------------
typedefenumE_MENU_ITEMS{
TOP_MENU_LEVEL,APDU_MENU_LEVEL
}menu_levels_t;
menu_levels_tmenu_level=TOP_MENU_LEVEL;
voidmenu(charkey);
voidusage(void);
UFR_STATUSNewCardInField(uint8_tsak,uint8_t*uid,uint8_tuid_size);
//------------------------------------------------------------------------------
intmain(void){
charkey;
boolcard_in_field=false;
uint8_told_sak=0,old_uid_size=0,old_uid[10];
uint8_tsak,uid_size,uid[10];
UFR_STATUSstatus;
usage();
printf(" --------------------------------------------------\n");
printf(" Please wait while opening uFR NFC reader.\n");
printf(" --------------------------------------------------\n");
status=ReaderOpen();
if(status!=UFR_OK){
printf(" Error while opening device, status is: 0x%08X\n",status);
getchar();
returnEXIT_FAILURE;
}
if(!CheckDependencies()){
ReaderClose();
getchar();
returnEXIT_FAILURE;
}
status=ReaderReset();
if(status!=UFR_OK){
printf(" Error while opening device, status is: 0x%08X\n",status);
getchar();
returnEXIT_FAILURE;
}
printf(" --------------------------------------------------\n");
printf(" uFR NFC reader successfully opened.\n");
printf(" --------------------------------------------------\n");
do{
while(!_kbhit()){
status=GetCardIdEx(&sak,uid,&uid_size);
switch(status){
caseUFR_OK:
if(card_in_field){
if(old_sak!=sak||old_uid_size!=uid_size||memcmp(old_uid,uid,uid_size)){
old_sak=sak;
old_uid_size=uid_size;
memcpy(old_uid,uid,uid_size);
NewCardInField(sak,uid,uid_size);
}
}else{
old_sak=sak;
old_uid_size=uid_size;
memcpy(old_uid,uid,uid_size);
NewCardInField(sak,uid,uid_size);
card_in_field=true;
}
break;
caseUFR_NO_CARD:
menu_level=TOP_MENU_LEVEL;
card_in_field=false;
status=UFR_OK;
break;
default:
ReaderClose();
printf(" Fatal error while trying to read card, status is: 0x%08X\n",status);
getchar();
returnEXIT_FAILURE;
}
Sleep(500);
}
key=_getch();
menu(key);
}while(key!='\x1b');
ReaderClose();
returnEXIT_SUCCESS;
}
//------------------------------------------------------------------------------
voidmenu(charkey){
switch(key){
case'1':
if(menu_level==APDU_MENU_LEVEL)
ReadSystemFileOnST_M24SR();
break;
case'2':
if(menu_level==APDU_MENU_LEVEL)
ReadNfcCC();
break;
case'3':
if(menu_level==APDU_MENU_LEVEL)
ReadNfcNdef();
break;
case'\x1b':
break;
default:
usage();
break;
}
}
//------------------------------------------------------------------------------
voidusage(void){
switch(menu_level){
caseAPDU_MENU_LEVEL:
printf(" -------------------------------------------------------------------\n");
printf(" ISO14443-4 tag detected, choose one of the supported APDU commands:\n");
printf(" -------------------------------------------------------------------\n");
break;
default:
printf(" +------------------------------------------------+\n"
" | uFR APDU Credit Card Reader Example |\n"
" | version "APP_VERSION" |\n"
" +------------------------------------------------+\n");
printf(" When You put ISO14443-4 tag in the reader field,\n"
" You will be prompted for appropriate APDU to send.\n"
"\n"
”exit, hit escape.\n");
printf(" --------------------------------------------------\n");
break;
}
}
//------------------------------------------------------------------------------
UFR_STATUSNewCardInField(uint8_tsak,uint8_t*uid,uint8_tuid_size){
UFR_STATUSstatus;
uint8_tdl_card_type;
status=GetDlogicCardType(&dl_card_type);
if(status!=UFR_OK)
returnstatus;
printf("\a-------------------------------------------------------------------\n");
printf(" Card type: %s, sak = 0x%02X, uid[%d] = ",GetDlTypeName(dl_card_type),sak,uid_size);
print_hex_ln(uid,uid_size,":");
printf(" -------------------------------------------------------------------\n");
if(dl_card_type==DL_UNKNOWN_ISO_14443_4){
menu_level=APDU_MENU_LEVEL;
usage();
}elseif(menu_level==APDU_MENU_LEVEL){
menu_level=TOP_MENU_LEVEL;
}
returnUFR_OK;
}
//------------------------------------------------------------------------------
voidReadSystemFileOnST_M24SR(void){
UFR_STATUSstatus;
size_tresponse_len;
uint8_tresponse[MAX_BUFF_LEN];
char*resp=NULL;
uint8_tsw[2];
uint32_tle;
uint16_t*sw16_ptr=(uint16_t*)&sw;
printf(" -------------------------------------------------------------------\n");
printf(" Read file on tag\n");
printf(" -------------------------------------------------------------------\n");
status=SetISO14443_4_Mode();
if(status!=UFR_OK){
printf(" Error while switching into ISO 14443-4 mode, uFR status is: 0x%08X\n",status);
return;
}
printf(" 1. Issuing\"NDEF Tag Application Select\"command:\n"
" [C] 00 A4 04 00 07 D2 76 00 00 85 01 01 00\n");
response_len=MAX_BUFF_LEN;
status=ApduCommand("00 A4 04 00 07 D2760000850101 00",&resp,sw);
if(status!=UFR_OK){
s_block_deselect(100);
printf(" Error while executing APDU command, uFR status is: 0x%08X\n",status);
return;
}else{
if(*sw16_ptr!=0x90){
s_block_deselect(100);
printf(" Could not continue execution due to an APDU error.\n");
printf(" [SW] ");
print_hex_ln(sw,2," ");
return;
}
response_len=strlen(resp);
printf(" APDU command executed: response data length = %d\n",(int)response_len);
printf(" [R] %s\n",resp);
printf(" [SW] ");
print_hex_ln(sw,2," ");
printf(" -------------------------------------------------------------------\n");
}
s_block_deselect(100);
}
//------------------------------------------------------------------------------
/*
* uFR.c
*/
#include
#include
#include
#include
#include
#include
#include "ini.h"
#include "uFR.h"
//------------------------------------------------------------------------------
size_thex2bin(uint8_t*dst,constchar*src){
size_tdst_len=0;
chars_tmp[3];
s_tmp[2]='\0';
while(*src){
while(((char)*src<'0'||(char)*src>'9')
&&((char)*src<“一个”||(char)*src>'f')
&&((char)*src<'A'||(char)*src>'F'))
src++;// skip delimiters, white spaces, etc.
s_tmp[0]=(char)*src++;
// Must be pair of the hex digits:
if(!(*src))
break;
// And again, must be pair of the hex digits:
if(((char)*src<'0'||(char)*src>'9')
&&((char)*src<“一个”||(char)*src>'f')
&&((char)*src<'A'||(char)*src>'F'))
break;
s_tmp[1]=(char)*src++;
*dst++=strtoul(s_tmp,NULL,16);
dst_len++;
}
returndst_len;
}
//------------------------------------------------------------------------------
UFR_STATUSApduCommand(sz_ptrapdu,char**response,uint8_t*sw){
UFR_STATUSstatus;
status=APDUHexStrTransceive(apdu,response);
if(status)
returnstatus;
if(strlen(*response)%2)
returnUFR_PARAMETERS_ERROR;
if(strlen(*response)>=4){
hex2bin(sw,*response+strlen(*response)-4);
*(*response+strlen(*response)-4)='\0';
}
else
returnUFR_PARAMETERS_ERROR;
returnUFR_OK;
}
//------------------------------------------------------------------------------
boolCheckDependencies(void){
#if defined(EXIT_ON_WRONG_FW_DEPENDENCY) || defined(EXIT_ON_WRONG_LIB_DEPENDENCY)
uint8_tversion_major,version_minor,build;
boolwrong_version=false;
#endif
UFR_STATUSstatus;
#ifdef EXIT_ON_WRONG_LIB_DEPENDENCY
#endif
#ifdef EXIT_ON_WRONG_FW_DEPENDENCY
wrong_version=false;
status=GetReaderFirmwareVersion(&version_major,&version_minor);
if(status!=UFR_OK){
printf(" Error while checking device version, status is: 0x%08X\n",status);
returnfalse;
}
status=GetBuildNumber(&build);
if(status!=UFR_OK){
printf(" Error while checking device version, status is: 0x%08X\n",status);
returnfalse;
}
if(version_major<MIN_DEPEND_FW_VER_MAJOR){
wrong_version=true;
}elseif(version_major==MIN_DEPEND_FW_VER_MAJOR&&version_minor<MIN_DEPEND_FW_VER_MINOR){
wrong_version=true;
}elseif(version_minor==MIN_DEPEND_FW_VER_MINOR&&build<MIN_DEPEND_FW_VER_BUILD){
wrong_version=true;
}
if(wrong_version){
printf("Wrong uFR NFC reader firmware version (%d.%d.%d).\n"
"Please update uFR firmware to at last %d.%d.%d version.\n",version_major,version_minor,build,
MIN_DEPEND_FW_VER_MAJOR,MIN_DEPEND_FW_VER_MINOR,MIN_DEPEND_FW_VER_BUILD);
returnfalse;
}
#endif
returntrue;
}
//------------------------------------------------------------------------------
sz_ptrGetDlTypeName(uint8_tdl_type_code){
switch(dl_type_code){
caseDL_MIFARE_ULTRALIGHT:
return"DL_MIFARE_ULTRALIGHT";
caseDL_MIFARE_ULTRALIGHT_EV1_11:
return"DL_MIFARE_ULTRALIGHT_EV1_11";
caseDL_MIFARE_ULTRALIGHT_EV1_21:
return"DL_MIFARE_ULTRALIGHT_EV1_21";
caseDL_MIFARE_ULTRALIGHT_C:
return"DL_MIFARE_ULTRALIGHT_C";
caseDL_NTAG_203:
return"DL_NTAG_203";
caseDL_NTAG_210:
return"DL_NTAG_210";
caseDL_NTAG_212:
return"DL_NTAG_212";
caseDL_NTAG_213:
return"DL_NTAG_213";
caseDL_NTAG_215:
return"DL_NTAG_215";
caseDL_NTAG_216:
return"DL_NTAG_216";
caseDL_MIKRON_MIK640D:
return"DL_MIKRON_MIK640D";
caseDL_MIFARE_MINI:
return"DL_MIFARE_MINI";
caseDL_MIFARE_CLASSIC_1K:
return"DL_MIFARE_CLASSIC_1K";
caseDL_MIFARE_CLASSIC_4K:
return"DL_MIFARE_CLASSIC_4K";
caseDL_MIFARE_PLUS_S_2K:
return"DL_MIFARE_PLUS_S_2K";
caseDL_MIFARE_PLUS_S_4K:
return"DL_MIFARE_PLUS_S_4K";
caseDL_MIFARE_PLUS_X_2K:
return"DL_MIFARE_PLUS_X_2K";
caseDL_MIFARE_PLUS_X_4K:
return"DL_MIFARE_PLUS_X_4K";
caseDL_MIFARE_DESFIRE:
return"DL_MIFARE_DESFIRE";
caseDL_MIFARE_DESFIRE_EV1_2K:
return"DL_MIFARE_DESFIRE_EV1_2K";
caseDL_MIFARE_DESFIRE_EV1_4K:
return"DL_MIFARE_DESFIRE_EV1_4K";
caseDL_MIFARE_DESFIRE_EV1_8K:
return"DL_MIFARE_DESFIRE_EV1_8K";
caseDL_UNKNOWN_ISO_14443_4:
return"DL_GENERIC_ISO_14443_4";
caseDL_IMEI_UID:
return"DL_IMEI_UID";
}
return"UNSUPPORTED CARD";
}
//------------------------------------------------------------------------------
/*
* uFR.h
*/
#ifndef UFR_H_
#define UFR_H_
#include "ini.h"
//------------------------------------------------------------------------------
typedefconstchar*sz_ptr;
//------------------------------------------------------------------------------
UFR_STATUSApduCommand(sz_ptrapdu,char**response,uint8_t*sw);
size_thex2bin(uint8_t*dst,constchar*src);
boolCheckDependencies(void);
sz_ptrGetDlTypeName(uint8_tdl_type_code);
//------------------------------------------------------------------------------
#endif/* UFR_H_ */
/*
* utils.c
*/
#include
#include
#include
#include "ini.h"
#include "utils.h"
//------------------------------------------------------------------------------
voidprint_ln_len(charsymbol,uint8_tcnt){
for(inti=0;i<cnt;i++)
printf("%c",symbol);
printf("\n");
}
//------------------------------------------------------------------------------
inlinevoidprint_ln(charsymbol){
print_ln_len(symbol,DEFAULT_LINE_LEN);
}
//------------------------------------------------------------------------------
voidprint_hex(constuint8_t*data,uint32_tlen,constchar*delimiter){
for(inti=0;i<len;i++){
printf("%02X",data[i]);
if((delimiter!=NULL)&&(i<(len-1)))
printf("%c",*delimiter);
}
}
//------------------------------------------------------------------------------
voidprint_hex_ln(constuint8_t*data,uint32_tlen,constchar*delimiter){
print_hex(data,len,delimiter);
printf("\n");
}
//==============================================================================
/*
* utils.h
*/
#ifndef UTILS_H_
#define UTILS_H_
#define DEFAULT_LINE_LEN 60
voidprint_ln_len(charsymbol,uint8_tcnt);
voidprint_ln(charsymbol);
voidprint_hex(constuint8_t*data,uint32_tlen,constchar*delimiter);
voidprint_hex_ln(constuint8_t*data,uint32_tlen,constchar*delimiter);
#endif/ * UTILS_H_ * /
@echo off
set path=..\lib\windows\x86;%path%
ufr-apdu-credit_card_reader.exe
\ No newline at end of file
@echo off
set path=..\lib\windows\x86;%path%
ufr-apdu-credit_card_reader.exe
\ No newline at end of file
@echo off
set path=..\lib\windows\x86_64;%path%
ufr-apdu-credit_card_reader.exe
\ No newline at end of file
@echo off
set path=..\lib\windows\x86_64;%path%
ufr-apdu-credit_card_reader.exe
\ No newline at end of file
    Markdownis supported
    0%or
    You are about to add0peopleto the discussion. Proceed with caution.
    Finish editing this message first!
    Pleaseregisterorto comment
    Baidu
    map