Selaa lähdekoodia

Z991239-1257 #comment other: 改好ContactlessCard实体

翟俊伟80258120 4 vuotta sitten
vanhempi
sitoutus
181ec0c0de

+ 1 - 0
Module/CMakeLists.txt

@@ -148,6 +148,7 @@ add_subdirectory(mod_validityVertifier)
 add_subdirectory(mod_deviceswitch)
 add_subdirectory(mod_CardReadAdapter)
 add_subdirectory(mod_cardissuer)
+add_subdirectory(mod_ContactlessCard)
 add_subdirectory(mod_pinpad)
 add_subdirectory(mod_IDCertificate)
 add_subdirectory(mod_CustMngrAuth)

+ 23 - 0
Module/mod_ContactlessCard/CMakeLists.txt

@@ -0,0 +1,23 @@
+#实体名
+define_module("ContactlessCard")
+
+add_definitions(-D_CRT_RAND_S)
+file(GLOB ${MODULE_PREFIX}_SRCS RELATIVE 
+		 ${CMAKE_CURRENT_SOURCE_DIR}
+		 ${CMAKE_CURRENT_SOURCE_DIR}/*.h
+		 ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
+		 ${DevHeadPath}/CardAssist.cpp
+	)
+
+set(MOD_VERSION_STRING "1.0.0-dev1")
+add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
+
+target_include_directories(${MODULE_NAME} PRIVATE
+	${DevHeadPath}
+)
+
+# 添加实体需要依赖的其他共享库(包括系统库)
+set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_ALL_LIBS})
+target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})
+
+deploy_module(${MODULE_PREFIX} ${MODULE_NAME})

+ 99 - 206
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -2,11 +2,12 @@
 #include "ContactlessFSM.h"
 #include "EventCode.h"
 #include "GetDevInfoHelper.h"
-#include "ContactlessCard_msg_g.h"
 #include "ModuleMix.h"
 #include "ContactlessCard_UserErrorCode.h"
 #include "CommDevEntityErrorCode.h"
 
+using namespace SP::Module::Comm;
+
 const int GET_DEV_STATUS_COUNT = 3;
 const int MAX_RESET_TIMES_PERIOD = 1000;//oiltest configure to ini file?
 const int MAX_RESET_TIMEROUT = 5000;
@@ -239,19 +240,8 @@ unsigned int CContactlessCardFSM::s4_on_event(FSMEvent* pEvt)
 		}
 	case USER_EVT_EXIT:
 	case USER_EVT_EJECT:
-	//case USER_EVT_ACCEPT:
 		{
 			pEvt->SetHandled();
-			//if (pEvt->iEvt == USER_EVT_ACCEPT)
-			//{
-			//	CardAcceptEvent *pCAE = dynamic_cast<CardAcceptEvent*>(pEvt);
-			//	pCAE->ctx->Answer(Error_Duplication);
-			//	return 0;
-			//}
-			//if ((pEvt->iEvt == USER_EVT_EXIT) && m_bIssued)
-			//{				
-			//	return 1;
-			//}
 			CardEjectEvent *cee;
 			if (pEvt->iEvt == USER_EVT_EJECT)
 				cee = dynamic_cast<CardEjectEvent*>(pEvt);
@@ -306,44 +296,8 @@ unsigned int CContactlessCardFSM::s5_on_event(FSMEvent* pEvt)
 	Dbg("s5 event(%d)",pEvt->iEvt);
 	switch(pEvt->iEvt)
 	{
-		//case USER_EVT_READFINISHED:
-		//	{
-		//		pEvt->SetHandled();
-		//		CardReadFinishedEvent *pCRFE = dynamic_cast<CardReadFinishedEvent *>(pEvt);
-		//		int err = pCRFE->param1;
-		//		Dbg("readfinish(%d)",err);
-		//		if (err == 0)
-		//		{
-		//			pCRFE->ctx->Answer(Error_Succeed);
-		//			return 0;
-		//		}else if (err == 2)
-		//			return 2;
-		//		else
-		//			return 1;
-		//	}
-		//	break;
-	//case USER_EVT_READ_FINISHED:
-	//	{
-	//		pEvt->SetHandled();
-	//		CardReadFinishedEvent *pCRFE = dynamic_cast<CardReadFinishedEvent *>(pEvt);
-	//		int err = pCRFE->param1;
-	//		Dbg("read finish(%d)",err);
-	//		if (err == 0)
-	//		{
-	//			pCRFE->ctx->Answer(Error_Succeed);
-	//			return 0;
-	//		}else if (err == 2)
-	//			return 2;
-	//		else
-	//		{
-	//			pCRFE->ctx->Answer(Error_Unexpect);
-	//			return 1;
-	//		}
-	//	}
-	//	break;
 	case USER_EVT_EXIT:
 		{
-			//CardEjectEvent *cee = dynamic_cast<CardEjectEvent*>(pEvt);
 			EjectTask *task=  new EjectTask(this);
 			task->ctx = NULL;
 			GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
@@ -542,16 +496,15 @@ unsigned int CContactlessCardFSM::s9_on_event(FSMEvent* pEvt)
 ErrorCodeEnum CContactlessCardFSM::OnInit()
 {
 	LOG_FUNCTION();
-	/*------2020-02-27------*/
-	//modify by LZM
-	VendorLogControler(this,"ContactlessCard");
-	/*---------------------*/
+	GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
+
 	m_pCardProcess = new CCardProcess();
 	if (m_pCardProcess == NULL)//almost no use...
 	{
 		Dbg("create card process failed.");
 		return Error_Resource;
 	}
+
 	ErrorCodeEnum errCode = Load();
 	if (errCode != Error_Succeed)
 	{
@@ -561,23 +514,14 @@ ErrorCodeEnum CContactlessCardFSM::OnInit()
 	devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
 	return Error_Succeed;
 }
+
 ErrorCodeEnum CContactlessCardFSM::OnExit()
 {
 	LOG_FUNCTION();
 	ErrorCodeEnum eExit;
-	if (m_pRFIC != NULL)
+	if (m_hDevHelper)
 	{
-		eExit = m_pRFIC->GetDevStatus(devStatus);
-		if (eExit == Error_Succeed)
-		{
-			if (devStatus.eMediaPos == CI_MEDIA_PRESENT){
-			}
-		}
-		eExit = m_pRFIC->DevClose();
-		if (eExit == Error_Succeed)
-			Dbg("读卡器关闭成功");
-		else
-			Dbg("读卡器关闭失败(%d)",eExit);
+		m_hDevHelper.TearDown();
 	}
 	FSMImpl<CContactlessCardFSM>::OnExit();
 	return Error_Succeed;
@@ -585,61 +529,48 @@ ErrorCodeEnum CContactlessCardFSM::OnExit()
 
 ErrorCodeEnum CContactlessCardFSM::Load()
 {
-	//	MessageBoxA(0,0,0,0);
 	LOG_FUNCTION();
-	HRESULT hr;
+
 	int initTries = 0;
 	bool bClosePort = false;
-	ErrorCodeEnum eErrDev;
+	ErrorCodeEnum errDev;
 	CSimpleStringA dllName;
-	eErrDev = SpGetDevAdaptorPath(m_pEntity,GetEntityBase()->GetEntityName(),dllName);
-	if (eErrDev != Error_Succeed)
+
+	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
+	errDev = pEntity->ExtractVendorLibFullPath(dllName);
+
+	Dbg("dllName = %s", dllName.GetData());
+	if (errDev != Error_Succeed)
 	{
-		Dbg("load vendor dll(%s) failed.",(LPCTSTR)dllName);
+		Dbg("load vendor lib failed");
 		return Error_DevLoadFileFailed;
 	}
-	Dbg("%s",(LPCTSTR)dllName);
+
+	errDev = m_hDevHelper.LoadUp(dllName);
+	if (Error_Succeed != errDev)
+	{
+		Dbg("load vendorlib or create DevAdapterObject failed.");
+		return Error_DevLoadFileFailed;
+	}
+
 	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
 	CSmartPointer<IConfigInfo> spConfig;
-	eErrDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
-	if (eErrDev != Error_Succeed) {
+	errDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
+	if (errDev != Error_Succeed) {
 		Dbg("open cfg file failed!");
-		return eErrDev;
+		return errDev;
 	}
-	CSimpleStringA csBinPath,csBackslash("\\");
+
+	CSimpleStringA csBinPath;
 	ErrorCodeEnum eErrPath = GetEntityBase()->GetFunction()->GetPath("Bin", csBinPath);
 	if (eErrPath != Error_Succeed)
 	{
 		Dbg("GetBasePath failed (%d).",eErrPath);
 		return Error_Param;
 	}
-	m_hVerdorDll = LoadLibraryA(dllName);
-	if (m_hVerdorDll == NULL)
-	{
-		Dbg("Load dll failed.%d",GetLastError());
-		return Error_DevLoadFileFailed;
-	}
-	if ((CreateDevComponent = (lpCreateDevCom)GetProcAddress(m_hVerdorDll,"CreateDevComponent")) == NULL)
-	{
-		Dbg("Get CreateDevComponent failed.");
-		return Error_DevLoadFileFailed;
-	}
-	if ((ReleaseDevComponent = (lpReleaseDevCom)GetProcAddress(m_hVerdorDll,"ReleaseDevComponent")) == NULL)
-	{
-		Dbg("Get ReleaseDevComponent failed.");
-		return Error_DevLoadFileFailed;
-	}	
+
 	do{
-		if (m_pRFIC == NULL)
-		{
-			if (CreateDevComponent((DeviceBaseClass *&)m_pRFIC) != Error_Succeed)
-			{
-				LOG_TRACE("创建读卡器设备模块失败");
-				initTries++;
-				continue;
-			}
-		}
-		//		CardIssuerInitParam ciInitParam;
+		//CardIssuerInitParam ciInitParam;
 		int baudRate,port,smflag,onlineOnly;
 
 		spConfig->ReadConfigValueInt("Device.ContactlessCard","Baudrate",baudRate);
@@ -650,47 +581,49 @@ ErrorCodeEnum CContactlessCardFSM::Load()
 		m_bOnlineOnly = onlineOnly;
 
 		Dbg("open card issuer [%d][%d]",port,baudRate);
-		hr = m_pRFIC->DevOpen(port,baudRate);
-		Dbg("open[%d]",hr);
-		if (hr == Error_Succeed)
+		errDev = m_hDevHelper->DevOpen(port, baudRate);
+		if (errDev == Error_Succeed)
 		{
+			Dbg("读卡器打开成功!");
 			bClosePort = true;
-			LOG_TRACE("读卡器打开成功");
-			//hr = m_pRFIC->Reset();
-			//Dbg("cardreader reset(%d)",hr);
-			//if (hr != Error_Succeed)
-			//{
-			//	DevErrorInfo devErrInfo;
-			//	m_pRFIC->GetLastErr(devErrInfo);
-			//	Dbg("reset err[%s]",devErrInfo.szErrMsg);
-			//}
+#ifdef RVC_OS_WIN
 			CSimpleStringA csCMBPrint("CMBPrint.dll");
-			csCMBPrint = csBinPath + csBackslash + csCMBPrint;
-			Dbg("cmbpath %s",(LPCTSTR)csCMBPrint);
-			HMODULE hr = LoadLibraryA(csCMBPrint);
-			if (hr == NULL)
+#else
+			CSimpleStringA csCMBPrint("CMBPrint.so");
+#endif // RVC_OS_WIN
+
+			csCMBPrint = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s",
+												csBinPath.GetData(), csCMBPrint.GetData());
+			Dbg("cmbpath %s",csCMBPrint.GetData());
+
+			toolkit_lib_t dlOpen;
+			int res = toolkit_dlopen(csCMBPrint, &dlOpen);
+			if (res != 0)
 			{
-				Dbg("Load CMBPrint failed(%d).",hr);
+				Dbg("Load CMBPrint failed with error %s.", toolkit_dlerror(&dlOpen));
 				return Error_DevLoadFileFailed;
 			}
-			if ((cmdDecodeMag2=(lpCMBdecodeMag2)GetProcAddress(hr, "CMBdecodeMag2")) == NULL)
+
+			if ((res = toolkit_dlsym(&dlOpen, "CMBdecodeMag2", (void**)& cmdDecodeMag2)) != 0)
 			{
 				Dbg("Get Mag2 address failed.");
 				return Error_DevLoadFileFailed;
 			}
-			if ((cmdDecodeEx=(lpCMBdecodeEx)GetProcAddress(hr, "CMBdecodeEx")) == NULL)
+
+			if ((res = toolkit_dlsym(&dlOpen, "CMBdecodeEx", (void**)& cmdDecodeEx)) != 0)
 			{
 				Dbg("Get Mag23Ex address failed.");
 				return Error_DevLoadFileFailed;
 			}
+
 			initTries = 0;
 			break;
 		}
 		else {
-			DevErrorInfo devErrInfo;
-			m_pRFIC->GetLastErr(devErrInfo);
-			Dbg("%s",devErrInfo.szErrMsg);
-			Dbg("读卡器 DevOpen (%d)",hr);
+			WORD devErrCode = errDev;
+			CSimpleStringA errMsg = "";
+			GetAndSplitDevErrInfo(errMsg, devErrCode, "DevOpen");
+			Dbg("ContactlessCard DevOpen failed (%s)", SpStrError(errDev));
 			initTries++;
 		}
 	}while(initTries < INIT_TRY_NUM);
@@ -698,16 +631,16 @@ ErrorCodeEnum CContactlessCardFSM::Load()
 	if (initTries != 0)
 	{
 		if (bClosePort)
-			m_pRFIC->DevClose();
-		LOG_TRACE("读卡器打开失败");
+			m_hDevHelper->DevClose();
+		Dbg("读卡器打开失败");
 		return Error_DevCommFailed;
 	}
 	else
 	{
-		eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
-		if (eErrDev != Error_Succeed) {
+		errDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
+		if (errDev != Error_Succeed) {
 			Dbg("open run cfg file failed!");
-			return eErrDev;
+			return errDev;
 		}
 		int ret = 0,isIssue = 0;
 		if ((spConfig->ReadConfigValueInt("RunInfo","CardRemains",m_CardRemains) == Error_Succeed)
@@ -720,72 +653,58 @@ ErrorCodeEnum CContactlessCardFSM::Load()
 		{
 			Dbg("in %d cycle",isIssue);
 			m_bIssued = isIssue;
-			//ret = UnAcceptCard();
-		}
-		else
-			return Error_IO;
-		if (ret == 0)
-		{
-			//m_pGUIConsoleClient = new GUIConsoleService_ClientBase(dynamic_cast<CCardIssuerEntity*>(GetEntityBase()));
-			//ErrorCodeEnum eConn = m_pGUIConsoleClient->Connect();
-			//if (eConn != Error_Succeed)
-			//{
-			//	m_pGUIConsoleClient->SafeDelete();
-			//	m_pGUIConsoleClient = NULL;
-			//}
-			//else
-			//	Dbg("GUIConsole connected.");
+
 			return Error_Succeed;
 		}
 		else
-			return Error_Unexpect;
+			return Error_IO;
 	}
 }
+
 int CContactlessCardFSM::Initial()
 {
 	return 0;
 }
+
 bool CContactlessCardFSM::GetDevStatus()
 {
 	//LOG_FUNCTION();
 	int getDevInfoCount = 0;
 	ErrorCodeEnum err;
 	do{
-		err = m_pRFIC->GetDevStatus(devStatus);
+		err = m_hDevHelper->GetDevStatus(devStatus);
 		if (Error_Succeed == err)
 			return true;
 		else
 		{
-			//if (Reset())
-			//	continue;
-			//Dbg("GetDevStatus failed(%d).",hr);
 			DevErrorInfo devErrInfo;
-			m_pRFIC->GetLastErr(devErrInfo);
+			m_hDevHelper->GetLastErr(devErrInfo);
 			Dbg("GetDevStatus:[%s]",devErrInfo.szErrMsg);
 			getDevInfoCount++;
-			Sleep(3000);
+			SLEEP(3000);
 		}
 	} while (getDevInfoCount < GET_DEV_STATUS_COUNT);
 	Dbg("getdevstatus to reset");
-	err = m_pRFIC->Reset();
-	Sleep(MAX_RESET_TIMEROUT);
+	err = m_hDevHelper->Reset();
+	SLEEP(MAX_RESET_TIMEROUT);
 	if (err == Error_Succeed)
 	{
-		err = m_pRFIC->GetDevStatus(devStatus);
+		err = m_hDevHelper->GetDevStatus(devStatus);
 		if (err == Error_Succeed && devStatus.eMediaPos == CI_MEDIA_PRESENT)
 		{
 		}
 	}
 	return false;
 }
+
 int CContactlessCardFSM::Reset()
 {
 	LOG_FUNCTION();
 	ErrorCodeEnum eErr;
-	eErr = m_pRFIC->Reset();
+	eErr = m_hDevHelper->Reset();
 	if (eErr == Error_Succeed)
 	{
-		if (Error_Succeed == m_pRFIC->GetDevStatus(devStatus))
+		if (Error_Succeed == m_hDevHelper->GetDevStatus(devStatus))
 		{
 
 			Dbg("media position %d",devStatus.eMediaPos);
@@ -836,7 +755,7 @@ int CContactlessCardFSM::InternalAcceptCard()
 			else
 			{
 				acceptTries++;
-				Sleep(ACCEPT_TRY_INTERVAL);
+				SLEEP(ACCEPT_TRY_INTERVAL);
 			}
 		}
 		else
@@ -895,21 +814,11 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
 	m_pCardProcess->DataInit();
 	LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_ON,"ContactCard green on");
 	m_bWaitAccepteMore = false;
-	//GpioService_Set_Req Req;
-	//GpioService_Set_Ans Ans;
-	//Req.devseq = CARDREADER;
-	//Req.mode = 1;
-	//Req.close = 0;
-	//CCardReaderEntity* pEntity = dynamic_cast<CCardReaderEntity*>(m_pEntity);
-	//pEntity->SetGpio(Req,Ans);
 	int rc = InternalAcceptCard();
-	//Req.devseq = CARDREADER;
-	//Req.mode = 1;
-	//Req.close = 1;
-	//pEntity->SetGpio(Req,Ans);
+	
 	LogEvent(Severity_Middle,LOG_EVT_CONTACTLESS_CARD_GREEN_OFF,"ContactCard green off");
+
 	if (rc == 0) {
-		//FSMSetIssueFlag(false);
 		if (ctx != NULL)
 		{
 			Dbg("insert error_succeed");
@@ -919,7 +828,7 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
 
 			ctx->Ans.ICData = "";
 			int activeCardType;
-			bool bGetICData = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_pRFIC, "A000000333", activeCardType);
+			bool bGetICData = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType);
 			if (!bGetICData)
 			{
 				Dbg("DetectAndReadICData failed.");
@@ -933,7 +842,7 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
 			if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1)
 			{
 				Dbg("[ic]no track2 data");
-				eErr = m_pRFIC->HaltCard();
+				eErr = m_hDevHelper->HaltCard();
 				ctx->Answer(Error_Unexpect);//can't find track2,retry 20150128
 			}
 			else
@@ -956,7 +865,6 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
 				ctx->Ans.status = 0;
 				delete[]ddd;
 				delete[]pICTrack2;
-				//m_pRFIC->DeactContactlessICCard();
 			}
 			ctx->Answer(Error_Succeed);
 		}
@@ -991,7 +899,6 @@ static CSimpleStringA GetStrData(TrackInfo trackInfo)
 	case CI_DATA_INVALID:
 		strRet = "无效数据";
 		break;
-		//case CI_DATA_MISSING:
 	default:
 		strRet = "数据丢失";
 	}
@@ -1039,19 +946,16 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
 		m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101"));
 	}
 	int activeCardType;
-	if (!m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_pRFIC, "A000000333", activeCardType))//oiltest 20140915
+	if (!m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType))//oiltest 20140915
 	{
 		ctx->Answer(Error_Unexpect);
 		return 0;
 	}
