Bladeren bron

!10687 身份证日志精简
Merge pull request !10687 from 80310970/IDCerLogOptimize_CJL

陈礼鹏80274480 6 maanden geleden
bovenliggende
commit
59a2329781
38 gewijzigde bestanden met toevoegingen van 1755 en 435 verwijderingen
  1. 15 4
      DevAdapter/include/CardAssist.cpp
  2. 1 1
      DevAdapter/simulator/include/DeviceSimulator.h
  3. 9 16
      Framework/Common/SpBase.h
  4. 1 1
      Framework/Common/SpHelper.h
  5. 3 3
      Framework/spbase/SpEntity.cpp
  6. 1 1
      Framework/spbase/SpEntityNoPrivilege.h
  7. 1 1
      Framework/spbase/SpEntityPrivilege.cpp
  8. 1 1
      Framework/spbase/SpEntityPrivilege.h
  9. 6 13
      Framework/spbase/SpHelper.cpp
  10. 1 5
      Framework/spbase/SpMisc.cpp
  11. 17 7
      Framework/spbase/sp_cfg.cpp
  12. 1 0
      Framework/spbase/sp_var.c
  13. 2 2
      Framework/spshell/app.cpp
  14. 1 0
      Framework/spshell/app.h
  15. 3 3
      Framework/spshell/svc.cpp
  16. 95 11
      Module/mod_ContactlessCard/ContactlessCard.xml
  17. 16 0
      Module/mod_ContactlessCard/ContactlessCard_UserErrorCode.h
  18. 210 0
      Module/mod_ContactlessCard/ContactlessCard_client_g.h
  19. 114 0
      Module/mod_ContactlessCard/ContactlessCard_def_g.h
  20. 135 0
      Module/mod_ContactlessCard/ContactlessCard_server_g.h
  21. 684 0
      Module/mod_ContactlessCard/ContactlessFSM.cpp
  22. 155 24
      Module/mod_ContactlessCard/ContactlessFSM.h
  23. 50 0
      Module/mod_ContactlessCard/mod_ContactlessCard.cpp
  24. 93 1
      Module/mod_ContactlessCard/mod_ContactlessCard.h
  25. 70 76
      Module/mod_IDCertificate/IDCertFSM.cpp
  26. 0 1
      Module/mod_IDCertificate/IDCertFSM.h
  27. 1 11
      Module/mod_IDCertificate/IDCertificate.xml
  28. 0 77
      Module/mod_IDCertificate/IDCertificate_client_g.h
  29. 0 45
      Module/mod_IDCertificate/IDCertificate_def_g.h
  30. 0 81
      Module/mod_IDCertificate/IDCertificate_server_g.h
  31. 6 2
      Module/mod_cardissuerstore/CardIssuerFSM.cpp
  32. 1 3
      Module/mod_chromium/mod_chromium.cpp
  33. 14 0
      Module/mod_healthmanager/HealthManagerFSM.cpp
  34. 2 1
      Module/mod_healthmanager/HealthManagerFSM.h
  35. 21 36
      Module/mod_healthmanager/mod_healthmanager.cpp
  36. 3 7
      Module/mod_healthmanager/mod_healthmanager.h
  37. 13 1
      Module/mod_vtmloader/VtmLoaderFSM.cpp
  38. 9 0
      Module/mod_vtmloader/mod_vtmloader.h

+ 15 - 4
DevAdapter/include/CardAssist.cpp

@@ -458,10 +458,10 @@ bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, i
 			return false;
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveContactlessICCard");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveContactlessICCard,Detect contactless card type %d", ch);
 		}
 		cardType = ch;
-		DbgInfo(CSimpleStringA::Format("Detect contactless card type %d",ch));
+		
 	}
 	else if (eType == CARD_MACHINE_ISSUER_RF || eType == CARD_MACHINE_ISSUER_STORE_RF)
 	{
@@ -487,10 +487,10 @@ bool CCardProcess::DetectIfICCard(CardReadType eType, DeviceBaseClass *pCardX, i
 			return false; 
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveContactlessICCard");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveContactlessICCard").setCostTime(l_endTime - l_beginTime)("DetectIfICCard::ActiveContactlessICCard,(CardIssuer)Detect contactless card type %d", ch);
 		}
 		cardType = ch;
-		DbgInfo(CSimpleStringA::Format("(CardIssuer)Detect contactless card type %d", ch));
+		
 	}
 	return true;
 }
@@ -2690,6 +2690,17 @@ int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCard
 		DbgWarn("<DetectIfICCard>, not ic card.");
 		return -1;
 	}
+	else {
+		//兼容发卡非接上电有的厂商非IC卡也返回成功,直接返回上电失败
+		if (eType == CARD_MACHINE_ISSUER_RF || eType == CARD_MACHINE_ISSUER_STORE_RF) {
+			if ( bIssue && cardType != 'A' && cardType != 'B' && cardType != 'M') {
+				CSimpleStringA errMsg = CSimpleStringA::Format("{\"ErrCode\":2147483646,\"Description\":\"<DetectIfICCard>, not ic card,cardType=%d\"}", cardType);
+				setCardAssistLastErr(Error_Exception, errMsg.GetData(), "DevAdapter::ActiveContactlessICCard");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<DetectIfICCard>, not ic card.");
+				return -1;
+			}
+		}
+	}
 	int bGetICData = -3;
 
 	bGetICData = GetICDataFromCard(eType,pCardX,pAIDs);

+ 1 - 1
DevAdapter/simulator/include/DeviceSimulator.h

@@ -35,7 +35,7 @@
 #endif
 
 using namespace std;
-#define DEFAULT_DATA_URL "http://emulator.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData"
+#define DEFAULT_DATA_URL "http://emulatoruser.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData"
 
 //获取模拟器库文件所在目录
 string GetCurrentDirectory() {

+ 9 - 16
Framework/Common/SpBase.h

@@ -114,20 +114,13 @@ enum InstallStateEnum
 	Install_Installed,			// D, only used to LightPack
 };
 
-/** framework state*/
-enum FrameworkStateEnum
+/** terminal application boot state*/
+enum AppBootStateEnum
 {
-	FrameworkState_NotInit = 0,   /** the begin state*/
-    FrameworkState_NotConfig,   /** the factory mode, not config*/
-	FrameworkState_Booting,        /** the entity is starting*/
-	FrameworkState_Running,       /** the machine has enter business page*/
-	FrameworkState_Serving,        /** the machine is providing business service*/
-	FrameworkState_Breakdown,   /** the machine is sick*/
-	FrameworkState_Repairing,     /** the machine is being maintained*/
-	FrameworkState_Upgrading,   /** the software is upgrading*/
-	FrameworkState_Rollbacking, /** the software is rollback for some reason*/
-	FrameworkState_Recoving,     /** the machine is reaching running state from other state*/
-	FrameworkState_NotDisturb  /**/
+	AppBootState_Init = 0,   /** the begin(init) state*/
+	AppBootState_StartEntity,   /** begin to start entity*/
+	AppBootState_CallAccessAuth,        /** begin to call Regist*/
+	AppBootState_FirstEnterMainPage,       /** the first time received enter main page message*/
 };
 
 /** entity state */
@@ -532,7 +525,7 @@ struct CSystemRunInfo
 {
 	CSmallDateTime tmStart;
 	DebugLevelEnum eDebugLevel;
-	FrameworkStateEnum eState;
+	AppBootStateEnum eAppBootState;
 	DWORD dwBootOption;
 	BOOL autoTest;
 	CAutoArray<CSimpleStringA> strRunningEntityNames;
@@ -651,7 +644,7 @@ struct ISysVarListener
 };
 struct ITerminalStateChangedListener
 {
-	virtual void OnStateChanged(FrameworkStateEnum oldState, FrameworkStateEnum curState, const char* triggerEntity) = 0;
+	virtual void OnStateChanged(AppBootStateEnum oldState, AppBootStateEnum curState, const char* triggerEntity) = 0;
 };
 
 struct IBroadcastListener
@@ -1073,7 +1066,7 @@ struct IEntityFunctionPrivilege
 	virtual ~IEntityFunctionPrivilege() {}
 
 	/*upate terminal current state*/
-	virtual ErrorCodeEnum RefreshFrameworkState(FrameworkStateEnum eState) = 0;
+	virtual ErrorCodeEnum RefreshAppBootState(AppBootStateEnum eState) = 0;
 
 	/** start a remote entity,if restart itself only been call in OnClose event,will ignore pAsynWaitSp,and will not wait*/
 	virtual ErrorCodeEnum StartEntity(const char* pszEntityName, const char* pszCmdLine, CSmartPointer<IAsynWaitSp>& pAsynWaitSp) = 0;

+ 1 - 1
Framework/Common/SpHelper.h

@@ -375,7 +375,7 @@ SPBASE_API LPCTSTR SpStrRebootTrigger(const RebootTriggerEnum trigger);
 
 SPBASE_API LPCTSTR SpStrRebootWay(const RebootWayEnum way);
 
-SPBASE_API LPCTSTR SpStrFrameworkState(const FrameworkStateEnum state);
+SPBASE_API LPCTSTR SpStrAppBootState(const AppBootStateEnum state);
 
 #define IS_SUCCEED(hr)	((hr) == Error_Succeed)
 

+ 3 - 3
Framework/spbase/SpEntity.cpp

@@ -61,8 +61,8 @@ static void var_callback(sp_var_listener_t *listener,
 		if(strcmp(VAR_RSERVERD_KEY_TERM_STATE, key) != 0)
 			pListener->OnSysVarEvent(key, newstr, oldstr, ent->cfg->name);
 		else {
-			FrameworkStateEnum oldState = static_cast<FrameworkStateEnum>(atoi(oldstr));
-			FrameworkStateEnum newState = static_cast<FrameworkStateEnum>(atoi(newstr));
+			AppBootStateEnum oldState = static_cast<AppBootStateEnum>(atoi(oldstr));
+			AppBootStateEnum newState = static_cast<AppBootStateEnum>(atoi(newstr));
 			(static_cast<ITerminalStateChangedListener*>(user_data))->OnStateChanged(oldState, newState, ent->cfg->name);
 		}
 	}
@@ -1490,7 +1490,7 @@ ErrorCodeEnum SpEntity::GetSystemRunInfo(CSystemRunInfo &Info)
 	}
 	array_free(arr);
 
-	Info.eState = (FrameworkStateEnum)env->cfg->shell_ini->shell_state;
+	Info.eAppBootState = (AppBootStateEnum)env->cfg->shell_ini->shell_state;
 
 	if (env == NULL || env->cfg == NULL || env->cfg->root_ini == NULL)
 	{

+ 1 - 1
Framework/spbase/SpEntityNoPrivilege.h

@@ -105,7 +105,7 @@ public:
         return Error_NoPrivilege;
     }
 
-    virtual ErrorCodeEnum RefreshFrameworkState(FrameworkStateEnum eState)
+    virtual ErrorCodeEnum RefreshAppBootState(AppBootStateEnum eState)
     {
         return Error_NoPrivilege;
     }

+ 1 - 1
Framework/spbase/SpEntityPrivilege.cpp

@@ -424,7 +424,7 @@ ErrorCodeEnum SpEntityPrivilege::SetSysDebugLevel(const char *pszEntityName,Debu
 	return Error_Succeed;
 }
 
-ErrorCodeEnum SpEntityPrivilege::RefreshFrameworkState(FrameworkStateEnum eState)
+ErrorCodeEnum SpEntityPrivilege::RefreshAppBootState(AppBootStateEnum eState)
 {
 	int rc = Error_Succeed;
 	char n[12] = { '\0' };

+ 1 - 1
Framework/spbase/SpEntityPrivilege.h

@@ -76,7 +76,7 @@ public:
 	// debug
 	virtual ErrorCodeEnum SetSysDebugLevel(const char *pszEntityName,DebugLevelEnum eDebugLevel,bool bPersist=false);
 
-	virtual ErrorCodeEnum RefreshFrameworkState(FrameworkStateEnum eState);
+	virtual ErrorCodeEnum RefreshAppBootState(AppBootStateEnum eState);
 
 private:
 

+ 6 - 13
Framework/spbase/SpHelper.cpp

@@ -864,25 +864,18 @@ SPBASE_API LPCTSTR SpStrRebootWay(const RebootWayEnum way)
 }
 
 #undef ENT_ENUM_MAP
-#define ENT_ENUM_MAP(name) case FrameworkState_##name: return #name; break;
+#define ENT_ENUM_MAP(name) case AppBootState_##name: return #name; break;
 
