Преглед изворни кода

Merge branch 'uat' into 0_0_3_st1

gifur пре 2 година
родитељ
комит
3e8a292c50
28 измењених фајлова са 850 додато и 1621 уклоњено
  1. 1 1
      DevAdapter/CMakeLists.txt
  2. 267 1
      DevAdapter/grg/idcer.1.1/idcer_impl.cpp
  3. 5 0
      DevAdapter/grg/idcer.1.1/idcer_impl.h
  4. 6 1
      Module/include/DevFSMCommBase.hpp
  5. 145 90
      Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp
  6. 41 6
      Module/mod_CardReadAdapter/CardReadAdapterFSM.h
  7. 1 2
      Module/mod_ContactlessCard/ContactlessCard_UserErrorCode.h
  8. 2 4
      Module/mod_ContactlessCard/ContactlessFSM.cpp
  9. 13 2
      Module/mod_IDCertificate/IDCertFSM.cpp
  10. 2 0
      Module/mod_IDCertificate/IDCertificate_UserErrorCode.h
  11. 1 1
      Module/mod_accessauth/AccessAuthFSM.cpp
  12. 88 363
      Module/mod_cardissuer/CardIssuerFSM.cpp
  13. 20 98
      Module/mod_cardissuer/CardIssuerFSM.h
  14. 25 3
      Module/mod_cardissuer/CardIssuer_UserErrorCode.h
  15. 23 94
      Module/mod_cardissuer/mod_cardissuer.cpp
  16. 0 40
      Module/mod_cardissuer/mod_cardissuer.h
  17. 7 7
      Module/mod_guiconsole/mod_guiconsole.cpp
  18. 103 700
      Module/mod_heartbeat/HeartBeatFSM.cpp
  19. 5 126
      Module/mod_heartbeat/HeartBeatFSM.h
  20. 3 1
      Module/mod_heartbeat/HeartBeat_UserErrorCode.h
  21. 2 17
      Module/mod_heartbeat/mod_heartbeat.cpp
  22. 1 21
      Module/mod_heartbeat/mod_heartbeat.h
  23. 10 10
      Module/mod_selfchecker/SelfCheckerFSM.cpp
  24. 5 1
      Module/mod_selfchecker/SelfCheckerFSM.h
  25. 34 24
      Module/mod_selfchecker/mod_selfchecker.cpp
  26. 1 0
      Module/mod_sipphone/Event.h
  27. 1 1
      Module/mod_sipphone/mod_sipphone.cpp
  28. 38 7
      addin/cfg/UserCodeToMsgTip.ini

+ 1 - 1
DevAdapter/CMakeLists.txt

@@ -140,7 +140,7 @@ message(STATUS "vendor log library: ${VENDOR_LOG_LIB_NAME}")
 # 通过conan的方式管理厂商库
 if(DEVADAPTER_USING_CONAN)
     set(KEBA_CONAN_LIB_NAME keba/2023.0524.01@LR04.02_VendorLib/testing)
-	set(GRG_CONAN_LIB_NAME grg/2022.1123.01@LR04.02_VendorLib/testing)
+	set(GRG_CONAN_LIB_NAME grg/2023.0526.01@LR04.02_VendorLib/testing)
 	set(CW_CONAN_LIB_NAME cw/2021.0927.01@LR04.02_VendorLib/testing)
 endif(DEVADAPTER_USING_CONAN)
  

+ 267 - 1
DevAdapter/grg/idcer.1.1/idcer_impl.cpp

@@ -93,7 +93,7 @@ ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
 	LOG4VTM(INFO,__FUNCTION__);
 	char* szType = "PVER=GRG#MID=IDR-001";
 	char* szVendor = "grg";
-	char* szModel = "STYLE=IG#FUNCTON=ITF";
+	char* szModel = "STYLE=IG#FUNCTON=ITF#CODE=UCS2";
 	memset(&devCategory,0,sizeof(devCategory));
 	strcpy(devCategory.szType, szType);
 	strcpy(devCategory.szVendor, szVendor);
@@ -685,6 +685,272 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
 	return Error_Succeed;
 }
 
+//  修改结构体获取证件信息,包括二代身份证、外国人永久居留证
+ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx2(IDCerInfoEx2 &idCerInfoEx)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	int iCardType;
+	memset(&idCerInfoEx, 0, sizeof(idCerInfoEx));
+	if (IDDIGITALCOPIER_NO_ERROR != GetIDCardType(m_DeviceID, &iCardType)) {
+		FormatDevErrorInfo(__FUNCTION__, __LINE__);
+		return Error_Unexpect;
+	}
+	switch (iCardType)
+	{
+	case 0://普通身份证
+	{
+		IDInfoEx idInfo = {0};
+		if (IDDIGITALCOPIER_NO_ERROR != GetID2InfoExByCode(m_DeviceID, &idInfo, const_cast<char*>(m_sHeadImageName.c_str()),1)) 
+        {
+			FormatDevErrorInfo(__FUNCTION__, __LINE__);
+			return Error_Unexpect;
+		}
+		//姓名
+		char utf8buf[UTF8_BUFF_SIZE] = {0};
+
+		//GbkToUtf8(idInfo.name,strlen(idInfo.name),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.name.data, idInfo.name,sizeof(idInfo.name));
+		idCerInfoEx.name.dwSize = strlen(idInfo.name);
+		//性别
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfo.sex,strlen(idInfo.sex),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.sex.data, idInfo.sex,sizeof(idInfo.sex));
+		idCerInfoEx.sex.dwSize = sizeof(idInfo.sex);
+
+		//民族
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfo.nation,strlen(idInfo.nation),utf8buf,UTF8_BUFF_SIZE);		
+        //strcpy(idCerInfoEx.nation.data, idInfo.nation);
+        memcpy(idCerInfoEx.nation.data, idInfo.nation,sizeof(idInfo.nation));
+		idCerInfoEx.nation.dwSize = sizeof(idInfo.nation);
+       
+		//生日
+		std::string Newbirthday = ForDataFormat(std::string(idInfo.birthday), "for");
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.birthday.data, idInfo.birthday,sizeof(idInfo.birthday));
+		idCerInfoEx.birthday.dwSize = sizeof(idInfo.birthday);
+		//住址
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfo.address,strlen(idInfo.address),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.address.data, idInfo.address,sizeof(idInfo.address));
+		idCerInfoEx.address.dwSize = sizeof(idInfo.address);
+		//证件号
+		//int len = sizeof(idCerInfoEx.idno.data) > strlen(idInfo.number) ? strlen(idInfo.number) : sizeof(idCerInfoEx.idno.data);
+		int len = strlen(idInfo.number);
+		memcpy(idCerInfoEx.idno.data, idInfo.number,sizeof(idInfo.number));
+		idCerInfoEx.idno.dwSize = sizeof(idInfo.number);
+		//签发机关
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfo.department,strlen(idInfo.department),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.department.data, idInfo.department,sizeof(idInfo.department));
+		idCerInfoEx.department.dwSize = sizeof(idInfo.department);
+		//处理有效期
+		std::string beginTime = "", endTime = "";
+		std::string data = std::string(idInfo.timeLimit);
+		if (data.length() > 0)
+		{
+			int location = data.find_first_of("-");
+			if (location > 0)
+			{
+				beginTime = data.substr(0, location);
+				beginTime = ForDataFormat(beginTime, ".");
+				endTime = data.substr(location + 1, data.length());
+				endTime = ForDataFormat(endTime, ".");
+			}
+		}
+
+		//有效日期签发日
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(beginTime.c_str()),strlen(beginTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		//strcpy(idCerInfoEx.startDate.data, utf8buf);
+        memcpy(idCerInfoEx.startDate.data,idInfo.timeLimit,16);
+		idCerInfoEx.startDate.dwSize = 18;
+		//有效日期终止日
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(endTime.c_str()),strlen(endTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
+        
+		memcpy(idCerInfoEx.endDate.data,idInfo.timeLimit+16 ,18);
+		idCerInfoEx.endDate.dwSize = 18;
+		//头像信息
+		strcpy(idCerInfoEx.photoPath.data, idInfo.Image);
+		idCerInfoEx.photoPath.dwSize = sizeof(idInfo.Image);
+		break;
+	}
+	case 1://外国人居住证
+	{
+        
+		IDInfoForeign idInfoFore;
+		if (IDDIGITALCOPIER_NO_ERROR != GetIDInfoForeignByCode(m_DeviceID, &idInfoFore, const_cast<char*>(m_sHeadImageName.c_str()),1)) {
+			FormatDevErrorInfo(__FUNCTION__, __LINE__);
+			return Error_Unexpect;
+		}
+    
+		char utf8buf[UTF8_BUFF_SIZE] = {0};
+		//英文姓名
+		memcpy(idCerInfoEx.englishName.data, idInfoFore.NameENG,sizeof(idInfoFore.NameENG));
+		idCerInfoEx.englishName.dwSize = sizeof(idInfoFore.NameENG);
+
+		//国籍3
+		//GbkToUtf8(idInfoFore.Nation,strlen(idInfoFore.Nation),utf8buf,UTF8_BUFF_SIZE);
+
+		memcpy(idCerInfoEx.nationality.data, idInfoFore.Nation,sizeof(idInfoFore.Nation));
+		idCerInfoEx.nationality.dwSize = sizeof(idInfoFore.Nation);
+
+		//证件类型
+
+		strcpy(idCerInfoEx.idType.data, "I");
+		idCerInfoEx.idType.dwSize = strlen("I");
+
+		//证件版本
+		memcpy(idCerInfoEx.idVersion.data, idInfoFore.IDVersion,sizeof(idInfoFore.IDVersion));
+		idCerInfoEx.idVersion.dwSize = sizeof(idInfoFore.IDVersion);
+
+
+		//保留字段
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoFore.Reserve,strlen(idInfoFore.Reserve),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.reserved.data, idInfoFore.Reserve,sizeof(idInfoFore.Reserve));
+		idCerInfoEx.reserved.dwSize = sizeof(idInfoFore.Reserve);
+		//中文姓名
+
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoFore.NameCHN,strlen(idInfoFore.NameCHN),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.name.data, idInfoFore.NameCHN,sizeof(idInfoFore.NameCHN));
+		idCerInfoEx.name.dwSize = sizeof(idInfoFore.NameCHN);
+
+		//性别
+
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoFore.Sex,strlen(idInfoFore.Sex),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.sex.data, idInfoFore.Sex,sizeof(idInfoFore.Sex));
+		idCerInfoEx.sex.dwSize = sizeof(idInfoFore.Sex);
+
+		//生日
+
+		//std::string Newbirthday = ForDataFormat(std::string(idInfoFore.Born), "for");
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.birthday.data, idInfoFore.Born,sizeof(idCerInfoEx.birthday.data));
+		idCerInfoEx.birthday.dwSize = sizeof(idCerInfoEx.birthday.data);
+		//证件号
+
+		memcpy(idCerInfoEx.idno.data, idInfoFore.IDCardNO,sizeof(idInfoFore.IDCardNO));
+		idCerInfoEx.idno.dwSize = sizeof(idInfoFore.IDCardNO);
+		//签发机关
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoFore.Department,strlen(idInfoFore.Department),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.department.data, idInfoFore.Department,sizeof(idInfoFore.Department));
+		idCerInfoEx.department.dwSize = sizeof(idInfoFore.Department);
+		//有效日期签发日
+
+		//std::string NewTimeLimitBegin = GetForeignTimeLimit(std::string(idInfoFore.TimeLimitBegin), ".");
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(NewTimeLimitBegin.c_str()),strlen(NewTimeLimitBegin.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.startDate.data, idInfoFore.TimeLimitBegin,sizeof(idInfoFore.TimeLimitBegin));
+		idCerInfoEx.startDate.dwSize = sizeof(idInfoFore.TimeLimitBegin);
+		//有效日期终止日
+
+		//std::string NewTimeLimitEnd = GetForeignTimeLimit(std::string(idInfoFore.TimeLimitEnd), ".");
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(NewTimeLimitEnd.c_str()),strlen(NewTimeLimitEnd.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.endDate.data, idInfoFore.TimeLimitEnd,sizeof(idInfoFore.TimeLimitEnd));
+		idCerInfoEx.endDate.dwSize = sizeof(idInfoFore.TimeLimitEnd);
+		//头像信息sizeof
+
+		int len = sizeof(idCerInfoEx.photoPath.data) > strlen(idInfoFore.Image) ? strlen(idInfoFore.Image) : sizeof(idCerInfoEx.photoPath.data);
+		strncpy(idCerInfoEx.photoPath.data, idInfoFore.Image, len);
+		idCerInfoEx.photoPath.dwSize = len;
+		break;
+	}
+	case 2://港澳台居住证
+	{
+		IDInfoGAT idInfoGAT;
+		if (IDDIGITALCOPIER_NO_ERROR != GetIDInfoGATByCode(m_DeviceID, &idInfoGAT, const_cast<char*>(m_sHeadImageName.c_str()),1)) {
+			FormatDevErrorInfo(__FUNCTION__, __LINE__);
+			return Error_Unexpect;
+		}
+		//姓名
+		char utf8buf[UTF8_BUFF_SIZE] = {0};
+		//GbkToUtf8(idInfoGAT.name,strlen(idsizeofInfoGAT.name),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.name.data, idInfoGAT.name,sizeof(idInfoGAT.name));
+		idCerInfoEx.name.dwSize = sizeof(idInfoGAT.name);
+		//性别
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoGAT.sex,strlen(idInfoGAT.sex),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.sex.data, idInfoGAT.sex,sizeof(idInfoGAT.sex));
+		idCerInfoEx.sex.dwSize = strlen(idInfoGAT.sex);
+		//民族
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoGAT.nation,strlen(idInfoGAT.nation),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.nation.data, idInfoGAT.nation,sizeof(idInfoGAT.nation));
+		idCerInfoEx.nation.dwSize = sizeof(idInfoGAT.nation);
+		//生日
+		std::string Newbirthday = ForDataFormat(std::string(idInfoGAT.birthday), "for");
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.birthday.data, idInfoGAT.birthday,sizeof(idInfoGAT.birthday));
+		idCerInfoEx.birthday.dwSize = sizeof(idInfoGAT.birthday);
+		//住址
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoGAT.address,strlen(idInfoGAT.address),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.address.data, idInfoGAT.address,sizeof(idInfoGAT.address));
+		idCerInfoEx.address.dwSize = sizeof(idInfoGAT.address);
+		//证件号
+		int len = sizeof(idCerInfoEx.idno.data) > strlen(idInfoGAT.number) ? strlen(idInfoGAT.number) : sizeof(idCerInfoEx.idno.data);
+		memcpy(idCerInfoEx.idno.data, idInfoGAT.number, sizeof(idInfoGAT.number));
+		idCerInfoEx.idno.dwSize =  sizeof(idInfoGAT.number);
+		//签发机关
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(idInfoGAT.department,strlen(idInfoGAT.department),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.department.data, idInfoGAT.department,sizeof(idInfoGAT.department));
+		idCerInfoEx.department.dwSize = sizeof(idInfoGAT.department);
+		//有效日期签发日
+		std::string beginTime = "", endTime = "";
+		std::string data = std::string(idInfoGAT.timeLimit);
+		if (data.length() > 0)
+		{
+			int location = data.find_first_of("-");
+			if (location > 0)
+			{
+				beginTime = data.substr(0, location);
+				beginTime = ForDataFormat(beginTime, ".");
+				endTime = data.substr(location + 1, data.length());
+				endTime = ForDataFormat(endTime, ".");
+			}
+		}
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(beginTime.c_str()),strlen(beginTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.startDate.data, idInfoGAT.timeLimit,16);
+		idCerInfoEx.startDate.dwSize = 18;
+		//有效日期终止日
+		memset(utf8buf,0,UTF8_BUFF_SIZE);
+		//GbkToUtf8(const_cast<char*>(endTime.c_str()),strlen(endTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
+		memcpy(idCerInfoEx.endDate.data, idInfoGAT.timeLimit+16,18);
+		idCerInfoEx.endDate.dwSize = 18;
+		//头像信息
+		strcpy(idCerInfoEx.photoPath.data, idInfoGAT.Image);
+		idCerInfoEx.photoPath.dwSize = sizeof(idInfoGAT.Image);
+		//通行证号码
+		memcpy(idCerInfoEx.txzCode.data, idInfoGAT.passport,sizeof(idInfoGAT.passport));
+		idCerInfoEx.txzCode.dwSize = sizeof(idInfoGAT.passport);
+		//签发次数
+		memcpy(idCerInfoEx.issuedSN.data, idInfoGAT.issue,sizeof(idInfoGAT.issue));
+		idCerInfoEx.issuedSN.dwSize = sizeof(idInfoGAT.issue);
+		//证件类型
+		strcpy(idCerInfoEx.idType.data, "J");
+		idCerInfoEx.idType.dwSize = strlen("J");
+		break;
+	}
+	default:
+		break;
+	}
+	
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}
+
 //	强制弹出身份证等证件
 //	Force ID Card to eject。
 //

+ 5 - 0
DevAdapter/grg/idcer.1.1/idcer_impl.h

@@ -61,6 +61,11 @@ public:
 	//
 	ErrorCodeEnum IDCerGetDataEx(IDCerInfoEx &idCerInfoEx);
 
+
+	//新增身份证信息获取接口,用于获取身份证中存储的原始文字UCS2编码信息
+	ErrorCodeEnum IDCerGetDataEx2(IDCerInfoEx2 &idCerInfoEx);
+
+
 	//	强制弹出身份证等证件
 	//	Force ID Card to eject。
 	//

+ 6 - 1
Module/include/DevFSMCommBase.hpp

@@ -90,7 +90,12 @@ do {\
 
 #define LOG_WATCHDOG_ERROR_MSG_MACRO(errCode, MethodSig)\
 	LOG_ERROR_MSG_MACRO(errCode, MethodSig, WATCHDOG)
-
+enum PageType
+{
+	PageType_MainPage,
+	PageType_UserDesktop,
+	PageType_Other,
+};
 enum VendorNameType 
 {
 	Vendor_Invalide,

+ 145 - 90
Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp

@@ -411,15 +411,6 @@ unsigned int CCardReadAdapterFSM::s2_on_event(FSMEvent* pEvt)
 		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 	}
 		break;
-	case USER_EVT_NOTIFY_PREONLINE:
-	{
-		pEvt->SetHandled();
-		NotifyPreonlineEvent* samice = dynamic_cast<NotifyPreonlineEvent*>(pEvt);
-		NotifyPreOnlineTask* task = new NotifyPreOnlineTask(this);
-		task->ctx = samice->ctx;
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
-	}
-		break;
 	case USER_EVT_QUERY_CARD_INFO_ON_STORE:
 	{
 		pEvt->SetHandled();
@@ -476,6 +467,15 @@ unsigned int CCardReadAdapterFSM::s3_on_event(FSMEvent* pEvt)
 	int ret = 0;
 	switch (pEvt->iEvt)
 	{
+	case USER_EVT_NOTIFY_PREONLINE:
+	{
+		pEvt->SetHandled();
+		NotifyPreonlineEvent* samice = dynamic_cast<NotifyPreonlineEvent*>(pEvt);
+		NotifyPreOnlineTask* task = new NotifyPreOnlineTask(this);
+		task->ctx = samice->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+	}
+	break;
 	case USER_EVT_READ_FINISHED:
 	{
 		pEvt->SetHandled();
@@ -2242,105 +2242,111 @@ int CCardReadAdapterFSM::BindSCI(SpReqAnsContext<CardReadAdapterService_BindSCI_
 int CCardReadAdapterFSM::PreOnlineOnStore(SpReqAnsContext<CardReadAdapterService_PreOnlineOnStore_Req, CardReadAdapterService_PreOnlineOnStore_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	if (IsCardIssuerSessionOK())
+	//oilyang@20230525 to call heartbeat directly
+	if (!CheckHBSessionOrToConnect())
 	{
-		ErrorCodeEnum eErr = Error_Unexpect;
-		CardIssuerService_PreOnlineOnStore_Req req;
-		CardIssuerService_PreOnlineOnStore_Ans ans;
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("While calling to PreOnlineOnStore, connect to HeartBeat failed.");
+		ctx->Answer(Error_DevNotAvailable);
+		return 0;
+	}
+	m_crossCtx = ctx;
+	ErrorCodeEnum eErr = Error_Unexpect;
+	CSimpleStringA errMsg(true);
+
+	m_ullCrossStart = GetTickCountRVC();
+
+	if (m_pHBClient != NULL)
+	{
+		HeartBeatService_CardActive_Req req;
+		HeartBeatService_CardActive_Ans ans;
+		req.type = 0;
 		req.account = ctx->Req.account;
-		req.businessData = ctx->Req.businessData;
+		req.term = ctx->Req.termNo;
+		req.data = ctx->Req.businessData;
 		req.slot = ctx->Req.slot;
-		req.termNo = ctx->Req.termNo;
-		req.reserved1.Copy(ctx->Req.reserved1);
-		req.reserved2.Copy(ctx->Req.reserved2);
-		req.reserved3.Copy(ctx->Req.reserved3);
-		req.reserved4.Copy(ctx->Req.reserved4);
-		CSimpleStringA inParam("");
-		if (!req.account.IsNullOrEmpty() && req.account.GetLength() > 10)
+
+		errMsg = CSimpleStringA::Format("<PreOnlineOnStore>, send CardActive, termNo:%s, slot:%d", req.term.GetData(), req.slot);
+		LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Send_CardActive, errMsg.GetData());
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220327")("to call heartbeat CardActive");
+
+		eErr = m_pHBClient->CardActive(req, ans, 6000);
+		if (eErr == Error_Succeed)
 		{
-			inParam = CSimpleStringA::Format("account:%s****%s, bussinessDataLen:%d, slot:%d, termNo:%s",
-				req.account.SubString(0, 6).GetData(), req.account.SubString(req.account.GetLength() - 4, 4).GetData(), req.businessData.GetLength(), req.slot, req.termNo.GetData());
-		}
-		else {
-			inParam = CSimpleStringA::Format("accountLen:%d, bussinessDataLen:%d, slot:%d, termNo:%s",
-				req.account.GetLength(), req.businessData.GetLength(), req.slot, req.termNo.GetData());
+			m_bCardActiveNotify = false;
+			WaitCardActiveTask* pTask = new WaitCardActiveTask(this);
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
 		}
-		LogWarn(Severity_Low, Error_Unexpect, CardReadAdapter_UserErrorCode_PreOnline_Invoke, inParam.GetData());
-		eErr = m_pCardIssuer->PreOnlineOnStore(req, ans, 62000);//跨机CardIssuer的返回超时是60秒,这里选62秒
-		if (eErr == Error_Succeed)
+		else
 		{
-			ctx->Ans.cardPos = ans.cardPos;
-			ctx->Ans.findCard = ans.findCard;
-			ctx->Ans.result = ans.result;
-			ctx->Ans.reserved1.Copy(ans.reserved1);
-			ctx->Ans.reserved2.Copy(ans.reserved2);
-			ctx->Ans.reserved3.Copy(ans.reserved3);
-			ctx->Ans.reserved4.Copy(ans.reserved4);
-			CSimpleStringA outParam = CSimpleStringA::Format("cardPos:%d, findCard:%d, resultLen:%d",
-															ctx->Ans.cardPos, ctx->Ans.findCard, ctx->Ans.result.GetLength());
-			LogWarn(Severity_Low, Error_Unexpect, CardReadAdapter_UserErrorCode_PreOnline_Result, outParam.GetData());
-			ctx->Answer(eErr);
-		}else if (eErr == Error_TimeOut) {
-			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2R01")("PreOnlineOnStore timeout(62s)");
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("PreOnlineOnStore, CardIssuer PreOnlineOnStore failed return:%d", eErr));
-			ctx->Answer(Error_TimeOut, CardReadAdapter_UserErrorCode_HBService_No_Return);
-		}
-		else if (eErr == Error_Duplication)
-			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DupCallPreOnline_WhileInWorking);
-		else if (eErr == Error_ReplyTimeOut)
-			ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong);
-		else if (eErr == Error_DevNotAvailable)
-			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine);
-		else if (eErr == Error_Hardware)
-			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState);
-		else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("PreOnlineOnStore, CardIssuer PreOnlineOnStore failed return:%d", eErr));
-			ctx->Answer(eErr);
+			errMsg = CSimpleStringA::Format("CardActive Result(termNo:%s, slot:%d):%d(0x%x)", req.term.GetData(), req.slot, eErr, eErr);
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Recv_CardActive, errMsg.GetData());
 		}
 	}