-	//if (m_cardType == CI_CARDTYPE_IC)
-	//{
-	//	ProcessRestrict();
-	//	CardholderVerify();
+
 	m_pCardProcess->TermRiskManage();
 	CSimpleStringA taaResult;
 	BYTE bt9f27 = 0;
-	int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_RFIC,m_pRFIC,taaResult,m_bOnlineOnly,m_bCDA,bt9f27);
+	int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_RFIC, m_hDevHelper,taaResult,m_bOnlineOnly,m_bCDA,bt9f27);
 	Dbg("TermActionAnalyze %d",retTAA);
 	switch(retTAA)
 	{//to be added oiltest 20140929
@@ -1065,8 +969,7 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
 		break;
 	}
 	ctx->Ans.result = taaResult;
-	//	Dbg("[%d,%d,%d,%d]",m_TVR[0],m_TVR[1],m_TVR[2],m_TVR[3]);
-	//}
+
 	if (ctx->Ans.result.GetLength() == 0)
 	{
 		ctx->Answer(Error_Succeed);
@@ -1074,10 +977,6 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
 	}
 	Dbg("term action analyze result[%s]",(const char*)ctx->Ans.result);
 
-	//char tmpResult[1024,]result[1024];
-	//ZeroMemory(tmpResult,sizeof(tmpResult));
-	//ZeroMemory(result,sizeof(result));
-	//memcpy(tmpResult,ctx->Ans.result,ctx->Ans.result.GetLength());
 	string tmpResult, actionType, result = "", baseICData = "";
 	tmpResult = ctx->Ans.result;
 	char *pSomeICData = new char[1024];