-SPBASE_API LPCTSTR SpStrFrameworkState(const FrameworkStateEnum state)
+SPBASE_API LPCTSTR SpStrAppBootState(const AppBootStateEnum state)
 {
 
 	static char content[128];
 
 	switch (state) {
-		ENT_ENUM_MAP(NotInit)
-		ENT_ENUM_MAP(NotConfig)
-		ENT_ENUM_MAP(Booting)
-		ENT_ENUM_MAP(Running)
-		ENT_ENUM_MAP(Serving)
-		ENT_ENUM_MAP(Breakdown)
-		ENT_ENUM_MAP(Repairing)
-		ENT_ENUM_MAP(Upgrading)
-		ENT_ENUM_MAP(Rollbacking)
-		ENT_ENUM_MAP(Recoving)
-		ENT_ENUM_MAP(NotDisturb)
+		ENT_ENUM_MAP(Init)
+		ENT_ENUM_MAP(StartEntity)
+		ENT_ENUM_MAP(CallAccessAuth)
+		ENT_ENUM_MAP(FirstEnterMainPage)
 	default:
 		sprintf(content, "UnRecorded(%d)", (int)state);
 		break;

+ 1 - 5
Framework/spbase/SpMisc.cpp

@@ -369,18 +369,14 @@ ErrorCodeEnum SpIniConfig::ReadConfigValueInt(const char *pszSection, const char
 //TODO: forbid from write cfg/entity.ini
 ErrorCodeEnum SpIniConfig::WriteConfigValue(const char *pszSection, const char *pszKey, const char *pszValue)
 {
-	if (m_type == Config_Root && (((FrameworkStateEnum)sp_get_env()->cfg->shell_ini->shell_state) == FrameworkState_NotConfig)) {
-		/** Skip and allow to modify root.ini  [Gifur@20211014]*/
-	} else if (m_type == Config_Hardware || m_type == Config_Shell || m_type == Config_Root || m_type == Config_CenterSetting) {
+	if (m_type == Config_Hardware || m_type == Config_Shell || m_type == Config_Root || m_type == Config_CenterSetting) {
 		return Error_Readonly;
 	}
-
     CSimpleStringA path;
     ErrorCodeEnum Error = _GetMappFilePath(path);
 	if (Error == Error_Succeed) {
 		Error = SpIniFileWriteString(path, pszSection, pszKey, pszValue);
 	}
-
 	return Error;
 }
 

+ 17 - 7
Framework/spbase/sp_cfg.cpp

@@ -1692,21 +1692,25 @@ static int shell_ini__load_entities_list(sp_dir_t* dir, sp_cfg_shell_ini_t* shel
 	return rc;
 }
 
-static int shell_ini__load_sysevent(sp_cfg_shell_ini_t* shell, const char* shell_var_path, std::map<std::string, std::string> &sysEventArr)
+static int shell_ini__init_sysevent(sp_cfg_shell_ini_t* shell)
 {
 	int rc = 0;
-
 	if (NULL == shell->arr_sysevent)
 	{
 		shell->arr_sysevent = shm_array_make(0, sizeof(sp_cfg_shell_sysevent_t*));
+		rc = 1;
+	}
+	else if (shell->arr_sysevent->nelts == 0) {
+		rc = 1;
+	}
+	if (rc == 1) {
 		//单独添加一个框架级别的系统变量
 		sp_cfg_shell_sysevent_t* sysevent = T_MALLOC_T(sp_cfg_shell_sysevent_t, 1);
 		memset(sysevent, 0, sizeof(sp_cfg_shell_sysevent_t));
 		sysevent->name = T_STRDUP(VAR_RSERVERD_KEY_TERM_STATE, 1);
 		sysevent->init_value[0] = '0', sysevent->init_value[1] = '\0';
-
 		sysevent->arr_owner_entity = shm_array_make(0, sizeof(sp_cfg_shell_entity_t*));
-		sp_cfg_shell_entity_t* owner_entity = find_entity(shell, "SpShell");
+		sp_cfg_shell_entity_t* owner_entity = find_entity(shell, SPSHELL_NAME);
 		if (owner_entity) {
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("add framework level sys val: %s", VAR_RSERVERD_KEY_TERM_STATE);
 			SHM_ARRAY_PUSH(sysevent->arr_owner_entity, sp_cfg_shell_entity_t*) = owner_entity;
@@ -1718,6 +1722,14 @@ static int shell_ini__load_sysevent(sp_cfg_shell_ini_t* shell, const char* shell
 			destroy_sysevent(sysevent);
 		}
 	}
+	return rc;
+}
+
+static int shell_ini__load_sysevent(sp_cfg_shell_ini_t* shell, const char* shell_var_path, std::map<std::string, std::string> &sysEventArr)
+{
+	int rc = 0;
+
+	shell_ini__init_sysevent(shell);
 
 	for (auto it = sysEventArr.begin(); it != sysEventArr.end(); it++)
 	{
@@ -2109,8 +2121,6 @@ ErrorCodeEnum init_shell_byHttp(sp_dir_t* dir, sp_cfg_shell_ini_t* shell, sp_cfg
 		}
 	}
 
-	
-
 	//init entity debug mode
 	if (args->debug_mode && shell->arr_entity) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("override entities' debug level!");
@@ -2172,7 +2182,7 @@ ErrorCodeEnum init_shell_byHttp(sp_dir_t* dir, sp_cfg_shell_ini_t* shell, sp_cfg
 	}	
 
 	shell->shell_debug_level = args->debug_mode ? 2 : debug_level;
-	shell->log_record_level = getEntityLogLevel("SpShell");
+	shell->log_record_level = getEntityLogLevel(SPSHELL_NAME);
 
 	if (args->telnet_port == 0)
 		shell->nConsolePort = shellConfig[SHELL_MAIN_HEAD].find(SHELL_MAIN_CONSOLEPORT) != shellConfig[SHELL_MAIN_HEAD].end() ?

+ 1 - 0
Framework/spbase/sp_var.c

@@ -125,6 +125,7 @@ int sp_var_client_set(sp_var_client_t *client, const char *key, const char *str,
 	if (!sp_var_can_write(client, key, &sysevent)) {
 
 		if (sysevent == NULL) {
+			DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "%s sysevent is not exist %s!", __FUNCTION__, key);
 			return Error_NotExist;
 		}
 		else {

+ 2 - 2
Framework/spshell/app.cpp

@@ -148,7 +148,7 @@ static unsigned int __stdcall __startlist_proc(void *param)
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("======================================================");
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("!!!!!! 部分实体启动失败,请检查dbg\\spshell日志排除故障 !!!!!!");
 		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("======================================================");
-		app_update_terminal_state(FrameworkState_Breakdown);
+		//app_update_terminal_state(FrameworkState_Breakdown);
 		
 		// 启动失败
 		app_upload_last_log();
@@ -607,7 +607,7 @@ int app_init(const sp_cfg_start_args_t* args, std::function<void(const char* msg
 
 #endif // RVC_OS_WIN && WITH_DEBUG
     
-	app_update_terminal_state(flag != 0 ? FrameworkState_NotConfig : FrameworkState_Booting);
+	//app_update_terminal_state(flag != 0 ? FrameworkState_NotConfig : FrameworkState_Booting);
 
 
 	auto shellEnv = sp_mod_mgr_find_entity_by_idx(sp_get_env()->mod_mgr, 0);

+ 1 - 0
Framework/spshell/app.h

@@ -66,6 +66,7 @@ int app_init(const sp_cfg_start_args_t* args, std::function<void(const char* msg
 int app_term();
 int app_run();
 void app_stop(int from_id);
+/** 暂时不适用,由实体去控制,否则会出现因配置SYSEVENT未拉下来导致值不统一的问题  [Gifur@2025314]*/
 int app_update_terminal_state(int state);
 
 void app_clear();

+ 3 - 3
Framework/spshell/svc.cpp

@@ -561,9 +561,9 @@ void on_terminal_stage_change(sp_rpc_server_t* server, int epid, int svc_id, int
     sp_cfg_t* cfg = env->cfg;
     iobuffer_read(*info_pkt, IOBUF_T_I4, &newStage, 0);
     iobuffer_read(*info_pkt, IOBUF_T_I4, &oldStage, 0);
-    const FrameworkStateEnum eNewStage = (FrameworkStateEnum)newStage;
-    const FrameworkStateEnum eOldStage = (FrameworkStateEnum)oldStage;
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("change teriminal state from %s to %s", SpStrFrameworkState(eOldStage), SpStrFrameworkState(eNewStage));
+    const AppBootStateEnum eNewStage = (AppBootStateEnum)newStage;
+    const AppBootStateEnum eOldStage = (AppBootStateEnum)oldStage;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("change teriminal state from %s to %s", SpStrAppBootState(eOldStage), SpStrAppBootState(eNewStage));
     auto app = get_app_instance();
 #if defined(RVC_OS_LINUX)
 	if (app->bsc_gui != NULL) {

+ 95 - 11
Module/mod_ContactlessCard/ContactlessCard.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="gb2312" ?>
 <entity name="ContactlessCard">
 	<class name="ContactlessCardService" overlap="true" exclusive="false">
-		<twoway name="Insert" overlap="true">
+		<twoway name="Insert" overlap="true" method_id="0">
 			<req>
 				<param name="aid" type="string"/>
 				<param name="order" type="string"/>
@@ -27,11 +27,11 @@
 				<param name="reserved4" type="string"/>
 			</res>		
 		</twoway>
-		<oneway name="CancelInsert" overlap="true">			
+		<oneway name="CancelInsert" overlap="true" method_id="1">			
 		</oneway>
-		<oneway name="InsertWaitMore" overlap="true">			
+		<oneway name="InsertWaitMore" overlap="true" method_id="2">			
 		</oneway>								
-		<twoway name="PreOnline" overlap="true">
+		<twoway name="PreOnline" overlap="true" method_id="3">
 			<req>
 				<param name="businessData" type="string"/>
 				<param name="reserved1" type="string"/>
@@ -41,7 +41,7 @@
 				<param name="result" type="string"/>
 			</res>			
 		</twoway>
-		<twoway name="PostOnline" overlap="true">
+		<twoway name="PostOnline" overlap="true" method_id="4">
 			<req>
 				<param name="data" type="string"/>
 			</req>
@@ -49,15 +49,15 @@
 				<param name="result" type="string"/>
 			</res>			
 		</twoway>
-		<twoway name="Eject" overlap="true">
+		<twoway name="Eject" overlap="true" method_id="5">
 			<req>
 			</req>
 			<res>
 			</res>			
 		</twoway>
-		<oneway name="Exit" overlap="true">			
+		<oneway name="Exit" overlap="true" method_id="6">			
 		</oneway>
-		<twoway name="QueryCardInfo" overlap="true">
+		<twoway name="QueryCardInfo" overlap="true" method_id="7">
 			<req>
 			</req>
 			<res>
@@ -65,17 +65,101 @@
 				<param name="reserved1" type="int"/>
 				<param name="reserved2" type="string"/>
 			</res>			
-		</twoway>										
-		<twoway name="GetDevInfo" overlap="true" method_id="65535">
+		</twoway>	
+		<!--查询卡机设备状态接口 -->
+		<!--1、非接打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2J10-->
+		<!--2、非接正在打开中, errorCode为Error_NotInit(769),rtaCode为RTA2J10-->
+		<twoway name="GetDevInfo" overlap="true" method_id="65535" jsflag="true">
 			<req>
 			</req>
 			<res>
 				<param name="type" type="string" />
 				<param name="model" type="string" />
 				<param name="version" type="string" />
+				<!--卡机状态 0设备未打开 1 正常运行 3卡机异常不可工作-->
 				<param name="state" type="int" />
 			</res>			
-		</twoway>							
+		</twoway>	
+		
+		<!--非接读卡接口 -->
+		<!--1、非接打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2J10-->
+		<!--2、非接处寻卡超时, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J12-->
+		<!--3、卡检测失败,非IC卡 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J13-->
+		<!--4、读卡失败,激活非接失败, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J01-->
+		<!--5、读卡失败,读IC数据失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J02-->
+		<!--6、读卡取消, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J14-->
+		<twoway name="ReadJS" overlap="true" method_id="40" jsflag="true">
+			<req>
+				<!--Aid列表-->
+				<param name="aid" type="string"/>
+				<!--业务数据-->
+				<param name="businessData" type="string"/>
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="string"/>
+			</req>
+			<res>
+				<!--读IC结果 0失败 1成功-->
+				<param name="icState" type="int"/>
+				<!--IC读取的数据<json格式>
+					ACTION:行为代码
+					ATC_CODE:交易计数器code
+					ARQC_CODE:授权请求code
+					MAC:安全报文鉴别码
+					ARQC_SIZE:授权请求长度
+					ARQC_DATA:授权请求数据
+					T2TRACK2_DATA:磁道2数据
+					EXPIRE_DATE:卡片失效日期
+					T2CARD_SERIAL:卡序号
+					CARD_CAT:卡类型
+					IC_TAGS:基础IC数据
+				-->
+				<param name="result" type="string"/>
+				<param name="reserved1" type="array_int"/>
+				<param name="reserved2" type="array_string"/>
+			</res>
+		</twoway>
+			
+		<!--联机后处理接口-->
+		<!--1、非接打开失败, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J10-->
+		<twoway name="PostOnlineJS" overlap="true" method_id="41" jsflag="true">
+			<req>
+				<!--联机后处理数据-->
+				<param name="data" type="string"/>
+			</req>
+			<res>
+				<!--处理结果-->
+				<param name="result" type="string"/>
+			</res>			
+		</twoway>
+		
+		<!--吐卡接口-->
+		<!--1、非接打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2J10-->
+		<!--2、超时未取卡 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J16-->
+		<twoway name="EjectJS" overlap="true" method_id="42" jsflag="true">
+			<req>
+			</req>
+			<res>
+			</res>			
+		</twoway>
+
+		<!--查询非接卡片位置接口-->
+		<!--1、非接打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2J10-->
+		<!--2、查询设备状态失败, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2J04-->
+		<twoway name="QueryHasCardJS" overlap="true" method_id="43" jsflag="true">
+			<req>
+			</req>
+			<res>
+				<!--卡片位置情况 0:没有发现卡片 6:非接处有非接卡片 7:非接处有身份证-->
+				<param name="position" type="int"/>
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="string"/>
+			</res>			
+		</twoway>
+		
+		<!--取消插卡接口-->
+		<oneway name="CancelReadJS" overlap="true" method_id="44" jsflag="true">			
+		</oneway>
+		
 	</class>
 	<message name="FetchCard">
 			<param name="status" type="int"/>

+ 16 - 0
Module/mod_ContactlessCard/ContactlessCard_UserErrorCode.h

@@ -28,9 +28,25 @@
 
 #define ContactlessCard_UserErrorCode_DevOpen_Success						(ContactlessCard_UserErrorCode_Start + 31)	//设备打开成功
 #define ContactlessCard_UserErrorCode_DevOpen_Failed						(ContactlessCard_UserErrorCode_Start + 32)	//设备打开失败
+#define ContactlessCard_UserErrorCode_Read_TimeOut							(ContactlessCard_UserErrorCode_Start + 33)	//读卡寻卡超时
+#define ContactlessCard_UserErrorCode_Read_Not_IC							(ContactlessCard_UserErrorCode_Start + 34)	//读卡检测,非IC卡
+#define ContactlessCard_UserErrorCode_Read_Cancel							(ContactlessCard_UserErrorCode_Start + 35)	//读卡取消
+#define ContactlessCard_UserErrorCode_Forget_Fectch_Card					(ContactlessCard_UserErrorCode_Start + 36)	//吐卡超时未取卡
 
 //实际root配置
 //#define ContactlessCard_UserErrorCode_Real_Root_Config						(ContactlessCard_UserErrorCode_Start + 36)	//实际root配置
 #define ContactlessCard_UserErrorCode_ReadAccount							(ContactlessCard_UserErrorCode_Start + 37)	//读到卡片信息
 
+#define ContactlessCard_UserErrorCode_EntityInStateCannotProcess			(CardIssuerStore_UserErrorCode_Start + 38) //卡机当前状态无法处理此请求
+
+//非接流程状态报错
+#define ContactlessCard_UserErrorCode_PROCESS_IDLE					0x21300402		//当前处于卡机无卡空闲状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_HOLD					0x21300404		//当前处于卡机有卡等待状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_READ					0x21300405		//当前处于正在读卡状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_EJECT					0x21300406		//当前处于正在吐卡状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_WAIT_FETCH			0x21300407		//当前处于正在取卡状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_CAPTURE				0x21300408		//当前处于正在吞卡状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_FAULT					0x21300409		//当前处于卡机故障异常状态,无法处理此请求
+#define ContactlessCard_UserErrorCode_PROCESS_READ_JS				0x2130040A		//当前处于正在读卡状态,无法处理此请求,请稍后再试
+#define ContactlessCard_UserErrorCode_PROCESS_EJECT_JS				0x2130040B		//当前处于正在取卡状态,无法处理此请求,请稍后再试
 #endif //_CONTACTLESSCARD_USER_ERRORCODE_H

+ 210 - 0
Module/mod_ContactlessCard/ContactlessCard_client_g.h

@@ -394,6 +394,216 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum ReadJS(ContactlessCardService_ReadJS_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(ContactlessCardService_Method_ReadJS, ContactlessCardService_MethodSignature_ReadJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum ReadJS(ContactlessCardService_ReadJS_Req &Req, ContactlessCardService_ReadJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ReadJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum ReadJS(ContactlessCardService_ReadJS_Req &Req, ContactlessCardService_ReadJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ReadJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum ReadJS(ContactlessCardService_ReadJS_Req &Req, ContactlessCardService_ReadJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ReadJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum PostOnlineJS(ContactlessCardService_PostOnlineJS_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(ContactlessCardService_Method_PostOnlineJS, ContactlessCardService_MethodSignature_PostOnlineJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum PostOnlineJS(ContactlessCardService_PostOnlineJS_Req &Req, ContactlessCardService_PostOnlineJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = PostOnlineJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum PostOnlineJS(ContactlessCardService_PostOnlineJS_Req &Req, ContactlessCardService_PostOnlineJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = PostOnlineJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum PostOnlineJS(ContactlessCardService_PostOnlineJS_Req &Req, ContactlessCardService_PostOnlineJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = PostOnlineJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum EjectJS(ContactlessCardService_EjectJS_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(ContactlessCardService_Method_EjectJS, ContactlessCardService_MethodSignature_EjectJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum EjectJS(ContactlessCardService_EjectJS_Req &Req, ContactlessCardService_EjectJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = EjectJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum EjectJS(ContactlessCardService_EjectJS_Req &Req, ContactlessCardService_EjectJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = EjectJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum EjectJS(ContactlessCardService_EjectJS_Req &Req, ContactlessCardService_EjectJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = EjectJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum QueryHasCardJS(ContactlessCardService_QueryHasCardJS_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(ContactlessCardService_Method_QueryHasCardJS, ContactlessCardService_MethodSignature_QueryHasCardJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum QueryHasCardJS(ContactlessCardService_QueryHasCardJS_Req &Req, ContactlessCardService_QueryHasCardJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = QueryHasCardJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum QueryHasCardJS(ContactlessCardService_QueryHasCardJS_Req &Req, ContactlessCardService_QueryHasCardJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = QueryHasCardJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum QueryHasCardJS(ContactlessCardService_QueryHasCardJS_Req &Req, ContactlessCardService_QueryHasCardJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = QueryHasCardJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum CancelReadJS()
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->OnewayCall(ContactlessCardService_Method_CancelReadJS, ContactlessCardService_MethodSignature_CancelReadJS, m_context);
+		m_context.clear();
+		return ret;
+	}
+
 
 	bool SafeDelete()
 	{

+ 114 - 0
Module/mod_ContactlessCard/ContactlessCard_def_g.h

@@ -21,6 +21,11 @@ namespace ContactlessCard {
 #define ContactlessCardService_Method_Exit 6
 #define ContactlessCardService_Method_QueryCardInfo 7
 #define ContactlessCardService_Method_GetDevInfo 65535
+#define ContactlessCardService_Method_ReadJS 40
+#define ContactlessCardService_Method_PostOnlineJS 41
+#define ContactlessCardService_Method_EjectJS 42
+#define ContactlessCardService_Method_QueryHasCardJS 43
+#define ContactlessCardService_Method_CancelReadJS 44
 
 #define ContactlessCardService_MethodSignature_Insert -1860890966
 #define ContactlessCardService_MethodSignature_CancelInsert -1202478828
@@ -31,6 +36,11 @@ namespace ContactlessCard {
 #define ContactlessCardService_MethodSignature_Exit -1158854104
 #define ContactlessCardService_MethodSignature_QueryCardInfo 154962579
 #define ContactlessCardService_MethodSignature_GetDevInfo 296205965
+#define ContactlessCardService_MethodSignature_ReadJS -1004160201
+#define ContactlessCardService_MethodSignature_PostOnlineJS -92324905
+#define ContactlessCardService_MethodSignature_EjectJS -687956608
+#define ContactlessCardService_MethodSignature_QueryHasCardJS -2034090823
+#define ContactlessCardService_MethodSignature_CancelReadJS -1728083983
 
 #define ContactlessCardService_LogCode_Insert "QLR040221300"
 #define ContactlessCardService_LogCode_CancelInsert "QLR040221301"
@@ -41,6 +51,11 @@ namespace ContactlessCard {
 #define ContactlessCardService_LogCode_Exit "QLR040221306"
 #define ContactlessCardService_LogCode_QueryCardInfo "QLR040221307"
 #define ContactlessCardService_LogCode_GetDevInfo "QLR040221399"
+#define ContactlessCardService_LogCode_ReadJS "QLR040221340"
+#define ContactlessCardService_LogCode_PostOnlineJS "QLR040221341"
+#define ContactlessCardService_LogCode_EjectJS "QLR040221342"
+#define ContactlessCardService_LogCode_QueryHasCardJS "QLR040221343"
+#define ContactlessCardService_LogCode_CancelReadJS "QLR040221344"
 
 struct ContactlessCardService_Insert_Req
 {
@@ -218,6 +233,105 @@ struct ContactlessCardService_GetDevInfo_Ans
 
 };
 
+struct ContactlessCardService_ReadJS_Req
+{
+	CSimpleStringA aid;
+	CSimpleStringA businessData;
+	int reserved1;
+	CSimpleStringA reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & aid & businessData & reserved1 & reserved2;
+	}
+
+};
+
+struct ContactlessCardService_ReadJS_Ans
+{
+	int icState;
+	CSimpleStringA result;
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & icState & result & reserved1 & reserved2;
+	}
+
+};
+
+struct ContactlessCardService_PostOnlineJS_Req
+{
+	CSimpleStringA data;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & data;
+	}
+
+};
+
+struct ContactlessCardService_PostOnlineJS_Ans
+{
+	CSimpleStringA result;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & result;
+	}
+
+};
+
+struct ContactlessCardService_EjectJS_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct ContactlessCardService_EjectJS_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct ContactlessCardService_QueryHasCardJS_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct ContactlessCardService_QueryHasCardJS_Ans
+{
+	int position;
+	int reserved1;
+	CSimpleStringA reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & position & reserved1 & reserved2;
+	}
+
+};
+
+struct ContactlessCardService_CancelReadJS_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 
 ///////////////////////////
 

+ 135 - 0
Module/mod_ContactlessCard/ContactlessCard_server_g.h

@@ -93,6 +93,41 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case ContactlessCardService_Method_ReadJS:
+			if (dwSignature == ContactlessCardService_MethodSignature_ReadJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_PostOnlineJS:
+			if (dwSignature == ContactlessCardService_MethodSignature_PostOnlineJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_EjectJS:
+			if (dwSignature == ContactlessCardService_MethodSignature_EjectJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_QueryHasCardJS:
+			if (dwSignature == ContactlessCardService_MethodSignature_QueryHasCardJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_CancelReadJS:
+			if (dwSignature == ContactlessCardService_MethodSignature_CancelReadJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -149,6 +184,31 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case ContactlessCardService_Method_ReadJS:
+			if (dwSignature != ContactlessCardService_MethodSignature_ReadJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_PostOnlineJS:
+			if (dwSignature != ContactlessCardService_MethodSignature_PostOnlineJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_EjectJS:
+			if (dwSignature != ContactlessCardService_MethodSignature_EjectJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_QueryHasCardJS:
+			if (dwSignature != ContactlessCardService_MethodSignature_QueryHasCardJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case ContactlessCardService_Method_CancelReadJS:
+			if (dwSignature != ContactlessCardService_MethodSignature_CancelReadJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -201,6 +261,31 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -307,6 +392,56 @@ public:
 						Handle_GetDevInfo(ctx);
 					}
 					break;
+				case ContactlessCardService_Method_ReadJS:
+					{
+						SpReqAnsContext<ContactlessCardService_ReadJS_Req,ContactlessCardService_ReadJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ContactlessCardService_ReadJS_Req,ContactlessCardService_ReadJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_ReadJS(ctx);
+					}
+					break;
+				case ContactlessCardService_Method_PostOnlineJS:
+					{
+						SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req,ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req,ContactlessCardService_PostOnlineJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_PostOnlineJS(ctx);
+					}
+					break;
+				case ContactlessCardService_Method_EjectJS:
+					{
+						SpReqAnsContext<ContactlessCardService_EjectJS_Req,ContactlessCardService_EjectJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ContactlessCardService_EjectJS_Req,ContactlessCardService_EjectJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_EjectJS(ctx);
+					}
+					break;
+				case ContactlessCardService_Method_QueryHasCardJS:
+					{
+						SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req,ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req,ContactlessCardService_QueryHasCardJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_QueryHasCardJS(ctx);
+					}
+					break;
+				case ContactlessCardService_Method_CancelReadJS:
+					{
+						SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_CancelReadJS(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 684 - 0
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -29,6 +29,7 @@ class CContactlessCardEntity;
 void CContactlessCardFSM::s0_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 0;
 	SetDevState(DEVICE_STATUS_NOT_READY);
 	FSMEvent *e = new FSMEvent(USER_EVT_INIT);
 	PostEventFIFO(e);
@@ -57,6 +58,7 @@ unsigned int CContactlessCardFSM::s0_on_event(FSMEvent* e)
 void CContactlessCardFSM::s1_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 1;
 }
 void CContactlessCardFSM::s1_on_exit()
 {
@@ -83,6 +85,7 @@ unsigned int CContactlessCardFSM::s1_on_event(FSMEvent* event)
 void CContactlessCardFSM::s2_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 2;
 	SetDevState(DEVICE_STATUS_NORMAL);
 	m_resetTimes = 0;
 	m_testResult = Error_Succeed;
@@ -97,6 +100,44 @@ unsigned int CContactlessCardFSM::s2_on_event(FSMEvent* pEvt)
 	int ret = 0;
 	switch(pEvt->iEvt)
 	{
+	case USER_EVT_JS_READ:
+		{
+			ReadJSEvent* rje = dynamic_cast<ReadJSEvent*>(pEvt);
+			m_bCancelRead = false;
+			m_bPageExit = false;
+			ReadJSTask* task = new ReadJSTask(this);
+			task->ctx = rje->ctx;
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+			pEvt->SetHandled();
+		}
+		break;
+	case USER_EVT_JS_EJECT:
+		{
+			EjectJSEvent* eje = dynamic_cast<EjectJSEvent*>(pEvt);
+			m_bPageExit = false;
+			EjectJSTask* task = new EjectJSTask(this);
+			task->ctx = eje->ctx;
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+			pEvt->SetHandled();
+		}
+		break;
+	case USER_EVT_JS_POSTONLINE:
+		{
+			PostOnlineJSEvent* pje = dynamic_cast<PostOnlineJSEvent*>(pEvt);
+			m_bCancelRead = false;
+			m_bPageExit = false;
+			PostOnlineJSTask* task = new PostOnlineJSTask(this);
+			task->ctx = pje->ctx;
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+			pEvt->SetHandled();
+		}
+		break;
+	case USER_EVT_JS_READ_CANCEL:
+		{
+			m_bCancelRead = true;
+			pEvt->SetHandled();
+		}
+		break;
 	case USER_EVT_ACCEPT:
 		{
 			CardAcceptEvent *cae = dynamic_cast<CardAcceptEvent*>(pEvt);
@@ -146,6 +187,7 @@ unsigned int CContactlessCardFSM::s2_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s3_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 3;
 }
 void CContactlessCardFSM::s3_on_exit()
 {
@@ -205,6 +247,7 @@ unsigned int CContactlessCardFSM::s3_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s4_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 4;
 }
 void CContactlessCardFSM::s4_on_exit()
 {
@@ -292,6 +335,7 @@ unsigned int CContactlessCardFSM::s4_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s5_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 5;
 }
 void CContactlessCardFSM::s5_on_exit()
 {
@@ -326,6 +370,7 @@ unsigned int CContactlessCardFSM::s5_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s6_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 6;
 }
 void CContactlessCardFSM::s6_on_exit()
 {
@@ -353,6 +398,7 @@ unsigned int CContactlessCardFSM::s6_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s7_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 7;
 	WaitFetchingTask* task = new WaitFetchingTask(this);
 	GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
 }
@@ -413,6 +459,7 @@ unsigned int CContactlessCardFSM::s7_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s8_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 8;
 }
 void CContactlessCardFSM::s8_on_exit()
 {
@@ -437,6 +484,7 @@ unsigned int CContactlessCardFSM::s8_on_event(FSMEvent* pEvt)
 void CContactlessCardFSM::s9_on_entry()
 {
 	LOG_FUNCTION();
+	m_currentFSMState = 9;
 	SetDevState(DEVICE_STATUS_FAULT);
 	FSMEvent *e = new FSMEvent(USER_EVT_RESET);
 	PostEventFIFO(e);
@@ -496,6 +544,91 @@ unsigned int CContactlessCardFSM::s9_on_event(FSMEvent* pEvt)
 	return 0;
 }
 
+void CContactlessCardFSM::s10_on_entry()
+{
+	LOG_FUNCTION();
+	m_currentFSMState = 10;
+}
+
+void CContactlessCardFSM::s10_on_exit()
+{
+	LOG_FUNCTION();
+}
+
+unsigned int CContactlessCardFSM::s10_on_event(FSMEvent* pEvt)
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s10 event(%d)", pEvt->iEvt);
+	int ret = 0;
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_JS_READ_FINISHED:
+		{
+			pEvt->SetHandled();
+			ret = 0;
+		}
+	break;
+	case USER_EVT_JS_POSTONLINEFINISHED:
+		{
+			pEvt->SetHandled();
+			ret = 0;
+		}
+	break;
+	case USER_EVT_JS_READ_CANCEL:
+		{
+			m_bCancelRead = true;
+			pEvt->SetHandled();
+			ret = 0;
+		}
+	break;
+	case USER_EVT_EXIT_MIAN_PAGE:
+		{
+			m_bPageExit = true;
+			pEvt->SetHandled();
+			ret = 0;
+		}
+	break;
+	default:
+		break;
+	}
+	return ret;
+}
+
+void CContactlessCardFSM::s11_on_entry()
+{
+	LOG_FUNCTION();
+	m_currentFSMState = 11;
+}
+
+void CContactlessCardFSM::s11_on_exit()
+{
+	LOG_FUNCTION();
+}
+
+unsigned int CContactlessCardFSM::s11_on_event(FSMEvent* pEvt)
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s11 event(%d)", pEvt->iEvt);
+	int ret = 0;
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_JS_EJECTFINISHED:
+		{
+			pEvt->SetHandled();
+			ret = pEvt->param1;
+		}
+	break;
+	case USER_EVT_EXIT_MIAN_PAGE:
+	{
+		m_bPageExit = true;
+		pEvt->SetHandled();
+		ret = 0;
+	}
+	break;
+	default:
+		break;
+	}
+	return ret;
+}
+
 ErrorCodeEnum CContactlessCardFSM::OnInit()
 {
 	LOG_FUNCTION();
@@ -1510,3 +1643,554 @@ void CContactlessCardFSM::GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimple
 	alarmMsg = alarmMsgStr.GetData();
 	csErrMsgWithReturnCode = csErrMsgWithReturnCodeStr.GetData();
 }
+
+DWORD CContactlessCardFSM::GetFsmStateErrCode()
+{
+	int state = GetFSMState();
+	switch (state)
+	{
+	case 2:
+		return ContactlessCard_UserErrorCode_PROCESS_IDLE;
+	case 4:
+		return ContactlessCard_UserErrorCode_PROCESS_HOLD;
+	case 5:
+		return ContactlessCard_UserErrorCode_PROCESS_READ;
+	case 6:
+		return ContactlessCard_UserErrorCode_PROCESS_EJECT;
+	case 7:
+		return ContactlessCard_UserErrorCode_PROCESS_WAIT_FETCH;
+	case 8:
+		return ContactlessCard_UserErrorCode_PROCESS_CAPTURE;
+	case 9:
+		return ContactlessCard_UserErrorCode_PROCESS_FAULT;
+	case 10:
+		return ContactlessCard_UserErrorCode_PROCESS_READ_JS;
+	case 11:
+		return ContactlessCard_UserErrorCode_PROCESS_EJECT_JS;
+	default:
+		return ContactlessCard_UserErrorCode_EntityInStateCannotProcess;
+	}
+}
+
+void CContactlessCardFSM::QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	int ret = 0;
+	if (m_hDevHelper == nullptr) {
+		ctx->Answer(Error_Unexpect, ContactlessCard_UserErrorCode_DevOpen_Failed);
+	}
+	else {
+		RFICReaderStatus devStatus;
+		long l_beginTime, l_endTime;
+		l_beginTime = SP::Module::Comm::RVCGetTickCount();
+		ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(devStatus);
+		l_endTime = SP::Module::Comm::RVCGetTickCount();
+
+		if (Error_Succeed == eErr)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("QueryInternalHasCardJS::GetDevStatus, eMedia pos:%d", devStatus.eMediaPos);
+
+			//switch (devStatus.eMediaPos)
+			//{
+			//case CI_MEDIA_RF:
+			//	ret = 6;
+			//	break;
+			//case CI_MEDIA_NOTPRESENT:
+			//	ret = 0;
+			//	break;
+			//case CI_MEDIA_IDCARD:
+			//	ret = 7;
+			//	break;
+			//default:
+			//	ret = 0;
+			//	break;
+			//}
+
+			ctx->Ans.position = (int)devStatus.eMediaPos;
+			ctx->Answer(Error_Succeed);
+		}
+		else
+		{
+			DWORD dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_RF_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		}
+
+	}
+}
+
+int CContactlessCardFSM::EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("吐卡开始");
+	m_pCardProcess->DataInit();
+	int ret = 0;
+	int getDevInfoCount = 0;
+	DWORD dwStart = SP::Module::Comm::RVCGetTickCount();
+	DWORD dwEnd = dwStart;
+	LogEvent(Severity_Middle, LOG_EVT_CONTACTLESS_CARD_GREEN_ON, "ContactCard(fetch) warning on");
+	while (true)
+	{
+
+		dwEnd = SP::Module::Comm::RVCGetTickCount();
+		if ((dwEnd - dwStart) > 58 * 1000)
+		{
+			ret = 1;//超时
+			break;
+		}
+
+		if (m_bPageExit) {
+			ret = 2;
+			break;//退到首页
+		}
+
+		ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(devStatus);
+		if (eErr == Error_Succeed)
+		{
+			if (devStatus.eMediaPos == CI_MEDIA_RF || devStatus.eMediaPos == CI_MEDIA_NOTPRESENT)
+			{
+				if (devStatus.eMediaPos == CI_MEDIA_NOTPRESENT){
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EjectCard, devStatus.eMedia %d", devStatus.eMediaPos);
+					ret = 0;//取走
+					break;
+				}
+				else if (devStatus.eMediaPos == CI_MEDIA_RF) {
+				}
+			}
+		}
+		else {
+			getDevInfoCount++;
+			if (getDevInfoCount % 10 == 0) {
+				DevErrorInfo devErrInfo;
+				m_hDevHelper->GetLastErr(devErrInfo);
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDevStatus, errMsg:%s", devErrInfo.szErrMsg);
+			}
+		}
+		Sleep(WAIT_INTERVAL);
+	}
+	LogEvent(Severity_Middle, LOG_EVT_CONTACTLESS_CARD_GREEN_OFF, "ContactCard(fetch) warning off");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("eject return.ret=%d",ret);
+	if (ctx != NULL) {
+		if (ret == 0) {
+			ctx->Answer(Error_Succeed);
+		}
+		else if(ret == 1 || ret == 2){
+			ctx->Answer(Error_Exception, ContactlessCard_UserErrorCode_Forget_Fectch_Card);
+		}
+	}
+	return ret;
+}
+
+int CContactlessCardFSM::ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("读卡开始");
+	int ret = InternalAcceptCardJS();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalAcceptCardJS ret:%d", ret);
+
+	if (ret == 0) {
+		//寻卡成功,开始联机读卡
+		ret = PreOnlineJS(ctx);
+	}
+	else if (ret == 1) {
+		//非IC卡
+		ctx->Answer(Error_Exception, ContactlessCard_UserErrorCode_Read_Not_IC);
+	}
+	else if (ret == 2) {
+		//寻卡超时
+		ctx->Answer(Error_Exception, ContactlessCard_UserErrorCode_Read_TimeOut);
+	}
+	else if (ret == 3 || ret == 4){
+		//读卡取消
+		ctx->Answer(Error_Exception, ContactlessCard_UserErrorCode_Read_Cancel);
+	}
+	return 0;
+}
+
+int CContactlessCardFSM::PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PostOnlineJS) 联机后IC接触处理");
+	m_pCardProcess->DataInit();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("postOnLine data[%s]", ctx->Req.data.GetData());
+	m_pCardProcess->SplitOnlineReplyData(ctx->Req.data, strlen(ctx->Req.data));
+	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_RFIC, m_hDevHelper);
+	CSimpleStringA csTransEnd;
+	if (issBnkAuth == 0)
+	{
+		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_RFIC, m_hDevHelper, m_bCDA);
+		if (transEnd == 0) {
+			csTransEnd = "TRANSEND,0";
+		}
+		else if (transEnd == 1) {
+			csTransEnd = "TRANSEND,1";
+		}
+	}
+	else {
+		csTransEnd = "TRANSEND,1";
+	}
+	ctx->Ans.result = csTransEnd;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
+	ctx->Answer(Error_Succeed);
+	return 0;
+}
+
+int CContactlessCardFSM::InternalAcceptCardJS()
+{
+	LOG_FUNCTION();
+	int err = 0;
+	long l_beginTime, l_endTime;
+	DWORD64 dwStart = SP::Module::Comm::RVCGetTickCount();
+	DWORD64 dwEnd = dwStart;
+	ErrorCodeEnum eErr = Error_Succeed;
+	LogEvent(Severity_Middle, LOG_EVT_CONTACTLESS_CARD_GREEN_ON, "ContactCard green on");
+
+	int timeOutResult = 0;
+	do {
+		if (m_bCancelRead) {
+			err = 3;//取消读卡
+			break;
+		}
+		if (m_bPageExit) {
+			err = 4;//退到首页,取消读卡
+			break;
+		}
+
+		l_beginTime = SP::Module::Comm::RVCGetTickCount();
+		eErr = m_hDevHelper->GetDevStatus(devStatus);
+		l_endTime = SP::Module::Comm::RVCGetTickCount();
+
+		if (eErr == Error_Succeed) {
+			if (devStatus.eMediaPos == CI_MEDIA_RF) {
+				LogEvent(Severity_Middle, LOG_EVT_CONTACTLESS_CARD_OP, "Contactless card op.");
+
+				int activeCardType;
+				l_beginTime = SP::Module::Comm::RVCGetTickCount();
+				bool bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_RFIC, m_hDevHelper, activeCardType);
+				l_endTime = SP::Module::Comm::RVCGetTickCount();
+				if (bIC) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InternalAcceptCardJS::DetectIfICCard activeCardType=%d", activeCardType);
+					if (activeCardType == 'A' || activeCardType == 'B' || activeCardType == 'M') {
+						err = 0;//探测到IC卡
+					}
+					else {
+						err = 1;//非IC卡
+					}
+					break;
+				}
+				else {
+					//探测失败,继续循环
+					err = 2;
+					timeOutResult = 1;
+					Sleep(ACCEPT_TRY_INTERVAL);
+				}
+			}
+			else {
+				//无卡,继续循环
+				err = 2;
+				timeOutResult = 3;
+				Sleep(ACCEPT_TRY_INTERVAL);
+			}
+		}
+		else {
+			//查询卡机状态失败,继续循环
+			err = 2;
+			timeOutResult = 2;
+			Sleep(ACCEPT_TRY_INTERVAL);
+		}
+		dwEnd = SP::Module::Comm::RVCGetTickCount();
+	} while (dwEnd - dwStart <= 55 * 1000);
+
+	//超时报错
+	if (err == 2) {
+		if (timeOutResult == 1) {
+			SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_ActiveContactlessICCard, "DevAdapter::ActiveContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+		}
+		else if (timeOutResult == 2) {
+			SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalAcceptCardJS No IC card found ");
+		}
+	}
+
+	LogEvent(Severity_Middle, LOG_EVT_CONTACTLESS_CARD_GREEN_OFF, CSimpleStringA::Format("ContactCard green off,err=%d", err).GetData());
+
+	return err;
+
+}
+
+int CContactlessCardFSM::PreOnlineJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	long l_beginTime, l_endTime;
+	m_pCardProcess->DataInit();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS>, aid[%s], bus data[%s]", ctx->Req.aid.GetData(),ctx->Req.businessData.GetData());
+	m_pCardProcess->SplitBusinessData(ctx->Req.businessData, ctx->Req.businessData.GetLength());
+	m_pCardProcess->SplitBusinessData("DF690101", strlen("DF690101"));
+	int activeCardType;
+	//oilyang@20201014 add emv card support
+	int retDetectAndRead = -1;
+	ICData aidFromBus(false, 0x4f, 0x00);
+	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the front BusinessData han't provide aid data.");
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
+
+	}
+	else {
+		char* pAIDTmp = new char[64];
+		memset(pAIDTmp, 0, 64);
+		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, the aid is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		l_beginTime = SP::Module::Comm::RVCGetTickCount();
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, preAIDs, activeCardType);
+		l_endTime = SP::Module::Comm::RVCGetTickCount();
+
+		if (pAIDTmp != NULL) {
+			delete[]pAIDTmp;
+		}
+	}
+
+	if (retDetectAndRead < 0)
+	{
+		ctx->Ans.icState = 0;//调用失败
+		if (retDetectAndRead == -1) {
+			DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_ActiveContactlessICCard, "DevAdapter::ActiveContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ctx->Answer(Error_Exception, dwTmpUserErrCode);
+		}
+		else if (retDetectAndRead == -2) {
+			DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ctx->Answer(Error_Exception, dwTmpUserErrCode);
+		}
+		else if (retDetectAndRead == -3) {
+			DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_RF_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ctx->Answer(Error_Exception, dwTmpUserErrCode);
+		}
+		return -1;
+	}
+
+	m_pCardProcess->TermRiskManage();
+	CSimpleStringA taaResult;
+	BYTE bt9f27 = 0;
+	int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_RFIC, m_hDevHelper, taaResult, true, m_bCDA, bt9f27);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS>,TermActionAnalyze retTAA:%d, taaResult:%s", retTAA, taaResult.GetData());
+	switch (retTAA)
+	{//to be added oiltest 20140929
+	case -1:	//some data may be wrong
+		break;
+	case 1:		//terminal trans
+		break;
+	case 2:		//to do trans end "TransEnd"
+		break;
+	default:
+		break;
+	}
+	ctx->Ans.result = taaResult;
+
+	if (ctx->Ans.result.GetLength() == 0)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS>,TermActionAnalyze result len = 0");
+		ctx->Ans.icState = 0;
+		ctx->Answer(Error_Succeed);
+		return 0;
+	}
+
+	string tmpResult, actionType, result = "", baseICData = "";
+	tmpResult = ctx->Ans.result;
+	char* pSomeICData = new char[1024];
+	ZeroMemory(pSomeICData, 1024);
+	int lenRet = m_pCardProcess->ConstructARQCData(tmpResult.substr(6, 4).c_str(), m_pDataToARQC, pSomeICData);
+	baseICData = pSomeICData;
+	if (pSomeICData != NULL) {
+		delete[]pSomeICData;
+	}
+	char arqcLen[8];
+	ZeroMemory(arqcLen, sizeof(arqcLen));
+#ifdef RVC_OS_WIN
+	itoa(lenRet, arqcLen, 10);
+#else
+	sprintf(arqcLen, "%d", lenRet);
+#endif // RVC_OS_WIN
+
+	
+
+	ICData track2(false, 0x57, 0x00), ICCardSerial(false, 0x5f, 0x34), appExpiryDate(false, 0x5f, 0x24);
+	string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType("0"),t2ICExpireDate("");
+
+	char* pExpireDate = new char[12];//获取ic有效期
+	ZeroMemory(pExpireDate, 12);
+	if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, appExpiryDate, false, 0) == -1)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("can't find expire date");
+	}
+	else {
+		HexBuf2StrBuf(appExpiryDate.value, &pExpireDate, appExpiryDate.lenth);
+		t2ICExpireDate = pExpireDate;
+	}
+	delete[] pExpireDate;
+
+	char* pICCardSerial = new char[4];//获取ic序号
+	ZeroMemory(pICCardSerial, 4);
+	if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, ICCardSerial, false) == -1)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("can't find card serial.");
+	}
+	else
+	{
+		HexBuf2StrBuf(ICCardSerial.value, &pICCardSerial, ICCardSerial.lenth);
+		t2ICCardSerial = pICCardSerial;
+	}
+	delete[] pICCardSerial;
+
+	char* pICTrack2 = new char[128];//获取等效磁条2
+	ZeroMemory(pICTrack2, 128);
+	if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("no track2 data in ic");
+	}
+	else
+	{
+		HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
+		t2ICTrack2 = pICTrack2;
+
+		int pos = FindHexCharPosition(track2.value, 0x0d, track2.lenth);
+		pICTrack2[37] = '\0';
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, split pos:%d", pos);
+		char* ddd = new char[40];
+		ZeroMemory(ddd, 40);
+		memcpy(ddd, pICTrack2, pos - 1);
+
+		char icTrack2Data[128];
+		ZeroMemory(icTrack2Data, sizeof(icTrack2Data));
+
+		Track2Data track2Data;
+		track2Data.status = 0;
+		track2Data.t2Account = "";
+		cmdDecodeMag2(pICTrack2, icTrack2Data);
+		if (SplitTrack2(icTrack2Data, track2Data) == 0)
+		{
+			t2ICAccount = track2Data.t2Account;
+			//t2ICCardSerial = track2Data.t2CardSerial;
+			t2ICCVC = track2Data.t2CVC;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("done(ic).");
+		}
+
+		if (strnicmp(track2Data.t2Account, ddd, strlen(ddd)))
+		{
+			t2ICCVC = "";
+			t2ICAccount = (char*)ddd;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("contactless card countcount:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+		}
+		delete[]ddd;
+
+		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()));//读到的卡号
+	}
+	delete[]pICTrack2;
+
+
+	//80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
+	if (m_pCardProcess->GetP1() == 0x1)
+		actionType = "ARQC";
+	else
+		actionType = "";
+	//【55域】
+	//	基本域:
+	//	9F26	8b	应用密文AC
+	//	9F27	1b	密文信息数据
+	//	9F10	max.32b	发卡行应用数据IAD
+	//	9F37	4b	不可预知数
+	//	9F36	2b	应用交易计数器ATC
+	//	95	5b	终端验证结果TVR
+	//	9A	3cn	交易日期(6位有效数字,YYMMDD)
+	//	9C	1cn	交易类型(2位有效数字)
+	//	9F02	6cn	授权金额(12位有效数字)
+	//	5F2A	2cn	交易货币代码(3位有效数字)
+	//	82	2b	应用交互特征AIP
+	//	9F1A	2cn	终端国家代码(3位有效数字)
+	//	9F03	6cn	其他金额(12位有效数字)
+	//	9F33	3b	终端性能 "E0C900"
+
+	//	可选域:
+	//添加9F26,9F27,9F10,9F33的数据
+	char* pCID = new char[4];
+	ZeroMemory(pCID, 4);
+	HexBuf2StrBuf(&bt9f27, &pCID, 1);
+	char* pIssueBankLen = new char[4];
+	ZeroMemory(pIssueBankLen, 4);
+	int len9f10 = tmpResult.length() - 26 - 4;
+	int lenHigh, lenLow;
+	len9f10 = len9f10 / 2;
+	lenHigh = len9f10 / 16;
+	lenLow = len9f10 % 16;
+	BYTE bt9f10;
+	bt9f10 = (lenHigh << 4) + lenLow;
+	HexBuf2StrBuf(&bt9f10, &pIssueBankLen, 1);
+	baseICData += "9F2608" + tmpResult.substr(10, 16) + "9F2701" + pCID + "9F10" + pIssueBankLen + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "9F3303" + "E0C900";
+
+	
+	//result = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
+	//	+ "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|"
+	//	+ "ARQCDATA," + m_pDataToARQC + "|EXPIREDATE," + pExpireDate + "|T2ACCOUNT," + t2ICAccount + "|T2CARDSERIAL," + t2ICCardSerial
+	//	+ "|T2CVC," + t2ICCVC + "|T2TRACK2," + t2ICTrack2 + "|CARDCAT," + cardType + "|ICTAGS," + baseICData;
+	//json格式返回
+	std::map<std::string, std::string> msgInfo;
+	msgInfo["ACTION"] = actionType.c_str();
+	msgInfo["ATC_CODE"] = tmpResult.substr(6, 4).c_str();
+	msgInfo["ARQC_CODE"] = tmpResult.substr(10, 16).c_str();
+	msgInfo["MAC"] = tmpResult.substr(26, tmpResult.length() - 26 - 4).c_str();
+	CSimpleStringA arqcLenStr = arqcLen;
+	msgInfo["ARQC_SIZE"] = arqcLenStr.GetData();
+	CSimpleStringA arqcData = m_pDataToARQC;
+	msgInfo["ARQC_DATA"] = arqcData.GetData();
+	msgInfo["T2TRACK2_DATA"] = t2ICTrack2.c_str();
+	msgInfo["EXPIRE_DATE"] = t2ICExpireDate.c_str();
+	msgInfo["T2CARD_SERIAL"] = t2ICCardSerial.c_str();
+	msgInfo["CARD_CAT"] = cardType.c_str();
+	msgInfo["IC_TAGS"] = baseICData.c_str();
+
+	std::pair<bool, std::string> strResult;
+	strResult = generateJsonStr(msgInfo);
+	result = strResult.second.c_str();
+
+	ctx->Ans.result = result.c_str();
+	ctx->Ans.icState = 1;
+	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("data to host result=%s,len=%d", result.c_str(),result.length());
+
+	
+	string txtresult = "ACTION," + actionType + "|" + "ATCCODE," + tmpResult.substr(6, 4) + "|" + "ARQCCODE," + tmpResult.substr(10, 16) + "|"
+		+ "MAC," + tmpResult.substr(26, tmpResult.length() - 26 - 4) + "|" + "ARQCSIZE," + string(arqcLen) + "|ARQCDATA, " + m_pDataToARQC + "|"
+		+ "T2TRACK2(len)," + CSimpleStringA::Format("%d", t2ICTrack2.length()).GetData() + "|"
+		+ "EXPIREDATE(len)," + CSimpleStringA::Format("%d", t2ICExpireDate.length()).GetData() + "|"
+		+ "T2CARDSERIAL(len), " + CSimpleStringA::Format("%d", t2ICCardSerial.length()).GetData() + "|"
+		+ "CARDCAT, " + cardType + "|"
+		+ "ICTAGS, " + CSimpleStringA::Format("%d", baseICData.length()).GetData();
+
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("data to host(less)[%s]", txtresult.c_str());
+
+
+	if (pCID != NULL)
+		delete[]pCID;
+	if (pIssueBankLen != NULL)
+		delete[]pIssueBankLen;
+
+	if (m_pDataToARQC != NULL)
+	{
+		delete[]m_pDataToARQC;
+		m_pDataToARQC = NULL;
+	}
+	ctx->Answer(Error_Succeed);
+	return 0;
+
+}
+
+int CContactlessCardFSM::ExitToMainPage()
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit to main page, send event");
+	FSMEvent* evt = new FSMEvent(USER_EVT_EXIT_MIAN_PAGE);
+	PostEventFIFO(evt);
+	return 0;
+}

+ 155 - 24
Module/mod_ContactlessCard/ContactlessFSM.h

@@ -38,7 +38,15 @@ enum EvtType
 	USER_EVT_READ_FINISHED,
 	USER_EVT_QUERY_CARD_INFO,
 	USER_EVT_QUERY_CARD_INFO_FINISHED,
-
+	//new 
+	USER_EVT_JS_READ,
+	USER_EVT_JS_READ_FINISHED,
+	USER_EVT_JS_EJECT,
+	USER_EVT_JS_EJECTFINISHED,
+	USER_EVT_JS_POSTONLINE,
+	USER_EVT_JS_POSTONLINEFINISHED,
+	USER_EVT_JS_READ_CANCEL,
+	USER_EVT_EXIT_MIAN_PAGE
 };
 
 using namespace ContactlessCard;
@@ -156,21 +164,75 @@ public:
 protected:
 private:
 };
+//new
+class EjectJSEvent : public FSMEvent
+{
+public:
+	EjectJSEvent() : FSMEvent(USER_EVT_JS_EJECT) {}
+	~EjectJSEvent() {}
+	SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS unhandled");
+			//ctx->Answer(Error_InvalidState);
+		}
+	}
+protected:
+private:
+};
+
+class PostOnlineJSEvent : public FSMEvent
+{
+public:
+	PostOnlineJSEvent() : FSMEvent(USER_EVT_JS_POSTONLINE) {}
+	~PostOnlineJSEvent() {}
+	SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PostOnlineJS unhandled");
+			//ctx->Answer(Error_InvalidState);
+		}
+	}
+protected:
+private:
+};
+
+class ReadJSEvent : public FSMEvent
+{
+public:
+	ReadJSEvent() : FSMEvent(USER_EVT_JS_READ) {}
+	~ReadJSEvent() {}
+	SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS unhandled");
+			//ctx->Answer(Error_InvalidState);
+		}
+	}
+protected:
+private:
+};
+
 class CContactlessCardFSM : public CCommDevFSM<CContactlessCardFSM, RFICClass>
 {
 public:
-	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9};
+	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11};
 	BEGIN_FSM_STATE(CContactlessCardFSM)
-		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)
-		FSM_STATE_ENTRY(s2,"Idle",s2_on_entry,s2_on_exit,s2_on_event)
-		FSM_STATE_ENTRY(s3,"Accepting",s3_on_entry,s3_on_exit,s3_on_event)
-		FSM_STATE_ENTRY(s4,"Hold",s4_on_entry,s4_on_exit,s4_on_event)
-		FSM_STATE_ENTRY(s5,"Reading",s5_on_entry,s5_on_exit,s5_on_event)
-		FSM_STATE_ENTRY(s6,"Ejecting",s6_on_entry,s6_on_exit,s6_on_event)
-		FSM_STATE_ENTRY(s7,"WaitFetching",s7_on_entry,s7_on_exit,s7_on_event)
-		FSM_STATE_ENTRY(s8,"Capturing",s8_on_entry,s8_on_exit,s8_on_event)
-		FSM_STATE_ENTRY(s9,"Failed",s9_on_entry,s9_on_exit,s9_on_event)
+		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)
+		FSM_STATE_ENTRY(s2, "Idle", s2_on_entry, s2_on_exit, s2_on_event)
+		FSM_STATE_ENTRY(s3, "Accepting", s3_on_entry, s3_on_exit, s3_on_event)
+		FSM_STATE_ENTRY(s4, "Hold", s4_on_entry, s4_on_exit, s4_on_event)
+		FSM_STATE_ENTRY(s5, "Reading", s5_on_entry, s5_on_exit, s5_on_event)
+		FSM_STATE_ENTRY(s6, "Ejecting", s6_on_entry, s6_on_exit, s6_on_event)
+		FSM_STATE_ENTRY(s7, "WaitFetching", s7_on_entry, s7_on_exit, s7_on_event)
+		FSM_STATE_ENTRY(s8, "Capturing", s8_on_entry, s8_on_exit, s8_on_event)
+		FSM_STATE_ENTRY(s9, "Failed", s9_on_entry, s9_on_exit, s9_on_event)
+		FSM_STATE_ENTRY(s10, "ReadJs", s10_on_entry, s10_on_exit, s10_on_event)
+		FSM_STATE_ENTRY(s11, "EjectJs", s11_on_entry, s11_on_exit, s11_on_event)
 		END_FSM_STATE()
 
 		BEGIN_FSM_RULE(CContactlessCardFSM,s0)
@@ -180,7 +242,6 @@ public:
 		FSM_RULE_ENTRY(s1,s9,USER_EVT_INITFINISHED,1)
 		FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s2,s3,USER_EVT_ACCEPT,0)
-		//		FSM_RULE_ENTRY(s2,s9,USER_EVT_ACCEPT,1)
 		FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s2, s6, USER_EVT_EJECT, 0)
 		FSM_RULE_ENTRY(s3,s4,USER_EVT_ACCEPTFINISHED,0)
@@ -189,11 +250,8 @@ public:
 		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,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,s2,USER_EVT_ACCEPT,0)
 		FSM_RULE_ENTRY(s4,s2,USER_EVT_QUERY_CARD_INFO_FINISHED,0)
 		FSM_RULE_ENTRY(s4, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
@@ -208,21 +266,22 @@ public:
 		FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,0)
 		FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,2)
-		//FSM_RULE_ENTRY(s7,s9,USER_EVT_WAITFINISHED,1)
-		//FSM_RULE_ENTRY(s7,s8,USER_EVT_WAITFINISHED,2)
 		FSM_RULE_ENTRY(s7, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
-		//FSM_RULE_ENTRY(s8,s2,USER_EVT_CAPTUREFINISHED,0)
-		//FSM_RULE_ENTRY(s8,s9,USER_EVT_CAPTUREFINISHED,1)
 		FSM_RULE_ENTRY(s8, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
-		//FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 0)
 		FSM_RULE_ENTRY(s9, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 0)
 		FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 1)
+		FSM_RULE_ENTRY(s10, s2, USER_EVT_JS_READ_FINISHED, 0)
+		FSM_RULE_ENTRY(s10, s2, USER_EVT_JS_POSTONLINEFINISHED, 0)
+		FSM_RULE_ENTRY(s11, s2, USER_EVT_JS_EJECTFINISHED, 0)
+		FSM_RULE_ENTRY(s11, s2, USER_EVT_JS_EJECTFINISHED, 1)
+		FSM_RULE_ENTRY(s11, s2, USER_EVT_JS_EJECTFINISHED, 2)
 		END_FSM_RULE()
 
-		CContactlessCardFSM() : m_bCancelAccept(false),m_bWaitingAccept(false),
-		m_bWaitAccepteMore(false),m_bExit(false),m_resetTimes(0),m_testResult(Error_Succeed)
-		,m_bCDA(false),m_pDataToARQC(NULL), m_csMachineType(true), m_csDevNo(""),m_devInit(false), m_repeatErrTimes(0)
+		CContactlessCardFSM() : m_bCancelAccept(false), m_bWaitingAccept(false),
+		m_bWaitAccepteMore(false), m_bExit(false), m_resetTimes(0), m_testResult(Error_Succeed)
+		, m_bCDA(false), m_pDataToARQC(NULL), m_csMachineType(true), m_csDevNo(""), m_devInit(false), m_repeatErrTimes(0),
+		m_bCancelRead(false),m_bPageExit(false)
 		{
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x213); 
 			cmdDecodeMag2 = NULL;
@@ -267,6 +326,13 @@ public:
 	void s9_on_exit();
 	unsigned int s9_on_event(FSMEvent* event);
 
+	void s10_on_entry();
+	void s10_on_exit();
+	unsigned int s10_on_event(FSMEvent* event);
+	void s11_on_entry();
+	void s11_on_exit();
+	unsigned int s11_on_event(FSMEvent* event);
+
 	int Initial();
 	ErrorCodeEnum Load();
 	bool GetDevStatus(bool bPrint=true);
@@ -289,6 +355,26 @@ public:
 	{
 		pTransactionContext->SendAnswer(m_testResult);
 	}
+	//new interface
+	int GetFSMState()
+	{
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_currentFSMState:%d", m_currentFSMState);
+		return m_currentFSMState;
+	}
+	DWORD GetFsmStateErrCode();
+	void QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx);
+
+	int EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx);
+
+	int ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
+
+	int PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx);
+
+	int InternalAcceptCardJS();
+
+	int PreOnlineJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
+
+	int ExitToMainPage();
 
 protected:
 	int m_iInsertTries;
@@ -318,6 +404,11 @@ private:
 	int SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData);
 
 	int m_repeatErrTimes;