-	else
-	{
-		LogWarn(Severity_High, Error_Unexpect, CardReadAdapter_UserErrorCode_PreOnline_CardIssuer_Not_Ok, "Entity CardIssuer is not ok.");
-		ctx->Answer(Error_DevNotAvailable, CardReadAdapter_UserErrorCode_PreOnline_CardIssuer_Not_Ok);
-	}
-	return 0;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("have send heartbeat CardActive");
+	return 1;//维持s3状态,直到收到返回或超时
 }
 int CCardReadAdapterFSM::NotifyPreonline(SpReqAnsContext<CardReadAdapterService_NotifyPreonline_Req, CardReadAdapterService_NotifyPreonline_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	if (IsCardIssuerSessionOK())
+
+	UINT64 crossEnd = GetTickCountRVC();
+	//? ? ? 为什么是110s,重试?从生产实际来看,在25s到40s之间,大部分在30s左右,需要和前端(65s)一致,改成60s oilyang@20221019
+	//in 110 second 
+	if (m_crossCtx != NULL)
 	{
-		ErrorCodeEnum eErr = Error_Unexpect;
-		CardIssuerService_NotifyPreonline_Req req;
-		CardIssuerService_NotifyPreonline_Ans ans;
-		req.account = ctx->Req.account;
-		req.cardPos = ctx->Req.cardPos;
-		req.data = ctx->Req.data;
-		req.errCode = ctx->Req.errCode;
-		req.findCard = ctx->Req.findCard;
-		req.termNo = ctx->Req.termNo;
-		req.reserved1.Copy(ctx->Req.reserved1);
-		req.reserved2.Copy(ctx->Req.reserved2);
-		req.reserved3.Copy(ctx->Req.reserved3);
-		req.reserved4.Copy(ctx->Req.reserved4);
-		eErr = m_pCardIssuer->NotifyPreonline(req, ans, 100000);
-		if (eErr == Error_Succeed)
+		if ((crossEnd - m_ullCrossStart) < 60 * 1000)
 		{
-			ctx->Ans.reserved1.Copy(ans.reserved1);
-			ctx->Ans.reserved2.Copy(ans.reserved2);
-			ctx->Ans.reserved3.Copy(ans.reserved3);
-			ctx->Ans.reserved4.Copy(ans.reserved4);
+			m_bCardActiveNotify = true;
+			m_crossCtx->Ans.cardPos = ctx->Req.cardPos;
+			m_crossCtx->Ans.findCard = ctx->Req.findCard;
+			m_crossCtx->Ans.result = ctx->Req.data;
+			CSimpleStringA outParam = CSimpleStringA::Format("NotifyPreOnline, cardPos:%d, findCard:%d, errCode:%d", ctx->Req.cardPos, ctx->Req.findCard, ctx->Req.errCode);
+			LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreOnline_ParamInfo, outParam.GetData());
+			if (ctx->Req.errCode == Error_Duplication)//THE CardStore is issuing card
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Q")("卡库正在使用中");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_Issuing, "卡库正在使用中");
+				m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DupCallPreOnline_WhileInWorking);
+			}
+			else if (ctx->Req.errCode == Error_TimeOut)//CardStore process cost too long!
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230W")("跨机时卡库处理耗时过长");
+				LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong, "跨机时卡库处理耗时过长");
+				m_crossCtx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong);
+			}
+			else if (ctx->Req.errCode == Error_NotExist)//heartbeat service can't find the dest terminal
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Y")("跨机时卡库不在线");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine, "跨机时卡库不在线");
+				m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine);
+			}
+			else if (ctx->Req.errCode == Error_DevNotAvailable)//CardStore maybe called by OTHER VTM
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2310")("卡库正在被其他VTM跨机调用");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther, "卡库正在被其他VTM跨机调用");
+				m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther);
+			}
+			else if (ctx->Req.errCode == Error_Hardware)//CardStore's CardIssuer in fault state
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2311")("卡库卡机未成功打开");
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState, "卡库卡机未成功打开");
+				m_crossCtx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState);
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327")("卡库异常:%d(0x%x)", ctx->Req.reserved1[0], ctx->Req.reserved1[0]);
+				m_crossCtx->Answer((ErrorCodeEnum)ctx->Req.errCode, MapErrorCodeWhileCallStore(ctx->Req.reserved1[0]));
+			}
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("NotifyPreonline, CardIssuer NotifyPreonline failed return:%d", eErr);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2312")("超时后,才收到卡库返回");
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong, "CardStore return after timeout.");
 		}
-		ctx->Answer(eErr);
-	}
-	else
-	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Entity CardIssuer is not ok.");
-		ctx->Answer(Error_Unexpect);
+		m_crossCtx = NULL;
 	}
+
+	ctx->Answer(Error_Succeed);
+
 	return 0;
 }
 int CCardReadAdapterFSM::QueryCardInfoOnStore(SpReqAnsContext<CardReadAdapterService_QueryCardInfoOnStore_Req, CardReadAdapterService_QueryCardInfoOnStore_Ans>::Pointer ctx)
@@ -2640,4 +2646,53 @@ int CCardReadAdapterFSM::QueryCIStatus(SpReqAnsContext<CardReadAdapterService_Qu
 		return 0;
 	}
 	return 0;
+}
+void CCardReadAdapterFSM::WaitCardActive()
+{
+	while (1)
+	{
+		if (m_bCardActiveNotify)
+			break;
+		UINT64 crossEnd = GetTickCountRVC();
+		if ((crossEnd - m_ullCrossStart) < 62 * 1000)
+			Sleep(1000);
+		else {
+			if (m_crossCtx != NULL)
+			{
+				FSMEvent* e = new FSMEvent(USER_EVT_PREONLINE_ON_STORE_FINISHED);
+				PostEventFIFO(e);
+
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230U")("跨机激活未收到返回,请确认卡库或服务是否正常");
+				m_crossCtx->Answer(Error_TimeOut, CardIssuer_UserErrorCode_CardActive_Service_NoReturn);
+				LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_Service_NoReturn, "CardActive havn't return in 60s");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("oiltest record for SelfChecker test 1792 to kill CardIsser");
+				break;
+			}
+		}
+	}
+}
+bool CCardReadAdapterFSM::CheckHBSessionOrToConnect()
+{
+	if (m_pHBClient != NULL && !m_pHBClient->QuerySessionClosed())
+		return true;
+	else
+	{
+		ErrorCodeEnum eErr = Error_Unexpect;
+		m_pHBClient = new HeartBeatService_ClientBase(GetEntityBase());
+		if (m_pHBClient != NULL) {
+			eErr = m_pHBClient->Connect();
+			if (eErr != Error_Succeed)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to HeartBeat failed:%d(0x%x)", eErr, eErr);
+				return false;
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to HeartBeat suc.");
+				return true;
+			}
+		}
+		else
+			return false;
+	}
 }

+ 41 - 6
Module/mod_CardReadAdapter/CardReadAdapterFSM.h

@@ -779,7 +779,7 @@ public:
 
 		END_FSM_RULE()
 
-		CCardReadAdapterFSM() : m_pCardIssuer(NULL), m_pContactless(NULL), m_pCardSwiper(NULL){}
+		CCardReadAdapterFSM() : m_pCardIssuer(NULL), m_pContactless(NULL), m_pCardSwiper(NULL), m_pHBClient(NULL){}
 	~CCardReadAdapterFSM(){}
 	virtual ErrorCodeEnum OnInit();
 	virtual ErrorCodeEnum OnExit();
@@ -877,6 +877,7 @@ public:
 	}
 	MachineType GetMachineType() {return m_eMachineType;}
 	int QueryCIStatus(SpReqAnsContext<CardReadAdapterService_QueryCIStatus_Req, CardReadAdapterService_QueryCIStatus_Ans>::Pointer ctx);
+	void WaitCardActive();
 protected:
 	//LPIDCCARDDATA* lppCardData;
 	int m_iInsertTries;
@@ -887,6 +888,7 @@ private:
 	CardIssuerService_ClientBase *m_pCardIssuer;
 	ContactlessCardService_ClientBase *m_pContactless;
 	CardSwiperService_ClientBase *m_pCardSwiper;
+	HeartBeatService_ClientBase* m_pHBClient;
 	BusinessContext m_busCtx;
 	SpReqAnsContext<CardReadAdapterService_Read_Req, CardReadAdapterService_Read_Ans>::Pointer m_readCtx;
 
@@ -905,7 +907,8 @@ private:
 	HMODULE m_hVerdorDll;
 	//GUIConsoleService_ClientBase *m_pGUIConsoleClient;
 	bool m_devInit, m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore
-		, m_bCDA, m_bIssuingExit, m_bCardIssued, m_bCaptureCfgFlag, m_bHasHopper[3], m_bBTConncting;
+		, m_bCDA, m_bIssuingExit, m_bCardIssued, m_bCaptureCfgFlag, m_bHasHopper[3], m_bBTConncting
+		, m_bCardActiveNotify;
 	ErrorCodeEnum m_testResult;
 	//m_CardInit,m_CardRemains,m_CardIssued,m_CardMixed,m_CardPercent
 	int m_CardCaptured, m_issueStatusFromFile, m_issueStatus, m_port, m_baudRate, m_currentHopper, m_scanSlot;
@@ -924,11 +927,36 @@ private:
 	char m_AuthCode[2];
 	bool m_bBTConnected;
 	map<int, CtxInfo> m_mapCtx;
+	SpReqAnsContext<CardReadAdapterService_PreOnlineOnStore_Req, CardReadAdapterService_PreOnlineOnStore_Ans>::Pointer m_crossCtx;
+	ULONGLONG m_ullCrossStart;
 
 	bool IsCardIssuerSessionOK();
 	bool IsContactlessCardSessionOK();
 	bool IsCardSwiperSessionOK();
 	bool IsTheEntity(int module,ModuleType eModule);
+	bool CheckHBSessionOrToConnect();
+	//oilyang@20230614 跨及时因为卡片的实际交易发生在卡库,需要在发起端对返回的UserErrorCode做二次映射,方便客户理解提示信息
+	DWORD MapErrorCodeWhileCallStore(DWORD eErrCode)
+	{
+		//eErrCode defined on CardIssuer_UserErrorCode.h
+		switch (eErrCode)
+		{
+		case 0x20300240:
+			return 0x203002E0;
+		case 0x20300242:
+			return 0x203002E1;
+		case 0x20300243:
+			return 0x203002E2;
+		case 0x20300244:
+			return 0x203002E3;
+		case 0x20300246:
+			return 0x203002E4;
+		case 0x2030000D:
+			return 0x203002E5;
+		default:
+			return eErrCode;
+		}
+	}
 };
 struct InitTask : public ITaskSp
 {
@@ -1283,9 +1311,7 @@ struct PreOnlineOnStoreTask : public ITaskSp
 	PreOnlineOnStoreTask(CCardReadAdapterFSM* f) : fsm(f) {}
 	void Process()
 	{
-		FSMEvent *e = new FSMEvent(USER_EVT_PREONLINE_ON_STORE_FINISHED);
-		e->param1 = fsm->PreOnlineOnStore(ctx);
-		fsm->PostEventFIFO(e);
+		fsm->PreOnlineOnStore(ctx);
 	}
 };
 struct GetAddCardInfoTask : public ITaskSp
@@ -1307,7 +1333,7 @@ struct NotifyPreOnlineTask : public ITaskSp
 	NotifyPreOnlineTask(CCardReadAdapterFSM* f) : fsm(f) {}
 	void Process()
 	{
-		FSMEvent *e = new FSMEvent(USER_EVT_NOTIFY_PREONLINE_FINISHED);
+		FSMEvent* e = new FSMEvent(USER_EVT_PREONLINE_ON_STORE_FINISHED);
 		e->param1 = fsm->NotifyPreonline(ctx);
 		fsm->PostEventFIFO(e);
 	}
@@ -1384,4 +1410,13 @@ struct Test2Task : public ITaskSp
 		fsm->PostEventFIFO(e);
 	}
 };
+struct WaitCardActiveTask : public ITaskSp
+{
+	CCardReadAdapterFSM* fsm;
+	WaitCardActiveTask(CCardReadAdapterFSM* f) : fsm(f) {}
+	void Process()
+	{
+		fsm->WaitCardActive();
+	}
+};
 #endif //__CARDREAD_ADAPTER_FSM_H

+ 1 - 2
Module/mod_ContactlessCard/ContactlessCard_UserErrorCode.h

@@ -30,7 +30,6 @@
 
 //实际root配置
 #define ContactlessCard_UserErrorCode_Real_Root_Config						(ContactlessCard_UserErrorCode_Start + 36)	//实际root配置
-
-#define ContactlessCard_UserErrorCode_AccoutInfo							(ContactlessCard_UserErrorCode_Start + 40)	//卡号(脱敏后)
+#define ContactlessCard_UserErrorCode_ReadAccount							(ContactlessCard_UserErrorCode_Start + 37)	//读到卡片信息
 
 #endif //_CONTACTLESSCARD_USER_ERRORCODE_H

+ 2 - 4
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -963,10 +963,8 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
 
 				t2ICTrack2 = pICTrack2;
 				t2ICAccount = (char*)ddd;//oiltest
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("split pos:%d, card acount:%s,%s", pos, t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
-				LogWarn(Severity_Low, Error_Succeed, ContactlessCard_UserErrorCode_AccoutInfo,
-					CSimpleStringA::Format("card acount:%s****%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str()));
-				
+				LogWarn(Severity_Low, Error_Succeed, ContactlessCard_UserErrorCode_ReadAccount, CSimpleStringA::Format("split pos:%d, card acount:%s,%s"
+					, pos, t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str()));
 				ctx->Ans.ICData = ctx->Ans.t2Account = t2ICAccount.c_str();
 				ctx->Ans.ICType = 4;
 				ctx->Ans.status = 0;

+ 13 - 2
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -672,11 +672,12 @@ int CIDCertFSM::ReadAndScan(SpReqAnsContext<IDCert_ReadAndScan_Req, IDCert_ReadA
 					//hyc@2021.3.24
 					LogDate(idInfoOld);
 
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,"
+					CSimpleStringA csIDLogInfo = CSimpleStringA::Format("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,"
 						,idInfoOld.sex.data
 						,idInfoOld.nation.data
 						,idInfoOld.endDate.data
 						,(const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1));
+					LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData());
 
 					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to get photo");
 					GetPngBlobEx(ctx->Ans.headphoto, "zp", true);
@@ -740,12 +741,14 @@ int CIDCertFSM::ReadAndScan(SpReqAnsContext<IDCert_ReadAndScan_Req, IDCert_ReadA
 					}
 					GetPngBlobEx(ctx->Ans.headphoto, "zp", true);
 
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s"
+					CSimpleStringA csIDLogInfo = CSimpleStringA::Format("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s"
 						, (const char*)ctx->Ans.sex, (const char*)ctx->Ans.nation
 						, (const char*)ctx->Ans.enddate
 						, (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)
 						, (const char*)ctx->Ans.idtype);
 
+					LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData());
+
 					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to get photo");
 					eErr = GetPngBlob(ctx->Ans.photodata, true);
 					if (eErr != Error_Succeed)
@@ -1114,6 +1117,14 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 						, (const char*)ctx->Ans.enddate
 						, (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)
 						, (const char*)ctx->Ans.idtype);*/
+					CSimpleStringA tIdcode = (char*)idno;
+					CSimpleStringA csIDLogInfo = CSimpleStringA::Format("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s"
+						, (const char*)sex, (const char*)nation
+						, (const char*)endDate
+						, (const char*)tIdcode.SubString(0, 4), (const char*)tIdcode.SubString(tIdcode.GetLength() - 1, 1)
+						, (const char*)idType);
+
+					LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData());
 
 					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to get photo");
 					eErr = GetPngBlob(ctx->Ans.photodata, true);

+ 2 - 0
Module/mod_IDCertificate/IDCertificate_UserErrorCode.h

@@ -26,6 +26,8 @@
 #define IDCertificate_UserErrorCode_ReadAndScan_Failed		(IDCertificate_UserErrorCode_Start + 26) //读取身份证失败
 #define IDCertificate_UserErrorCode_ReadAndScan_Interrupt	(IDCertificate_UserErrorCode_Start + 27) //读取身份证异常退出
 #define IDCertificate_UserErrorCode_ReadAndScan_NotHanZi	(IDCertificate_UserErrorCode_Start + 28) //读取身份证非汉字 错误码为 2010021c
+#define IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo	(IDCertificate_UserErrorCode_Start + 29) //读取身份证信息 错误码为 2010021d
+#define IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild (IDCertificate_UserErrorCode_Start + 30) // 扫描图片获取失败错误码为 2010021e
 
 #define IDCertificate_UserErrorCode_Real_Root_Config		(IDCertificate_UserErrorCode_Start + 31) //加载实际的root配置
 

+ 1 - 1
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -262,7 +262,7 @@ struct TimeSynTask : ITaskSp {
 
 			if (!responseStatus.IsOperatedOK()) {
                 m_fsm->doWarnMsg(ERR_ACCESSAUTH_REPORT_STATE,
-                                 GetOutPutStr("%s%s%s%s", "TimeSynTask", responseStatus.errorCode.c_str(), "message", responseStatus.errorMsg.c_str()).c_str());
+                                 GetOutPutStr("%s%s%s%s", "TimeSynTask", responseStatus.errorCode.c_str(), "message", responseStatus.errorMsg.c_str()).c_str(), true);
                 return;
 			}
 

+ 88 - 363
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -213,55 +213,6 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 	case USER_EVT_QUIT:
 		pEvt->SetHandled();
 		break;
-	case USER_EVT_GET_MATERIAL:
-	{
-		pEvt->SetHandled();
-		GetMaterialEvent *pGME = dynamic_cast<GetMaterialEvent*>(pEvt);
-		pGME->ctx->Ans.captured = m_CardCaptured;
-		pGME->ctx->Ans.remains = m_remainsEx[0];
-		pGME->ctx->Ans.issued = m_issuedEx[0];
-		pGME->ctx->Ans.mixed = m_mixedEx[0];
-		pGME->ctx->Answer(Error_Succeed);
-	}
-		break;
-	case USER_EVT_SET_MATERIAL:
-	{
-		m_bSettingMaterial = true;
-		pEvt->SetHandled();
-		bool bR, bC, bI, bM;
-		bR = bC = bI = bM = true;
-		SetMaterialEvent *pSME = dynamic_cast<SetMaterialEvent*>(pEvt);
-		if (pSME->ctx->Req.bRemains)
-		{
-			m_CardInitEx[0] = m_remainsEx[0] = pSME->ctx->Req.remains;
-			bR = SetCardRemains(pSME->ctx->Req.remains, 1, true);
-		}
-		if (pSME->ctx->Req.bCaptured)
-		{
-			m_CardCaptured = pSME->ctx->Req.captured;
-			bC = SetCardCaptured(pSME->ctx->Req.captured);
-		}
-		if (pSME->ctx->Req.bIssued)
-		{
-			m_issuedEx[0] = pSME->ctx->Req.issued;
-			bI = SetCardIssued(pSME->ctx->Req.issued, 1);
-		}
-		if (pSME->ctx->Req.bMixed)
-		{
-			m_mixedEx[0] = pSME->ctx->Req.mixed;
-			bM = SetCardMixed(pSME->ctx->Req.mixed, 1);
-		}
-		if (bR && bC && bI && bM)
-			pSME->ctx->Answer(Error_Succeed);
-		else
-		{
-			pSME->ctx->Answer(Error_Unexpect);
-		}
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("case USER_EVT_SET_MATERIAL, bRemains:%d, bCaptured:%d, bIssued:%d, bMixed:%d, bR:%d, bC:%d, bI:%d, bM:%d",
-			pSME->ctx->Req.bRemains, pSME->ctx->Req.bCaptured, pSME->ctx->Req.bIssued, pSME->ctx->Req.bMixed, bR, bC, bI, bM));
-		m_bSettingMaterial = false;
-	}
-		break;
 	case USER_EVT_GET_MATERIAL_EX:
 	{
 		pEvt->SetHandled();
@@ -313,7 +264,7 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 				pGMEE->ctx->Ans.reserved1[i] = 0;
 				pGMEE->ctx->Ans.reserved2[i] = "";
 			}
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetMaterial CardBoxNo:%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,",
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("GetMaterial CardBoxNo (%d):%s, PsbCode:%s, PsbName:%s, CardInit:%d, remains:%d, issued:%d, mixed:%d,",i,
 				pGMEE->ctx->Ans.CardBoxNo[i].GetData(),
 				pGMEE->ctx->Ans.PsbCode[i].GetData(),
 				pGMEE->ctx->Ans.PsbName[i].GetData(),
@@ -407,15 +358,6 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 		}
 		break;
 	}
-	case USER_EVT_PREONLINE_ON_STORE:
-	{
-		pEvt->SetHandled();
-		PreOnlineOnStoreEvent *bsl = dynamic_cast<PreOnlineOnStoreEvent*>(pEvt);
-		PreOnlineOnStoreTask *pTask = new PreOnlineOnStoreTask(this);
-		pTask->ctx = bsl->ctx;
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-	}
-		break;
 	default:
 		break;
 	}
@@ -457,7 +399,7 @@ unsigned int CCardIssuerFSM::s3_on_event(FSMEvent* pEvt)
 		break;
 	case USER_EVT_ACCEPT_CANCEL:
 		m_bCancelAccept = true;
-		m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+		//m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 		pEvt->SetHandled();
 		ret = 3;
 		break;