@@ -1089,7 +988,12 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
 
 	char arqcLen[8];
 	ZeroMemory(arqcLen,sizeof(arqcLen));
-	itoa(lenRet,arqcLen,10);
+#ifdef RVC_OS_WIN
+	itoa(lenRet, arqcLen, 10);
+#else
+	sprintf(arqcLen, "%d", lenRet);
+#endif // RVC_OS_WIN
+
 	ICData appExpiryDate(false,0x5f,0x24);
 	if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,appExpiryDate,false,0) == -1)
 	{
@@ -1115,7 +1019,6 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
 	if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC,track2,false,0) == -1)
 	{
 		Dbg("[ic]no track2 data");
-		//eErr = m_pRFIC->ReleaseIC();
 		Dbg("ic failed,release it %d",eErr);
 	}
 	else
@@ -1223,11 +1126,11 @@ int CContactlessCardFSM::PostOnline(SpReqAnsContext<ContactlessCardService_PostO
 	Dbg("post online data[%s]",(LPCTSTR)ctx->Req.data);
 	m_pCardProcess->SplitOnlineReplyData(ctx->Req.data,strlen(ctx->Req.data));
 
-	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_RFIC,m_pRFIC);
+	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_RFIC, m_hDevHelper);
 	CSimpleStringA csTransEnd;
 	if (issBnkAuth == 0)
 	{
-		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_RFIC,m_pRFIC,m_bCDA);
+		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_RFIC, m_hDevHelper,m_bCDA);
 		if (transEnd == 0)
 			csTransEnd = "TRANSEND,0";
 		else if (transEnd == 1)