+
+	int m_currentFSMState;
+	//new
+	bool m_bCancelRead;
+	bool m_bPageExit;
 };
 struct InitTask : public ITaskSp
 {
@@ -416,4 +507,44 @@ struct QueryCardInfoTask : public ITaskSp
 		fsm->PostEventFIFO(e);
 	}
 };
+
+
+struct EjectJSTask : public ITaskSp
+{
+	SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx;
+	CContactlessCardFSM* fsm;
+	EjectJSTask(CContactlessCardFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_EJECTFINISHED);
+		e->param1 = fsm->EjectJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+struct ReadJSTask : public ITaskSp
+{
+	SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx;
+	CContactlessCardFSM* fsm;
+	ReadJSTask(CContactlessCardFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_READ_FINISHED);
+		e->param1 = fsm->ReadJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+struct PostOnlineJSTask : public ITaskSp
+{
+	SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx;
+	CContactlessCardFSM* fsm;
+	PostOnlineJSTask(CContactlessCardFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_POSTONLINEFINISHED);
+		e->param1 = fsm->PostOnlineJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
 #endif //_CONTACTLESS_FSM_H

+ 50 - 0
Module/mod_ContactlessCard/mod_ContactlessCard.cpp

@@ -73,6 +73,56 @@ void ContactlessCardServerSession::Handle_GetDevInfo(SpReqAnsContext<Contactless
 	m_pEntity->GetDevInfo(ctx);
 }
 
+
+//new interface
+
+void ContactlessCardServerSession::Handle_CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Invoke CancelReadJS");
+	m_pEntity->CancelReadJS(ctx);
+}
+void ContactlessCardServerSession::Handle_ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Invoke ReadJS");
+	m_pEntity->ReadJS(ctx);
+}
+void ContactlessCardServerSession::Handle_PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Invoke PostOnlineJS");
+	m_pEntity->PostOnlineJS(ctx);
+}
+void ContactlessCardServerSession::Handle_EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Invoke EjectJS");
+	m_pEntity->EjectJS(ctx);
+}
+void ContactlessCardServerSession::Handle_QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("Invoke QueryHasCardJS");
+	m_pEntity->QueryHasCardJS(ctx);
+}
+
+void CContactlessCardEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
+{
+	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
+	{
+		m_fsm.OnUIState4SetWhatPage(pszValue);
+		if (_strnicmp(pszValue, "M", strlen("M")) == 0) {
+			m_fsm.ExitToMainPage();
+		}
+	}
+}
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CContactlessCardEntity)
 SP_END_ENTITY_MAP()