@@ -490,7 +432,7 @@ unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s4 evt (%d,%d)", pEvt->iEvt, pEvt->param1));
 
 	switch(pEvt->iEvt){
-		case USER_EVT_READ_NEW:
+		case USER_EVT_READ:
 			{
 				CardReadEvent* crne = dynamic_cast<CardReadEvent*>(pEvt);
 				ReadTask* task = new ReadTask(this);
@@ -571,56 +513,6 @@ unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
 				pEvt->SetHandled();
 				return 0;
 			}
-		case USER_EVT_GET_MATERIAL:
-		{
-			pEvt->SetHandled();
-			GetMaterialEvent *pGME = dynamic_cast<GetMaterialEvent*>(pEvt);
-			pGME->ctx->Ans.captured = m_CardCaptured;
-			pGME->ctx->Ans.remains = m_remainsEx[0];
-			pGME->ctx->Ans.issued = m_issuedEx[0];
-			pGME->ctx->Ans.mixed = m_mixedEx[0];
-			pGME->ctx->Answer(Error_Succeed);
-		}
-			break;
-		case USER_EVT_SET_MATERIAL:
-		{
-				m_bSettingMaterial = true;
-				pEvt->SetHandled();
-				bool bR, bC, bI, bM;
-				bR = bC = bI = bM = true;
-				SetMaterialEvent *pSME = dynamic_cast<SetMaterialEvent*>(pEvt);
-				if (pSME->ctx->Req.bRemains)
-				{
-					m_CardInitEx[0] = m_remainsEx[0] = pSME->ctx->Req.remains;
-					bR = SetCardRemains(pSME->ctx->Req.remains, 1, true);
-				}
-				if (pSME->ctx->Req.bCaptured)
-				{
-					m_CardCaptured = pSME->ctx->Req.captured;
-					bC = SetCardCaptured(pSME->ctx->Req.captured);
-				}
-				if (pSME->ctx->Req.bIssued)
-				{
-					m_issuedEx[0] = pSME->ctx->Req.issued;
-					bI = SetCardIssued(pSME->ctx->Req.issued, 1);
-				}
-				if (pSME->ctx->Req.bMixed)
-				{
-					m_mixedEx[0] = pSME->ctx->Req.mixed;
-					bM = SetCardMixed(pSME->ctx->Req.mixed, 1);
-				}
-				if (bR && bC && bI && bM)
-					pSME->ctx->Answer(Error_Succeed);
-				else
-				{
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set material failed.r(%d),c(%d),i(%d),m(%d)", bR, bC, bI, bM);
-					pSME->ctx->Answer(Error_Unexpect);
-				}
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("case USER_EVT_SET_MATERIAL, bRemains:%d, bCaptured:%d, bIssued:%d, bMixed:%d, bR:%d, bC:%d, bI:%d, bM:%d",
-					pSME->ctx->Req.bRemains, pSME->ctx->Req.bCaptured, pSME->ctx->Req.bIssued, pSME->ctx->Req.bMixed, bR, bC, bI, bM);
-				m_bSettingMaterial = false;
-		}
-			break;
 		case USER_EVT_GET_MATERIAL_EX:
 		{
 			pEvt->SetHandled();
@@ -807,7 +699,7 @@ unsigned int CCardIssuerFSM::s5_on_event(FSMEvent* pEvt)
 	int ret = 0;
 	switch(pEvt->iEvt)
 	{
-	case USER_EVT_READ_NEW_FINISHED:
+	case USER_EVT_READ_FINISHED:
 		{
 			pEvt->SetHandled();
 			CardReadFinishedEvent *pCRNFE = dynamic_cast<CardReadFinishedEvent *>(pEvt);
@@ -823,7 +715,7 @@ unsigned int CCardIssuerFSM::s5_on_event(FSMEvent* pEvt)
 			else
 			{
 				SetErrPackage("Read finished", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus);
-				pCRNFE->ctx->Answer(Error_Unexpect, AlarmDEC(true));
+				pCRNFE->ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败");
 				ret = 1;
 			}
@@ -925,19 +817,6 @@ unsigned int CCardIssuerFSM::s7_on_event(FSMEvent* pEvt)
 		pEvt->SetHandled();
 		return 0;
 	}
-	case USER_EVT_GET_MATERIAL:
-	{
-		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("captured:%d, remains:%d, issued:%d, mixed:%d",
-			m_CardCaptured, m_remainsEx[0], m_issuedEx[0], m_mixedEx[0]);
-		GetMaterialEvent* pGME = dynamic_cast<GetMaterialEvent*>(pEvt);
-		pGME->ctx->Ans.captured = m_CardCaptured;
-		pGME->ctx->Ans.remains = m_remainsEx[0];
-		pGME->ctx->Ans.issued = m_issuedEx[0];
-		pGME->ctx->Ans.mixed = m_mixedEx[0];
-		pGME->ctx->Answer(Error_Succeed);
-	}
-		break;
 	case USER_EVT_GET_MATERIAL_EX:
 	{
 		pEvt->SetHandled();
@@ -1266,31 +1145,6 @@ unsigned int CCardIssuerFSM::s14_on_event(FSMEvent* pEvt)
 	}
 	return ret;
 }
-//PreOnlineOnStore
-void CCardIssuerFSM::s16_on_entry()
-{
-	m_currentFSMState = 16;
-}
-void CCardIssuerFSM::s16_on_exit()
-{
-}
-unsigned int CCardIssuerFSM::s16_on_event(FSMEvent* pEvt)
-{
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s16 evt (%d,%d)", pEvt->iEvt, pEvt->param1));
-	switch (pEvt->iEvt)
-	{
-		case USER_EVT_PREONLINE_ON_STORE_FINISHED:
-		{
-			pEvt->SetHandled();
-			return pEvt->param1;
-		}
-			break;
-		default:
-			break;
-	}
-	return 0;
-}
-
 
 ErrorCodeEnum CCardIssuerFSM::OnInit()
 {
@@ -1332,8 +1186,7 @@ ErrorCodeEnum CCardIssuerFSM::OnExit()
 		l_beginTime = GetTickCountRVC();
 		eExit = m_hDevHelper->GetDevStatus(m_devStatus);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus", l_beginTime, l_endTime, eExit,
-				CSimpleStringA::Format("OnExit, m_devStatus.eMedia:%d, m_issueStatus:%d", m_devStatus.eMedia, m_issueStatus));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnExit, m_devStatus.eMedia:%d, m_issueStatus:%d", m_devStatus.eMedia, m_issueStatus);
 		
 		if (eExit == Error_Succeed)
 		{
@@ -1356,9 +1209,9 @@ ErrorCodeEnum CCardIssuerFSM::OnExit()
 		eExit = m_hDevHelper->DevClose();
 		l_endTime = GetTickCountRVC();
 		if (eExit == Error_Succeed)
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DevClose", l_beginTime, l_endTime, eExit, CSimpleStringA::Format("OnExit,读卡器关闭成功"));
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnExit,读卡器关闭DevClose成功");
 		else
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DevClose", l_beginTime, l_endTime, eExit, CSimpleStringA::Format("OnExit,读卡器关闭失败"));
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnExit,读卡器关闭DevClose失败 eErr:%d", eExit);
 	}
 	FSMImpl<CCardIssuerFSM>::OnExit();
 	return Error_Succeed;
@@ -1407,7 +1260,7 @@ bool CCardIssuerFSM::GetDevStatus(bool bPrint)
 		errCode = m_hDevHelper->GetDevStatus(m_devStatus);
 		l_endTime = GetTickCountRVC();
 		if (bPrint)
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus", l_beginTime, l_endTime, errCode,CSimpleStringA::Format("GetDevStatus, GetDevStatus::eMedia: %d", m_devStatus.eMedia));
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus, GetDevStatus::eMedia: %d", m_devStatus.eMedia);
 		if (Error_Succeed == errCode) 
 		{
 			if (_strnicmp("RVC.CardPrinter", m_csMachineType, strlen("RVC.CardPrinter")) == 0)
@@ -1644,8 +1497,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		long l_beginTime = GetTickCountRVC();
 		eErrDev = m_hDevHelper->DevOpenEx(m_port, m_baudRate, btOpenType, pDevSN, m_connectType);
 		long l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DevOpenEx", l_beginTime, l_endTime, eErrDev,
-			CSimpleStringA::Format("OpenDevice, openType:%d, connectType:%d", btOpenType, m_connectType));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OpenDevice, openType:%d, connectType:%d", btOpenType, m_connectType);
 
 		if (eErrDev == Error_Succeed)
 		{
@@ -1661,9 +1513,8 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 			{
 				CSimpleStringA tmpVersion = CSimpleStringA::Format("%d.%d.%d.%d", m_devCat.version.wMajor, m_devCat.version.wMinor, m_devCat.version.wRevision, m_devCat.version.wBuild);
 				int ret = SplitDevModelInfo();
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevCategory", l_beginTime, l_endTime, eErrDev,
-					CSimpleStringA::Format("OpenDevice, szVendor:%s, szType:%s, szModel:%s, version:%s, ret:%d",
-						m_devCat.szVendor, m_devCat.szType, m_devCat.szVendor, tmpVersion.GetData(), ret));
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OpenDevice, szVendor:%s, szType:%s, szModel:%s, version:%s, ret:%d",
+						m_devCat.szVendor, m_devCat.szType, m_devCat.szVendor, tmpVersion.GetData(), ret);
 				m_adapterInfo.FulfillCategoryInfo(m_devCat);
 			}
 			else
@@ -1835,7 +1686,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		}
 		else
 		{
-			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Open_Failed, "读卡器打开失败");
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Open_Failed, "启动后检查卡机状态失败");
 			return Error_Unexpect;
 		}
 	}
@@ -1894,7 +1745,9 @@ int CCardIssuerFSM::UnAcceptCard()
 	CSimpleStringA errMsg(true);
 	if (GetDevStatus())
 	{
-		if (m_devStatus.eMedia == CI_MEDIA_PRESENT)
+		switch (m_devStatus.eMedia)
+		{
+		case CI_MEDIA_PRESENT:
 		{
 			m_hasCardWhileDevOpen = true;
 			JustReadCardNo();
@@ -1917,23 +1770,30 @@ int CCardIssuerFSM::UnAcceptCard()
 			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_EntityOnStart, errMsg.GetData());
 			return CaptureCard(NULL);
 		}
-		else
-		{
-			long l_beginTime, l_endTime;
-			l_beginTime = GetTickCountRVC();
-			eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
-			l_endTime = GetTickCountRVC();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetCardInType", l_beginTime, l_endTime, eErr, "UnAcceptCard, CI_CARD_IN_TYPE_FORBIDDEN");
-
-			if (Error_Succeed != eErr){
-				SetErrPackage("UnAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
-				AlarmDEC();
-			} 
-			if (GetDevStatus())
-				return 0;
-			else
-				return 1;
+		case CI_MEDIA_JAMMED:
+		case CI_MEDIA_ENTERING:
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardPosUnexpectedOnDevOpen, CSimpleStringA::Format("Unexpected CardStatusEnum:%d", m_devStatus.eMedia));
+			break;
+		case CI_MEDIA_NOTPRESENT:
+			return 0;
+		default:
+			break;
 		}
+
+		//oilyang@20230612 delete the following lines,as no need to GetDevStatus twice
+		//long l_beginTime, l_endTime;
+		//l_beginTime = GetTickCountRVC();
+		//eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+		//l_endTime = GetTickCountRVC();
+
+		//if (Error_Succeed != eErr){
+		//	SetErrPackage("UnAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
+		//	AlarmDEC();
+		//} 
+		//if (GetDevStatus())
+		//	return 0;
+		//else
+		//	return 1;
 	}
 	else
 	{
@@ -2072,7 +1932,6 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 	l_beginTime = GetTickCountRVC();
 	errCode = m_hDevHelper->GetDevStatus(cis);
 	l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevStatus", l_beginTime, l_endTime, errCode, "IssueCard");
 
 	if (errCode != Error_Succeed) {
 		SetErrPackage("IssueCard::GetDevStatus", m_csDevSN, errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus);
@@ -2168,7 +2027,6 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 	l_beginTime = GetTickCountRVC();
 	errCode = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 	l_beginTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetCardInType",l_beginTime, l_endTime, errCode, "IssueCard, CI_CARD_IN_TYPE_FORBIDDEN");
 
 	if (errCode != Error_Succeed)
 	{
@@ -2182,7 +2040,7 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 	l_beginTime = GetTickCountRVC();
 	errCode = m_hDevHelper->MoveCard(CI_MOVECARD_FROM_HOPPER, m_currentHopper);
 	l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MoveCard", l_beginTime, l_endTime, errCode, CSimpleStringA::Format("IssuerCard, m_currentHopper:%d", m_currentHopper));
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssuerCard, m_currentHopper:%d", m_currentHopper);
 	m_bCardFromHopper = true;
 	if (errCode != Error_Succeed)
 	{
@@ -2190,12 +2048,12 @@ int CCardIssuerFSM::IssueCard(SpReqAnsContext<CardIssuerService_Issue_Req, CardI
 		SetErrPackage("IssueCard::MoveCard", m_csDevSN, errCode, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA2306")("从卡箱移动卡片到读卡器失败,请重试或检查是否有塞卡");
 		if (ctx != NULL)
-			ctx->Answer(Error_Unexpect, AlarmDEC(true));
+			ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 		else
-			ctxEx->Answer(Error_Unexpect, AlarmDEC(true));
+			ctxEx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 		return 1;
 	}
-
+	LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_MoveCard_FromHopper, "MoveCard from hopper suc.");
 	m_issuedEx[m_currentHopper - 1]++;
 	m_remainsEx[m_currentHopper - 1]--;
 	//oilyang@20180809 增加对单卡槽多卡槽机器的使用及闲置的适配
@@ -2281,7 +2139,6 @@ int CCardIssuerFSM::CaptureCard(SpReqAnsContext<CardIssuerService_Capture_Req,Ca
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetCardInType", l_beginTime, l_endTime, eErr, "CaptureCard, CI_CARD_IN_TYPE_FORBIDDEN");
 
 		if (eErr != Error_Succeed) {
 			SetErrPackage("CaptureCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
@@ -2292,7 +2149,10 @@ int CCardIssuerFSM::CaptureCard(SpReqAnsContext<CardIssuerService_Capture_Req,Ca
 	}
 	else {
 		if (ctx != NULL){
-			LogError(Severity_Middle, Error_Unexpect, 0x20300034, "CaptureCard failed");
+			if (m_iInWhatPage == PageType_Other)
+				LogError(Severity_Middle, Error_Unexpect, 0x20300034, "CaptureCard failed");
+			else
+				LogWarn(Severity_Middle, Error_Unexpect, 0x20300034, "CaptureCard failed");
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220304").setResultCode("RTA2307")("吞卡失败,请检查吞卡箱是否已满或联系厂商检查是否有吞卡");
 			ctx->Answer(Error_Unexpect, 0x20300034);
 		}
@@ -2308,7 +2168,7 @@ int CCardIssuerFSM::EjectCard(SpReqAnsContext<CardIssuerService_Eject_Req,CardIs
 	Sleep(300);//oilyang@20230106 for keba said "maybe we need stay for machine to prepare..."
 	int ret = 0;
 	ErrorCodeEnum eErr;
-	eErr = MachineMoveCardFrontGate(ctx != NULL);
+	eErr = MachineMoveCardFrontGate(ctx != NULL && m_iInWhatPage == PageType_Other);
 	m_pCardProcess->DataInit();
 	if (Error_Succeed == eErr){
 		if (ctx != NULL)
@@ -2343,7 +2203,6 @@ int CCardIssuerFSM::WaitFetchingCard()
 				l_beginTime = GetTickCountRVC();
 				ErrorCodeEnum eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 				l_endTime = GetTickCountRVC();
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetCardInType", l_beginTime, l_endTime, eErr, "WaitFetchingCard,card fetched,to set CI_CARD_IN_TYPE_FORBIDDEN");
 
 				if (eErr != Error_Succeed) {
 					SetErrPackage("WaitFetchingCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
@@ -2402,12 +2261,18 @@ int CCardIssuerFSM::InternalAcceptCard()
 			{
 				acceptTries++;
 				Sleep(ACCEPT_TRY_INTERVAL);
+				//oilyang@20230609 after sleep,to check if have been canceled in sleeping time
+				if (m_bCancelAccept)
+				{
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("have been canceled in sleeping time");
+					err = 3;
+					goto Err;
+				}
 				//hr = m_pIDCard->IDC_Accept(IDC_ALL_CARD,&lpCardData);
 				if (!m_bCancelAccept && !bHasSetCardInType) {
 					l_beginTime = GetTickCountRVC();
 					eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_ALL);
 					l_endTime = GetTickCountRVC();
-					//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetCardInType", l_beginTime, l_endTime, eErr, "InternalAcceptCard, CI_CARD_IN_TYPE_ALL");
 				}
 				if (Error_Succeed != eErr) {
 					SetErrPackage("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_ALL)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
@@ -2432,7 +2297,6 @@ Err:
 	l_beginTime = GetTickCountRVC();
 	eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 	l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SetCardInType", l_beginTime, l_endTime, eErr, "InternalAcceptCard, CI_CARD_IN_TYPE_FORBIDDEN");
 
 	if (Error_Succeed != eErr)
 	{
@@ -2451,13 +2315,12 @@ Err:
 			{
 				err = 4;
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<InternalAcceptCard>, Cancel InterAccept, eject card.");
-				eErr = MachineMoveCardFrontGate(true);
+				eErr = MachineMoveCardFrontGate(m_iInWhatPage == PageType_Other);
 
 				if (Error_Succeed == eErr) {
 					l_beginTime = GetTickCountRVC();
 					eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 					l_endTime = GetTickCountRVC();
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalAcceptCard, SetCardInType", l_beginTime, l_endTime, eErr, "CI_CARD_IN_TYPE_FORBIDDEN");
 
 					if (eErr != Error_Succeed) {
 						SetErrPackage("InternalAcceptCard::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SetCardInType);
@@ -2492,7 +2355,8 @@ int CCardIssuerFSM::AcceptCard(SpReqAnsContext<CardIssuerService_Insert_Req, Car
 		m_bCardFromHopper = false;
 		if (ctx != NULL)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AcceptCard, insert succeed");
+			LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_InsertCardSucceed, "AcceptCard, insert succeed");
+			
 			m_bUseRFTillNext = false;
 			ctx->Answer(Error_Succeed);
 		}
@@ -2515,7 +2379,7 @@ int CCardIssuerFSM::AcceptCard(SpReqAnsContext<CardIssuerService_Insert_Req, Car
 	{
 		if (ctx != NULL){
 			SetErrPackage("AcceptCard::InternalAcceptCard", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus);
-			ctx->Answer(Error_Unexpect, AlarmDEC(true));
+			ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 		}
 	}
 	return rc;
@@ -2621,8 +2485,8 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerService_Read_Req,
 		l_beginTime = GetTickCountRVC();
 		eMagReadErr = m_hDevHelper->MagRead(magTracks);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagRead", l_beginTime, l_endTime, eMagReadErr, CSimpleString::Format("t2Status:%d, t3Status:%d, t2Len:%d, t3Len:%d",
-			magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[1].dwSize, magTracks.track[2].dwSize));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagRead t2Status:%d, t3Status:%d, t2Len:%d, t3Len:%d",
+			magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[1].dwSize, magTracks.track[2].dwSize);
 		//oilyang@20230204 copy mag data for RF
 		m_magTracks.eRange = magTracks.eRange;
 		for (int i = 0; i < 3; ++i)
@@ -2814,7 +2678,6 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerService_Read_Req,
 				l_beginTime = GetTickCountRVC();
 				eErr = m_hDevHelper->DeactivateICCard();
 				l_endTime = GetTickCountRVC();
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeactivateICCard", l_beginTime, l_endTime, eErr, "ReadCard");
 
 				if (eErr != Error_Succeed) {
 				SetErrPackage("ReadCard::DeactivateICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard);
@@ -3050,7 +2913,6 @@ int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerService_Read_Req, Card
 				l_beginTime = GetTickCountRVC();
 				eErr = m_hDevHelper->DeactContactlessICCard();
 				l_endTime = GetTickCountRVC();
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeactContactlessICCard", l_beginTime, l_endTime, eErr, "ReadCard");
 
 				if (eErr != Error_Succeed) {
 					SetErrPackage("ReadCard::DeactContactlessICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard);
@@ -3156,7 +3018,7 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerService_PreOnlin
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230V")("发卡时,检测卡片类型时上电失败");
 				if (!IfUseRf())
 				{
-					if (!bCrossPreOnline)
+					if (!bCrossPreOnline && m_iInWhatPage == PageType_Other)
 						LogError(Severity_Middle, Error_Unexpect, 0x203002A1, "(IssueCard)PreOnline::DetectAndReadICData:DetectIfICCard");
 					else
 						LogWarn(Severity_Middle, Error_Unexpect, 0x203002A1, "(IssueCard)PreOnline::DetectAndReadICData:DetectIfICCard");
@@ -3168,7 +3030,7 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerService_PreOnlin
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA230M")("检测卡片类型时上电失败");
 				if (!IfUseRf())
 				{
-					if (!bCrossPreOnline)
+					if (!bCrossPreOnline && m_iInWhatPage == PageType_Other)
 						LogError(Severity_Middle, Error_Unexpect, 0x20300243, "PreOnline::DetectAndReadICData:DetectIfICCard");
 					else
 						LogWarn(Severity_Middle, Error_Unexpect, 0x20300243, "PreOnline::DetectAndReadICData:DetectIfICCard");
@@ -3184,7 +3046,7 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerService_PreOnlin
 			if (!IfUseRf())
 			{
 				SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-2)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand);
-				ctx->Answer(Error_Unexpect, AlarmDEC(!bCrossPreOnline));
+				ctx->Answer(Error_Unexpect, AlarmDEC(!bCrossPreOnline && m_iInWhatPage == PageType_Other));
 			}
 		}else if (retDetectAndRead == -3){
 			if (m_issueStatus)
@@ -3194,7 +3056,7 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerService_PreOnlin
 			if (!IfUseRf())
 			{
 				SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-3)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand);
-				ctx->Answer(Error_Unexpect, AlarmDEC(!bCrossPreOnline));
+				ctx->Answer(Error_Unexpect, AlarmDEC(!bCrossPreOnline && m_iInWhatPage == PageType_Other));
 			}
 		}
 		bICOK = false;
@@ -3461,13 +3323,19 @@ int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext<CardIssuerService_PreOnline_Req
 			if (m_issueStatus)
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220320").setResultCode("RTA230V")("发卡时,检测卡片类型时上电失败");
-				LogError(Severity_Middle, Error_Unexpect, 0x203002A1, "(IssueCard)PreOnline_RF::DetectAndReadICData:DetectIfICCard");
+				if (m_iInWhatPage == PageType_Other)
+					LogError(Severity_Middle, Error_Unexpect, 0x203002A1, "(IssueCard)PreOnline_RF::DetectAndReadICData:DetectIfICCard");
+				else
+					LogWarn(Severity_Middle, Error_Unexpect, 0x203002A1, "(IssueCard)PreOnline_RF::DetectAndReadICData:DetectIfICCard");
 				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
 			}
 			else
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA230M")("检测卡片类型时上电失败");
-				LogError(Severity_Middle, Error_Unexpect, 0x20300243, "PreOnline_RF::DetectAndReadICData:DetectIfICCard");
+				if (m_iInWhatPage == PageType_Other)
+					LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, "PreOnline_RF::DetectAndReadICData:DetectIfICCard");
+				else
+					LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, "PreOnline_RF::DetectAndReadICData:DetectIfICCard");
 				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed);
 			}
 		}
@@ -3477,7 +3345,7 @@ int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext<CardIssuerService_PreOnline_Req
 			else
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败");
 			SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-2)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand);
-			ctx->Answer(Error_Unexpect, AlarmDEC(true));
+			ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 		}
 		else if (retDetectAndRead == -3) {
 			if (m_issueStatus)
@@ -3485,7 +3353,7 @@ int CCardIssuerFSM::PreOnline_RF(SpReqAnsContext<CardIssuerService_PreOnline_Req
 			else
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220303").setResultCode("RTA2302")("读取IC数据失败");
 			SetErrPackage(xCardName + " PreOnline::DetectAndReadICData:GetICDataFromCard(-3)", m_csDevSN, Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand);
-			ctx->Answer(Error_Unexpect, AlarmDEC(true));
+			ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 		}
 		return 0;
 	}
@@ -3765,13 +3633,12 @@ int CCardIssuerFSM::WriteCard(SpReqAnsContext<CardIssuerService_WriteTrack_Req,
 		long l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->MoveCard(CI_MOVECARD_MAG_POSITION);
 		long l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MoveCard", l_beginTime, l_endTime, eErr, "CI_MOVECARD_MAG_POSITION");
 
 		if (eErr != Error_Succeed)
 		{
 			SetErrPackage("WriteCard::MoveCard(CI_MOVECARD_MAG_POSITION)", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_MAG_POSITION);
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220315").setResultCode("RTA2309")("从卡箱移动卡片到磁条写卡位置失败");
-			ctx->Answer(Error_Unexpect, AlarmDEC(true));
+			ctx->Answer(Error_Unexpect, AlarmDEC(m_iInWhatPage == PageType_Other));
 			return ret;
 		}
 	}
@@ -3816,7 +3683,6 @@ int CCardIssuerFSM::WriteCard(SpReqAnsContext<CardIssuerService_WriteTrack_Req,
 	l_beginTime = GetTickCountRVC();
 	eErr = m_hDevHelper->MagWrite(magTrack, AUTO_CO);
 	l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagWrite", l_beginTime, l_endTime, eErr, "AUTO_CO");
 
 	if (eErr != Error_Succeed)
 	{
@@ -3824,7 +3690,7 @@ int CCardIssuerFSM::WriteCard(SpReqAnsContext<CardIssuerService_WriteTrack_Req,
 		AlarmDEC();
 		ret = 1;
 	}
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220315")();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220315")("MagWrite ok");
 	ctx->Ans.result = ret;
 	ctx->Answer(Error_Succeed);
 	return ret;
@@ -4073,7 +3939,6 @@ ErrorCodeEnum CCardIssuerFSM::MachineMoveCardBackNotHold()
 	long l_beginTime = GetTickCountRVC();
 	ErrorCodeEnum eMoveNotHold = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
 	long l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MoveCard", l_beginTime, l_endTime, eMoveNotHold, CSimpleStringA::Format("<MachineMoveCardBackNotHold>, param:%d", CI_MOVECARD_BACK_NOT_HOLD));
 	
 	//2016-11-10 14:30:54 joseph
 	if (eMoveNotHold != Error_Succeed)
@@ -4090,7 +3955,6 @@ ErrorCodeEnum CCardIssuerFSM::MachineMoveCardFrontGate(bool bInBussiness)
 	long l_beginTime = GetTickCountRVC();
 	ErrorCodeEnum eMoveFrontGate = m_hDevHelper->MoveCard(CI_MOVECARD_FRONT_GATE);
 	long l_endTime = GetTickCountRVC();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MoveCard", l_beginTime, l_endTime, eMoveFrontGate, CSimpleStringA::Format("MachineMoveCardFrontGate, param:%d", CI_MOVECARD_FRONT_GATE));
 
 	if (eMoveFrontGate != Error_Succeed){
 		if (m_bCardFromHopper)
@@ -4387,7 +4251,6 @@ bool CCardIssuerFSM::JustReadCardNo()
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->DeactivateICCard();
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeactivateICCard", l_beginTime, l_endTime, eErr, "JustReadCardNo");
 
 		if (eErr != Error_Succeed){
 			SetErrPackage("JustReadCardNo::DeactivateICCard", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard);
@@ -4397,7 +4260,6 @@ bool CCardIssuerFSM::JustReadCardNo()
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->ReleaseIC();
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReleaseIC", l_beginTime, l_endTime, eErr, "JustReadCardNo");
 
 		if (eErr != Error_Succeed){
 			SetErrPackage("JustReadCardNo::ReleaseIC", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC);
@@ -4414,9 +4276,9 @@ bool CCardIssuerFSM::JustReadCardNo()
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->MagRead(magTracks);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagRead", l_beginTime, l_endTime, eErr, CSimpleStringA::Format("JustReadCardNo, track[1].eStatus:%d, track[2].sStatus:%d, t2.dwSize:%d, t3.dwSize:%d, t2Len:%d, t3Len:%d",
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MagRead JustReadCardNo, track[1].eStatus:%d, track[2].sStatus:%d, t2.dwSize:%d, t3.dwSize:%d, t2Len:%d, t3Len:%d",
 				magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[1].dwSize, magTracks.track[2].dwSize,
-				strlen((const char*)magTracks.track[1].data), strlen((const char*)magTracks.track[2].data)));
+				strlen((const char*)magTracks.track[1].data), strlen((const char*)magTracks.track[2].data));
 
 		if (eErr == Error_Succeed)
 		{
@@ -4543,7 +4405,7 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SAMSelect(ctx->Req.param1[0]);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMSelect", l_beginTime, l_endTime, eErr, CSimpleStringA::Format("req.param1:%d", ctx->Req.param1[0]));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMSelect req.param1:%d", ctx->Req.param1[0]);
 
 		if(eErr) {
 			SetErrPackage("SAMICCommand::SAMSelect", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMSelect);
@@ -4554,7 +4416,7 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SAMActive(ctx->Req.param1[0]);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMActive", l_beginTime, l_endTime, eErr, CSimpleStringA::Format("req.param1:%d", ctx->Req.param1[0]));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMActive req.param1:%d", ctx->Req.param1[0]);
 
 		if(eErr) {
 			SetErrPackage("SAMICCommand::SAMActive", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMActive);
@@ -4565,7 +4427,6 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SAMDeactivate();
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMDeactivate", l_beginTime, l_endTime, eErr, "SAMICCommand_SAM_Deactivate");
 
 		if(eErr) {
 			SetErrPackage("SAMICCommand::SAMDeactivate", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMDeactivate);
@@ -4576,7 +4437,6 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SAMWarmReset();
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMWarmReset", l_beginTime, l_endTime, eErr, "SAMICCommand_SAM_WarmReset");
 
 		if(eErr) {
 			SetErrPackage("SAMICCommand::SAMWarmReset", m_csDevSN, eErr, MEC_DEVAPI_CARDISSUER_SAMWarmReset);
@@ -4589,7 +4449,7 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SAMQueryStatus(samStatus);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMWarmReset", l_beginTime, l_endTime, eErr, CSimpleStringA::Format("isActive:%d, chosenOfSAM:%d", samStatus.isActive, samStatus.chosenOfSAM));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMWarmReset isActive:%d, chosenOfSAM:%d", samStatus.isActive, samStatus.chosenOfSAM);
 
 		if (eErr == Error_Succeed)
 		{
@@ -4616,7 +4476,7 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->SAMCommand(sendBuf,recvBuf);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMCommand", l_beginTime, l_endTime, eErr, CSimpleStringA::Format("req.param2:%s, recvBuf.dwSize:%d", ctx->Req.param2[0].GetData(), recvBuf.dwSize));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMCommand req.param2:%s, recvBuf.dwSize:%d", ctx->Req.param2[0].GetData(), recvBuf.dwSize);
 
 		if (eErr == Error_Succeed)
 		{
@@ -4643,7 +4503,6 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->ContactIC();
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SAMCommand", l_beginTime, l_endTime, eErr, "SAMICCommand_IC_Active");
 
 		if (eErr == Error_Succeed)
 		{
@@ -4651,7 +4510,6 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 			l_beginTime =GetTickCountRVC();
 			eErr = m_hDevHelper->ActiveICCardATR(atrBuf);
 			l_beginTime =GetTickCountRVC();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ActiveICCardATR", l_beginTime, l_endTime, eErr, "SAMICCommand_IC_Active");
 
 			if (eErr == Error_Succeed)
 			{
@@ -4694,7 +4552,6 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 			l_beginTime = GetTickCountRVC();
 			eErr = m_hDevHelper->DeactivateICCard();
 			l_endTime = GetTickCountRVC();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeactivateICCard", l_beginTime, l_endTime, eErr, "SAMICCommand_IC_Deactivate");
 
 			if(eErr != Error_Stoped)
 			{
@@ -4721,7 +4578,6 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 		l_beginTime = GetTickCountRVC();
 		eErr = m_hDevHelper->ICCommand(sendBuf, recvBuf);
 		l_endTime = GetTickCountRVC();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ICCommand", l_beginTime, l_endTime, eErr, "SAMICCommand_IC_Command");
 
 		if(false)//oiltest@20201224 before deploy ,comment loging apdu content
 		{
@@ -4730,7 +4586,7 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 			{
 				ZeroMemory(pRet, MAX_IC_BUFFER_SIZE);
 				HexBuf2StrBuf(sendBuf.data, (char**)&pRet, size);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("ICCommand return data, %s", (const char*)pRet));
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("ICCommand send data, %s", (const char*)pRet));
 				delete[] pRet;
 			}
 										
@@ -4748,6 +4604,10 @@ int CCardIssuerFSM::SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_
 				ctx->Ans.ret2.Init(1);
 				ctx->Ans.ret1[0] = recvBuf.dwSize * 2;
 				ctx->Ans.ret2[0] = pRet;
+				if (false)//oiltest before deploy ,comment loging apdu content
+				{
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ICCommand, recvBuf.data:%s", pRet);
+				}
 				delete[]pRet;
 			}
 		}
@@ -4847,7 +4707,6 @@ int CalcDelayFactor(int failedCount)
 	else
 		return 1 << (failedCount % 7);
 }
-
 void CCardIssuerFSM::GetVendorDllName(CSimpleStringA& strDevAdaptorPath)
 {
 	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
@@ -4959,119 +4818,6 @@ bool CCardIssuerFSM::ReadCardInfo(CSmartPointer<IConfigInfo> &cfgRun, CSimpleStr
 	return false;
 }
 
-int CCardIssuerFSM::PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx)
-{
-	HeartBeatService_ClientBase *pHeartBeatClient = NULL;
-	ErrorCodeEnum eErr = Error_Unexpect;
-	CSimpleStringA errMsg(true);
-	pHeartBeatClient = new HeartBeatService_ClientBase(GetEntityBase());
-	if (pHeartBeatClient != NULL) {
-		eErr = pHeartBeatClient->Connect();
-		if (eErr != Error_Succeed) {
-			pHeartBeatClient->SafeDelete();
-			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Connect_Heatbeat_Failed, "connect heartbeat faile while preonline.");
-		}
-	}
-	else
-	{
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("pGuiConsoleClient is null?");
-		ctx->Answer(Error_Unexpect);
-		return 0;
-	}
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("<PreOnlineOnStore>, connect to heartbeat suc.");
-	m_crossStart = GetTickCountRVC();
-	if (eErr == Error_Succeed)
-	{
-		if (pHeartBeatClient != NULL)
-		{
-			m_crossCtx = ctx;
-			HeartBeatService_CardActive_Req req;
-			HeartBeatService_CardActive_Ans ans;
-			req.type = 0;
-			req.account = ctx->Req.account;
-			req.term = ctx->Req.termNo;
-			req.data = ctx->Req.businessData;
-			req.slot = ctx->Req.slot;
-
-			errMsg = CSimpleStringA::Format("<PreOnlineOnStore>, send CardActive, termNo:%s, slot:%d", req.term.GetData(), req.slot);
-			LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Send_CardActive, errMsg.GetData());
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220327")();
-
-			eErr = pHeartBeatClient->CardActive(req, ans, 60000);
-			if (eErr == Error_Succeed)
-			{
-				m_bCardActiveNotify = false;
-				WaitCardActiveTask* pTask = new WaitCardActiveTask(this);
-				GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-			}
-			else
-			{
-				errMsg = CSimpleStringA::Format("CardActive Result(termNo:%s, slot:%d):%d(0x%x)", req.term.GetData(), req.slot, eErr, eErr);
-				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_PreOnline_Recv_CardActive, errMsg.GetData());
-			}
-
-			pHeartBeatClient->GetFunction()->CloseSession();
-			pHeartBeatClient = NULL;
-		}
-	}
-	return 0;
-}
-void CCardIssuerFSM::NotifyPreOnline(unsigned long errCode, unsigned long findCard, unsigned long cardPos, CSimpleStringA data)
-{
-	UINT64 crossEnd = GetTickCountRVC();
-	//? ? ? 为什么是110s,重试?从生产实际来看,在25s到40s之间,大部分在30s左右,需要和前端(65s)一致,改成60s oilyang@20221019
-	//in 110 second 
-	if (m_crossCtx != NULL)
-	{
-		if ((crossEnd - m_crossStart) < 60 * 1000)
-		{
-			m_bCardActiveNotify = true;
-			m_crossCtx->Ans.cardPos = cardPos;
-			m_crossCtx->Ans.findCard = findCard;
-			m_crossCtx->Ans.result = data;
-			CSimpleStringA outParam = CSimpleStringA::Format("NotifyPreOnline, cardPos:%d, findCard:%d, errCode:%d", cardPos, findCard, errCode);
-			LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreOnline_ParamInfo, outParam.GetData());
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("<NotifyPreOnline>, notify result:%d, cardPos:%d, findCard:%d",errCode, cardPos, findCard));
-			if (errCode == Error_Duplication)//THE CardStore is issuing card
-			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Q")("卡库正在使用中");
-				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_Issuing, "卡库正在使用中");
-				m_crossCtx->Answer(Error_Duplication);
-			}
-			else if (errCode == Error_TimeOut)//CardStore process cost too long!
-			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230W")("跨机时卡库处理耗时过长");
-				LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardStore_Reply_TooLong, "跨机时卡库处理耗时过长");
-				m_crossCtx->Answer(Error_ReplyTimeOut);
-			}
-			else if (errCode == Error_NotExist)//heartbeat service can't find the dest terminal
-			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230Y")("跨机时卡库不在线");
-				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_OffLine, "跨机时卡库不在线");
-				m_crossCtx->Answer(Error_DevNotAvailable);
-			}
-			else if (errCode == Error_DevNotAvailable)//CardStore maybe called by OTHER VTM
-			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2310")("卡库正在被其他VTM跨机调用");
-				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther, "卡库正在被其他VTM跨机调用");
-				m_crossCtx->Answer(Error_Duplication);
-			}
-			else if (errCode == Error_Hardware)//CardStore's CardIssuer in fault state
-			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2311")("卡库卡机未成功打开");
-				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState, "卡库卡机未成功打开");
-				m_crossCtx->Answer(Error_Hardware);
-			}
-			else
-				m_crossCtx->Answer((ErrorCodeEnum)errCode);
-		}else{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA2312")("超时后,才收到卡库返回");
-			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong, "CardStore return after timeout.");
-		}
-		m_crossCtx = NULL;
-	}
-}
-
 void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size, char *&magData, bool bT2OK, bool bT3OK)
 {
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<DecodeTracksData>, bT2OK:%d, bT3OK:%d, t2.size:%d(%d), t3.size:%d(%d)",
@@ -5141,27 +4887,6 @@ void CCardIssuerFSM::CloseAndClearDevObj(bool bCheckConnecting, bool bCloseOnly)
 	}
 }
 