@@ -1236,16 +1139,6 @@ int CContactlessCardFSM::PostOnline(SpReqAnsContext<ContactlessCardService_PostO
 	else
 		csTransEnd = "TRANSEND,1";
 	ctx->Ans.result = csTransEnd;
-	//PBYTE pData = new BYTE[MAX_IC_BUFFER_SIZE];
-	//ZeroMemory(pData,MAX_IC_BUFFER_SIZE);
-	//int size = StrBuf2HexBuf(ctx->Req.data,&pData);
-	//if (size > 0)
-	//m_pCardProcess->ExecuteIssuerScript(CARD_MACHINE_ISSUER,m_pRFIC);
-	//else
-	//{
-	//	Dbg("Wrong post on line data[%s]",ctx->Req.data);
-	//	ctx->Answer(Error_Unexpect);
-	//}
 	ctx->Answer(Error_Succeed);
 	return 0;
 }
@@ -1256,7 +1149,7 @@ int CContactlessCardFSM::EjectCard(SpReqAnsContext<ContactlessCardService_Eject_
 	//eErr = MachineMoveCardFrontGate();
 	m_pCardProcess->DataInit();
 	int ret = 0;
-	DWORD dwStart = GetTickCount();
+	ULLINT dwStart = RVCGetTickCount();
 	DWORD dwEnd = dwStart;
 	while(1)
 	{
@@ -1265,13 +1158,13 @@ int CContactlessCardFSM::EjectCard(SpReqAnsContext<ContactlessCardService_Eject_
 			ret = 2;
 			break;
 		}
-		dwEnd = GetTickCount();
+		dwEnd = RVCGetTickCount();
 		if ((dwEnd-dwStart) > 58*1000)
 		{
 			ret = 2;
 			break;
 		}
-		ErrorCodeEnum eErr = m_pRFIC->GetDevStatus(devStatus);
+		ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(devStatus);
 		if (eErr == Error_Succeed)
 		{
 			Dbg("devStatus.eMedia %d",devStatus.eMediaPos);
@@ -1284,7 +1177,7 @@ int CContactlessCardFSM::EjectCard(SpReqAnsContext<ContactlessCardService_Eject_
 				break;
 			}
 		}
-		Sleep(100);
+		SLEEP(100);
 	}
 	Dbg("oiltest eject");
 	if (ctx != NULL)
@@ -1299,7 +1192,7 @@ int CContactlessCardFSM::WaitFetchingCard()
 	do {
 		if (GetDevStatus()){
 			if (devStatus.eMediaPos == CI_MEDIA_RF){
-				Sleep(WAIT_INTERVAL);
+				SLEEP(WAIT_INTERVAL);
 				waitTries++;
 			}
 			else if (devStatus.eMediaPos == CI_MEDIA_NOTPRESENT){
@@ -1319,7 +1212,7 @@ int CContactlessCardFSM::WaitFetchingCard()
 int CContactlessCardFSM::QueryCardInfo(SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req, ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx)
 {
 	RFICReaderStatus devStatus;
-	ErrorCodeEnum eErr = m_pRFIC->GetDevStatus(devStatus);
+	ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(devStatus);
 	if (eErr != Error_Succeed)
 	{
 		Dbg("GetDevStatus failed(%d).",eErr);
@@ -1351,7 +1244,7 @@ int CContactlessCardFSM::QueryCardInfo(SpReqAnsContext<ContactlessCardService_Qu
 void CContactlessCardFSM::LogErrInfo(const char* msgHead)
 {
 	DevErrorInfo errInfo;
-	ErrorCodeEnum eErr = m_pRFIC->GetLastErr(errInfo);
+	ErrorCodeEnum eErr = m_hDevHelper->GetLastErr(errInfo);
 	if (eErr == Error_Succeed)
 		Dbg("%s,%s",msgHead,errInfo.szErrMsg);
 }

+ 13 - 75
Module/mod_ContactlessCard/ContactlessFSM.h

@@ -3,6 +3,14 @@
 #pragma once
 
 #include "SpFSM.h"
+#include "CommEntityUtil.hpp"
+#include "DevFSMCommBase.hpp"
+#include "RFICClass.h"
+#include "CardAssist.h"
+#include "ICDataElement.h"
+#include "ContactlessCard_server_g.h"
+#include "ContactlessCard_msg_g.h"
+
 enum EvtType
 {
 	USER_EVT_TEST = EVT_USER+1,
@@ -30,17 +38,12 @@ enum EvtType
 	USER_EVT_QUERY_CARD_INFO_FINISHED,
 
 };
-#include "ContactlessCard_server_g.h"
 
-#include "RFICClass.h"
-#include "CardAssist.h"
-#include "ICDataElement.h"
+
 using namespace ContactlessCard;
 
-typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
-typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data);
-typedef ErrorCodeEnum (*lpCreateDevCom)(DeviceBaseClass *&baseObj);
-typedef ErrorCodeEnum (*lpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
+using lpCMBdecodeMag2 = int(*)(char* mag2Data, char* data);
+using lpCMBdecodeEx = int(*)(char* magData, char* type, char* data);
 
 class CContactlessCardEntity;
 class CContactlessCardFSM;
@@ -75,40 +78,6 @@ public:
 		}
 	}
 };
-//class CardReadEvent : public FSMEvent
-//{
-//public:
-//	CardReadEvent() : FSMEvent(USER_EVT_READ){}
-//	~CardReadEvent(){}
-//	SpReqAnsContext<ContactlessCardService_Read_Req,ContactlessCardService_Read_Ans>::Pointer ctx;
-//	virtual void OnUnhandled() 
-//	{
-//		if (ctx != NULL)
-//		{
-//			Dbg("card read unhandled");
-//			ctx->Answer(Error_InvalidState);
-//		}
-//	}
-//protected:
-//private:
-//};
-//class CardReadFinishedEvent : public FSMEvent
-//{
-//public:
-//	CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_FINISHED){}
-//	~CardReadFinishedEvent(){}
-//	SpReqAnsContext<ContactlessCardService_Read_Req,ContactlessCardService_Read_Ans>::Pointer ctx;
-//	virtual void OnUnhandled() 
-//	{
-//		if (ctx != NULL)
-//		{
-//			Dbg("card read unhandled");
-//			ctx->Answer(Error_InvalidState);
-//		}
-//	}
-//protected:
-//private:
-//};
 
 class PreOnlineEvent : public FSMEvent
 {
@@ -182,7 +151,7 @@ public:
 protected:
 private:
 };
-class CContactlessCardFSM : public FSMImpl<CContactlessCardFSM>
+class CContactlessCardFSM : public CCommDevFSM<CContactlessCardFSM, RFICClass>
 {
 public:
 	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9};
@@ -300,38 +269,21 @@ public:
 	bool GetWaitFlag(){return m_bWaitingAccept;}
 	void SetWaitMore(){m_bWaitAccepteMore = true;}
 	void SetExitFlag(bool bFlag=true){m_bExit = bFlag;}
-	//bool FSMSetIssueFlag(bool bValue=false);
-	//void FrontSetIssueFlag(bool bValue=true){ m_bIssued = bValue;}
-	//bool SetCardCaptured(const int num);
-	//bool SetCardIssued(const int num);
-	//bool SetCardRemains(const int num,bool bInit=false);
-	//bool SetCardMixed(const int num);
-	//ErrorCodeEnum MachineMoveCardBackNotHold();
-	//ErrorCodeEnum MachineMoveCardFrontGate();
-	//bool DetectIfICCard();
-
-	//int DetectCardTypeInfoByAccount(char *pAccount, int len, char *pT3 = NULL, int t3Len = 0);
-	//void LoadCMBBin();
 
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		pTransactionContext->SendAnswer(m_testResult);
 	}
 	DevStateEnum GetDevState(){ return m_eDevState;}
-	//int QueryCardInfo();
 protected:
-	//LPIDCCARDDATA* lppCardData;
 	int m_iInsertTries;
 	int m_resetTries;
 	int m_ejectTries;
 private:
-	///
 	int m_resetTimes;
-	HMODULE m_hVerdorDll;
-	lpCreateDevCom CreateDevComponent;
-	lpReleaseDevCom ReleaseDevComponent;
 	lpCMBdecodeMag2 cmdDecodeMag2;
 	lpCMBdecodeEx cmdDecodeEx;	
+	 
 	bool m_devInit,m_bCancelAccept,m_bWaitingAccept,m_bWaitAccepteMore,m_bExit,m_bIssued,m_bSM;
 	ErrorCodeEnum m_testResult;
 
@@ -347,7 +299,6 @@ private:
 	bool m_bOnlineOnly,m_bCDA;
 
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
-	//int SplitUnionPayTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
 	void LogErrInfo(const char*);
 };
 struct InitTask : public ITaskSp
@@ -376,19 +327,6 @@ struct AcceptTask : public ITaskSp
 		fsm->PostEventFIFO(e);
 	}
 };