+ 93 - 1
Module/mod_ContactlessCard/mod_ContactlessCard.h

@@ -22,11 +22,19 @@ public:
 	virtual void Handle_Exit(SpOnewayCallContext<ContactlessCardService_Exit_Info>::Pointer ctx);
 	virtual void Handle_QueryCardInfo(SpReqAnsContext<ContactlessCardService_QueryCardInfo_Req, ContactlessCardService_QueryCardInfo_Ans>::Pointer ctx);
 	virtual void Handle_GetDevInfo(SpReqAnsContext<ContactlessCardService_GetDevInfo_Req, ContactlessCardService_GetDevInfo_Ans>::Pointer ctx);
+
+	//new interface
+	virtual void Handle_CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx);
+	virtual void Handle_ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
+	virtual void Handle_PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx);
+	virtual void Handle_EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx);
+	virtual void Handle_QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx);
+
 private:
 	CContactlessCardEntity* m_pEntity;
 };
 
-class CContactlessCardEntity : public CDevAdptEntityBase
+class CContactlessCardEntity : public CDevAdptEntityBase, public ISysVarListener
 {
 public:
 	CContactlessCardEntity()
@@ -39,6 +47,7 @@ public:
 		LOG_FUNCTION();
 
 		ErrorCodeEnum eStart = m_fsm.Init(this);
+		GetFunction()->RegistSysVarEvent("UIState", this);
 		pTransactionContext->SendAnswer(Error_Succeed);
 	}
 