-void CCardIssuerFSM::WaitCardActive()
-{
-	while (1)
-	{
-		if (m_bCardActiveNotify)
-			break;
-		UINT64 crossEnd = GetTickCountRVC();
-		if ((crossEnd - m_crossStart) < 60 * 1000)
-			Sleep(1000);
-		else {
-			if (m_crossCtx != NULL)
-			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230U")("跨机激活未收到返回,请确认卡库或服务是否正常");
-				m_crossCtx->Answer(Error_TimeOut, CardIssuer_UserErrorCode_CardActive_Service_NoReturn);
-				LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_CardActive_Service_NoReturn, "CardActive havn't return in 60s");
-				Dbg("oiltest record for SelfChecker test 1792 to kill CardIsser");
-				break;
-			}
-		}
-	}
-}
 int CCardIssuerFSM::JudgeCardType(CSimpleStringA cardno, bool& bMismatch)
 {
 	if (cardno.GetLength() < 8)

+ 20 - 98
Module/mod_cardissuer/CardIssuerFSM.h

@@ -32,10 +32,8 @@ enum EvtType
 	USER_EVT_ACCEPTFINISHED,
 	USER_EVT_ISSUE,
 	USER_EVT_ISSUE_FINISHED,
-	//USER_EVT_READ,
 	USER_EVT_EJECT,
 	USER_EVT_CAPTURE,
-	//USER_EVT_READFINISHED,
 	USER_EVT_EJECTFINISHED,
 	USER_EVT_WAITFINISHED,
 	USER_EVT_CAPTUREFINISHED,
@@ -47,10 +45,8 @@ enum EvtType
 	USER_EVT_RESET,
 	USER_EVT_RESETFINISHED,
 	USER_EVT_EXIT,
-	USER_EVT_GET_MATERIAL,
-	USER_EVT_SET_MATERIAL,
-	USER_EVT_READ_NEW,
-	USER_EVT_READ_NEW_FINISHED,
+	USER_EVT_READ,
+	USER_EVT_READ_FINISHED,
 	USER_EVT_WRITE,
 	USER_EVT_WRITE_FINISHED,
 	USER_EVT_GET_MATERIAL_EX,
@@ -60,8 +56,6 @@ enum EvtType
 	USER_EVT_SAM_IC,
 	USER_EVT_SAM_IC_FINISHED,
 	USER_EVT_BACK_TO_INIT,
-	USER_EVT_PREONLINE_ON_STORE,
-	USER_EVT_PREONLINE_ON_STORE_FINISHED,
 };
 enum SAMICCommandType
 {
@@ -170,7 +164,7 @@ public:
 class CardReadEvent : public FSMEvent
 {
 public:
-	CardReadEvent() : FSMEvent(USER_EVT_READ_NEW) {}
+	CardReadEvent() : FSMEvent(USER_EVT_READ) {}
 	~CardReadEvent() {}
 	SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx;
 	virtual void OnUnhandled()
@@ -187,7 +181,7 @@ private:
 class CardReadFinishedEvent : public FSMEvent
 {
 public:
-	CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_NEW_FINISHED) {}
+	CardReadFinishedEvent() : FSMEvent(USER_EVT_READ_FINISHED) {}
 	~CardReadFinishedEvent() {}
 	SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx;
 	virtual void OnUnhandled()
@@ -273,35 +267,6 @@ public:
 protected:
 private:
 };
-class GetMaterialEvent : public FSMEvent
-{
-public:
-	GetMaterialEvent() : FSMEvent(USER_EVT_GET_MATERIAL){}
-	~GetMaterialEvent(){}
-	SpReqAnsContext<CardIssuerService_GetMaterialCount_Req,CardIssuerService_GetMaterialCount_Ans>::Pointer ctx;
-	virtual void OnUnhandled() 
-	{
-		if (ctx != NULL)
-			ctx->Answer(Error_InvalidState);
-	}
-protected:
-private:
-};
-
-class SetMaterialEvent : public FSMEvent
-{
-public:
-	SetMaterialEvent() : FSMEvent(USER_EVT_SET_MATERIAL){}
-	~SetMaterialEvent(){}
-	SpReqAnsContext<CardIssuerService_SetMaterialCount_Req,CardIssuerService_SetMaterialCount_Ans>::Pointer ctx;
-	virtual void OnUnhandled() 
-	{
-		if (ctx != NULL)
-			ctx->Answer(Error_InvalidState);
-	}
-protected:
-private:
-};
 class CardWriteEvent : public FSMEvent
 {
 public:
@@ -338,8 +303,8 @@ private:
 class GetMaterialExEvent : public FSMEvent
 {
 public:
-	GetMaterialExEvent() : FSMEvent(USER_EVT_GET_MATERIAL_EX){}
-	~GetMaterialExEvent(){}
+	GetMaterialExEvent() : FSMEvent(USER_EVT_GET_MATERIAL_EX) {}
+	~GetMaterialExEvent() {}
 	SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req, CardIssuerService_GetMaterialCountEx_Ans>::Pointer ctx;
 	virtual void OnUnhandled()
 	{
@@ -348,7 +313,7 @@ public:
 	}
 protected:
 private:
-}; 
+};
 class SetMaterialExEvent : public FSMEvent
 {
 public:
@@ -393,21 +358,7 @@ public:
 		}
 	}
 };
-class PreOnlineOnStoreEvent : public FSMEvent
-{
-public:
-	PreOnlineOnStoreEvent() : FSMEvent(USER_EVT_PREONLINE_ON_STORE){}
-	virtual ~PreOnlineOnStoreEvent(){}
-	SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx;
-	virtual void OnUnhandled()
-	{
-		if (ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("preonline on store unhandled");
-			ctx->Answer(Error_InvalidState);
-		}
-	}
-};
+
 typedef struct EacQueryByEac_X1 {
 	string xEacNbr;
 	string xCltNbr;
@@ -647,7 +598,7 @@ struct CRegistSwallowCardRet : CHTTPRet {
 class CCardIssuerFSM : public CCommDevFSM<CCardIssuerFSM, CardIssuerClass>
 {
 public:
-	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s14,s16};
+	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s14};
 	BEGIN_FSM_STATE(CCardIssuerFSM)
 		FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
 		FSM_STATE_ENTRY(s1,"Initializing",s1_on_entry,s1_on_exit,s1_on_event)
@@ -662,7 +613,6 @@ public:
 		FSM_STATE_ENTRY(s10,"Issuing",s10_on_entry,s10_on_exit,s10_on_event)
 		FSM_STATE_ENTRY(s11,"Writing",s11_on_entry,s11_on_exit,s11_on_event)
 		FSM_STATE_ENTRY(s14, "SAMIC", s14_on_entry, s14_on_exit, s14_on_event)
-		FSM_STATE_ENTRY(s16, "PreOnlineOnStore", s16_on_entry, s16_on_exit, s16_on_event)
 		END_FSM_STATE()
 
 	BEGIN_FSM_RULE(CCardIssuerFSM,s0)
@@ -678,14 +628,13 @@ public:
 		FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s2,s10,USER_EVT_ISSUE,0)
 		FSM_RULE_ENTRY(s2, s10, USER_EVT_ISSUE_EX, 0)
-		FSM_RULE_ENTRY(s2, s16, USER_EVT_PREONLINE, 16)
 		FSM_RULE_ENTRY(s3,s4,USER_EVT_ACCEPTFINISHED,0)
 		FSM_RULE_ENTRY(s3,s9,USER_EVT_ACCEPTFINISHED,1)
 		FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,2)
 		FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,3)
 		FSM_RULE_ENTRY(s3,s7,USER_EVT_ACCEPTFINISHED,4)
 		FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
-		FSM_RULE_ENTRY(s4,s5,USER_EVT_READ_NEW,0)
+		FSM_RULE_ENTRY(s4,s5,USER_EVT_READ,0)
 		FSM_RULE_ENTRY(s4,s6,USER_EVT_EJECT,0)
 		FSM_RULE_ENTRY(s4,s6,USER_EVT_EXIT,0)
 		FSM_RULE_ENTRY(s4,s8,USER_EVT_ACCEPT,0)
@@ -698,9 +647,9 @@ public:
 		FSM_RULE_ENTRY(s4, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
 		FSM_RULE_ENTRY(s4, s5, USER_EVT_PREONLINE, 0)
 		FSM_RULE_ENTRY(s4, s5, USER_EVT_POSTONLINE, 0)
-		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_NEW_FINISHED,0)
-		FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_NEW_FINISHED,1)
-		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_NEW_FINISHED,2)
+		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
+		FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_FINISHED,1)
+		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,2)
 		FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s5, s4, USER_EVT_EXIT, 0)
 		FSM_RULE_ENTRY(s5, s4, USER_EVT_PREONLINEFINISHED, 0)
@@ -731,8 +680,7 @@ public:
 		FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,0)
 		FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,1)
 		FSM_RULE_ENTRY(s14, s4, USER_EVT_SAM_IC_FINISHED, 0)
-		FSM_RULE_ENTRY(s16, s2, USER_EVT_PREONLINE_ON_STORE, 0)
-		FSM_RULE_ENTRY(s16, s2, USER_EVT_PREONLINEFINISHED, 0)
+
 		
 	END_FSM_RULE()
 
@@ -744,7 +692,7 @@ public:
 	, m_captureReason(""), m_machineType(1), m_currentHopper(1), m_hopperNum(1)
 	, m_bSettingMaterial(false)	, m_addCardNo(""), m_addCardSerial(""), m_hasCardWhileDevOpen(false)
 	, m_bChannelOK(false), m_bCancelByRFIC(false), m_devOpenFailedCount(0)
-			, m_bInMainPage(false), m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
+			, m_iInWhatPage(PageType_Other), m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
 			, m_bCardFromHopper(true), m_bStopUseRF(false),m_rfVendorList(""), m_bUseRFTillNext(false), m_csMaterialUrl("")
 		{
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
@@ -799,9 +747,6 @@ public:
 	void s14_on_entry();
 	void s14_on_exit();
 	unsigned int s14_on_event(FSMEvent* event);
-	void s16_on_entry();
-	void s16_on_exit();
-	unsigned int s16_on_event(FSMEvent* event);
 	
 	void Load();
 	ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
@@ -861,8 +806,6 @@ public:
 
 	bool WriteCardInfo(CSmartPointer<IConfigInfo> &cfgRun, const char *acc, const char* serial, int slot, bool bClear = false, bool bHasCard = false);
 	bool ReadCardInfo(CSmartPointer<IConfigInfo> &cfgRun, CSimpleStringA &acc, CSimpleStringA &serial, int slot);
-	int PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx);
-	void NotifyPreOnline(unsigned long errCode,unsigned long findCard, unsigned long cardPos, CSimpleStringA data);
 
 	void DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size,char *&magData,bool bT2OK=true,bool bT3OK=true);
 	int GetFSMState()
@@ -882,7 +825,7 @@ public:
 	void CloseAndClearDevObj(bool bCheckConnecting = true, bool bCloseOnly = false);
 	bool GetDevInitFlag() { return m_bOpened; }
 
-	void SetMainPageFlag(bool bValue) { m_bInMainPage = bValue; }
+	void SetInWhatPage(int bValue) { m_iInWhatPage = bValue; }
 	void WaitCardActive();
 	static void HttpsLogCallBack(const char* logtxt);
 	int JudgeCardType(CSimpleStringA cardno, bool &bMismatch);