-//struct ReadTask : public ITaskSp
-//{
-//	SpReqAnsContext<ContactlessCardService_Read_Req,ContactlessCardService_Read_Ans>::Pointer ctx;
-//	CContactlessCardFSM* fsm;
-//	ReadTask(CContactlessCardFSM* f) : fsm(f) {}
-//	void Process()
-//	{
-//		CardReadFinishedEvent *e = new CardReadFinishedEvent();
-//		e->ctx = ctx;
-//		e->param1 = fsm->ReadCard(ctx);
-//		fsm->PostEventFIFO(e);
-//	}
-//};
 
 struct PreOnlineTask : public ITaskSp
 {

+ 7 - 1
Module/mod_ContactlessCard/mod_ContactlessCard.h

@@ -3,6 +3,8 @@
 #pragma once
 #include "stdafx.h"
 #include "ContactlessFSM.h"
+#include "modVer.h"
+#include "SpTest.h"
 
 class CContactlessCardEntity;
 
@@ -24,7 +26,7 @@ private:
 	CContactlessCardEntity* m_pEntity;
 };
 
-class CContactlessCardEntity : public CEntityBase
+class CContactlessCardEntity : public CDevAdptEntityBase
 {
 public:
 	CContactlessCardEntity()
@@ -32,6 +34,10 @@ public:
 	}
 	virtual ~CContactlessCardEntity(){}
 	virtual const char *GetEntityName() const { return "ContactlessCard"; }