@@ -161,6 +170,88 @@ public:
 		}
 	}
 
+	//new interface
+
+	void CancelReadJS(SpOnewayCallContext<ContactlessCardService_CancelReadJS_Info>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			LogWarn(Severity_Middle, Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed, "CancelInsert but DevOpen failed.");
+		}
+		else {
+			FSMEvent* evt = new FSMEvent(USER_EVT_JS_READ_CANCEL);
+			m_fsm.PostEventFIFO(evt);
+		}
+	}
+
+	void ReadJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
+			DWORD errCode = m_fsm.GetFsmStateErrCode();
+			int state = m_fsm.GetFSMState();
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+		else {
+			ReadJSEvent* pEvt = new ReadJSEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
+	}
+
+	void PostOnlineJS(SpReqAnsContext<ContactlessCardService_PostOnlineJS_Req, ContactlessCardService_PostOnlineJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
+			DWORD errCode = m_fsm.GetFsmStateErrCode();
+			int state = m_fsm.GetFSMState();
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PostOnlineJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+		else {
+			PostOnlineJSEvent* pEvt = new PostOnlineJSEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
+	}
+
+	void EjectJS(SpReqAnsContext<ContactlessCardService_EjectJS_Req, ContactlessCardService_EjectJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Idle") != 0) {
+			DWORD errCode = m_fsm.GetFsmStateErrCode();
+			int state = m_fsm.GetFSMState();
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+		else {
+			EjectJSEvent* e = new EjectJSEvent();
+			e->ctx = ctx;
+			m_fsm.PostEventFIFO(e);
+		}
+	}
+
+	void QueryHasCardJS(SpReqAnsContext<ContactlessCardService_QueryHasCardJS_Req, ContactlessCardService_QueryHasCardJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, ContactlessCard_UserErrorCode_DevOpen_Failed);
+		}
+		else {
+			m_fsm.QueryHasCardJS(ctx);
+		}
+	}
+
 	virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		m_fsm.SelfTest(eTestType,pTransactionContext);