@@ -899,12 +842,12 @@ private:
 	lpCMBdecodeEx cmdDecodeEx;	
 	bool m_bCancelAccept, m_bWaitingAccept, m_bWaitAccepteMore, m_bExit
 		, m_bCDA, m_bIssuingExit, m_bCardIssued, m_bHasHopper[HOPPER_NUM]
-		, m_bSettingMaterial, m_hasCardWhileDevOpen, m_bChannelOK, m_bCancelByRFIC, m_bInMainPage
+		, m_bSettingMaterial, m_hasCardWhileDevOpen, m_bChannelOK, m_bCancelByRFIC
 		, m_bCardActiveNotify, m_bCardFromHopper, m_bUseCardnoMismatch, m_bStopUseRF;
 	bool m_bUseRFTillNext;//if ReadCard by RF,the following PreOnline & PostOnline always use RF till the next card(insert/issue)
 	ErrorCodeEnum m_testResult;
 
-	int m_CardCaptured;
+	int m_CardCaptured,m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
 	int m_issueStatusFromFile, m_issueStatus/*the status maybe changed by Business call*/;
 	//1:default, 2:SCI, 3:no cfg
 	int m_machineType;
@@ -928,8 +871,6 @@ private:
 		,m_csCM, m_rfVendorList, m_csDevSN;
 	char m_AuthCode[2];
 	vector<CMBBin> m_vBin;
-	SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer m_crossCtx;
-	UINT64 m_crossStart;
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
 	bool JustReadCardNo();
 	bool IsValidCardNo(const char*,int);
@@ -1111,27 +1052,8 @@ struct SAMICCommandTask : public ITaskSp
 		fsm->PostEventFIFO(e);
 	}
 };
-struct PreOnlineOnStoreTask : public ITaskSp
-{
-	CCardIssuerFSM* fsm;
-	SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx;
-	PreOnlineOnStoreTask(CCardIssuerFSM* f) : fsm(f) {}
-	void Process()
-	{
-		FSMEvent *e = new FSMEvent(USER_EVT_PREONLINE_ON_STORE_FINISHED);
-		e->param1 = fsm->PreOnlineOnStore(ctx);
-		fsm->PostEventFIFO(e);
-	}
-};
-struct WaitCardActiveTask : public ITaskSp
-{
-	CCardIssuerFSM* fsm;
-	WaitCardActiveTask(CCardIssuerFSM* f) : fsm(f) {}
-	void Process()
-	{
-		fsm->WaitCardActive();
-	}
-};
+
+
 struct RegistCaptureCardInfoTask : public ITaskSp
 {
 	CCardIssuerFSM* fsm;

+ 25 - 3
Module/mod_cardissuer/CardIssuer_UserErrorCode.h

@@ -6,7 +6,7 @@
 
 #define CardIssuer_UserErrorCode_No_Encryted_Channel				(CardIssuer_UserErrorCode_Start + 1)	//未建立安全通道
 #define CardIssuer_UserErrorCode_Open_RunCfgFile_Failed				(CardIssuer_UserErrorCode_Start + 2)	//打开运行时配置失败
-//#define CardIssuer_UserErrorCode_Hopper_Mixed_Too_Much				(CardIssuer_UserErrorCode_Start + 3)	//后面错误码细化了卡箱1,2,3
+#define CardIssuer_UserErrorCode_EntityInFailState					(CardIssuer_UserErrorCode_Start + 3)	//卡机处于故障态,请稍后重试,重试还有问题请联系厂商维护
 #define CardIssuer_UserErrorCode_NotHas_Hopper1						(CardIssuer_UserErrorCode_Start + 4)	//未检测到卡箱1,请确认卡箱1是否有卡箱
 #define CardIssuer_UserErrorCode_NotHas_Hopper2						(CardIssuer_UserErrorCode_Start + 5)	//未检测到卡箱2,请确认卡箱2是否有卡箱
 #define CardIssuer_UserErrorCode_NotHas_Hopper3						(CardIssuer_UserErrorCode_Start + 6)	//未检测到卡箱3,请确认卡箱3是否有卡箱
@@ -16,7 +16,7 @@
 #define CardIssuer_UserErrorCode_NoCardRemains_Hopper1				(CardIssuer_UserErrorCode_Start + 10)	//卡箱1剩余卡片计数为0(空)
 #define CardIssuer_UserErrorCode_NoCardRemains_Hopper2				(CardIssuer_UserErrorCode_Start + 11)	//卡箱2剩余卡片计数为0(空)
 #define CardIssuer_UserErrorCode_NoCardRemains_Hopper3				(CardIssuer_UserErrorCode_Start + 12)	//卡箱3剩余卡片计数为0(空)
-//#define CardIssuer_UserErrorCode_CaptureCard_Failed					(CardIssuer_UserErrorCode_Start + 13)	//吞卡失败
+#define CardIssuer_UserErrorCode_MoveCard_FromHopper				(CardIssuer_UserErrorCode_Start + 13)	//卡片从卡箱移到读卡器
 #define CardIssuer_UserErrorCode_MoveCardToGate_Failed				(CardIssuer_UserErrorCode_Start + 14)	//前端进卡,吐卡失败
 #define CardIssuer_UserErrorCode_KakuFindEmptySlot_Failed			(CardIssuer_UserErrorCode_Start + 15)	//卡库找不到空闲卡槽
 #define CardIssuer_UserErrorCode_KakuHaveOldPanKuRecord				(CardIssuer_UserErrorCode_Start + 16)	//卡库有旧的盘库记录
@@ -47,6 +47,12 @@
 #define CardIssuer_UserErrorCode_CaptureCard_IdleExit				(CardIssuer_UserErrorCode_Start + 39) //Idle空闲状态处理Exit事件时吞卡
 #define CardIssuer_UserErrorCode_CaptureCard_FromBusiness			(CardIssuer_UserErrorCode_Start + 40) //业务主动发起调用CaptureCard
 
+#define CardIssuer_UserErrorCode_EntityInStateCannotProcess			(CardIssuer_UserErrorCode_Start + 41) //卡机当前状态无法处理此请求
+#define CardIssuer_UserErrorCode_MoveCardToSlot						(CardIssuer_UserErrorCode_Start + 42) //卡片移到卡槽
+#define CardIssuer_UserErrorCode_MoveCardFromSlot					(CardIssuer_UserErrorCode_Start + 43) //卡槽移到卡机
+#define CardIssuer_UserErrorCode_PrintCardFaceRightNow				(CardIssuer_UserErrorCode_Start + 44) //卡面打印
+#define CardIssuer_UserErrorCode_InsertCardSucceed					(CardIssuer_UserErrorCode_Start + 45) //前端插卡
+
 
 #define CardIssuer_UserErrorCode_CardStore_SlotNum					(CardIssuer_UserErrorCode_Start + 49) //记录卡库容量
 #define CardIssuer_UserErrorCode_Invoke_Access_IniDev_Failed		(CardIssuer_UserErrorCode_Start + 50) //建立加密通道时,调用准入接口失败
@@ -85,7 +91,7 @@
 #define CardIssuer_UserErrorCode_AddCardToStoreStepFirst			(CardIssuer_UserErrorCode_Start + 74)	//加卡第一步,从卡箱移到读卡器
 #define CardIssuer_UserErrorCode_AddCardToStoreStepLast				(CardIssuer_UserErrorCode_Start + 75)	//加卡第二步,从读卡器移到卡槽
 #define CardIssuer_UserErrorCode_ReadAccount_Data_Error				(CardIssuer_UserErrorCode_Start + 76)	//加卡过程,卡片数据有误
-//#define CardIssuer_UserErrorCode_FindFirstEmptySlot_Failed			(CardIssuer_UserErrorCode_Start + 77)	//加卡过程,未找到空卡槽
+#define CardIssuer_UserErrorCode_AddCardToStoreStepFirst_Failed		(CardIssuer_UserErrorCode_Start + 77)	//加卡过程,移卡到卡槽失败
 #define CardIssuer_UserErrorCode_NotifyPreonline_Wait_TooLong		(CardIssuer_UserErrorCode_Start + 78)	//NotifyPreonline收到时已经超过等待时间
 
 //临时 后续去除
@@ -104,6 +110,7 @@
 #define CardIssuer_UserErrorCode_CaptureCard_ByTerminal				(CardIssuer_UserErrorCode_Start + 87)	//终端自行调用吞卡
 #define CardIssuer_UserErrorCode_EjectCard_ByTerminal				(CardIssuer_UserErrorCode_Start + 88)	//终端自行调用吐卡
 #define CardIssuer_UserErrorCode_CaptureCard_EntityOnStart			(CardIssuer_UserErrorCode_Start + 89)	//实体启动时发现有卡,终端自行调用吞卡
+#define CardIssuer_UserErrorCode_CardPosUnexpectedOnDevOpen			(CardIssuer_UserErrorCode_Start + 90)	//实体启动时卡片位置异常
 
 
 //读卡过程
@@ -179,4 +186,19 @@
 #define CardIssuer_UserErrorCode_CardActive_CardStore_CallByOther	(CardIssuer_UserErrorCode_Start + 168)	//跨机时卡库正在其他VTM调用
 #define CardIssuer_UserErrorCode_ReadAccount_Cost_Time				(CardIssuer_UserErrorCode_Start + 169)	//ReadAccount耗时
 #define CardIssuer_UserErrorCode_CardActive_CardIssuer_InFaultState	(CardIssuer_UserErrorCode_Start + 170)	//卡库收到跨机请求时卡机未成功打开
+#define CardIssuer_UserErrorCode_Account_NotMatchWithReadAccount	(CardIssuer_UserErrorCode_Start + 171)	//传入卡号与实际读到的不一致
+
+//***此段枚举值不可变动,涉及到业务逻辑***	卡库API细化后新增的错误码,也用于前端展示对应话术
+#define CardIssuer_UserErrorCode_Dev_HopperHasNoCard		(CardIssuer_UserErrorCode_Start + 180) //卡箱无卡
+#define CardIssuer_UserErrorCode_Dev_HopperMissing			(CardIssuer_UserErrorCode_Start + 181)//发卡箱缺失
+#define CardIssuer_UserErrorCode_Dev_TransCarJammed			(CardIssuer_UserErrorCode_Start + 182)//传输小车堵塞
+#define CardIssuer_UserErrorCode_Dev_RetainBinFull			(CardIssuer_UserErrorCode_Start + 183)//回收箱满
+#define CardIssuer_UserErrorCode_Dev_RetainBinMissing		(CardIssuer_UserErrorCode_Start + 184)//回收箱缺失
+#define CardIssuer_UserErrorCode_Dev_CardInReader			(CardIssuer_UserErrorCode_Start + 185)//读卡器内有卡
+#define CardIssuer_UserErrorCode_Dev_SlotHasNoCard			(CardIssuer_UserErrorCode_Start + 186)//卡槽内无卡
+#define CardIssuer_UserErrorCode_Dev_CardInSlot				(CardIssuer_UserErrorCode_Start + 187)//卡槽内有卡
+#define CardIssuer_UserErrorCode_Dev_NoCardInReader			(CardIssuer_UserErrorCode_Start + 188)//读卡器内无卡
+#define CardIssuer_UserErrorCode_Dev_CardJammed				(CardIssuer_UserErrorCode_Start + 189)//塞卡
+#define CardIssuer_UserErrorCode_Dev_SlotJammed				(CardIssuer_UserErrorCode_Start + 190)//卡槽堵塞
+#define CardIssuer_UserErrorCode_Dev_SlotInvalid			(CardIssuer_UserErrorCode_Start + 191)//卡槽地址非法(越界等)
 #endif //_CARDISSUER_USER_ERRORCODE_H

+ 23 - 94
Module/mod_cardissuer/mod_cardissuer.cpp

@@ -13,186 +13,117 @@
 void CardIssuerServerSession::Handle_Insert(SpReqAnsContext<CardIssuerService_Insert_Req, CardIssuerService_Insert_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Insert")("Invoke Insert");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Insert")("Insert");
 	m_pEntity->Insert(ctx);
 }
 void CardIssuerServerSession::Handle_Read(SpReqAnsContext<CardIssuerService_Read_Req, CardIssuerService_Read_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Read")("Invoke Read");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Read")("Read");
 	m_pEntity->Read(ctx);
 }
 
 void CardIssuerServerSession::Handle_Capture(SpReqAnsContext<CardIssuerService_Capture_Req, CardIssuerService_Capture_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Capture")("Invoke Capture");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Capture")("Capture");
 	m_pEntity->Capture(ctx);
 }
 
 void CardIssuerServerSession::Handle_Eject(SpReqAnsContext<CardIssuerService_Eject_Req, CardIssuerService_Eject_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Eject")("Invoke Eject");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Eject")("Eject");
 	m_pEntity->Eject(ctx);
 }
 
 void CardIssuerServerSession::Handle_CancelInsert(SpOnewayCallContext<CardIssuerService_CancelInsert_Info>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("CancelInsert")("Invoke CancelInsert");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("CancelInsert")("CancelInsert");
 	m_pEntity->CancelInsert(ctx);
 }
 void CardIssuerServerSession::Handle_InsertWaitMore(SpOnewayCallContext<CardIssuerService_InsertWaitMore_Info>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("InsertWaitMore")("Invoke InsertWaitMore");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("InsertWaitMore")("InsertWaitMore");
 	m_pEntity->InsertWaitMore(ctx);
 }
-void CardIssuerServerSession::Handle_Issue(SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Issue")("Invoke Issue");
-	m_pEntity->Issue(ctx);
-}
 void CardIssuerServerSession::Handle_PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("PreOnline")("Invoke PreOnline");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("PreOnline")("PreOnline");
 	m_pEntity->PreOnline(ctx);
 }
 void CardIssuerServerSession::Handle_PostOnline(SpReqAnsContext<CardIssuerService_PostOnline_Req, CardIssuerService_PostOnline_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("PostOnline")("Invoke PostOnline");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("PostOnline")("PostOnline");
 	m_pEntity->PostOnline(ctx);
 }
 void CardIssuerServerSession::Handle_Exit(SpOnewayCallContext<CardIssuerService_Exit_Info>::Pointer ctx)
 {
 	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("Exit")("Exit");
 	m_pEntity->Exit(ctx);
-}
-void CardIssuerServerSession::Handle_GetMaterialCount(SpReqAnsContext<CardIssuerService_GetMaterialCount_Req, CardIssuerService_GetMaterialCount_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("GetMaterialCount")("Invoke GetMaterialCount");
-	m_pEntity->GetMaterialCount(ctx);
-}
-
-void CardIssuerServerSession::Handle_SetMaterialCount(SpReqAnsContext<CardIssuerService_SetMaterialCount_Req, CardIssuerService_SetMaterialCount_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetMaterialCount")("Invoke SetMaterialCount");
-	m_pEntity->SetMaterialCount(ctx);
 }
  void CardIssuerServerSession::Handle_SetIssueFlag(SpOnewayCallContext<CardIssuerService_SetIssueFlag_Info>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetIssueFlag")("Invoke SetIssueFlag");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetIssueFlag")("SetIssueFlag");
 	m_pEntity->SetIssueFlag(ctx);
 }
-void CardIssuerServerSession::Handle_ReadEx(SpReqAnsContext<CardIssuerService_ReadEx_Req, CardIssuerService_ReadEx_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
 void CardIssuerServerSession::Handle_QueryCardInfo(SpReqAnsContext<CardIssuerService_QueryCardInfo_Req, CardIssuerService_QueryCardInfo_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("QueryCardInfo");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("QueryCardInfo")("QueryCardInfo");
 	m_pEntity->QueryCardInfo(ctx);
 }
 void CardIssuerServerSession::Handle_WriteTrack(SpReqAnsContext<CardIssuerService_WriteTrack_Req, CardIssuerService_WriteTrack_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("WriteTrack")("Invoke WriteTrack");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("WriteTrack")("WriteTrack");
 	m_pEntity->WriteTrack(ctx);
 }
 void CardIssuerServerSession::Handle_GetMaterialCountEx(SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req, CardIssuerService_GetMaterialCountEx_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("GetMaterialCountEx")("Invoke GetMaterialCountEx");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("GetMaterialCountEx")("GetMaterialCountEx");
 	m_pEntity->GetMaterialCountEx(ctx);
 }
 void CardIssuerServerSession::Handle_SetMaterialCountEx(SpReqAnsContext<CardIssuerService_SetMaterialCountEx_Req, CardIssuerService_SetMaterialCountEx_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetMaterialCountEx")("Invoke SetMaterialCountEx");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetMaterialCountEx")("SetMaterialCountEx");
 	m_pEntity->SetMaterialCountEx(ctx);
 }
 void CardIssuerServerSession::Handle_SetSomeFlag(SpReqAnsContext<CardIssuerService_SetSomeFlag_Req, CardIssuerService_SetSomeFlag_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetSomeFlag");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SetSomeFlag")("SetSomeFlag");
 	m_pEntity->SetSomeFlag(ctx);
 }