+	virtual const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
+
+	ON_ENTITYT_TEST()
+
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
 	{ 
 		LOG_FUNCTION();

+ 0 - 106
Module/mod_ContactlessCard/mod_ContactlessCard.vcxproj

@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{961CDF1C-E226-4D26-A1D3-A171A97EE3B7}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>mod_ContactlessCard</RootNamespace>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <CharacterSet>MultiByte</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <Import Project="..\modmake.setting" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_CONTACTLESSCARD_EXPORTS;_CRT_RAND_S;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>$(FrameworkHeadRoot)\Common;$(DevHeadPath);$(ModuleCommonHeadPath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>$(FrameworkLib)\SpBase.lib</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_CONTACTLESSCARD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-
-    <None Include="ReadMe.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="$(FrameworkHeadRoot)\Common\stdafx.h" />
-    <ClInclude Include="..\..\DeviceAdapter\DevInc\CardAssist.h" />
-    <ClInclude Include="ContactlessCard_def_g.h" />
-    <ClInclude Include="ContactlessCard_msg_g.h" />
-    <ClInclude Include="ContactlessCard_server_g.h" />
-    <ClInclude Include="ContactlessFSM.h" />
-    <ClInclude Include="mod_ContactlessCard.h" />
-    <ClInclude Include="targetver.h" />
-    <ClInclude Include="ContactlessCard_UserErrorCode.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\..\DeviceAdapter\DevInc\CardAssist.cpp" />
-    <ClCompile Include="$(FrameworkHeadRoot)\Common\stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="ContactlessFSM.cpp" />
-    <ClCompile Include="mod_ContactlessCard.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="..\..\Version.rc" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>

+ 0 - 57
Module/mod_ContactlessCard/mod_ContactlessCard.vcxproj.filters

@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="ReadMe.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="targetver.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ContactlessFSM.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ContactlessCard_def_g.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ContactlessCard_msg_g.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="ContactlessCard_server_g.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\..\DeviceAdapter\DevInc\CardAssist.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="mod_ContactlessCard.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="mod_ContactlessCard.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="ContactlessFSM.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\DeviceAdapter\DevInc\CardAssist.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\..\Framework\Common\stdafx.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>

+ 5 - 0
Module/mod_FingerPrint/FingerPrintFSM.cpp

@@ -377,7 +377,12 @@ void CFingerPrintFSM::GetVendorLibName(CSmartPointer<IConfigInfo> spConfig
 		switch (terminalInfo.type)
 		{
 		case RVC_Stand2S:
+#ifdef RVC_OS_WIN
 			strVersion = "7";
+#else
+			strVersion = "1";
+#endif // RVC_OS_WIN
+
 			break;
 		case RVC_PAD:
 			if (IsFWBDevice(strVendor))

+ 8 - 0
addin/hardwarecfg/root.ini.unix

@@ -89,6 +89,14 @@ Batch=1
 Port=2
 Baudrate=115200
 
+[Device.ContactlessCard]
+# parameters such as port 
+Vendor=cmbsz
+Version=1
+Batch=1
+Port=2
+Baudrate=115200
+
 [Device.DeviceControl]
 # parameters such as port 
 Vendor=cmbsz