@@ -169,6 +260,7 @@ public:
 	{
 		return new ContactlessCardServerSession(this);
 	}
+	virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
 	virtual bool IsService()const{return true;}
 	virtual bool IsMultiThread()const{return true;}
 protected:

+ 70 - 76
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -586,11 +586,10 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 			errRfOpen = m_hDevHelper->IDCerRFControl(true);
 			m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("RreadAndScanUTF8 DevAdapter::IDCerRFControl");
 			if (Error_Succeed == errRfOpen)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open rf succeed.");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
+					.setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)();
 			}
 			else
 			{
@@ -615,8 +614,8 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("ReadAndScanUTF8 IDCerAuthenticate auth succeed.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
+				.setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)();
 			bIDCerAuthenticate = true;
 
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
@@ -658,7 +657,7 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 
 					DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER)
 						.setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime)
-						.setLogCode(IDCertService_LogCode_ReadAndScanUTF8)("read succeed(sp2 scan).");
+						.setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
 					bReadSuccess = true;
 					LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
 
@@ -816,8 +815,8 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 						m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 						if (eErr == Error_Succeed)
 						{
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)
-								("ReadAndScanUTF8 ScanIDAndSaveImage succeed.");
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
+								.setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)();
 						}
 						else
 						{
@@ -917,9 +916,8 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 	{
 		if (eErr1 == Error_Succeed)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
-				.setCostTime(m_ullEndTime - m_ullBeginTime)
-				("exec QueryCardPos first time succ, pos : %d", pos);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+				.setCostTime(m_ullEndTime - m_ullBeginTime)();
 			switch (pos)
 			{
 			case 1:
@@ -929,26 +927,29 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 				m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 				if (eErr1 != Error_Succeed)
 				{
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
 					SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
 						false, m_ullEndTime - m_ullBeginTime);
 					
 					m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 					ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject();
 					m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)
-						("ReadAndScanUTF8 DevAdapter::ForceIDEject");
+					
 					if (errEject != Error_Succeed)
 					{
 						SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
 							false, m_ullEndTime - m_ullBeginTime);
 					}
+					else
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)();
+					}
 
 					CheckEjectCardRes(eErr1, errEject);
 				}
 				else
 				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ.");
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl")
+						.setCostTime(m_ullEndTime - m_ullBeginTime)();
 				}
 				break;
 			case 0:
@@ -960,8 +961,6 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 		{
 			SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__,
 				false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec QueryCardPos first time failed.");
 		}
 
 		//查询卡片位置以决定跳转
@@ -970,48 +969,47 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 		m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 		if (eErr1 == Error_Succeed)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
-				.setCostTime(m_ullEndTime - m_ullBeginTime)
-				("exec QueryCardPos second time succ, pos : %d", pos);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+				.setCostTime(m_ullEndTime - m_ullBeginTime)();
 		}
 		else
 		{
 			SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__,
 				false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec QueryCardPos second time failed with errcode: %d", eErr1);
 		}
 	}
 
 	if (eErr1 != Error_Succeed || (eErr1 == Error_Succeed && (pos != 0)))
 	{
 		//oilyang@20180531 add for close enter card
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("Close RF again...");
 		m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 		ErrorCodeEnum errRf = m_hDevHelper->IDCerRFControl(false);
 		m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 		if (errRf != Error_Succeed)
 		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
 			SetErrorAndLog(errRf, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__,
 				false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 			ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject();
 			m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("ReadAndScanUTF8 DevAdapter::ForceIDEject");
 
 			if (errEject != Error_Succeed)
 			{
 				SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
 					false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
 			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)
+					.setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)();
+			}
 
 			CheckEjectCardRes(errRf, errEject);
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ.");
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)
+				.setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)();
 		}
 	}
 
@@ -1030,29 +1028,17 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 
 				SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
 					true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
-				const DWORD dwCode = GetAlarmDEC();
-				CSimpleStringA tmpRTA(true), tmpDesc(true);
-				if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
-					DbgToBeidou(ctx->link, __FUNCTION__).setReturnCode(tmpRTA)();
-				ctx->Answer(Error_Unexpect, dwCode); //RTA2109
+				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
 			}
 		}
 		else if (!bOpenRF)
 		{
 			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__,
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
-			const DWORD dwCode = GetAlarmDEC();
-			CSimpleStringA tmpRTA(true), tmpDesc(true);
-			if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwCode, tmpDesc, tmpRTA) == Error_Succeed)
-				DbgToBeidou(ctx->link, __FUNCTION__).setReturnCode(tmpRTA)();
-			ctx->Answer(Error_Unexpect, dwCode);
+			ctx->Answer(Error_Unexpect, GetAlarmDEC());
 		}
 		else
 		{
-
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadAndScanUTF8::IDCerAuthenticate(Timeout) failed with errcode: %d", errAuth);
 			if (errAuth == Error_DevMedia)
 			{
 				SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate_NotIDCard, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
@@ -1069,7 +1055,7 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 	}
 	else 
 	{
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::IDCerGetDataEx2").setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8 some thing wrong.");
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8 some thing wrong.");
 		ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed);
 		LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong.");
 	}
@@ -1154,11 +1140,11 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 			errRfOpen = m_hDevHelper->IDCerRFControl(true);
 			m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::OpenIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("RreadAndScanUTF8JS DevAdapter::OpenIDCerRFControl");
+			
 			if (Error_Succeed == errRfOpen)
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open rf succeed.");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
+					.setAPI("DevAdapter::OpenIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)();
 			}
 			else
 			{
@@ -1183,14 +1169,13 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("ReadAndScanUTF8JS IDCerAuthenticate auth succeed.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
+				.setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)();
 			bIDCerAuthenticate = true;
 
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 			errReadEx2 = m_hDevHelper->IDCerGetDataEx2(idInfoEx2);
 			m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-
 			if (errReadEx2 == Error_NotImpl)
 			{
 				ctx->Ans.msgtype = 0; //旧字段传递,GBK、字符串传递文字信息
@@ -1226,7 +1211,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 					DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER)
 						.setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime)
-						.setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)("read succeed(sp2 scan).");
+						.setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)();
 					bReadSuccess = true;
 					LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
 
@@ -1384,8 +1369,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 						m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 						if (eErr == Error_Succeed)
 						{
-							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)
-								("ReadAndScanUTF8JS ScanIDAndSaveImage succeed.");
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)();
 						}
 						else
 						{
@@ -1474,9 +1458,9 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__,
 			true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
+		/*DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
 			.setResultCode(std::to_string(errRfOpen).c_str())
-			("ReadAndScanUTF8JS::IDCerRFControl Open failed with errcode: %d", errRfOpen);
+			("ReadAndScanUTF8JS::IDCerRFControl Open failed with errcode: %d", errRfOpen);*/
 	}
 
 	m_bExit = false;
