#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include "RS232dev.h"
#include "libUnionPayCard.h"
#include <android/log.h>
#define TAG "UnionPayCard"
#define LOGE(fmt,args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
#define LOGD(fmt,args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
/*
cc -fPIC -c libUnionPayCard.c
cc -shared -o libUnionPayCard.so libUnionPayCard.o $@ -L. -Wl,--whole-archive -lCrt310r004device -Wl,--no-whole-archive
========================================================================
cc -c -O libUnionPayCard_Test_Cpu_Card.c
cc libUnionPayCard_Test_Cpu_Card.o -ldl -o libUnionPayCard_Test_Cpu_Card
./libUnionPayCard_Test_Cpu_Card
*/
#define DebugDll 2
#define FALSE -1
#define TRUE 0
#define RET_OK 0
//读卡器状态码
#define CARD_STATE_NOCARD 0 //机内无卡
#define CARD_STATE_CARDOFGATE 1 //卡在门口
#define CARD_STATE_CARDOFINSIDE 2 //机内有卡
#define STATE_READER_NO_READER_ERROR 203000 //错误,读卡器内部无卡(由于无卡产生的错误)
#define STATE_READER_OTHER_ERROR 203001 //错误,其它失败(如超时未插卡,操作卡片时卡被移动,卡没有上电就传输数据等)
#define STATE_READER_READ_TRACK_FAILED 203002 //错误,读磁卡数据失败
#define STATE_READER_CPU_POWERON_FAILED 203003 //错误,CPU卡上电失败
#define STATE_READER_CPU_CHIPIO_FAILED 203004 //错误,CPU卡读写数据失败
#define STATE_READER_CPU_POWEROFF_FAILED 203005 //错误,CPU卡下电失败
#define STATE_READER_RF_POWERON_FAILED 203006 //错误,RF卡上电失败
#define STATE_READER_RF_CHIPIO_FAILED 203007 //错误,RF卡读写数据失败
#define STATE_READER_RF_POWEROFF_FAILED 203008 //错误,RF卡下电失败
#define STATE_READER_SIM_SELECTSLOT_FAILED 203009 //错误,SIM卡座失败
#define STATE_READER_SIM_POWERON_FAILED 203010 //错误,SIM卡上电失败
#define STATE_READER_SIM_CHIPIO_FAILED 203011 //错误,SIM卡读写数据失败
#define STATE_READER_SIM_POWEROFF_FAILED 203012 //错误,SIM卡下电失败
#define STATE_READER_CARD_COMEIN_FAILED 303001 //维护,进卡夹卡(应用尝试一次读卡器初始化,不成功就报读卡器故障)
#define STATE_READER_CARD_EJECT_FAILED 303002 //维护,退卡夹卡(应用尝试一次读卡器初始化,不成功就报读卡器故障)
#define STATE_READER_CARD_CAPTURE_FAILED 303003 //维护,吞卡夹卡(应用尝试一次读卡器初始化,不成功就报读卡器故障)
#define STATE_READER_COMMUTIE_BAD 403000 //故障,读卡器故障
#define STATE_READER_PORT_EXIST 403001 //故障,端口不存在(端口指串口或并口)
#define STATE_READER_PORT_FAILED 403002 //故障,端口打开失败
#define STATE_READER_TIMEOUT 403003 //故障,无响应(读卡器未连接,通讯超时,读卡器故障)
#define STATE_READER_RECV_FAILED 403004 //故障,数据接收异常
char devicename[100]={0};
void WTraceEX(char *chInfo);
int icomporthdl; //device Number Address
int iCPUCardType;
int iRFCardType;
int iSIMCardType;
int iSIMCardNumber;
char LogInfo[2048]={0};
int GetDllVersion(char* VersMes);
int OpenDevice(char *sPort, char* sMes);
int CloseDevice(char* sMes);
int InitDevice (int Option,char* sMes);
int GetFirewareVersion(char* VerMessage, char* sMes);
int ReaderCapabilities(int *iCardOption,int *iDeviceType,char* sMes);
int GetDeviceStatus(int *iCardStatus,char * sMes);
int CallEntry(char* sMes);
int DisEntry (char* sMes);
int Eject(char* sMes);
int Capture(char* sMes);
int ReadTracks(int track_id, char *track_datas, char* sMes);
int CPUPowerOn(unsigned char* AtrData,int *AtrDataLen, char* sMes);
int CPUChipIo(unsigned char* InDataBuf, int InLen, unsigned char* OutDataBuf, int *OutLen, char* sMes);
int CPUPowerOff(char* sMes);
int RFPowerOn(unsigned char* AtrData,int *AtrDataLen, char* sMes);
int RFChipIo(unsigned char* InDataBuf, int InLen, unsigned char* OutDataBuf, int *OutLen, char* sMes);
int RFPowerOff(char* sMes);
int SIMSelectSlot(int SlotNumber, char* sMes);
int SIMPowerOn(unsigned char* AtrData,int *AtrDataLen, char* sMes);
int SIMChipIo(unsigned char* InDataBuf, int InLen, unsigned char* OutDataBuf, int *OutLen, char* sMes);
int SIMPowerOff(char* sMes);
//===============================================
int C2jniString(char szjni[], char szc[])
{
int i= 0;
int j = 0;
int szclen = strlen(szc);
for(;j<szclen;i+=2,j++)
{
szjni[i] = szc[j];
}
return 0;
}
//===============================================
int Jni2cString(char szjni[], int jnilen,char szc[])
{
int i= 0;
int j = 0;
for(;j<jnilen;i+=2,j++)
{
szc[j] = szjni[i];
}
return 0;
}
void WTraceEX(char *chInfo)
{
LOGD("%s", chInfo);
}
int GetDllVersion(char* VersMes)
{
int rc;
char StrMes[256]={0};
strcpy(StrMes,"31V150702CRATOR(CRT-310-004)");
strcpy(VersMes,StrMes);
rc= RET_OK;
OutLabel:
memset(LogInfo,0x00,sizeof(LogInfo));
sprintf(LogInfo,"[GetDllVersion] {%d} (%s)",rc,VersMes);
WTraceEX(LogInfo);
return rc;
}
int OpenDevice(char *sPort, char* sMes)
{
char StrMes1[256]={0};
int rc,i;
strcpy(devicename,sPort);
icomporthdl=open_portWithBaut(devicename,9600);
if (icomporthdl>0)
{
sprintf(sMes,"[devicename] {%s} Open Comm. port success ",devicename);
//strcpy(sMes,"Open Comm. port success");
rc= RET_OK;
goto OutLabel;
}
else
{
sprintf(sMes,"[devicename] {%s} Open Comm. port fail ",devicename);
// strcpy(sMes,"Open Comm. port fail");
rc= STATE_READER_PORT_EXIST;
goto OutLabel;
}
OutLabel:
strcpy(StrMes1,"31V150702CRATOR(CRT-310-004)");
memset(LogInfo,0x00,sizeof(LogInfo));
sprintf(LogInfo,"[OpenDevice] {%d} (Version=%s)",rc,StrMes1);
WTraceEX(LogInfo);
memset(LogInfo,0x00,sizeof(LogInfo));
sprintf(LogInfo,"[OpenDevice] {%d} (sPort=%s,sMes=%s)",rc,sPort,sMes);
WTraceEX(LogInfo);
return rc;
}
//===========================================
int CloseDevice(char* sMes)
{
int CmDataLen;
unsigned char CmData[1024];
unsigned char ReType;
int ReDataLen;
unsigned char ReData[1024];
int rc=0;
memset(CmData,0x00,sizeof(CmData));
memset(ReData,0x00,sizeof(ReData));
CmData[0]=0x2F;
CmData[1]=0x31;
CmData[2]=0x30;
CmDataLen=3;
if (icomporthdl>0)
rc=RS232_ExeCommand(icomporthdl,CmData,CmDataLen,&ReType,ReData,&ReDataLen);
close_port(icomporthdl);
icomporthdl=-1;
strcpy(sMes,"Close Comm. port success");
rc= RET_OK;
OutLabel:
memset(LogInfo,0x00,sizeof(LogInfo));
sprintf(LogInfo,"[CloseDevice] {%d} (%s)",rc,sMes);
WTraceEX(LogInfo);
return rc;
}
//===========================================
int InitDevice (int Option,char* sMes)
{
int rc,n;
int CmDataLen;
unsigned char CmData[1024];
unsigned char ReType;
int ReDataLen;
unsigned char ReData[1024];
if (icomporthdl<0)
{
strcpy(sMes,"Comm. port is not Opened");
rc= STATE_READER_PORT_EXIST;
goto OutLabel;
}
memset(CmData,0x00,sizeof(CmData));
memset(ReData,0x00,sizeof(ReData));
CmData[0]=0x30;
if (Option==1)
CmData[1]=0x31;
else if (Option==2)
CmData[1]=0x32;
else
CmData[1]=0x30;
CmDataLen=2;
rc=RS232_ExeCommand(icomporthdl,CmData,CmDataLen,&ReType,ReData,&ReDataLen);
if(rc!=0)
{
strcpy(sMes,"Comm. is error");
rc= STATE_READER_COMMUTIE_BAD;
goto OutLabel;
}
else
{
strcpy(sMes,"Success");
rc= RET_OK;
goto OutLabel;
}
OutLabel:
memset(LogInfo,0x00,sizeof(LogInfo));
sprintf(LogInfo,"[InitDevice] {%d} (%s)",rc,sMes);
WTraceEX(LogInfo);
return rc;
}
int GetFirewareVersion(char* VerMessage, char* sMes)
{
int rc,n;
int CmDataLen;