-void CardIssuerServerSession::Handle_GetSCIInfo(SpReqAnsContext<CardIssuerService_GetSCIInfo_Req, CardIssuerService_GetSCIInfo_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
 void CardIssuerServerSession::Handle_IssueEx(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("IssueEx")("Invoke IssueEx");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("IssueEx")("IssueEx");
 	m_pEntity->IssueEx(ctx);
 }
-void CardIssuerServerSession::Handle_OpenSafeLock(SpReqAnsContext<CardIssuerService_OpenSafeLock_Req, CardIssuerService_OpenSafeLock_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
 void CardIssuerServerSession::Handle_SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx)
 {
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SAMICCommand")("Invoke SAMICCommand");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("SAMICCommand")("SAMICCommand");
 	m_pEntity->SAMICCommand(ctx);
 }
-void CardIssuerServerSession::Handle_QueryPrinterStatus(SpReqAnsContext<CardIssuerService_QueryPrinterStatus_Req, CardIssuerService_QueryPrinterStatus_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
-void CardIssuerServerSession::Handle_Print(SpReqAnsContext<CardIssuerService_Print_Req, CardIssuerService_Print_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
-void CardIssuerServerSession::Handle_QuerySCIList(SpReqAnsContext<CardIssuerService_QuerySCIList_Req, CardIssuerService_QuerySCIList_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
-void CardIssuerServerSession::Handle_BindSCI(SpReqAnsContext<CardIssuerService_BindSCI_Req, CardIssuerService_BindSCI_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
-void CardIssuerServerSession::Handle_PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("PreOnlineOnStore")("Invoke PreOnlineOnStore");
-	m_pEntity->PreOnlineOnStore(ctx);
-}
-void CardIssuerServerSession::Handle_NotifyPreonline(SpReqAnsContext<CardIssuerService_NotifyPreonline_Req, CardIssuerService_NotifyPreonline_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("NotifyPreonline")("Invoke NotifyPreonline");
-	m_pEntity->NotifyPreonline(ctx);
-}
-void CardIssuerServerSession::Handle_QueryCardInfoOnStore(SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req, CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
-void CardIssuerServerSession::Handle_GetAddCardInfo(SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req, CardIssuerService_GetAddCardInfo_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
-void CardIssuerServerSession::Handle_PrintCardImmediately(SpReqAnsContext<CardIssuerService_PrintCardImmediately_Req, CardIssuerService_PrintCardImmediately_Ans>::Pointer ctx)
-{
-	ctx->Answer(Error_NotImpl);
-}
 void CardIssuerServerSession::Handle_QueryCIStatus(SpReqAnsContext<CardIssuerService_QueryCIStatus_Req, CardIssuerService_QueryCIStatus_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
-	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("QueryCIStatus")("Invoke QueryCIStatus");
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("QueryCIStatus")("QueryCIStatus");
 	m_pEntity->QueryCIStatus(ctx);
 }
 void CardIssuerServerSession::Handle_GetDevInfo(SpReqAnsContext<CardIssuerService_GetDevInfo_Req, CardIssuerService_GetDevInfo_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI("GetDevInfo")("GetDevInfo");
 	m_pEntity->GetDevInfo(ctx);
 }
 void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
@@ -200,13 +131,11 @@ void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue,
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{
 		if (_strnicmp(pszValue, "M", strlen("M")) == 0)
-		{
-			m_fsm.SetMainPageFlag(true);
-		}
+			m_fsm.SetInWhatPage(PageType_MainPage);
+		else if (_strnicmp(pszValue, "U", strlen("U")) == 0)
+			m_fsm.SetInWhatPage(PageType_UserDesktop);
 		else
-			m_fsm.SetMainPageFlag(false);
-
-
+			m_fsm.SetInWhatPage(PageType_Other);
 	}
 }
 

+ 0 - 40
Module/mod_cardissuer/mod_cardissuer.h

@@ -17,32 +17,17 @@ public:
 	virtual void Handle_Eject(SpReqAnsContext<CardIssuerService_Eject_Req, CardIssuerService_Eject_Ans>::Pointer ctx);
 	virtual void Handle_CancelInsert(SpOnewayCallContext<CardIssuerService_CancelInsert_Info>::Pointer ctx);
 	virtual void Handle_InsertWaitMore(SpOnewayCallContext<CardIssuerService_InsertWaitMore_Info>::Pointer ctx);
-	virtual void Handle_Issue(SpReqAnsContext<CardIssuerService_Issue_Req, CardIssuerService_Issue_Ans>::Pointer ctx);
 	virtual void Handle_PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req, CardIssuerService_PreOnline_Ans>::Pointer ctx);
 	virtual void Handle_PostOnline(SpReqAnsContext<CardIssuerService_PostOnline_Req, CardIssuerService_PostOnline_Ans>::Pointer ctx);
 	virtual void Handle_Exit(SpOnewayCallContext<CardIssuerService_Exit_Info>::Pointer ctx);	
-	virtual void Handle_GetMaterialCount(SpReqAnsContext<CardIssuerService_GetMaterialCount_Req, CardIssuerService_GetMaterialCount_Ans>::Pointer ctx);
-	virtual void Handle_SetMaterialCount(SpReqAnsContext<CardIssuerService_SetMaterialCount_Req, CardIssuerService_SetMaterialCount_Ans>::Pointer ctx);
 	virtual void Handle_SetIssueFlag(SpOnewayCallContext<CardIssuerService_SetIssueFlag_Info>::Pointer ctx);
-	virtual void Handle_ReadEx(SpReqAnsContext<CardIssuerService_ReadEx_Req, CardIssuerService_ReadEx_Ans>::Pointer ctx);
 	virtual void Handle_QueryCardInfo(SpReqAnsContext<CardIssuerService_QueryCardInfo_Req, CardIssuerService_QueryCardInfo_Ans>::Pointer ctx);
 	virtual void Handle_WriteTrack(SpReqAnsContext<CardIssuerService_WriteTrack_Req, CardIssuerService_WriteTrack_Ans>::Pointer ctx);
 	virtual void Handle_GetMaterialCountEx(SpReqAnsContext<CardIssuerService_GetMaterialCountEx_Req, CardIssuerService_GetMaterialCountEx_Ans>::Pointer ctx);
 	virtual void Handle_SetMaterialCountEx(SpReqAnsContext<CardIssuerService_SetMaterialCountEx_Req, CardIssuerService_SetMaterialCountEx_Ans>::Pointer ctx);
 	virtual void Handle_SetSomeFlag(SpReqAnsContext<CardIssuerService_SetSomeFlag_Req, CardIssuerService_SetSomeFlag_Ans>::Pointer ctx);
-	virtual void Handle_GetSCIInfo(SpReqAnsContext<CardIssuerService_GetSCIInfo_Req, CardIssuerService_GetSCIInfo_Ans>::Pointer ctx);
 	virtual void Handle_IssueEx(SpReqAnsContext<CardIssuerService_IssueEx_Req, CardIssuerService_IssueEx_Ans>::Pointer ctx);
-	virtual void Handle_OpenSafeLock(SpReqAnsContext<CardIssuerService_OpenSafeLock_Req, CardIssuerService_OpenSafeLock_Ans>::Pointer ctx);
 	virtual void Handle_SAMICCommand(SpReqAnsContext<CardIssuerService_SAMICCommand_Req, CardIssuerService_SAMICCommand_Ans>::Pointer ctx);
-	virtual void Handle_QueryPrinterStatus(SpReqAnsContext<CardIssuerService_QueryPrinterStatus_Req, CardIssuerService_QueryPrinterStatus_Ans>::Pointer ctx);
-	virtual void Handle_Print(SpReqAnsContext<CardIssuerService_Print_Req, CardIssuerService_Print_Ans>::Pointer ctx);
-	virtual void Handle_QuerySCIList(SpReqAnsContext<CardIssuerService_QuerySCIList_Req, CardIssuerService_QuerySCIList_Ans>::Pointer ctx);
-	virtual void Handle_BindSCI(SpReqAnsContext<CardIssuerService_BindSCI_Req, CardIssuerService_BindSCI_Ans>::Pointer ctx);
-	virtual void Handle_PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx);
-	virtual void Handle_NotifyPreonline(SpReqAnsContext<CardIssuerService_NotifyPreonline_Req, CardIssuerService_NotifyPreonline_Ans>::Pointer ctx);
-	virtual void Handle_QueryCardInfoOnStore(SpReqAnsContext<CardIssuerService_QueryCardInfoOnStore_Req, CardIssuerService_QueryCardInfoOnStore_Ans>::Pointer ctx);
-	virtual void Handle_GetAddCardInfo(SpReqAnsContext<CardIssuerService_GetAddCardInfo_Req, CardIssuerService_GetAddCardInfo_Ans>::Pointer ctx);
-	virtual void Handle_PrintCardImmediately(SpReqAnsContext<CardIssuerService_PrintCardImmediately_Req, CardIssuerService_PrintCardImmediately_Ans>::Pointer ctx);
 	virtual void Handle_QueryCIStatus(SpReqAnsContext<CardIssuerService_QueryCIStatus_Req, CardIssuerService_QueryCIStatus_Ans>::Pointer ctx);
 	virtual void Handle_GetDevInfo(SpReqAnsContext<CardIssuerService_GetDevInfo_Req, CardIssuerService_GetDevInfo_Ans>::Pointer ctx);
 private:
@@ -199,20 +184,6 @@ public:
 		FSMEvent *evt = new FSMEvent(USER_EVT_EXIT);
 		m_fsm.PostEventFIFO(evt);
 	}
-	void GetMaterialCount(SpReqAnsContext<CardIssuerService_GetMaterialCount_Req, CardIssuerService_GetMaterialCount_Ans>::Pointer ctx)
-	{
-		m_bNewSessionInit = false;
-		GetMaterialEvent *pEvt = new GetMaterialEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
-	}
-	void SetMaterialCount(SpReqAnsContext<CardIssuerService_SetMaterialCount_Req, CardIssuerService_SetMaterialCount_Ans>::Pointer ctx)
-	{
-		m_bNewSessionInit = false;
-		SetMaterialEvent *pEvt = new SetMaterialEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
-	}
 	void QueryCardInfo(SpReqAnsContext<CardIssuerService_QueryCardInfo_Req, CardIssuerService_QueryCardInfo_Ans>::Pointer ctx)
 	{
 		if (m_bNewSessionInit)
@@ -303,17 +274,6 @@ public:
 		pEvt->ctx = ctx;
 		m_fsm.PostEventFIFO(pEvt);
 	}
-	void PreOnlineOnStore(SpReqAnsContext<CardIssuerService_PreOnlineOnStore_Req, CardIssuerService_PreOnlineOnStore_Ans>::Pointer ctx)
-	{
-		PreOnlineOnStoreEvent *pEvt = new PreOnlineOnStoreEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
-	}
-	void NotifyPreonline(SpReqAnsContext<CardIssuerService_NotifyPreonline_Req, CardIssuerService_NotifyPreonline_Ans>::Pointer ctx)
-	{
-		m_fsm.NotifyPreOnline(ctx->Req.errCode,ctx->Req.findCard,ctx->Req.cardPos,ctx->Req.data);
-		ctx->Answer(Error_Succeed);
-	}
 	void GetDevInfo(SpReqAnsContext<CardIssuerService_GetDevInfo_Req, CardIssuerService_GetDevInfo_Ans>::Pointer ctx)
 	{
 		ctx->Ans.state = m_fsm.GetDevState();

+ 7 - 7
Module/mod_guiconsole/mod_guiconsole.cpp

@@ -265,7 +265,7 @@ ErrorCodeEnum CGUIConsoleEntity::AddTradeManage(const char *pszTerminalNo, const
 		rc = Error_NetBroken;
 	}
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 	if (Error_Succeed != rc)
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mod AddTradeManage return : %s", SpStrError(rc));
@@ -294,7 +294,7 @@ ErrorCodeEnum CGUIConsoleEntity::AddMaterialCounter(const char *pszMaterialCode)
 		rc = Error_NetBroken;
 	}
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 
 	if (rc == Error_Succeed)
@@ -330,7 +330,7 @@ ErrorCodeEnum CGUIConsoleEntity::QueryMaterialInfo(const char *pszDeviceNo, unsi
 	if(pCnn->IsConnectionOK())
 		pCnn->Close();
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 	return rc;
 }
@@ -357,7 +357,7 @@ ErrorCodeEnum CGUIConsoleEntity::GetMaterialCounter(const char *pszMaterial, uns
 		rc = Error_NetBroken;
 	}
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 	return rc;
 }
@@ -436,7 +436,7 @@ ErrorCodeEnum CGUIConsoleEntity::ResetMaterialCounter(const char *pszMaterial, u
 		rc = Error_NetBroken;
 	}
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 
 	if (rc == Error_Succeed)
@@ -476,7 +476,7 @@ ErrorCodeEnum CGUIConsoleEntity::RegistSwallowedCard(const char *pszCardNo, cons
         rc = Error_NetBroken;
     }
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 
 	char tempCardNo[MAX_PATH] = "";
@@ -552,7 +552,7 @@ ErrorCodeEnum CGUIConsoleEntity::SyncMaterialCount(const char *pszDeviceNo, DWOR
 		pCnn->Close();
 
 
-	pCnn->DecRefCount();
+	//pCnn->DecRefCount();
 	pCnn = NULL;
 
 	if (rc == Error_Succeed)

+ 103 - 700
Module/mod_heartbeat/HeartBeatFSM.cpp

@@ -93,9 +93,9 @@ ErrorCodeEnum CHeartBeatFSM::OnInit()
 	
 	//网络字节序
 	//由于双活改造,改成固定ip,分行服务有处理
-	m_servIP = "99.1.100.215";
-	m_dwServIP = inet_addr(m_servIP);
-	m_csServerIP = m_servIP;
+	//m_servIP = "99.1.100.215";
+	m_dwServIP = inet_addr("99.1.100.215");
+	//m_csServerIP = m_servIP;
 
 	CSimpleStringA csRunDiskName("C:\\");
 	Error = GetEntityBase()->GetFunction()->GetPath("Run", csRunDiskName);
@@ -104,7 +104,6 @@ ErrorCodeEnum CHeartBeatFSM::OnInit()
 	if(arrays.GetCount() > 0)
 	{
 		m_csRunDiskName = arrays[0] + "\\";
-		Dbg("m_csRunDiskName is %s", (LPCTSTR)m_csRunDiskName);
 	}
 	else
 	{
@@ -275,37 +274,6 @@ unsigned int CHeartBeatFSM::s2_on_event(FSMEvent* pEvt)
 	case USER_EVT_CARD_ACTIVE_FINISHED:
 		pEvt->SetHandled();
 		break;
-	case USER_EVT_CROSS_TERM_CALL:
-	{
-		pEvt->SetHandled();
-		CrossTermCallEvent* pCTCE = dynamic_cast<CrossTermCallEvent*>(pEvt);
-		CrossTermCallTask *pTask = new CrossTermCallTask(this);
-		pTask->ctx = pCTCE->ctx;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 cross call,type %x.",pCTCE->ctx->Req.type);
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-	}
-	break;
-	case USER_EVT_CROSS_TERM_CALL_FINISHED:
-		pEvt->SetHandled();
-		break;
-	case USER_EVT_ILCallToRVC:
-	{
-		pEvt->SetHandled();
-		ILCallToRVCEvent* pCTCE = dynamic_cast<ILCallToRVCEvent*>(pEvt);
-		ILCallToRVCTask *pTask = new ILCallToRVCTask(this);
-		pTask->ctx = pCTCE->ctx;
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-	}
-	break;
-	case USER_EVT_CallResultToIL:
-	{
-		pEvt->SetHandled();
-		CallResultToILEvent* pCTCE = dynamic_cast<CallResultToILEvent*>(pEvt);
-		CallResultToILTask *pTask = new CallResultToILTask(this);
-		pTask->ctx = pCTCE->ctx;
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-	}
-	break;
 	default:
 		break;
 	}
@@ -622,6 +590,8 @@ void CHeartBeatFSM::HttpsLogCallBack(const char* logtxt)
 {
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("http dbg: %s", logtxt);
 }
+
+
 int CHeartBeatFSM::CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx)
 {
 	LOG_FUNCTION();
@@ -666,7 +636,6 @@ ErrorCodeEnum CHeartBeatFSM::SetErrorList(int warmLevel,CSimpleStringA strList)
 {
 	m_warnLevel = warmLevel;
 	m_entErrorList = strList;
-	Dbg("strList[%s]",(LPCTSTR)strList);
 	return Error_Succeed;
 }
 void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
@@ -677,17 +646,53 @@ void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransaction
 void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data)
 {
 	LOG_FUNCTION();
-	CardReadAdapterService_ClientBase *pCardReadAdapterClient = NULL;
-	ErrorCodeEnum eErr = Error_Unexpect;
-	pCardReadAdapterClient = new CardReadAdapterService_ClientBase(GetEntityBase());
-	eErr = pCardReadAdapterClient->Connect();
-	if (eErr != Error_Succeed)
+	DWORD dwUserCode = 0;
+	if (!CheckCRASessionOrToConnect())
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("to call local preonline, but can't connect to CardReadAdapter.");
+		return;
+	}
+
+	//oilyang@20230316 check CardIssuer state first
+	CardReadAdapterService_GetDevInfo_Req reqInfo;
+	CardReadAdapterService_GetDevInfo_Ans ansInfo;
+	reqInfo.module = 1;//Module_CardIssuer
+	ErrorCodeEnum eErr = m_pCRAClient->GetDevInfo(reqInfo, ansInfo, 3000, dwUserCode);
+	CSimpleStringA errMsgData(true);
+	if (eErr == Error_InvalidState)
 	{
-		CSimpleStringA errMsg = CSimpleStringA::Format("LocalPreOnline, pGuiConsoleClient is null or connect CardReadAdapter failed:%d(0x%x)", eErr, eErr);
-		LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
-		pCardReadAdapterClient->SafeDelete();
+		errMsgData = "CardIssuer in use";
+		if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
+		{
+			m_pHandShakeConn->SendCardActive(1, slot, Error_Duplication, (const char*)termNo, (const char*)account,
+				account.GetLength(), errMsgData.GetData(), errMsgData.GetLength()+1, 9999, 9999, HeartBeat_UserErrorCode_CardStore_CardIssuer_In_Use);
+		}
+		LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardStore_CardIssuer_In_Use, "CardIssuer in use");
 		return;
 	}
+	else if (eErr == Error_DevNotAvailable)
+	{
+		errMsgData = "CardIssuer not available(open failed)";
+		if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
+		{
+			m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
+				account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, HeartBeat_UserErrorCode_CardIssuer_Open_Failed);
+		}
+		LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_Open_Failed, "CardIssuer not available(open failed)");
+		return;
+	}
+	else if (eErr != Error_Succeed || ansInfo.ModuleSN.GetCount() == 0 ||(ansInfo.ModuleSN.GetCount() == 1 && ansInfo.state[0] == 3))//3 for DEVICE_STATUS_FAULT defined in DevBaseClass.h
+	{
+		errMsgData = "CardIssuer in fault state";
+		if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
+		{
+			m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
+				account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, HeartBeat_UserErrorCode_CardIssuer_In_Fault_State);
+		}
+		LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_In_Fault_State, "CardIssuer in fault state");
+		return;
+	}
+	Sleep(500);//oilyang@20230328 wait for entity CardReadAdapter to change back to normal state
 	CardReadAdapterService_PreOnline_Req req;
 	CardReadAdapterService_PreOnline_Ans ans;
 	CSimpleStringA outParam("");
@@ -703,22 +708,21 @@ void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleSt
 	req.reserved2[1] = account;
 	CSimpleStringA inParam = CSimpleStringA::Format("PreOnline, CardStore heartbeat invodk PreOnline, slot:%s, accountLen:%d", req.reserved2[0].GetData(), account.GetLength());
 	LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
-	eErr = pCardReadAdapterClient->PreOnline(req, ans, 65000);
-	if (eErr != Error_Succeed) {
-		outParam = CSimpleStringA::Format("local preonline failed:%d(0x%x)", eErr, eErr);
+	eErr = m_pCRAClient->PreOnline(req, ans, 65000, dwUserCode);
+	if (eErr != Error_Succeed){
+		outParam = CSimpleStringA::Format("local preonline failed:%d(0x%x),dwUserCode:%d(0x%x)", eErr, eErr, dwUserCode, dwUserCode);
 		if (eErr == Error_Duplication)
 		{
 			ReceivePreOnlineBack(Error_Duplication, "", 0, 0);
-			pCardReadAdapterClient->GetFunction()->CloseSession();
 			return;
 		}
-		LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, outParam.GetData());
+		LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, outParam.GetData());
 	}
 	Sleep(500);
 	CardReadAdapterService_QueryCardInfoOnStore_Req reqX;
 	CardReadAdapterService_QueryCardInfoOnStore_Ans ansX;
 	ErrorCodeEnum eErrX = Error_Unexpect;
-	eErrX = pCardReadAdapterClient->QueryCardInfoOnStore(reqX, ansX,12000);
+	eErrX = m_pCRAClient->QueryCardInfoOnStore(reqX, ansX,12000);
 	if (eErrX != Error_Succeed)
 	{
 		outParam = CSimpleStringA::Format("QueryCardInfoOnStore failed.%d",eErrX);
@@ -727,455 +731,28 @@ void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleSt
 	}
 	if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
 	{
-		m_pHandShakeConn->SendCardActive(1,slot,eErr, (const char*)termNo, (const char*)account,
-			account.GetLength(), (const char*)ans.result, ans.result.GetLength(),ansX.findCard,ansX.cardPos);
+		m_pHandShakeConn->SendCardActive(1, slot, eErr, (const char*)termNo, (const char*)account,
+			account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ansX.findCard, ansX.cardPos, dwUserCode);
 	}
-	pCardReadAdapterClient->GetFunction()->CloseSession();
 }
-void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos)
+void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode)
 {
-	LOG_FUNCTION();
-	CardIssuerService_ClientBase *pCardIssuerClient = NULL;
-	ErrorCodeEnum eErr = Error_Unexpect;
-	pCardIssuerClient = new CardIssuerService_ClientBase(GetEntityBase());
-	eErr = pCardIssuerClient->Connect();	
-	if (eErr != Error_Succeed)
+	if (!CheckCRASessionOrToConnect())
 	{
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("pGuiConsoleClient is null or connect to cardissuer failed.%d", eErr);
-		pCardIssuerClient->SafeDelete();
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("while receive preonline result, but can't connect to CardReadAdapter.");
 		return;
 	}
-	CardIssuerService_NotifyPreonline_Req req;
-	CardIssuerService_NotifyPreonline_Ans ans;
+
+	CardReadAdapterService_NotifyPreonline_Req req;
+	CardReadAdapterService_NotifyPreonline_Ans ans;
 	req.data = data;
 	req.findCard = findCard;
 	req.cardPos = cardPos;
 	req.errCode = errCode;
-	eErr = pCardIssuerClient->NotifyPreonline(req, ans, 10000);
+	req.reserved1.Init(1);
+	req.reserved1[0] = userErrCode;
+	ErrorCodeEnum eErr = m_pCRAClient->NotifyPreonline(req, ans, 10000);
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("NotifyPreonline ret:%d",eErr);
-	pCardIssuerClient->GetFunction()->CloseSession();
-}
-int CHeartBeatFSM::CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
-{
-	int ret = 0;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cross term call,type:%x, entity: 0x%x",ctx->Req.type, ctx->Req.nEntityID);
-	switch (ctx->Req.nEntityID)
-	{
-	case 0x206:
-	case 0x201:
-	case 0x218:
-	case 0x21B:
-		ret = ProcessCrossCallToHBService(ctx->Req.type,ctx);
-		break;
-	default:
-		break;
-	}
-	return ret;
-}
-int CHeartBeatFSM::ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	ctx->Answer(Error_Succeed);
-	return SendToHeartBeatService(ctx->Req,ctx->Ans);
-}
-void CHeartBeatFSM::DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize)
-{
-	if (GetTerminalStageState().Compare("A"))
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Terminal havn't been auth suc,forbid cross call.");
-		return;
-	}
-
-	LocalProcessCrossCallTask *pTask = new LocalProcessCrossCallTask(this, reqInfo, nBufSize);
-	GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-}
-int CHeartBeatFSM::LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize)
-{
-	LOG_FUNCTION();
-
-	if(reqInfo == NULL) {
-		return -1;
-	}
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("entity sn:%x,is RVC.IL:%d,bTwoWay:%d", reqInfo->nEntityID, m_bJBMachine, reqInfo->bTwoWay);
-	if(m_bJBMachine) { //简版心跳逻辑,那么接收到的应该是回收包
-		switch(reqInfo->nEntityID) //实体ID
-		{
-		case 0x201:
-		{
-			ErrorCodeEnum ec = Error_Succeed;
-			IDCertService_ClientBase* pClient = new IDCertService_ClientBase(GetEntityBase());
-			ec = pClient->Connect();
-			if (ec == Error_Succeed) {
-				IDCertService_CrossTermInvokeInfo_Info info;
-				info.type = reqInfo->CallType;
-				info.nEntityID = reqInfo->nEntityID;
-				info.result = reqInfo->ErrorCode;
-				SpBuffer spbuf2;
-				int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
-				bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
-				if (bBuf) {
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
-					if (xSize > 0)
-						info.paramX = spbuf2.ToBlob();
-				}
-
-				ec = pClient->CrossTermInvokeInfo(info);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to IDCertificate failed %d", ec);
-			}
-		}
-			break;
-		case 0x206://pinpad
-		{
-			ErrorCodeEnum ec = Error_Succeed;
-			PinPadService_ClientBase* pClient = new PinPadService_ClientBase(GetEntityBase());
-			ec = pClient->Connect();
-			if (ec == Error_Succeed) {
-				PinPadService_CrossTermInvokeInfo_Info info;
-				info.type = reqInfo->CallType;
-				info.nEntityID = reqInfo->nEntityID;
-				info.result = reqInfo->ErrorCode;
-				SpBuffer spbuf2;
-				int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
-				bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
-				if (bBuf) {
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
-					if (xSize > 0)
-						info.paramX = spbuf2.ToBlob();
-				}
-
-				ec = pClient->CrossTermInvokeInfo(info);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to PinPad failed %d", ec);
-			}
-		}
-		break;
-		case 0x218:
-			{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Scanner set");
-				ErrorCodeEnum ec = Error_Succeed;
-				ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
-				ec = pClient->Connect();
-				if(ec == Error_Succeed) {
-					ScannerService_CrossTermInvokeInfo_Info info;
-					info.type = reqInfo->CallType;
-					info.nEntityID = reqInfo->nEntityID;
-					info.result = reqInfo->ErrorCode;
-					SpBuffer spbuf2;
-					int size = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX) , size);
-					bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), size);
-					if(bBuf) {
-						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
-						if(size > 0) {
-							info.paramX = spbuf2.ToBlob();
-						}
-					}
-					ec = pClient->CrossTermInvokeInfo(info);
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
-				} else {
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to scanner failed %d", ec);
-				}
-			}
-			break;
-		case 0x21B:
-		{
-			ErrorCodeEnum ec = Error_Succeed;
-			CardReadAdapterService_ClientBase* pClient = new CardReadAdapterService_ClientBase(GetEntityBase());
-			ec = pClient->Connect();
-			if (ec == Error_Succeed) {
-				CardReadAdapterService_CrossTermInvokeInfo_Info info;
-				info.type = reqInfo->CallType;
-				info.nEntityID = reqInfo->nEntityID;
-				info.result = reqInfo->ErrorCode;
-				SpBuffer spbuf2;
-				int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
-				bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
-				if (bBuf) {
-					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
-					if (xSize > 0)
-						info.paramX = spbuf2.ToBlob();
-				}
-
-				ec = pClient->CrossTermInvokeInfo(info);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to CardReadAdapter failed %d", ec);
-			}
-		}
-		break;
-		case 0x999:
-		{
-			if (reqInfo->numOfBlobInParamX == 1)
-			{
-				NotifyIECallResult resultNote;
-				resultNote.ans_context = reqInfo->StrParamX;
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest %s", (const char*)resultNote.ans_context.SubString(0, 512));
-				resultNote.error = reqInfo->ErrorCode;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("notify result to IE:error %d,len of ans_context %d", resultNote.error, reqInfo->lensOfBlobInParamX[0]);
-				SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
-			}
-			else
-			{//oiltest 需要改成按照序号组包
-				m_tmpMultiBlob += reqInfo->StrParamX;
-				if (reqInfo->blobSN == reqInfo->numOfBlobInParamX-1)
-				{
-					NotifyIECallResult resultNote;
-					resultNote.ans_context = m_tmpMultiBlob;
-					if (resultNote.ans_context.GetLength() > 512)
-						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest substr %s", (const char*)resultNote.ans_context.SubString(0, 512));
-					else
-						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest %s", (const char*)resultNote.ans_context);
-					if (resultNote.ans_context.GetLength() > 100)
-						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest the last 100 str %s", (const char*)resultNote.ans_context.SubString(resultNote.ans_context.GetLength()-100, 100));
-					resultNote.error = reqInfo->ErrorCode;
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("notify result to IE:error %d,len of ans_context %d", resultNote.error, resultNote.ans_context.GetLength());
-					SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
-					m_tmpMultiBlob = "";
-				}
-			}
-		}
-		break;
-		default:
-			break;
-		}
-	} else { //常规机型,连接适配器
-		switch(reqInfo->nEntityID) //实体ID
-		{
-		case 0x201:
-		{
-			ErrorCodeEnum ec = Error_Succeed;
-			if (m_pIDClient == NULL)
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat IDCertService_ClientBase client");
-				m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
-			}
-			if (m_pIDClient != NULL)
-			{
-				if (m_pIDClient->QuerySessionClosed())
-				{
-					m_pIDClient->SafeDelete();
-					m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to IDCertificate...");
-					if (m_pIDClient != NULL)
-						ec = m_pIDClient->Connect();
-				}
-			}
-			if (ec == Error_Succeed) {
-				IDCertService_CrossTermCall_Req reqX;
-				IDCertService_CrossTermCall_Ans ansX;
-				reqX.type = reqInfo->CallType;
-				//这个应该不用存储
-				reqX.fromTerminalNo = reqInfo->ToTerminalNo;
-				reqX.toTerminalNo = reqInfo->FromTerminalNo;
-
-				SpBuffer spbuf2;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
-				bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
-				if (bBuf) {
-					reqX.paramX = spbuf2.ToBlob();
-				}
-				ec = m_pIDClient->CrossTermCall(reqX, ansX, 20000);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
-				if (reqInfo->bTwoWay)//if one way call, no need to feed back
-				{
-					HeartBeatService_CrossTermCall_Req reqY;
-					HeartBeatService_CrossTermCall_Ans ansY;
-					reqY.type = reqInfo->CallType;
-					reqY.nEntityID = reqInfo->nEntityID;
-					//做返回
-					ansY.retCode = ec;
-					reqY.fromTerminalNo = reqInfo->ToTerminalNo;
-					reqY.toTerminalNo = reqInfo->FromTerminalNo;
-					reqY.paramX = ansX.retParamX;
-					//reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
-					SendToHeartBeatService(reqY, ansY);
-				}
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to IDCertificate failed %d", ec);
-				m_pIDClient->SafeDelete();
-				m_pIDClient = NULL;
-			}
-		}
-		break;
-		case 0x206://pinpad
-		{
-			ErrorCodeEnum ec = Error_Succeed;
-			if (m_pPinPadClient == NULL)
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat PinPadService_ClientBase client");
-				m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
-			}
-			if (m_pPinPadClient != NULL)
-			{
-				if (m_pPinPadClient->QuerySessionClosed())
-				{
-					m_pPinPadClient->SafeDelete();
-					m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to PinPad...");
-					if (m_pPinPadClient != NULL)
-						ec = m_pPinPadClient->Connect();
-				}
-			}
-			if (ec == Error_Succeed) {
-				PinPadService_CrossTermCall_Req reqX;
-				PinPadService_CrossTermCall_Ans ansX;
-				reqX.type = reqInfo->CallType;
-				//这个应该不用存储
-				reqX.fromTerminalNo = reqInfo->ToTerminalNo;
-				reqX.toTerminalNo = reqInfo->FromTerminalNo;
-
-				SpBuffer spbuf2;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
-				bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
-				if (bBuf) {
-					reqX.paramX = spbuf2.ToBlob();
-				}
-				ec = m_pPinPadClient->CrossTermCall(reqX, ansX, 20000);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
-				if (reqInfo->bTwoWay)//if one way call, no need to feed back
-				{
-					HeartBeatService_CrossTermCall_Req reqY;
-					HeartBeatService_CrossTermCall_Ans ansY;
-					reqY.type = reqInfo->CallType;
-					reqY.nEntityID = reqInfo->nEntityID;
-					//做返回
-					ansY.retCode = ec;
-					reqY.fromTerminalNo = reqInfo->ToTerminalNo;
-					reqY.toTerminalNo = reqInfo->FromTerminalNo;
-					reqY.paramX = ansX.retParamX;
-					//reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
-					SendToHeartBeatService(reqY, ansY);
-				}
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to PinPad failed %d", ec);
-			}
-		}
-		break;
-		case 0x218: // 高拍仪功能集
-			{
-				ErrorCodeEnum ec = Error_Succeed;
-				ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
-				ec = pClient->Connect();
-				if(ec == Error_Succeed) {
-					ScannerService_CrossTermCall_Req reqX;
-					ScannerService_CrossTermCall_Ans ansX;
-					reqX.type = reqInfo->CallType;
-					//这个应该不用存储
-					reqX.fromTerminalNo = reqInfo->ToTerminalNo;
-					reqX.toTerminalNo = reqInfo->FromTerminalNo;
-
-					SpBuffer spbuf2;
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX) );
-					bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1 );
-					if(bBuf) {
-						reqX.paramX = spbuf2.ToBlob();
-					}
-					 ec = pClient->CrossTermCall(reqX, ansX, 20000);
-					 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x",ec);
-					 if (reqInfo->bTwoWay)//if one way call, no need to feed back
-					 {
-						 HeartBeatService_CrossTermCall_Req reqY;
-						 HeartBeatService_CrossTermCall_Ans ansY;
-						 reqY.type = reqInfo->CallType;
-						 reqY.nEntityID = reqInfo->nEntityID;
-						 //做返回
-						 ansY.retCode = ec;
-						 reqY.fromTerminalNo = reqInfo->ToTerminalNo;
-						 reqY.toTerminalNo = reqInfo->FromTerminalNo;
-						 reqY.paramX = ansY.retParamX;
-						 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d", ec);
-						 SendToHeartBeatService(reqY, ansY);
-					 }
-				} else {
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to scanner failed %d", ec);
-				}
-			}
-			break;
-		case 0x21B:
-		{
-			ErrorCodeEnum ec = Error_Succeed;
-			if (m_pCRAClient == NULL)
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat CardReadAdapterService_ClientBase client");
-				m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
-			}
-			if (m_pCRAClient != NULL)
-			{
-				if (m_pCRAClient->QuerySessionClosed())
-				{
-					m_pCRAClient = NULL;
-					m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to CardReadAdapter");
-					ec = m_pCRAClient->Connect();
-				}
-			}
-			if (ec == Error_Succeed) {
-				CardReadAdapterService_CrossTermCall_Req reqX;
-				CardReadAdapterService_CrossTermCall_Ans ansX;
-				reqX.type = reqInfo->CallType;
-				//这个应该不用存储
-				reqX.fromTerminalNo = reqInfo->ToTerminalNo;
-				reqX.toTerminalNo = reqInfo->FromTerminalNo;
-
-				SpBuffer spbuf2;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
-				bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
-				if (bBuf) {
-					reqX.paramX = spbuf2.ToBlob();
-				}
-				ec = m_pCRAClient->CrossTermCall(reqX, ansX, 20000);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
-				if (reqInfo->bTwoWay)//if one way call, no need to feed back
-				{
-					HeartBeatService_CrossTermCall_Req reqY;
-					HeartBeatService_CrossTermCall_Ans ansY;
-					reqY.type = reqInfo->CallType;
-					reqY.nEntityID = reqInfo->nEntityID;
-					//做返回
-					ansY.retCode = ec;
-					reqY.fromTerminalNo = reqInfo->ToTerminalNo;
-					reqY.toTerminalNo = reqInfo->FromTerminalNo;
-					reqY.paramX = ansX.retParamX;
-					//reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,X len:%d", ec, reqY.paramX.m_iLength);
-					SendToHeartBeatService(reqY, ansY);
-				}
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to CardReadAdapter failed %d", ec);
-			}
-		}
-		break;
-		case 0x999:
-		{
-			m_ILDeviceNo = reqInfo->FromTerminalNo;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("save il TerminalNo:%s",(const char*)m_ILDeviceNo);
-			NotifyIEToCall note;
-			note.context = reqInfo->StrParamX;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("oiltest %s",(const char*)note.context);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("note IE to call:%d", reqInfo->lensOfBlobInParamX[0]);
-			SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIEToCall), SP_MSG_SIG_OF(NotifyIEToCall), note);
-		}
-		break;
-		default:
-			break;
-		}
-	}
-
-
 }
 
 ErrorCodeEnum CHeartBeatFSM::GetPerformCounter(TermianlCounter& counter)