@@ -1495,9 +1479,8 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 	{
 		if (eErr1 == Error_Succeed)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
-				.setCostTime(m_ullEndTime - m_ullBeginTime)
-				("exec QueryCardPos first time succ, pos : %d", pos);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+				.setCostTime(m_ullEndTime - m_ullBeginTime)();
 			switch (pos)
 			{
 			case 1:
@@ -1507,23 +1490,27 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 				m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 				if (eErr1 != Error_Succeed)
 				{
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
+					//DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
 					SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__,
 						false, m_ullEndTime - m_ullBeginTime);
 					m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 					ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject();
 					m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)
-						("ReadAndScanUTF8JS DevAdapter::ForceIDEject");
 					if (errEject != Error_Succeed)
 					{
 						SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
 							false, m_ullEndTime - m_ullBeginTime);
 					}
+					else
+					{
+						DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)
+							.setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)();
+					}
 				}
 				else
 				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ.");
+					DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl")
+						.setCostTime(m_ullEndTime - m_ullBeginTime)();
 				}
 				break;
 			case 0:
@@ -1536,10 +1523,10 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 			SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__,
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+			/*DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
 				.setCostTime(m_ullEndTime - m_ullBeginTime)
 				.setResultCode("RTA210A")
-				("exec QueryCardPos first time failed.");
+				("exec QueryCardPos first time failed.");*/
 		}
 
 		//查询卡片位置以决定跳转
@@ -1548,50 +1535,51 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 		if (eErr1 == Error_Succeed)
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
-				.setCostTime(m_ullEndTime - m_ullBeginTime)
-				("exec QueryCardPos second time succ, pos : %d", pos);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+				.setCostTime(m_ullEndTime - m_ullBeginTime)();
 		}
 		else
 		{
 			SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__,
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+			/*DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
 				.setCostTime(m_ullEndTime - m_ullBeginTime)
 				.setResultCode("RTA210A")
-				("exec QueryCardPos second time failed with errcode: %d", eErr1);
+				("exec QueryCardPos second time failed with errcode: %d", eErr1);*/
 		}
 	}
 
 	if (eErr1 != Error_Succeed || (eErr1 == Error_Succeed && (pos != 0)))
 	{
 		//oilyang@20180531 add for close enter card
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8JS")("Close RF again...");
 		m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 		ErrorCodeEnum errRfClose = m_hDevHelper->IDCerRFControl(false);
 		m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 		if (errRfClose != Error_Succeed)
 		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
 			SetErrorAndLog(errRfClose, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__,
 				false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 			ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject();
 			m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("ReadAndScanUTF8JS DevAdapter::ForceIDEject");
 
 			if (errEject != Error_Succeed)
 			{
 				SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
 					false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)
+					.setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)();
+			}
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ.");
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)
+				.setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)();
 		}
 	}
 
@@ -1610,7 +1598,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 				SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
 					true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
+				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
 
 				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
 			}
@@ -1619,14 +1607,14 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		{
 			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__,
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
+			//DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
 
 			ctx->Answer(Error_Unexpect, GetAlarmDEC());
 		}
 		else
 		{
 			
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadAndScanUTF8::IDCerAuthenticate(Timeout) failed with errcode: %d", errAuth);
+			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadAndScanUTF8::IDCerAuthenticate(Timeout) failed with errcode: %d", errAuth);
 			if (errAuth == Error_DevMedia)
 			{
 				SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate_NotIDCard, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
@@ -1641,6 +1629,12 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 			}
 		}
 	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8JS some thing wrong.");