@@ -1402,31 +979,6 @@ Cleanup:
 //oiltestlinux
 #endif //RVC_OS_WIN
 }
-int CHeartBeatFSM::SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
-{
-	LOG_FUNCTION();
-	if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
-	{
-		m_pHandShakeConn->SendCrossCallToService(req,ans);
-	}
-	return 0;
-}
-void CHeartBeatFSM::ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx)
-{
-	if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
-	{
-		CSimpleStringA csTerm("");
-		GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
-		m_pHandShakeConn->SendILCallToService(ctx->Info.req_context,0,true, m_localDeviceNo,csTerm);
-	}
-}
-void CHeartBeatFSM::CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx)
-{
-	if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
-	{
-		m_pHandShakeConn->SendILCallToService(ctx->Info.ans_context, ctx->Info.error, false, m_localDeviceNo,m_ILDeviceNo);
-	}
-}
 void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
 {
 	string serviceCode = pRecvPkg->GetServiceCode();
@@ -1439,10 +991,6 @@ void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
 	{
 		PkgRcvProcCardActive(pRecvPkg);
 	}
-	else if (serviceCode.compare("CRSSACT") == 0)
-	{
-		PkgRcvProcCrossCall(pRecvPkg);
-	}
 	else
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown service code!");
@@ -1597,10 +1145,10 @@ void HeartBeatConnection::SendHandShake()
 	//delete pkt;
 }
 
-void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned long errCode,const char *termNo, const char *account, const int accSize, const char *data, const int dataSize,int findCard,int cardPos)
+void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned long errCode,const char *termNo, const char *account, const int accSize, const char *data, const int dataSize,int findCard,int cardPos, unsigned long errCSCode)
 {
-	CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d",
-		type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize);
+	CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d,errCSCode:%d",
+													type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize, errCSCode);
 	LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_SendCardActive_InParam, inParm.GetData());
 	//发起跨机调用包
 	if (type == 0)
@@ -1629,6 +1177,7 @@ void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned
 		req.ErrCode = errCode;
 		req.findCard = findCard;
 		req.cardPos = cardPos;
+		req.reserved1 = errCSCode;
 		strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
 		strcpy_s(req.Account, accSize, account);
 		strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
@@ -1638,116 +1187,6 @@ void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned
 
 		SendPackage(pkt);
 	}
-}
-void HeartBeatConnection::SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
-{
-	LOG_FUNCTION();
-	Dbg("from term %s to term %s for entity %x,twoway:%d", (const char*)req.fromTerminalNo, (const char*)req.toTerminalNo, req.nEntityID, req.isTwoWay);
-
-	if (req.paramX.m_iLength > 0)
-	{
-		//char *pBuf = new char[64 * 1024];
-		//ZeroMemory(pBuf, 64 * 1024);
-		//HexBuf2StrBuf((PBYTE)req.paramX.m_pData, &pBuf, req.paramX.m_iLength);
-		//CSimpleStringA xStr(pBuf);
-		//int i = 0;
-		//for (; i < req.paramX.m_iLength / 900; i++)
-		//{
-		//	Dbg("%s", xStr.SubString(i * 900, 900));
-		//}
-		//Dbg("%s", xStr.SubString(i * 900, req.paramX.m_iLength - i * 900));
-	}
-	int count = req.paramX.m_iLength / (50 * 1000);
-	int size = sizeof(CrossCallReq)*(count + 1) + req.paramX.m_iLength + count;
-	char* pBuf = new char[size];
-	ZeroMemory(pBuf, size);
-	CrossCallReq* pReqX = (CrossCallReq*)pBuf;
-	for (int i = 0; i < count+1; i++)
-	{
-		pReqX[i].CallType = req.type;
-		pReqX[i].bTwoWay = req.isTwoWay;
-		pReqX[i].nEntityID = req.nEntityID;
-		pReqX[i].ErrorCode = ans.retCode;
-		pReqX[i].lensOfBlobInParamX[0] = req.paramX.m_iLength;
-		pReqX[i].numOfBlobInParamX = count+1;
-		strcpy_s(pReqX[i].FromTerminalNo, sizeof(pReqX[i].FromTerminalNo),req.fromTerminalNo);
-		strcpy_s(pReqX[i].ToTerminalNo, sizeof(pReqX[i].ToTerminalNo), req.toTerminalNo);
-		strcpy_s(pReqX[i].StrParam1, sizeof(pReqX[i].StrParam1), req.param1);
-		strcpy_s(pReqX[i].StrParam2, sizeof(pReqX[i].StrParam2), req.param2);
-		if (i == count)
-			memcpy_s(pReqX[i].StrParamX, (req.paramX.m_iLength-50*1000*i), (char*)req.paramX.m_pData+50*1000*i, req.paramX.m_iLength - 50 * 1000 * i);
-		else
-			memcpy_s(pReqX[i].StrParamX, 50*1000, (char*)req.paramX.m_pData + 50 * 1000 *i, 50 * 1000);
-	}
-	//memcpy_s(pReqX->StrParamX,req.paramY.GetLength(),req.paramX, req.paramX.GetLength());
-	Dbg("from %s to %s,struct X size:%d, len:%d,struct count:%d", pReqX->FromTerminalNo, pReqX->ToTerminalNo, size, req.paramX.m_iLength,count);
-	CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
-	pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, size,count+1);
-	SendPackage(pkt);
-	delete [] pBuf;
-}
-void HeartBeatConnection::SendILCallToService(CSimpleStringA csContent, int err, bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo)
-{
-	LOG_FUNCTION();
-	int count = csContent.GetLength() / (50 * 1000);
-	Dbg("count %d,size of content %d",count,csContent.GetLength());
-	if (csContent.GetLength() > 32)
-		Dbg("the last 32 str %s", (const char*)csContent.SubString(csContent.GetLength()-32,32));
-	
-	for (int i = 0; i < count + 1; i++)
-	{
-		int size;
-		if (i == count)
-		{
-			size = sizeof(CrossCallReq) + csContent.GetLength() - 50*1000*i + 1;
-		}
-		else
-			size = sizeof(CrossCallReq) + 50 * 1000 + 1;
-		
-		char* pBuf = new char[size];
-		ZeroMemory(pBuf, size);
-		Dbg("sz %d", size);
-		CrossCallReq* pReqX = (CrossCallReq*)pBuf;
-		pReqX->CallType = 999;
-		pReqX->bTwoWay = false;
-		pReqX->nEntityID = 0x999;
-		pReqX->blobSN = i;
-		pReqX->lensOfBlobInParamX[0] = csContent.GetLength();//no use 实际用到的时候需要修改这里
-		pReqX->numOfBlobInParamX = count + 1;
-		if (bFromIL)
-		{
-			pReqX->ErrorCode = 0;
-		}
-		else
-		{
-			pReqX->ErrorCode = err;
-		}
-		strcpy_s(pReqX->FromTerminalNo,sizeof(pReqX->FromTerminalNo), fromDevNo);
-		strcpy_s(pReqX->ToTerminalNo, sizeof(pReqX->ToTerminalNo), toDevNo);
-		CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
-		if (i == count)
-		{
-			memcpy_s(pReqX->StrParamX, csContent.GetLength() - 50 * 1000 * i, (const char*)csContent+50 * 1000 * i, csContent.GetLength() - 50 * 1000 * i);
-			Dbg("to add the %d packet from %d",i, csContent.GetLength() - 50 * 1000 * i);
-			Dbg("[%d],%d%d%d", strlen(pReqX->StrParamX), pReqX->StrParamX[strlen(pReqX->StrParamX) - 3], pReqX->StrParamX[strlen(pReqX->StrParamX) - 2],pReqX->StrParamX[strlen(pReqX->StrParamX)-1]);
-			pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
-			Dbg("p len:%d", sizeof(CrossCallReq) + csContent.GetLength() -  50 * 1000 * i);
-			SendPackage(pkt);
-			Dbg("the last of %d",i);
-			
-		}
-		else
-		{
-			memcpy_s(pReqX->StrParamX, 50 * 1000, (const char*)csContent + 50 * 1000 * i, 50 * 1000);
-			pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq)+50*1000);
-			Dbg("p len %d:%d,last 3:%d,%d,%d",i, sizeof(CrossCallReq) + 50 * 1000, pReqX->StrParamX[strlen(pReqX->StrParamX) - 3], pReqX->StrParamX[strlen(pReqX->StrParamX) - 2], pReqX->StrParamX[strlen(pReqX->StrParamX) - 1]);
-			SendPackage(pkt);
-			Dbg("the %d packet",i);
-		}
-		delete[] pBuf;
-	}	
-	
-	
 }
 void HeartBeatConnection::PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg)
 {
@@ -1847,7 +1286,7 @@ void CHeartBeatFSM::ProcessPreOnline(CardActiveReq* req)
 	if (req->type == 0)
 		LocalPreOnline(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2);
 	else if (req->type == 1)
-		ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos);
+		ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos, req->reserved1);
 }
 
 void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg)
@@ -1864,9 +1303,12 @@ void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pR
 			CardActiveReq* pAns = (CardActiveReq*)pBuf;
 			if (nArrayNum > 0)
 			{
-				CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
-					pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
-				LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
+				CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, errorCode:%d,userErrCode:%d, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
+					pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, pAns->ErrCode, pAns->reserved1, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
+				if (pAns->ErrCode == Error_Succeed)
+					LogWarn(Severity_Low, Error_Succeed, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
+				else
+					LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
 				m_pFSM->ProcessCardActive(pAns);
 			}
 		}
@@ -1877,71 +1319,6 @@ void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pR
 	}
 }
 
-void HeartBeatConnection::PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg)
-{
-	LOG_FUNCTION();
-	int nLen = pRecvPkg->GetStructLen("CRSSREQ");
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nLen: %d", nLen);
-	if (nLen > 0) {
-		
-		BYTE *pBuf = new BYTE[nLen+1];
-		ZeroMemory(pBuf,nLen+1);
-		int nArrayNum = 0;
-		if (pRecvPkg->GetStructData("CRSSREQ", pBuf, &nLen, &nArrayNum)) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d,array num:%d,last 3:%d,%d,%d", nLen, nArrayNum,pBuf[nLen-3], pBuf[nLen - 2], pBuf[nLen - 1]);
-			CrossCallReq* pAnsArray = (CrossCallReq*)pBuf;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%x", ((CrossCallReq*)pBuf)->nEntityID);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("num %x", ((CrossCallReq*)pBuf)->numOfBlobInParamX);
-			int tmpXLen = 0;
-			for (int i = 0; i < nArrayNum; ++i)
-			{
-				tmpXLen += strlen(pAnsArray[i].StrParamX);
-			}
-
-			tmpXLen += (sizeof(CrossCallReq)*nArrayNum);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("tmpXLen:%d", tmpXLen);
-			BYTE *pAnsBuf = new BYTE[tmpXLen + 1];
-			ZeroMemory(pAnsBuf, tmpXLen + 1);
-			memcpy_s(pAnsBuf, tmpXLen+1, pBuf, tmpXLen);
-			CrossCallReq* pAns = (CrossCallReq*)pAnsBuf;
-			pAns->Appendix1 = pAnsArray->Appendix1;
-			pAns->Appendix2 = pAnsArray->Appendix2;
-			pAns->bTwoWay = pAnsArray->bTwoWay;
-			pAns->CallType = pAnsArray->CallType;
-			pAns->ErrorCode = pAnsArray->ErrorCode;
-			pAns->nEntityID = pAnsArray->nEntityID;
-			pAns->numOfBlobInParamX = pAnsArray->numOfBlobInParamX;
-			for (int i = 0; i < sizeof(pAns->lensOfBlobInParamX); i++)
-				pAns->lensOfBlobInParamX[i] = pAnsArray->lensOfBlobInParamX[i];
-			strcpy_s(pAns->FromTerminalNo, sizeof(pAns->FromTerminalNo), pAnsArray->FromTerminalNo);
-			strcpy_s(pAns->StrParam1, sizeof(pAns->StrParam1), pAnsArray->StrParam1);
-			strcpy_s(pAns->StrParam2, sizeof(pAns->StrParam2), pAnsArray->StrParam2);
-			strcpy_s(pAns->ToTerminalNo, sizeof(pAns->ToTerminalNo), pAnsArray->ToTerminalNo);
-
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%x",pAns->nEntityID);
-			for (int i = 0, start = 0; i < nArrayNum; ++i)
-			{
-				strcpy_s(pAns->StrParamX + start, tmpXLen - start, pAnsArray[i].StrParamX);
-				start += strlen(pAnsArray[i].StrParamX);
-			}
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("type:%x,from %s,to %s", pAns->CallType, pAns->FromTerminalNo, pAns->ToTerminalNo);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nEntityID: %x", pAns->nEntityID);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("appendix1: %d", pAns->Appendix1);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("bTwoWay:[%d]", pAns->bTwoWay);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("blobSN:[%d]", pAns->blobSN);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("param2:[%s]", pAns->StrParam2);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("param3:[%d]", pAns->Appendix2);//oiltest
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ErrorCode:[%x]", pAns->ErrorCode);//oiltest
-
-			m_pFSM->DoLocalProcessCrossCallTask(pAns, nLen);
-		}
-		else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("invalid CRSSREQ packet!");
-		}
-		delete pBuf;
-	}
-}
-
 ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore)
 {
 	//卡库用新地址
@@ -2005,4 +1382,30 @@ ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig,
 	}
 
 	return Error_Succeed;
-}
+}
+bool CHeartBeatFSM::CheckCRASessionOrToConnect()
+{
+	if (m_pCRAClient != NULL && !m_pCRAClient->QuerySessionClosed())
+		return true;
+	else
+	{
+		ErrorCodeEnum eErr = Error_Unexpect;
+		m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
+		if (m_pCRAClient != NULL) {
+			eErr = m_pCRAClient->Connect();
+			if (eErr != Error_Succeed)
+			{
+				CSimpleStringA errMsg = CSimpleStringA::Format("connect to CardReadAdapter failed:%d(0x%x)", eErr, eErr);
+				LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
+				return false;
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to CardReadAdapter suc.");
+				return true;
+			}
+		}
+		else
+			return false;
+	}
+}

+ 5 - 126
Module/mod_heartbeat/HeartBeatFSM.h

@@ -100,27 +100,6 @@ struct CardActiveReq
 	char Reserved3[128];
 	char Reserved4[128];
 };
-struct CrossCallReq
-{
-	uint32_t CallType;//跨机调用类型,同def文件的method id,实体内唯一
-	bool bTwoWay;//true :two way call; false: one way call
-	char FromTerminalNo[16];
-	char ToTerminalNo[16];
-	uint32_t nEntityID;
-	uint32_t Appendix1;
-	uint32_t Appendix2;
-	//返回包时用于标注错误
-	uint32_t ErrorCode;
-	//oilyang@20190118
-	uint32_t blobSN;//拆包时用于标注序号
-	//本来以为StrParamX足够大,用这个值来划分blob,结果一个blob就塞满了
-	//故numOfBlobInParamX用于标注拆包数量(结构个数)
-	uint32_t numOfBlobInParamX;
-	uint32_t lensOfBlobInParamX[16];//多个blob塞到StrParamX用于标注每一个的长度
-	char StrParam1[128];
-	char StrParam2[1024];
-	char StrParamX[0];//用于传递图片信息
-};
 #pragma pack()
 enum EvtType
 {
@@ -136,11 +115,6 @@ enum EvtType
 	USER_EVT_EXIT,
 	USER_EVT_CARD_ACTIVE,
 	USER_EVT_CARD_ACTIVE_FINISHED,
-	USER_EVT_CROSS_TERM_CALL,
-	USER_EVT_CROSS_TERM_CALL_FINISHED,
-	USER_EVT_LOCAL_CROSS_TERM_CALL_FINISHED,
-	USER_EVT_ILCallToRVC,
-	USER_EVT_CallResultToIL,
 };
 struct TerminalInfo
 {
@@ -272,29 +246,6 @@ public:
 protected:
 private:
 };
-class CrossTermCallEvent : public FSMEvent
-{
-public:
-	CrossTermCallEvent() : FSMEvent(USER_EVT_CROSS_TERM_CALL) {}
-	virtual ~CrossTermCallEvent() {}
-	SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
-protected:
-private:
-};
-class ILCallToRVCEvent : public FSMEvent
-{
-public:
-	ILCallToRVCEvent() : FSMEvent(USER_EVT_ILCallToRVC) {}
-	virtual ~ILCallToRVCEvent() {}
-	SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx;
-};
-class CallResultToILEvent : public FSMEvent
-{
-public:
-	CallResultToILEvent() : FSMEvent(USER_EVT_CallResultToIL) {}
-	virtual ~CallResultToILEvent() {}
-	SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx;
-};
 class HeartBeatConnection;
 
 class CHeartBeatFSM : public FSMImpl<CHeartBeatFSM>
@@ -321,7 +272,7 @@ public:
 
 	CHeartBeatFSM():m_initTimes(0),m_bUseBackup(false),m_testResult(Error_Succeed),
 	m_warnLevel(0), m_entErrorList(""), m_nLodCtrFlag(0), m_pHandShakeConn(NULL)
-	, m_tradeState(99),m_bJBMachine(false), m_pCRAClient(NULL), m_pIDClient(NULL) , m_pPinPadClient(NULL)
+	, m_tradeState(99),m_bJBMachine(false), m_pCRAClient(NULL)
 	, m_localDeviceNo(""), m_ILDeviceNo(""), m_tmpMultiBlob(""), m_terminalStage(""), m_strHandShakeUrl(""),m_bAlarmed(false)
 	,m_longConnInterval(20000),m_handShakeConnInterval(20000){}
 	~CHeartBeatFSM(){}
@@ -382,14 +333,7 @@ public:
 	}
 	int CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx);
 	void LocalPreOnline(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data);
-	void ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos);
-	int CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
-	int ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
-	int SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans);	
-	void DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize);
-	int LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize);
-	void ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx);
-	void CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx);
+	void ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode=0);
 	void ProcessPreOnline(CardActiveReq* req);
 	void ProcessCardActive(CardActiveReq* req);
 
@@ -398,6 +342,7 @@ protected:
 	
 private:
 	ErrorCodeEnum GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore);
+	bool CheckCRASessionOrToConnect();
 	
 	int m_tmpTestFlag;
 	int m_longConnInterval;//长连接时间间隔
@@ -413,8 +358,6 @@ private:
 	int m_nLodCtrFlag;
 	bool m_bJBMachine;
 	CardReadAdapter::CardReadAdapterService_ClientBase *m_pCRAClient;
-	IDCertificate::IDCertService_ClientBase *m_pIDClient;
-	PinPad::PinPadService_ClientBase *m_pPinPadClient;
 
 	bool m_bAlarmed;
 	bool m_isCardStore;
@@ -494,69 +437,7 @@ struct CardActiveTask : public ITaskSp
 		fsm->PostEventFIFO(e);
 	}
 };
-struct CrossTermCallTask : public ITaskSp
-{
-	CHeartBeatFSM* fsm;
-	SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
-	CrossTermCallTask(CHeartBeatFSM* f) : fsm(f) {}
-
-	void Process()
-	{
-		FSMEvent *e = new FSMEvent(USER_EVT_CROSS_TERM_CALL_FINISHED);
-		e->param1 = fsm->CrossTermCall(ctx);
-		fsm->PostEventFIFO(e);
-	}
-}; 
-struct ILCallToRVCTask : public ITaskSp
-{
-	CHeartBeatFSM* fsm;
-	SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx;
-	ILCallToRVCTask(CHeartBeatFSM* f) : fsm(f) {}
 
-	void Process()
-	{
-		fsm->ILCallToRVC(ctx);
-	}
-};
-struct CallResultToILTask : public ITaskSp
-{
-	CHeartBeatFSM* fsm;
-	SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx;
-	CallResultToILTask(CHeartBeatFSM* f) : fsm(f) {}
-
-	void Process()
-	{
-		fsm->CallResultToIL(ctx);
-	}
-};
-struct LocalProcessCrossCallTask : public ITaskSp
-{
-	CHeartBeatFSM* fsm;
-	CrossCallReq *xreqInfo;
-	int xnBufSize;
-	SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
-	LocalProcessCrossCallTask(CHeartBeatFSM* f, CrossCallReq *reqInfo, const int nBufSize) : fsm(f),xnBufSize(nBufSize) 
-	{
-		BYTE *pBuf = new BYTE[nBufSize + 1];
-		ZeroMemory(pBuf, nBufSize + 1);
-		memcpy(pBuf, reqInfo, nBufSize);
-		xreqInfo = (CrossCallReq*)pBuf;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("id:%x",xreqInfo->nEntityID);
-	}
-	~LocalProcessCrossCallTask()
-	{
-		if (xreqInfo) {
-			delete[] (BYTE*)xreqInfo;
-		}
-	}
-
-	void Process()
-	{
-		FSMEvent *e = new FSMEvent(USER_EVT_LOCAL_CROSS_TERM_CALL_FINISHED);
-		e->param1 = fsm->LocalProcessCrossCall(xreqInfo,xnBufSize);
-		fsm->PostEventFIFO(e);
-	}
-};
 
 struct ProcessPreOnlineTask : public ITaskSp
 {
@@ -609,13 +490,11 @@ public:
 
 	void SendHandShake();
 	//type:0,send preonline; 1,result of preonline
+	//errCSCode:CardStore returned UserErrorCode
 	void SendCardActive(const int type, const int slot,unsigned long errCode, const char *termNo, const char *account, const int accSize
-		, const char *data, const int dataSize,int findCard,int cardPos);
-	void SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans);
-	void SendILCallToService(CSimpleStringA csContent,int err,bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo);
+		, const char *data, const int dataSize,int findCard,int cardPos, unsigned long errCSCode=0);
 	void PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg);
 	void PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg);
-	void PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg);
 protected:
 	virtual void OnDisconnect() 
 	{

+ 3 - 1
Module/mod_heartbeat/HeartBeat_UserErrorCode.h

@@ -10,6 +10,8 @@
 #define HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam				(HeartBeat_UserErrorCode_Start + 4)	//卡库心跳调用PreOnline
 #define HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied				(HeartBeat_UserErrorCode_Start + 5)	//卡库心跳调用PreOnline,返回失败
 #define HeartBeat_UserErrorCode_Connect_CardStore_Invoke_QueryCardInfoOnStore_Falied	(HeartBeat_UserErrorCode_Start + 6)	//卡库心跳调用PreOnline后再调用QueryCardInfoOnStore,返回失败
-
+#define HeartBeat_UserErrorCode_CardIssuer_In_Fault_State								(HeartBeat_UserErrorCode_Start + 7)	//卡库卡机状态异常
+#define HeartBeat_UserErrorCode_CardStore_CardIssuer_In_Use								(HeartBeat_UserErrorCode_Start + 8)	//卡库卡机正在使用中
+#define HeartBeat_UserErrorCode_CardIssuer_Open_Failed									(HeartBeat_UserErrorCode_Start + 9)	//卡库卡机未成功打开
 
 #endif

+ 2 - 17
Module/mod_heartbeat/mod_heartbeat.cpp

@@ -13,21 +13,6 @@ void HeartBeatServerSession::Handle_CardActive(SpReqAnsContext<HeartBeatService_
 	LOG_FUNCTION();
 	m_pEntity->CardActive(ctx);
 }
-void HeartBeatServerSession::Handle_CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	m_pEntity->CrossTermCall(ctx);
-}
-void HeartBeatServerSession::Handle_CallFromILToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	m_pEntity->CallFromILToRVC(ctx);
-}
-void HeartBeatServerSession::Handle_CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx)
-{
-	LOG_FUNCTION();
-	m_pEntity->CallResultToIL(ctx);
-}
 ErrorCodeEnum CHeartBeatEntity::GetEntityErrorList(int &warmLevel,CSimpleStringA &strList)
 {
 	if (m_pSelfCheckerClient == NULL)
@@ -36,9 +21,10 @@ ErrorCodeEnum CHeartBeatEntity::GetEntityErrorList(int &warmLevel,CSimpleStringA
 		if (m_pSelfCheckerClient == NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create(new) client failed.");
+			m_pSelfCheckerClient->SafeDelete();
+			m_pSelfCheckerClient = NULL;
 			return Error_Resource;
 		}
-		Dbg("creat selfchecher client suc.");
 	}
 	ErrorCodeEnum eErr = Error_Unexpect;
 	CSmartPointer<IAsynWaitSp> spWait;
@@ -56,7 +42,6 @@ ErrorCodeEnum CHeartBeatEntity::GetEntityErrorList(int &warmLevel,CSimpleStringA
 			m_pSelfCheckerClient = NULL;
 			return Error_Unexpect;
 		}
-		Dbg("connect to selfchecker suc.");
 		m_bConnetedSS = true;
 	}
 	//SpReqAnsContext<SelfCheckerService_GetEntityErrorList_Req, SelfCheckerService_GetEntityErrorList_Ans>::Pointer ctx;

+ 1 - 21
Module/mod_heartbeat/mod_heartbeat.h

@@ -18,9 +18,6 @@ public:
 	virtual ~HeartBeatServerSession(){}
 	void Handle_Instruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx);
 	void Handle_CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx);
-	void Handle_CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
-	virtual void Handle_CallFromILToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx);
-	virtual void Handle_CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx);
 private:
 	CHeartBeatEntity* m_pEntity;
 };
@@ -71,24 +68,7 @@ public:
 		pEvt->ctx = ctx;
 		m_fsm.PostEventFIFO(pEvt);
 	}
-	void CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
-	{
-		CrossTermCallEvent *pEvt = new CrossTermCallEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
-	}
-	void CallFromILToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx)
-	{
-		ILCallToRVCEvent *pEvt = new ILCallToRVCEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
-	}
-	void CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx)
-	{
-		CallResultToILEvent *pEvt = new CallResultToILEvent();
-		pEvt->ctx = ctx;
-		m_fsm.PostEventFIFO(pEvt);
-	}
+
 	ErrorCodeEnum GetEntityErrorList(int &warmLevel,CSimpleStringA &strList);
 	virtual void OnSysVarEvent(const char *pszKey,
 		const char *pszValue, const char *pszOldValue, const char *pszEntityName);

+ 10 - 10
Module/mod_selfchecker/SelfCheckerFSM.cpp

@@ -356,11 +356,11 @@ ErrorCodeEnum CSelfCheckerFSM::ExceptionErrorProcess(const char *pszEntityName,
 										  DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("waiting restart...");
 										  break;
 									  }
-									  if (m_entRunInfo[pszEntityName].loadOpt == 99)
-									  {
-										  DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
-										  break;
-									  }
+									  //if (m_entRunInfo[pszEntityName].loadOpt == 99)
+									  //{
+										 // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
+										 // break;
+									  //}
 									  //LogErrInfo("restart ",pszEntityName,eCode);
 									  m_entCfgInfo[pszEntityName].entityRestartCount++;
 									  DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("normalcount:%d,count:%d", m_restartNormal, m_entCfgInfo[pszEntityName].entityRestartCount);
@@ -1358,11 +1358,11 @@ ErrorCodeEnum CSelfCheckerFSM::ExceptionErrorProcessXml(ProcType eType, const ch
 											  break;
 										  }
 									  }
-									  if (m_entRunInfo[pszEntityName].loadOpt == 99)
-									  {
-										  DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
-										  break;
-									  }
+									  //if (m_entRunInfo[pszEntityName].loadOpt == 99)
+									  //{
+										 // DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
+										 // break;
+									  //}
 									  //oilyang@20200407 if being restarted by selfchecker,break
 									  if (m_entRunInfo[pszEntityName].bRestarting)
 									  {

+ 5 - 1
Module/mod_selfchecker/SelfCheckerFSM.h

@@ -34,7 +34,11 @@ using namespace HealthManager;
 const int MAX_KEY_VALUE_SIZE = 1024;
 class	CSelfCheckerEntity;
 class CSelfCheckerFSM;
-
+#define SelfChecker_UserErrorCode_Start		0x50500200
+//reserve for other
+#define SelfChecker_UserErrorCode_EntityLost_Start		0x50500300
+//SelfChecker_UserErrorCode_EntityLost = SelfChecker_UserErrorCode_EntityLost_Start + entityDevelopID
+//#define SelfChecker_UserErrorCode_EntityLost	(SelfChecker_UserErrorCode_EntityLost_Start + 1)	//ʵÌålost¸æ¾¯ÐÅÏ¢
 enum EvtType
 {
 	USER_EVT_TEST = EVT_USER+1,

+ 34 - 24
Module/mod_selfchecker/mod_selfchecker.cpp

@@ -89,82 +89,92 @@ void CSelfCheckerEntity::OnEntityStateHook(const char *pszEntityName,const char
 		switch(eState)
 		{
 		case EntityState_Lost:
+		{
 			//doing nothing except for loading stage. HandShake will take it.
 			//and only for MediaController module.
-			if (m_bEverInMainPage && _strnicmp("TokenKeeper",pszEntityName,strlen("TokenKeeper")) == 0)
+			//oilyang@20210809 add entity lost LogWarn
+			char tmpWarnMsg[256] = {};
+			snprintf(tmpWarnMsg, sizeof(tmpWarnMsg), "%s lost. trig entity:%s,lastState:%d", pszEntityName, pszTriggerEntity, eLastState);
+			CEntityStaticInfo esi = { 0 };
+			ErrorCodeEnum ec = GetFunction()->GetEntityStaticInfo(pszEntityName, esi);
+			LogWarn(Severity_High, Error_Unexpect, SelfChecker_UserErrorCode_EntityLost_Start + esi.wEntityDevelopID, tmpWarnMsg);
+			if (m_bEverInMainPage && _strnicmp("TokenKeeper", pszEntityName, strlen("TokenKeeper")) == 0)
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TokenKeeper lost");
-				LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_TOKEN_KEEPER_LOST,"TokenKeeper lost,restart and auth again.");
+				LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_TOKEN_KEEPER_LOST, "TokenKeeper lost,restart and auth again.");
 				break;
 			}
 			if (m_bEverInMainPage)
 				break;
-			if (_strnicmp("MediaController",pszEntityName,strlen("MediaController")) != 0)
+			if (_strnicmp("MediaController", pszEntityName, strlen("MediaController")) != 0)
 				break;
 			count = m_entityProcInfo[pszEntityName].restartTimes;
 			if (count >= MAX_RESTART_COUNT)
 			{
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s has restart %d times,give up to restart it again.",pszEntityName,count);
-				char xxx[256] = {0};
-				sprintf(xxx,"%s restart %d times,give up.",(LPCTSTR)pszEntityName,count);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("logwarn %s",xxx);
-				LogWarn(Severity_Middle,Error_Unexpect,LOG_WARN_SELFCHECK_ENTITY_LOST_TIMES,xxx);
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s has restart %d times,give up to restart it again.", pszEntityName, count);
+				char xxx[256] = { 0 };
+				sprintf(xxx, "%s restart %d times,give up.", (LPCTSTR)pszEntityName, count);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("logwarn %s", xxx);
+				LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_SELFCHECK_ENTITY_LOST_TIMES, xxx);
 				break;
 			}
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s lost count %d",pszEntityName,count);
-			errCode = pFuncPrivilege->TerminateEntity(pszEntityName,spWait);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s lost count %d", pszEntityName, count);
+			errCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
 			if (errCode == Error_Succeed)
 			{
 				errCode = spWait->WaitAnswer(10000);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost kill wait %d",errCode);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost kill wait %d", errCode);
 			}
 			else
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost kill %d",errCode);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost kill %d", errCode);
 			Sleep(5000);
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to start(lost)");
-			errCode = pFuncPrivilege->StartEntity(pszEntityName,NULL,spWait);
+			errCode = pFuncPrivilege->StartEntity(pszEntityName, NULL, spWait);
 			if (errCode == Error_Succeed)
 			{
 				errCode = spWait->WaitAnswer(10000);
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost start wait %d",errCode);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost start wait %d", errCode);
 			}
 			else
-				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost start %d",errCode);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("onlost start %d", errCode);
 
 			m_entityProcInfo[pszEntityName].restartTimes = count + 1;
+		}
 			break;
 		case EntityState_Idle:
-			if (!_strnicmp("AssistantChannel",pszEntityName,strlen("AssistantChannel")))
+		{
+			if (!_strnicmp("AssistantChannel", pszEntityName, strlen("AssistantChannel")))
 			{
 				if (m_pAssChanClient != NULL)
 				{
 					m_pAssChanClient->SafeDelete();
 					m_pAssChanClient = NULL;
 				}
-				
+
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("AssistantChannel change to idle.");
-				LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE,"AssistantChannel to idle.");
+				LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_ASSISTANTCHANNEL_IDLE, "AssistantChannel to idle.");
 				ConnectToAssistChannel();
 			}
-			if (!_strnicmp("SIPPhone",pszEntityName,strlen("SIPPhone")))
+			if (!_strnicmp("SIPPhone", pszEntityName, strlen("SIPPhone")))
 			{
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SIPPhone change to idle.");
-				LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_SIPPHONE_IDLE,"SIPPhone to idle.");
+				LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_SIPPHONE_IDLE, "SIPPhone to idle.");
 			}
-			if (!_strnicmp("IEBrowser",pszEntityName,strlen("IEBrowser")))
+			if (!_strnicmp("IEBrowser", pszEntityName, strlen("IEBrowser")))
 			{
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IEBrowser change to idle.");
-				LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_IEBROWSER_IDLE,"IEBrowser to idle.");
+				LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_IEBROWSER_IDLE, "IEBrowser to idle.");
 				m_bIEIdle = true;
 			}
 			if (!_strnicmp("HealthManager", pszEntityName, strlen("HealthManager")))
 			{
 			}
-			if (!_strnicmp("LocalMediaPlay",pszEntityName,strlen("LocalMediaPlay")))
+			if (!_strnicmp("LocalMediaPlay", pszEntityName, strlen("LocalMediaPlay")))
 			{
 				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("LocalMediaPlay change to idle.");
-				LogEvent(Severity_Middle,LOG_EVT_SELFCHECK_LOCALMEDIAPLAY_IDLE,"LocalMediaPlay to idle.");
+				LogEvent(Severity_Middle, LOG_EVT_SELFCHECK_LOCALMEDIAPLAY_IDLE, "LocalMediaPlay to idle.");
 			}
+		}
 			break;
 		default:
 			break;

+ 1 - 0
Module/mod_sipphone/Event.h

@@ -118,6 +118,7 @@
 
 #define ERROR_MOD_SIP_GET_ENV_VIDEO_FAILED							0x30190801  //获取env摄像头图像失败
 #define ERROR_MOD_SIP_GET_OPT_VIDEO_FAILED							0x30190802  //获取opt摄像头图像失败
+#define ERROR_MOD_SIP_GET_LOCAL_IP_FAILED							0x30190803  //获取本机IP地址失败
 
 
 #define EVENT_MOD_SIP_GET_LOCAL_IP									0x30190901  //获取本机IP地址

+ 1 - 1
Module/mod_sipphone/mod_sipphone.cpp

@@ -677,7 +677,7 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 	{
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get local ip failed!");
 		CSimpleStringA strErrMsg = "获取本地 IP 地址失败,请检查本地网络是否连接!";
-		LogWarn(Severity_Low, Error_NetBroken, 0, strErrMsg);
+		LogWarn(Severity_Middle, Error_NetBroken, ERROR_MOD_SIP_GET_LOCAL_IP_FAILED, strErrMsg);
 		return Error;
 	}
 

+ 38 - 7
addin/cfg/UserCodeToMsgTip.ini

@@ -14,10 +14,10 @@
 0x20200239=[RTA2208] [HW] 设备离线,请检查设备是否已经连上
 0x2020023A=[RTA2209] [HW] 设备离线,请检查设备是否已经连上
 
-0x2030000D=[RTA2302] [HW] 读卡失败,请重试或联系行内开发人员
-0x2030002E=[RTA2303] [HW] 卡片从读卡器移回到卡槽失败,请联系厂商排查
-0x2030002F=[RTA2304] [HW] 从卡槽移动卡片到读卡器失败,请联系厂商排查
-0x20300030=[RTA2305] [HW] 读取卡片账户信息失败,请联系厂商排查
+0x2030000D=[RTA2302] [HW] 读卡失败,请重试或联系厂商排查
+0x2030002E=[RTA2303] [HW] 卡片从读卡器移回到卡槽失败,请联系卡库厂商排查
+0x2030002F=[RTA2304] [HW] 从卡槽移动卡片到读卡器失败,请联系卡库厂商排查
+0x20300030=[RTA2305] [HW] 读取卡片账户信息失败,请联系卡库厂商排查
 0x20300033=[RTA2306] [HW] 从卡箱移动卡片到读卡器失败,请联系厂商排查
 0x20300034=[RTA2307] [HW] 吞卡失败,请检查吞卡箱是否已满或联系厂商排查
 0x20300035=[RTA2308] [HW] 卡片吐出失败,请联系厂商排查
@@ -33,11 +33,11 @@
 0x2030020B=[RTA230J] 卡箱2本地计数无卡,请执行清机计划
 0x2030020C=[RTA230K] 卡箱3本地计数无卡,请执行清机计划
 0x2030020E=[RTA2301] 卡片吐出失败,请确认卡片是否平整,联系厂商排查
-0x2030020F=[RTA230L] 卡库找不到空闲卡槽
+0x2030020F=[RTA230L] 卡库找不到空闲卡槽,请联系卡库厂商排查
 0x20300243=[RTA230M] [HW] 检测卡片类型时上电失败,请使用非接触式读卡模块
 0x20300270=[RTA230N] 便携发卡机编号无效
 0x20300272=[RTA230P] 便携发卡机编号无效
-0x2030029A=[RTA230Q] 卡库正在被其他机器跨机使用中,请确认卡库空闲后重试
+0x2030029A=[RTA230Q] 卡库正在使用中,请确认卡库空闲后重试
 0x2030029B=[RTA230R] 卡箱1连续吞卡超限,请及时执行清机。清机后依然连续吞卡请确认卡片摆放是否正确或联系厂商排查
 0x2030029C=[RTA230S] 卡箱2连续吞卡超限,请及时执行清机。清机后依然连续吞卡请确认卡片摆放是否正确或联系厂商排查
 0x2030029D=[RTA230T] 卡箱3连续吞卡超限,请及时执行清机。清机后依然连续吞卡请确认卡片摆放是否正确或联系厂商排查
@@ -45,8 +45,35 @@
 0x2030029F=[RTA230U] [SS] 跨机激活未收到返回,请联系行内开发人员排查
 0x203002A1=[RTA230V] [HW] 读卡失败,请重试或联系厂商排查
 0x203002A2=[RTA230X] 请使用换卡后的新卡办理业务
-0x203002A3=[RTA230W] [HW] 跨机时卡库处理耗时过长,请联系厂商排查
+0x203002A5=[RTA230Y] 卡库未正常启动,请确认卡库启动完成之后再发起业务
+0x203002A3=[RTA230W] [HW] 跨机时卡库处理耗时过长,请联系卡库厂商排查
+0x203002AA=[RTA2311] [HW] 卡库卡机未成功启动,请联系卡库厂商排查卡库
 
+0x20300032=[RTA2320] [HW] 查询卡槽状态失败,请联系卡库厂商排查
+0x2030023F=[RTA2321] 卡槽号非法,请联系行内开发人员排查
+0x20300002=[RTA2322] [HW] 取卡机状态失败,请重试或联系厂商排查
+0x20300203=[RTA2323] [HW] 卡库卡机故障,请联系卡库厂商排查
+0x203002A7=[RTA2324] 卡库正在发卡中,请在卡库空闲后重试
+
+0x203002B4=[RTA2380] 卡箱无卡,请确认卡箱有无卡片或卡片是否放好
+0x203002B5=[RTA2381] 未检测到卡箱,请确认卡箱是否放好
+0x203002B6=[RTA2382] [HW] 传输小车堵塞,请联系厂商排查
+0x203002B7=[RTA2383] 回收箱已满,请联系行内工作人员及时清理回收箱
+0x203002B8=[RTA2384] 回收箱缺失,请检查回收箱是否放好
+0x203002B9=[RTA2385] 读卡器内有卡,请联系厂商排查
+0x203002BA=[RTA2386] 卡槽内无卡,请联系厂商排查
+0x203002BB=[RTA2387] 卡槽内有卡,请联系厂商排查
+0x203002BC=[RTA2388] 读卡器内无卡,请联系厂商排查
+0x203002BD=[RTA2389] [HW] 塞卡,请联系厂商排查
+0x203002BE=[RTA238A] [HW] 卡槽堵塞,请联系厂商排查
+0x203002BF=[RTA238B] 卡槽地址非法,请联系行内开发人员排查
+
+0x203002E0=[RTA2390] 在卡库指定卡槽未找到卡片,请联系行内开发人员排查
+0x203002E1=[RTA2391] [HW] 卡库读卡失败(卡片上电时触点下压失败),请联系卡库厂商排查或更换
+0x203002E2=[RTA2392] [HW] 卡库读卡失败(卡片上电失败),请联系卡库厂商排查或更换
+0x203002E3=[RTA2393] [HW] 卡库读卡失败(BuildAppList.ICCommand),请联系卡库厂商排查或更换
+0x203002E4=[RTA2394] [HW] 卡库读卡失败(BuildAppList),请联系卡库厂商排查或更换
+0x203002E5=[RTA2395] [HW] 卡库读卡失败(ICCommand),请联系卡库厂商排查或更换
 
 0x20600201=[RTA26E9] [HW] 密码键盘故障,请重试或联系厂商排查
 
@@ -99,3 +126,7 @@
 0x21C0020A=[RTA2S0J] 摄像头未绑定,请退出重试
 0x21C0020B=[RTA2S0K] 摄像头不可用,请联系分行IT排查
 0x21C0020C=[RTA2S0L] 打开摄像头失败,请尝试重启应用或联系厂商排查
+0x21C0020D=[RTA2S0M] 上一次打开摄像头的操作还未完成,当前打开摄像头的请求已拒绝,请稍后再试
+
+0x30B00B01=[RTA3B01] 检测到系统故障,尝试恢复中,请稍后再试
+0x30B00B02=[RTA3B02] 播放失败,找不到要播放的文件