+		ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed);
+		LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong.");
+	}
 
 	if (eErr1 == Error_Succeed && pos == 2)
 	{
@@ -1671,9 +1665,9 @@ ErrorCodeEnum CIDCertFSM::GetPngBlobEx(CBlob &data, CSimpleStringA fileNamePrefi
 	CSimpleStringA strPath, errMsg, strOldPath;
 	ErrorCodeEnum eErr;
 	eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[Dep]%s,%s", SpStrError(eErr), strPath.GetData());
 	if (eErr != Error_Succeed)
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get [Dep] path failed!  errcode:%s.", SpStrError(eErr));
 		if (bClear)
 			DeleteZP(Bmp_SCAN);
 		return Error_Param;

+ 0 - 1
Module/mod_IDCertificate/IDCertFSM.h

@@ -95,7 +95,6 @@ enum BmpType
 #include "IDCertificate_def_g.h"
 #pragma region forsonar
 typedef IDCertificate::IDCertService_CancelRead_Info IDCert_CancelRead_Info;
-typedef IDCertificate::IDCertService_ReadWaitMore_Info IDCert_ReadWaitMore_Info;
 typedef IDCertificate::IDCertService_ReadAndScanUTF8_Req IDCert_ReadAndScanUTF8_Req; //ex2
 typedef IDCertificate::IDCertService_ReadAndScanUTF8_Ans IDCert_ReadAndScanUTF8_Ans;
 typedef IDCertificate::IDCertService_ReadAndScanUTF8JS_Req IDCert_ReadAndScanUTF8JS_Req; //js ReadAndScanUTF8

+ 1 - 11
Module/mod_IDCertificate/IDCertificate.xml

@@ -2,17 +2,7 @@
 <entity name="IDCertificate">
 	<class name="IDCertService" overlap="true" exclusive="false">			
 		<oneway name="CancelRead" overlap="true" method_id="1">		
-		</oneway>
-		<oneway name="ReadWaitMore" overlap="true" method_id="2">		
-		</oneway>
-		<oneway name="Exit" overlap="true" method_id="3">		
-		</oneway>
-		<twoway name="Eject" overlap="true" method_id="5">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>		
+		</oneway>		
 		<!-- 1、设备未打开,errorCodeΪError_DevNotAvailable(2050),rtaCodeΪRTA2105 -->
 		<twoway name="GetDevInfo" overlap="true" method_id="65535">
 			<req>

+ 0 - 77
Module/mod_IDCertificate/IDCertificate_client_g.h

@@ -72,83 +72,6 @@ public:
 		return ret;
 	}
 
-	ErrorCodeEnum ReadWaitMore()
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->OnewayCall(IDCertService_Method_ReadWaitMore, IDCertService_MethodSignature_ReadWaitMore, m_context);
-		m_context.clear();
-		return ret;
-	}
-
-	ErrorCodeEnum Exit()
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->OnewayCall(IDCertService_Method_Exit, IDCertService_MethodSignature_Exit, m_context);
-		m_context.clear();
-		return ret;
-	}
-
-	ErrorCodeEnum Eject(IDCertService_Eject_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(IDCertService_Method_Eject, IDCertService_MethodSignature_Eject, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Eject(IDCertService_Eject_Req &Req, IDCertService_Eject_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Eject(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Eject(IDCertService_Eject_Req &Req, IDCertService_Eject_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Eject(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Eject(IDCertService_Eject_Req &Req, IDCertService_Eject_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Eject(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
 	ErrorCodeEnum GetDevInfo(IDCertService_GetDevInfo_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
 	{
 		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();

+ 0 - 45
Module/mod_IDCertificate/IDCertificate_def_g.h

@@ -13,27 +13,18 @@ namespace IDCertificate {
 //
 
 #define IDCertService_Method_CancelRead 1
-#define IDCertService_Method_ReadWaitMore 2
-#define IDCertService_Method_Exit 3
-#define IDCertService_Method_Eject 5
 #define IDCertService_Method_GetDevInfo 65535
 #define IDCertService_Method_ReadAndScanUTF8 9
 #define IDCertService_Method_ReadAndScanUTF8JS 10
 #define IDCertService_Method_CancelReadJS 11
 
 #define IDCertService_MethodSignature_CancelRead -342104338
-#define IDCertService_MethodSignature_ReadWaitMore -5778028
-#define IDCertService_MethodSignature_Exit -1158854104
-#define IDCertService_MethodSignature_Eject -377455114
 #define IDCertService_MethodSignature_GetDevInfo 296205965
 #define IDCertService_MethodSignature_ReadAndScanUTF8 1171255469
 #define IDCertService_MethodSignature_ReadAndScanUTF8JS 1636770944
 #define IDCertService_MethodSignature_CancelReadJS -1728083983
 
 #define IDCertService_LogCode_CancelRead "QLR040220101"
-#define IDCertService_LogCode_ReadWaitMore "QLR040220102"
-#define IDCertService_LogCode_Exit "QLR040220103"
-#define IDCertService_LogCode_Eject "QLR040220105"
 #define IDCertService_LogCode_GetDevInfo "QLR040220199"
 #define IDCertService_LogCode_ReadAndScanUTF8 "QLR040220109"
 #define IDCertService_LogCode_ReadAndScanUTF8JS "QLR040220110"
@@ -48,42 +39,6 @@ struct IDCertService_CancelRead_Info
 
 };
 
-struct IDCertService_ReadWaitMore_Info
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct IDCertService_Exit_Info
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct IDCertService_Eject_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct IDCertService_Eject_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
 struct IDCertService_GetDevInfo_Req
 {
 

+ 0 - 81
Module/mod_IDCertificate/IDCertificate_server_g.h

@@ -37,27 +37,6 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
-		case IDCertService_Method_ReadWaitMore:
-			if (dwSignature == IDCertService_MethodSignature_ReadWaitMore) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case IDCertService_Method_Exit:
-			if (dwSignature == IDCertService_MethodSignature_Exit) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case IDCertService_Method_Eject:
-			if (dwSignature == IDCertService_MethodSignature_Eject) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
 		case IDCertService_Method_GetDevInfo:
 			if (dwSignature == IDCertService_MethodSignature_GetDevInfo) {
 				bOverlap = true;
@@ -102,21 +81,6 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
-		case IDCertService_Method_ReadWaitMore:
-			if (dwSignature != IDCertService_MethodSignature_ReadWaitMore) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case IDCertService_Method_Exit:
-			if (dwSignature != IDCertService_MethodSignature_Exit) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case IDCertService_Method_Eject:
-			if (dwSignature != IDCertService_MethodSignature_Eject) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
 		case IDCertService_Method_GetDevInfo:
 			if (dwSignature != IDCertService_MethodSignature_GetDevInfo) {
 				Error = Error_MethodSignatureFailed;
@@ -149,21 +113,6 @@ public:
 	/// override by user
 	}
 
-	virtual void Handle_ReadWaitMore(SpOnewayCallContext<IDCertService_ReadWaitMore_Info>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Exit(SpOnewayCallContext<IDCertService_Exit_Info>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Eject(SpReqAnsContext<IDCertService_Eject_Req, IDCertService_Eject_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
 	virtual void Handle_GetDevInfo(SpReqAnsContext<IDCertService_GetDevInfo_Req, IDCertService_GetDevInfo_Ans>::Pointer ctx)
 	{
 	/// override by user
@@ -210,36 +159,6 @@ public:
 						Handle_CancelRead(ctx);
 					}
 					break;
-				case IDCertService_Method_ReadWaitMore:
-					{
-						SpOnewayCallContext<IDCertService_ReadWaitMore_Info>::Pointer ctx;
-						ctx.Attach(new SpOnewayCallContext<IDCertService_ReadWaitMore_Info>());
-						SpBuffer2Object(Buf, ctx->Info);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_ReadWaitMore(ctx);
-					}
-					break;
-				case IDCertService_Method_Exit:
-					{
-						SpOnewayCallContext<IDCertService_Exit_Info>::Pointer ctx;
-						ctx.Attach(new SpOnewayCallContext<IDCertService_Exit_Info>());
-						SpBuffer2Object(Buf, ctx->Info);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Exit(ctx);
-					}
-					break;
-				case IDCertService_Method_Eject:
-					{
-						SpReqAnsContext<IDCertService_Eject_Req,IDCertService_Eject_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<IDCertService_Eject_Req,IDCertService_Eject_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Eject(ctx);
-					}
-					break;
 				case IDCertService_Method_GetDevInfo:
 					{
 						SpReqAnsContext<IDCertService_GetDevInfo_Req,IDCertService_GetDevInfo_Ans>::Pointer ctx;

+ 6 - 2
Module/mod_cardissuerstore/CardIssuerFSM.cpp

@@ -8546,6 +8546,8 @@ int CCardIssuerFSM::IssueFromBoxJS(SpReqAnsContext<CardIssuerStoreService_IssueF
 	if (ctx->Req.hopper < 1 || ctx->Req.hopper > 6) {
 		errMsg = CSimpleStringA::Format("Issuer Card, the hopperNo(%d) is wrong!!!", ctx->Req.hopper);
 		LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_Invalid_Hopper, errMsg.GetData());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040222045").setResultCode("RTA2WCX")(errMsg.GetData());
+		ctx->Answer(Error_Param, CardIssuerStore_UserErrorCode_Invalid_Hopper);
 		return 1;
 	}
 	m_currentHopper = ctx->Req.hopper;//设置发送的卡箱号
@@ -8759,6 +8761,8 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStoreService_ReadJS_Req, Ca
 		if (ICtype == 0) {
 			ctx->Ans.magStatus = 0;
 			ctx->Ans.icState = 0;
+			ctx->Ans.icMode = -1;
+			ctx->Ans.result = "";
 			ctx->Answer(Error_Succeed);//无磁无IC直接返回
 		}
 		else if (ICtype == 2) {
@@ -10614,11 +10618,11 @@ int CCardIssuerFSM::PreOnlineCrossJS_RF(SpReqAnsContext<CardIssuerStoreService_P
 			GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
 
 			if (IsInBusiness()) {
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040222052").setResultCode("RTA2W0V")(csErrMsgWithReturnCode.GetData());
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040222052").setResultCode("RTA2W26")(csErrMsgWithReturnCode.GetData());
 				LogError(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040222052").setResultCode("RTA2W0V")(csErrMsgWithReturnCode.GetData());
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040222052").setResultCode("RTA2W26")(csErrMsgWithReturnCode.GetData());
 				LogWarn(Severity_Middle, Error_Unexpect, CardIssuerStore_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
 			}
 			ctx->Answer(Error_Unexpect, CardIssuerStore_UserErrorCode_ActiveContactlessICCard_Failed);		

+ 1 - 3
Module/mod_chromium/mod_chromium.cpp

@@ -533,9 +533,7 @@ namespace Chromium {
 
 #if defined(RVC_OS_LINUX)
         Error = GetFunction()->SubscribeLog(m_uuidAllFault, this, Log_Notify, Severity_High, Error_IgnoreAll, -2, NULL, false);
-        if (Error_Succeed == Error) {
-            this->GetFunction()->GetPrivilegeFunction()->RefreshFrameworkState(FrameworkState_NotDisturb);
-        } else {
+        if (Error_Succeed != Error) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("subscribe log for notify failed! %s", SpStrError(Error));
         }
 #endif //RVC_OS_LINUX

+ 14 - 0
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -379,6 +379,9 @@ int CHealthManagerFSM::AccessAuthDoWork()
 		if (m_pACClient != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to call accessauth regist");
+			CSystemRunInfo sysRunInfo;
+			if (GetEntityBase()->GetFunction()->GetSystemRunInfo(sysRunInfo) != Error_Succeed || sysRunInfo.eAppBootState == AppBootState_StartEntity)
+				GetEntityBase()->GetFunction()->GetPrivilegeFunction()->RefreshAppBootState(AppBootState_CallAccessAuth);
 			m_ullAuthStart = SP::Module::Comm::RVCGetTickCount();
 			eErrCode = (*m_pACClient)(EntityResource::getLink().upgradeLink())->Regist();
 			m_bHasAuthEver = true;
@@ -1333,4 +1336,15 @@ void CHealthManagerFSM::CheckIfPinPadOK()
 	m_ullWaitForPinPad = ullWaitEnd - ullWaitStart;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501A3").setCostTime(m_ullWaitForPinPad)("finish (or time out) check  PinPad");
 	return;
+}
+bool CHealthManagerFSM::CheckIfAccessAuthSuc() 
+{
+	if (m_iAccessAuth == VtmLoad_AccessAuth_Suc)
+		return true;
+	CSimpleStringA csTmpTS("");
+	GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTmpTS);
+	if (csTmpTS.Compare("A") == 0)
+		return true;
+	else
+		return false;
 }

+ 2 - 1
Module/mod_healthmanager/HealthManagerFSM.h

@@ -161,9 +161,10 @@ public:
 
 	int AccessAuthDoWork();
 	void SetVtmLoadResult(int bResult);
-	bool GetAccessAuthFlag(){return m_iAccessAuth == VtmLoad_AccessAuth_Suc;}
+	bool CheckIfAccessAuthSuc();
 	int GetFSMState(){return m_fsmState;}
 	void ToReAccessAuth(bool bEver=false);
+	//oilyang@20250313 这个函数只有GetNetworkState,用来干嘛?而且在健康lost之后失效
 	int QueryAccessAuthStatus()
 	{
 		if (m_iAccessAuth == VtmLoad_AccessAuth_Suc)

+ 21 - 36
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -257,7 +257,7 @@ void CHealthManagerEntity::OnCheckTimeTimeout()
 		eErrCode = GetFunction()->GetSysVar("TerminalStage", csTermStage);
 		Dbg("OnCheckTimeTimeout::ToRestartByCenterSetting to get termstage %s", csTermStage.GetData());
 		//oilyang@20250313 in Main page('UIState' is 'M') or TerminalStage is (NOT 'S') AND (NOT 'A'),that is in close page which caused by terminal app
-		if (CheckUIStateIsM() || (!CheckUIStateIsM() && csTermStage.Compare("S") != 0 && csTermStage.Compare("A") != 0) )
+		if (m_bInMainPage || (!m_bInMainPage && csTermStage.Compare("S") != 0 && csTermStage.Compare("A") != 0) )
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("THE key CenterSetting updated,we must restart framework right now.");
 			m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
@@ -299,13 +299,9 @@ void CHealthManagerEntity::OnCheckTimeTimeout()
 		//1、AccessAuth ok
 		//2、have ever enter main page OR 
 		if (!m_bSayIdle)
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_fsm.GetAccessAuthFlag():%d, m_bEnterMainPageEver:%d, m_bInMainPage:%d", m_fsm.GetAccessAuthFlag()
-				, m_bEnterMainPageEver, CheckUIStateIsM());
-		//oilyang@20241230 check accessauth flag AND if in Main page ever
-		//oilyang@20250313 "Main page ever" has two scenes
-		//1. have enter main page ever,that is "m_bEnterMainPageEver is true"
-		//2. healthmanager have been lost at some point in the past,we check the "UIState" value if 'M'
-		if (m_fsm.GetAccessAuthFlag() && (m_bEnterMainPageEver || (!m_bEnterMainPageEver && CheckUIStateIsM())))
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_fsm.GetAccessAuthFlag():%d, CheckIfHaveEnterMainPageEver:%d", m_fsm.CheckIfAccessAuthSuc(), CheckIfHaveEnterMainPageEver());
+		//oilyang@20241230 check if have enter Main page ever
+		if (CheckIfHaveEnterMainPageEver())
 		{
 			iCheckGuardian = CheckGuardianIsRun(true);
 			if (!m_bSayIdle)
@@ -379,7 +375,7 @@ void CHealthManagerEntity::OnCheckTimeTimeout()
 		else
 		{
 			//oilyang@20190905 add if auth suc,tell guardian,for upgrade
-			if (m_fsm.GetAccessAuthFlag())
+			if (m_fsm.CheckIfAccessAuthSuc())
 			{
 				if (CheckGuardianIsRun(true) > 0)
 				{
@@ -1272,11 +1268,11 @@ void CHealthManagerEntity::OnSysVarEvent(const char *pszKey, const char *pszValu
 		if (_strnicmp(pszValue, "M", strlen("M")) == 0)
 		{
 			m_bInMainPage = true;
-			m_bEnterMainPageEver = true;
-
-			if (!m_bHaveThrowMainPage)
+			if (!CheckIfHaveEnterMainPageEver())
 			{
-				m_bHaveThrowMainPage = true;
+				CSystemRunInfo sysRunInfo;
+				if (GetFunction()->GetSystemRunInfo(sysRunInfo) != Error_Succeed || sysRunInfo.eAppBootState == AppBootState_CallAccessAuth)
+					GetFunction()->GetPrivilegeFunction()->RefreshAppBootState(AppBootState_FirstEnterMainPage);
 				
 				CSmartPointer<IConfigInfo> spConfigRun;
 				ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, spConfigRun);
@@ -1302,8 +1298,6 @@ void CHealthManagerEntity::OnSysVarEvent(const char *pszKey, const char *pszValu
 		}
 		else
 			m_bInMainPage = false;
-
-
 	}
 }
 void CHealthManagerEntity::OnBroadcastEvent(CUUID SubID, const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer)
@@ -1315,7 +1309,7 @@ void CHealthManagerEntity::OnTimeout(DWORD dwTimeID)
 	switch (dwTimeID)
 	{
 	case HEALTHMANAGER_WAIT_MAINPAGE_OPEN_TIMER_ID:
-		if (!m_bHaveThrowMainPage)
+		if (!CheckIfHaveEnterMainPageEver())
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setResultCode("RTA5101")
 			("After receive accessauth success event, havn't receive enter main page.", m_maxWaitMainpageTime / 1000);
 		break;
@@ -1455,18 +1449,6 @@ namespace
 	}
 }
 
-bool CHealthManagerEntity::IsTestMode()
-{
-	static int flag = -1;
-	if (flag == -1) {
-		CSystemRunInfo runInfo;
-		bool result = (GetFunction()->GetSystemRunInfo(runInfo) == Error_Succeed
-			&& !!(runInfo.dwBootOption & SystemBootOptionEnum::BootOption_Test));
-		flag = result ? 1 : 0;
-	}
-	return !!flag;
-}
-
 void CHealthManagerEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState)
 {
 	CSmartPointer<IEntityFunction> pFunc = GetFunction();
@@ -1508,7 +1490,7 @@ void CHealthManagerEntity::OnEntityStateHook(const char* pszEntityName, const ch
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501S1").setResultCode(csResultCode.GetData())(tmpWarnMsg.GetData());
 			//doing nothing before enter main page. HandShake will take it.
 			//AND if selfcheck is doing, no action at all
-			if (m_bEnterMainPageEver && m_modRunInfo[pszEntityName].abnormalCount < m_maxAbnormalTimes && !m_modRunInfo[pszEntityName].bAbnormalBusy)
+			if (CheckIfHaveEnterMainPageEver() && m_modRunInfo[pszEntityName].abnormalCount < m_maxAbnormalTimes && !m_modRunInfo[pszEntityName].bAbnormalBusy)
 			{
 				m_modRunInfo[pszEntityName].bAbnormalBusy = true;
 				m_modRunInfo[pszEntityName].abnormalCount++;
@@ -1744,20 +1726,23 @@ void CHealthManagerEntity::EntityLostProc(CSimpleStringA entityName)
 	}
 	else
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost start %d", eErrCode);
-	if (m_bEnterMainPageEver && _strnicmp("TokenKeeper", entityName, strlen("TokenKeeper")) == 0)
+	if (CheckIfHaveEnterMainPageEver() && _strnicmp("TokenKeeper", entityName, strlen("TokenKeeper")) == 0)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("TokenKeeper lost");
 		m_fsm.ToReAccessAuth();
 	}
 	m_modRunInfo[entityName].bAbnormalBusy = false;
 }
-bool CHealthManagerEntity::CheckUIStateIsM()
+bool CHealthManagerEntity::CheckIfHaveEnterMainPageEver()
 {
-	if (m_bInMainPage)
-		return true;
-	CSimpleStringA uiState(true);
-	if (GetFunction()->GetSysVar("UIState", uiState) != Error_Succeed || uiState.Compare("M") != 0)
-		return false;
+	if (!m_bSayIdle)
+	{
+		CSystemRunInfo sysRunInfo;
+		if (GetFunction()->GetSystemRunInfo(sysRunInfo) == Error_Succeed && sysRunInfo.eAppBootState == AppBootState_FirstEnterMainPage)
+			return true;
+		else
+			return false;
+	}
 	else
 		return true;
 }

+ 3 - 7
Module/mod_healthmanager/mod_healthmanager.h

@@ -88,7 +88,6 @@ public:
 		, m_bSayIdle(false), m_bGuardianRun(false), m_ullGuardShakeCount(0)
 		, m_menuChoice(""), m_menuPre(""), m_netState("N")
 		, m_bInMainPage(false), m_stopSelfCheck(0)
-		, m_bEnterMainPageEver(false),m_bHaveThrowMainPage(false)
 		,m_bNeedAuthRetry(false), m_bNeedGuardianRestart(true), m_bNeedGuardian(true)
 		, m_bToRestartByCenterSetting(false){}
 	virtual ~CHealthManagerEntity() {}
@@ -213,7 +212,7 @@ public:
 	{
 		ctx->Ans.netDeviceState = m_netState;
 		ctx->Ans.reserved1 = m_fsm.QueryAccessAuthStatus();
-		Dbg("current net state %s,auth state:%d", (LPCTSTR)m_netState, ctx->Ans.reserved1);
+		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_USER).setLogCode(HealthManagerService_LogCode_GetNetworkState)("current net state %s,auth state:%d", (LPCTSTR)m_netState, ctx->Ans.reserved1);
 		ctx->Answer(Error_Succeed);
 	}
 
@@ -265,8 +264,7 @@ private:
 	int m_stopSelfCheck;
 	int m_restartHour, m_restartMinute, m_lastHour, m_maxAbnormalTimes, m_rebootHourBegin, m_rebootHourEnd;;
 	bool m_bWaitRestartPC, m_bScreenLock, m_bSayIdle
-		, m_bGuardianRun
-		, m_bInMainPage, m_bEnterMainPageEver, m_bHaveThrowMainPage, m_bToRestartByCenterSetting;
+		, m_bGuardianRun, m_bInMainPage, m_bToRestartByCenterSetting;
 	bool m_bNeedAuthRetry/*需要重试准入*/, m_bNeedGuardianRestart/*需要重启*/, m_bNeedGuardian;
 	DWORD m_dwTimeOfAuthSuc;
 	int m_maxWaitMainpageTime;
@@ -296,10 +294,8 @@ private:
 	
 	CSimpleStringA __ReadCenterConfigStr(CSimpleStringA key, CSimpleStringA entityName);
 
-	bool IsTestMode();
-
 	void ToCalcRebootHourAndMinute(int restartBegin, int restartEnd);
-	bool CheckUIStateIsM();
+	bool CheckIfHaveEnterMainPageEver();
 };
 #endif // __MOD_HEALTHMANAGER_H
 

+ 13 - 1
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -1096,6 +1096,11 @@ int CVtmLoaderFSM::EntityLoad()
 	//oilyang@20240407 add check machine model in ST/UAT test room
 	if (!CheckConfigInfoInTestRoom())
 		return -1;
+	CSystemRunInfo sysRunInfo;
+	if (GetEntityBase()->GetFunction()->GetSystemRunInfo(sysRunInfo) != Error_Succeed || sysRunInfo.eAppBootState == AppBootState_Init)
+		GetEntityBase()->GetFunction()->GetPrivilegeFunction()->RefreshAppBootState(AppBootState_StartEntity);
+	else
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GetSystemRunInfo failed:%d");
 
 	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始加载实体");
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("StartLoadEntity")("开始加载实体");
@@ -1829,8 +1834,15 @@ bool CVtmLoaderFSM::GetConfig()
 ErrorCodeEnum CVtmLoaderFSM::SubscribeEntitysEvents()
 {
 	//want to do what?
-
 	auto rc = Error_Succeed;
+	/*GifutTest20250314 begin*/
+	CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
+	rc = pFunc->RegistTerminalStateChangeEvent(dynamic_cast<ITerminalStateChangedListener*>(this->GetEntityBase()));
+	if (rc != Error_Succeed)
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RegistTerminalStateChangeEvent failed: %s", SpStrError(rc));
+	}
+	/*GifutTest20250314 end*/
 	return rc;
 }
 int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)

+ 9 - 0
Module/mod_vtmloader/mod_vtmloader.h

@@ -87,6 +87,15 @@ public:
 	virtual void OnCloseConnection(const char* pszCallerEntity, const char* pszServiceEntity) { return; }
 	void EntityLostProc(CSimpleStringA entityName);
 	void SetVideoEntityOK() { m_FSM.SetVideoEntityOK(); }
+
+	/*GifutTest20250314 begin*/
+	//void OnStateChanged(AppBootStateEnum oldState, AppBootStateEnum curState, const char* triggerEntity)
+	//{
+	//	LOG_FUNCTION();
+	//	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("state changed from %s to %s by %s", SpStrAppBootState(oldState), SpStrAppBootState(curState), triggerEntity);
+	//}
+	/*GifutTest20250314 end*/
+
 protected:
 	//GUITask m_task;
 	CVtmLoaderFSM m_FSM;