Ver Fonte

Merge branch 'ST2' into feature_dc_rm

80374374 há 4 meses atrás
pai
commit
c0da3f90b4
32 ficheiros alterados com 4505 adições e 1120 exclusões
  1. 2 12
      CMakeLists.txt
  2. 8 66
      DevAdapter/CMakeLists.txt
  3. 1 1
      DevAdapter/simulator/assets/cmbsz.ini
  4. 1 1
      DevAdapter/simulator/include/DeviceSimulator.h
  5. 1 0
      Module/mod_CardIssuerStand/CMakeLists.txt
  6. 0 449
      Module/mod_CardIssuerStand/CardIssuer.xml
  7. 2293 6
      Module/mod_CardIssuerStand/CardIssuerFSM.cpp
  8. 314 4
      Module/mod_CardIssuerStand/CardIssuerFSM.h
  9. 169 2
      Module/mod_CardIssuerStand/CardIssuerStand.xml
  10. 357 0
      Module/mod_CardIssuerStand/CardIssuerStand_client_g.h
  11. 203 0
      Module/mod_CardIssuerStand/CardIssuerStand_def_g.h
  12. 216 0
      Module/mod_CardIssuerStand/CardIssuerStand_server_g.h
  13. 21 0
      Module/mod_CardIssuerStand/CardIssuer_UserErrorCode.h
  14. 59 0
      Module/mod_CardIssuerStand/mod_cardissuer.cpp
  15. 151 0
      Module/mod_CardIssuerStand/mod_cardissuer.h
  16. 1 1
      Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp
  17. 2 2
      Module/mod_FingerPrint/mod_FingerPrint.h
  18. 13 13
      Module/mod_HSPScanner/HSPScannerFSM.h
  19. 24 33
      Module/mod_IDCertificate/IDCertFSM.cpp
  20. 8 0
      Module/mod_cardissuerstore/CardIssuerFSM.h
  21. 11 0
      Module/mod_cardissuerstore/mod_cardissuer.h
  22. 0 2
      Module/mod_chromium/CWebsocketServer.cpp
  23. 1 0
      Module/mod_facetracking/CMakeLists.txt
  24. 338 319
      Module/mod_facetracking/mod_facetracking.cpp
  25. 65 0
      Module/mod_facetracking/mod_facetracking.h
  26. 1 1
      Module/mod_mediacontroller/capture.cpp
  27. 1 1
      Module/mod_sipphone/audio_session.cpp
  28. 1 1
      Module/mod_sipphone/mod_sipphone.cpp
  29. 1 4
      Other/libaudiomgr/linux/libaudiomgr_linux.cpp
  30. 240 200
      Other/libfacecapture/libfacecapture.cpp
  31. 1 1
      Other/libfacecapture/libfacecapture.h
  32. 1 1
      addin/cmake/DependencyConanFiles.cmake

+ 2 - 12
CMakeLists.txt

@@ -168,13 +168,6 @@ if(DEVOPS_ON)
 		set(BUILD_NUMBER ${RVC_DEV_NUM})
 	endif(DEFINED ENV{ENV_VER_Build})
 
-	if(DEFINED ENV{WITH_DEVADAPTER})
-		message(STATUS "FOR_BUILD DEVADAPTER or not: $ENV{WITH_DEVADAPTER}")
-		if(NOT $ENV{WITH_DEVADAPTER})
-			set(BUILD_DEVADAPTER OFF)
-		endif(NOT $ENV{WITH_DEVADAPTER})
-	endif(DEFINED ENV{WITH_DEVADAPTER})
-
 	if(DEFINED ENV{ONLY_DEVADAPTER})
 		if($ENV{ONLY_DEVADAPTER})
 			set(ONLY_BUILD_DEVADAPTER TRUE)
@@ -185,7 +178,7 @@ if(DEVOPS_ON)
 	if(DEVOPS_ON_CMAKE_PRD)
 		set(RVC_VERSION_SUFFIX "PRD")
 		if(PACK_AS_DEB_PKG)
-		#product version as debian installer, reset the last version element to zero.
+			#product version as debian installer, reset the last version element to zero.
 			set(BUILD_NUMBER 0)
 		endif(PACK_AS_DEB_PKG)
 	else()
@@ -206,6 +199,7 @@ if(DEVOPS_ON)
 
 elseif(BUILD_NUMBER EQUAL 0)
 	set(BUILD_NUMBER ${RVC_DEV_NUM})
+
 endif(DEVOPS_ON)
 
 message(STATUS "BUILD_NUMBER ${BUILD_NUMBER}")
@@ -641,10 +635,6 @@ else()
 endif(BUILD_TOOLS)
 
 if(BUILD_DEVADAPTER)
-	set(ONLY_PURE_ADAPTER_RELY FALSE)
-	add_subdirectory(DevAdapter)
-else()
-	set(ONLY_PURE_ADAPTER_RELY TRUE)
 	add_subdirectory(DevAdapter)
 endif(BUILD_DEVADAPTER)
 

+ 8 - 66
DevAdapter/CMakeLists.txt

@@ -166,87 +166,29 @@ message(STATUS "vendor log library: ${VENDOR_LOG_LIB_NAME}")
 
 # 通过conan的方式管理厂商库
 if(DEVADAPTER_USING_CONAN)
-    if(MSVC) #Windows 厂商适配器
-        if(RVC_INTEGRATE_BUILDV2 AND NOT ONLY_PURE_ADAPTER_RELY)
-            #厂商适配器兼容WIN的提交,需要将以前的ZIP链接转化为Conan依赖包,处理完之后这里填写内容进行拉取:Demo
-            #set(CMB_CONAN_ALL_LIB_NAME cmb/2024.0315.20@LR04.02_VendorLib/msvc)
-            #长城读卡接口优化
-            set(GWI_CONAN_ALL_LIB_NAME gwi/2024.0722.6@LR04.02_VendorLib/msvc)
-            set(KEBA_CONAN_ALL_LIB_NAME keba/2024.0326.23@LR04.02_VendorLib/msvc)
-            #【阅知】关于适配器解耦完成测试事宜
-            set(CW_CONAN_ALL_LIB_NAME cw/2024.1125.57@LR04.02_VendorLib/msvc)
-            #rvc_aggerate_vendor_libs(cmb)
-            rvc_aggerate_vendor_libs(gwi)
-            rvc_aggerate_vendor_libs(keba)
-            rvc_aggerate_vendor_libs(cw)
-        endif(RVC_INTEGRATE_BUILDV2 AND NOT ONLY_PURE_ADAPTER_RELY)
-    else() #UOS厂商适配器
-        if(RVC_INTEGRATE_BUILDV2 AND NOT ONLY_PURE_ADAPTER_RELY)
-            #邮件 试运行设备的密码键盘与读卡器的提示灯物理地址与测试样机的物理地址不一致
-            set(KEBA_CONAN_ALL_LIB_NAME keba/2024.0814.32@LR04.02_VendorLib/stable)
-            #【阅知】关于适配器解耦完成测试事宜
-            set(CW_CONAN_ALL_LIB_NAME cw/2024.1220.47@LR04.02_VendorLib/stable)
-            #【阅知】关于适配器解耦完成测试事宜
-            set(SZZT_CONAN_ALL_LIB_NAME szzt/2024.1209.40@LR04.02_VendorLib/stable)
-            #长城信创单屏设备root.ini配置需要更新为(根据行方规范,将信创单屏设备版本号修改为2.x)
-            set(GWI_CONAN_ALL_LIB_NAME gwi/2024.0723.20@LR04.02_VendorLib/stable)
-            #Fw: 回复:回复: Fw: 回复:回复: Fw: 南天-缺陷案例解决方案及适配器整合
-            set(NANTIAN_CONAN_ALL_LIB_NAME nantian/2024.0802.2@LR04.02_VendorLib/stable)
-            #Fw: 单屏VTM最新版本链接
-            set(GRG_CONAN_ALL_LIB_NAME grg/2024.0913.45@LR04.02_VendorLib/stable)
-            #根据开发规范适配器与依赖库简称由【CBPM】变更为【cbpm】案例自测完成
-            set(CBPM_CONAN_ALL_LIB_NAME cbpm/2024.1101.10@LR04.02_VendorLib/stable)
-            rvc_aggerate_vendor_libs(keba)
-            rvc_aggerate_vendor_libs(cw)
-            rvc_aggerate_vendor_libs(szzt)
-            rvc_aggerate_vendor_libs(gwi)
-            rvc_aggerate_vendor_libs(nantian)
-            rvc_aggerate_vendor_libs(grg)
-            rvc_aggerate_vendor_libs(cbpm)
-        endif(RVC_INTEGRATE_BUILDV2 AND NOT ONLY_PURE_ADAPTER_RELY)
-    endif(MSVC)
-
     if(MSVC)
-        #CardLibDB_CMB.db3
-        if(NOT ONLY_PURE_ADAPTER_RELY)
-            conan_cmake_run(REQUIRES VendorDLL/2024.11.1401@LR04.02_VendorLib/testing
-                BASIC_SETUP CMAKE_TARGETS)
-        endif(NOT ONLY_PURE_ADAPTER_RELY)
-
         set(SELF_CONAN_LIB_NAME self/2024.1217.01@LR04.02_VendorLib/testing)
         add_subdirectory(self)
     endif(MSVC)
-
 endif(DEVADAPTER_USING_CONAN)
 
-if(NOT ONLY_PURE_ADAPTER_RELY)
-    file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt")
-endif(NOT ONLY_PURE_ADAPTER_RELY)
-
+file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt")
 foreach(dir ${all_valid_subdirs})
 	if(${dir} MATCHES "^([^/]*)/+CMakeLists.txt")
 		string(REGEX REPLACE "^([^/]*)/+CMakeLists.txt" "\\1" dir_trimmed ${dir})
         # remove 'self' sub directory bcz it would be added seperately
-        if(DEVOPS_ON)
+        if(DEVOPS_ON_CMAKE_PRD)
             #硬件模拟器在生产流水线不参与编译
-            #liblog4vendor 单独上面提前编译
+            #liblog4vendor 和 self 已在上面提前单独编译
             #simulator 编译纯适配器时无法编译,因为依赖框架RVCComm库
-            if(DEVOPS_ON_CMAKE_PRD)
-                string(FIND "liblog4vendor|self|cmbsz|simulator" ${dir_trimmed} found)
-            else()
-                if(ONLY_BUILD_DEVADAPTER)
-                    string(FIND "liblog4vendor|self|cmbsz|simulator" ${dir_trimmed} found)
-                else()
-                    string(FIND "liblog4vendor|self|cmbsz" ${dir_trimmed} found)
-                endif(ONLY_BUILD_DEVADAPTER)
-            endif(DEVOPS_ON_CMAKE_PRD)
+            string(FIND "liblog4vendor|self|cmbsz|simulator" ${dir_trimmed} found)
         else()
-            if(ONLY_BUILD_DEVADAPTER)
-                string(FIND "liblog4vendor|self|simulator" ${dir_trimmed} found)
+            if(DEVOPS_ON)
+                string(FIND "liblog4vendor|self|cmbsz" ${dir_trimmed} found)
             else()
                 string(FIND "liblog4vendor|self" ${dir_trimmed} found)
-            endif(ONLY_BUILD_DEVADAPTER)
-        endif(DEVOPS_ON)
+            endif(DEVOPS_ON)
+        endif(DEVOPS_ON_CMAKE_PRD)
         message(STATUS "found: ${found}")
         if((NOT RVC_INTEGRATE_BUILD) OR (${found} EQUAL -1))
 		    message(STATUS "Adding vendor component ${dir_trimmed}")

+ 1 - 1
DevAdapter/simulator/assets/cmbsz.ini

@@ -1,2 +1,2 @@
 [server]
-url=http://emulatoruser.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData
+url=http://emulatoruser.paasuat.cmbchina.cn/emulator/avs/retrieveEmulatorData

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

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

+ 1 - 0
Module/mod_CardIssuerStand/CMakeLists.txt

@@ -16,6 +16,7 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${ModuleCommonHeadPath}
 	${MODULE_BASE_DIR}/mod_heartbeat
 	${MODULE_BASE_DIR}/mod_accessauth
+	${MODULE_BASE_DIR}/mod_healthmanager
 	${RVC_OTHER_DEPENDENIES_DIR}/libpublicFun
 	${CONAN_INCLUDE_DIRS_OPENSSL}
 	${CONAN_INCLUDE_DIRS_JSONCPP}

+ 0 - 449
Module/mod_CardIssuerStand/CardIssuer.xml

@@ -1,449 +0,0 @@
-<?xml version="1.0" encoding="gb2312" ?>
-<entity name="CardIssuer">
-	<class name="CardIssuerService" overlap="true" exclusive="false">	
-		<twoway name="Insert" overlap="true" method_id="0">
-			<req>
-				<param name="aid" type="string"/>
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<oneway name="CancelInsert" overlap="true" method_id="1">			
-		</oneway>
-		<oneway name="InsertWaitMore" overlap="true" method_id="2">			
-		</oneway>					
-		<twoway name="Read" overlap="true" method_id="3">
-			<req>
-				<param name="aid" type="string"/>
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="int"/>
-				<param name="reserved3" type="string"/>
-				<param name="reserved4" type="string"/>
-			</req>
-			<res>
-				<param name="track1" type="string"/>
-				<param name="track2" type="string"/>
-				<param name="track3" type="string"/>
-				<param name="ICType" type="int"/>
-				<param name="ICData" type="string"/>
-				<param name="status" type="int" />
-				<param name="t2Account" type="string" />
-				<param name="t2Region" type="string" />
-				<param name="t2CardSerial" type="string" />
-				<param name="t2CVC" type="string" />
-				<param name="t2ExpireDate" type="string" />
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="int"/>
-				<param name="reserved3" type="string"/>
-				<param name="reserved4" type="string"/>
-			</res>
-		</twoway>			
-		<twoway name="Capture" overlap="true" method_id="4">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<twoway name="Eject" overlap="true" method_id="5">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>						
-		<twoway name="PreOnline" overlap="true" method_id="6">
-			<req>
-				<param name="businessData" type="string"/>
-				<param name="reserved1" type="string"/>
-				<param name="reserved2" type="string"/>
-			</req>
-			<res>
-				<param name="result" type="string"/>
-			</res>			
-		</twoway>
-		<twoway name="PostOnline" overlap="true" method_id="7">
-			<req>
-				<param name="data" type="string"/>
-			</req>
-			<res>
-				<param name="result" type="string"/>
-			</res>			
-		</twoway>
-		<oneway name="Exit" overlap="true" method_id="8">			
-		</oneway>			
-		<twoway name="Issue" overlap="true" method_id="9">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>				
-		<twoway name="GetMaterialCount" overlap="true" method_id="10">
-			<req>
-			</req>
-			<res>
-				<param name="remains" type="int"/>
-				<param name="captured" type="int"/>
-				<param name="issued" type="int"/>
-				<param name="mixed" type="int"/>
-			</res>			
-		</twoway>
-		<twoway name="SetMaterialCount" overlap="true" method_id="11">
-			<req>
-				<param name="remains" type="int"/>
-				<param name="captured" type="int"/>
-				<param name="issued" type="int"/>
-				<param name="bRemains" type="bool"/>
-				<param name="bCaptured" type="bool"/>				
-				<param name="bIssued" type="bool"/>
-				<param name="mixed" type="int"/>
-				<param name="bMixed" type="bool"/>
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<oneway name="SetIssueFlag" overlap="true" method_id="12">			
-		</oneway>
-		<twoway name="ReadEx" overlap="true" method_id="13">
-			<req>
-				<param name="aid" type="string"/>
-				<param name="reserved1" type="string"/>
-				<param name="reserved2" type="string"/>
-			</req>
-			<res>
-				<param name="track1" type="string"/>
-				<param name="track2" type="string"/>
-				<param name="track3" type="string"/>
-				<param name="CDType" type="int"/>
-				<param name="ICType" type="int"/>
-				<param name="CMBType" type="int"/>
-				<param name="ICData" type="string"/>
-				<param name="status" type="int" />
-				<param name="t2Account" type="string" />
-				<param name="t2Region" type="string" />
-				<param name="t2CardSerial" type="string" />
-				<param name="t2CVC" type="string" />
-				<param name="t2ExpireDate" type="string" />
-				<param name="reserved1" type="string"/>
-				<param name="reserved2" type="string"/>
-			</res>
-		</twoway>
-		<twoway name="QueryCardInfo" overlap="true" method_id="14">
-			<req>
-			</req>
-			<res>
-				<param name="position" type="int"/>
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="string"/>
-			</res>			
-		</twoway>
-		<twoway name="WriteTrack" overlap="true" method_id="15">
-			<req>
-				<param name="mode" type="int"/>
-				<param name="co" type="int"/>
-				<param name="track1" type="wstring"/>
-				<param name="track2" type="wstring"/>
-				<param name="track3" type="wstring"/>
-				<param name="reserved" type="wstring"/>
-			</req>
-			<res>
-				<param name="result" type="int"/>
-				<param name="reserved1" type="int"/>
-				<param name="reserved2" type="string"/>
-			</res>
-		</twoway>
-		<twoway name="GetMaterialCountEx" overlap="true" method_id="16">
-			<req>
-				<param name="GetHopper" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>		
-			</req>
-			<res>
-				<param name="captured" type="int"/>
-				<param name="hasHopper" type="array_int"/>
-				<param name="CardBoxNo" type="array_string"/>
-				<param name="PsbCode" type="array_string"/>
-				<param name="PsbName" type="array_string"/>
-				<param name="Maintainer" type="array_string"/>
-				<param name="MaintainTime" type="array_string"/>
-				<param name="CardInit" type="array_int"/>
-				<param name="CardPercent" type="array_int"/>
-				<param name="remains" type="array_int"/>
-				<param name="issued" type="array_int"/>
-				<param name="mixed" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</res>			
-		</twoway>
-		<twoway name="SetMaterialCountEx" overlap="true" method_id="17">
-			<req>
-				<param name="SetHopper" type="array_int"/>
-				<param name="SetCaptured" type="int"/>
-				<param name="captured" type="int"/>
-				<param name="CardBoxNo" type="array_string"/>
-				<param name="PsbCode" type="array_string"/>
-				<param name="PsbName" type="array_string"/>
-				<param name="Maintainer" type="array_string"/>
-				<param name="MaintainTime" type="array_string"/>
-				<param name="CardInit" type="array_int"/>
-				<param name="CardPercent" type="array_int"/>
-				<param name="remains" type="array_int"/>
-				<param name="issued" type="array_int"/>
-				<param name="mixed" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>	
-			</res>			
-		</twoway>
-		<twoway name="SetSomeFlag" overlap="true" method_id="18">
-			<req>
-				<param name="IssueBusiness" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</res>				
-		</twoway>
-		<twoway name="GetSCIInfo" overlap="true" method_id="19">
-			<req>
-			</req>
-			<res>
-				<param name="connected" type="int"/>
-				<param name="DevSN" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>
-			</res>			
-		</twoway>
-		<twoway name="IssueEx" overlap="true" method_id="20">
-			<req>
-				<param name="hopper" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="OpenSafeLock" overlap="true" method_id="21">
-			<req>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="SAMICCommand" overlap="true" method_id="22">
-			<req>
-				<param name="cmdType" type="int"/>
-				<param name="param1" type="array_int"/>
-				<param name="param2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="ret1" type="array_int"/>
-				<param name="ret2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="QueryPrinterStatus" overlap="true" method_id="23">
-			<req>
-				<param name="param1" type="array_int"/>
-				<param name="param2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="ret1" type="array_int"/>
-				<param name="ret2" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="Print" overlap="true" method_id="24">
-			<req>
-				<param name="data1" type="blob"/>
-				<param name="data2" type="blob"/>
-				<param name="data3" type="blob"/>
-				<param name="data4" type="blob"/>
-				<param name="data5" type="blob"/>
-				<param name="data6" type="blob"/>				
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="QuerySCIList" overlap="true" method_id="25">
-			<req>			
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="sciNo" type="array_string"/>
-        <param name="arrMateriel" type="array_string"/>
-        <param name="CardGroove" type="array_string"/>
-        <param name="CardBoxNo" type="array_string"/>
-        <param name="PsbCode" type="array_string"/>
-        <param name="PsbName" type="array_string"/>
-        <param name="CardInit" type="array_uint"/>
-        <param name="CardRemains" type="array_uint"/>
-        <param name="CardIssued" type="array_uint"/>
-        <param name="CardMixed" type="array_uint"/>
-        <param name="CardPercent" type="array_uint"/>
-        <param name="Maintainer" type="array_string"/>
-        <param name="MaintainTime" type="array_string"/>
-        <param name="UpdateTime" type="array_string"/>				
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>		
-		<twoway name="BindSCI" overlap="true" method_id="26">
-			<req>
-				<param name="type" type="int"/>
-				<param name="sciNo" type="string" />			
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>			
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_string"/>					
-			</res>			
-		</twoway>
-		<twoway name="PreOnlineOnStore" overlap="true" method_id="27">
-			<req>
-				<param name="account" type="string"/>
-				<param name="termNo" type="string"/>
-				<param name="businessData" type="string"/>
-				<param name="slot" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="findCard" type="int"/>
-				<param name="cardPos" type="int"/>
-				<param name="result" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="NotifyPreonline" overlap="true" method_id="28">
-			<req>
-				<param name="findCard" type="int"/>
-				<param name="cardPos" type="int"/>			
-				<param name="errCode" type="int"/>			
-				<param name="account" type="string"/>
-				<param name="termNo" type="string"/>
-				<param name="data" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="QueryCardInfoOnStore" overlap="true" method_id="29">
-			<req>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="findCard" type="int"/>
-				<param name="cardPos" type="int"/>					
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="GetAddCardInfo" overlap="true" method_id="30">
-			<req>
-				<param name="isSync" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="count" type="int"/>
-				<param name="slot" type="array_int"/>
-				<param name="account" type="array_string"/>							
-				<param name="cardSerial" type="array_string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>		
-		<twoway name="PrintCardImmediately" overlap="true" method_id="31">
-			<req>
-				<param name="formFile" type="string"/>
-				<param name="printData" type="string"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="ret" type="int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>
-		<twoway name="QueryCIStatus" overlap="true" method_id="32">
-			<req>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>
-			</req>
-			<res>
-				<param name="retainBin" type="int"/>
-				<param name="hopperNo" type="array_int"/>
-				<param name="hopperStatus" type="array_int"/>
-				<param name="reserved1" type="array_int"/>
-				<param name="reserved2" type="array_int"/>
-				<param name="reserved3" type="array_string"/>
-				<param name="reserved4" type="array_string"/>				
-			</res>			
-		</twoway>																		
-		<twoway name="GetDevInfo" overlap="true" method_id="65535">
-			<req>
-			</req>
-			<res>
-				<param name="type" type="string" />
-				<param name="model" type="string" />
-				<param name="version" type="string" />
-				<param name="state" type="int" />
-			</res>			
-		</twoway>							
-	</class>
-	<message name="FetchCard">
-			<param name="status" type="int"/>
-	</message>
-	<message name="SCIConnect">
-			<param name="status" type="int"/>
-	</message>			
-</entity>

+ 2293 - 6
Module/mod_CardIssuerStand/CardIssuerFSM.cpp

@@ -188,12 +188,16 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 	}
 		break;
 	case USER_EVT_EXIT:
+	case EVT_MAINPAGE_DISPLAY:
 	{
 		m_captureReason = "4001";
 		m_bExit = true;
 		pEvt->SetHandled();
-		DoExitWhenIdleTask *task = new DoExitWhenIdleTask(this);
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		if (!m_bDoExit) {
+			SetDoExitFlag(true);
+			DoExitWhenIdleTask* task = new DoExitWhenIdleTask(this);
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		}
 	}
 		break;
 	case USER_EVT_QUIT:
@@ -344,6 +348,35 @@ unsigned int CCardIssuerFSM::s2_on_event(FSMEvent* pEvt)
 		}
 		break;
 	}
+	case USER_EVT_JS_INSERT:
+	{
+		InsertJSEvent* ise = dynamic_cast<InsertJSEvent*>(pEvt);
+		m_bCancelInsert = false;
+		m_bExit = false;
+		InsertJSTask* task = new InsertJSTask(this);
+		task->ctx = ise->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+	}
+		break;
+	case USER_EVT_JS_ISSUE_FROM_BOX:
+	{
+		IssueFromBoxJSTask* task = new IssueFromBoxJSTask(this);
+		IssueFromBoxJSEvent* ife = dynamic_cast<IssueFromBoxJSEvent*>(pEvt);;
+		task->ctx = ife->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+	}
+		break;
+	case USER_EVT_JS_CAPTURE:
+	{
+		CaptureJSEvent* cje = dynamic_cast<CaptureJSEvent*>(pEvt);
+		CaptureJSTask* task = new CaptureJSTask(this);
+		task->ctx = cje->ctx;
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+		pEvt->SetHandled();
+	}
+		break;
 	default:
 		break;
 	}
@@ -396,6 +429,38 @@ unsigned int CCardIssuerFSM::s3_on_event(FSMEvent* pEvt)
 	case USER_EVT_QUIT:
 		pEvt->SetHandled();
 		break;
+	case USER_EVT_JS_INSERT_FINISHED:
+		{
+			ret = pEvt->param1;
+			if (ret == 1) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("插卡时查询设备状态故障");
+				setQuickSelfCheck();
+			}
+			else if (ret == 4) {
+				//吐卡
+				EjectJSEvent* eje = dynamic_cast<EjectJSEvent*>(pEvt);
+				EjectJSTask* task = new EjectJSTask(this);
+				task->ctx = NULL;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+			}
+			pEvt->SetHandled();
+		}
+		break;
+	case USER_EVT_JS_INSERT_CANCEL:
+		{
+			m_bCancelInsert = true;
+			pEvt->SetHandled();
+			ret = 0;
+		}
+		break;
+	case EVT_MAINPAGE_DISPLAY:
+		{
+			m_captureReason = "4001";
+			m_bExit = true;
+			pEvt->SetHandled();
+			ret = 0;
+		}
+		break;
 	default:
 		break;
 	}
@@ -416,6 +481,62 @@ unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s4 evt (%d,%d)", pEvt->iEvt, pEvt->param1));
 
 	switch(pEvt->iEvt){
+		case USER_EVT_JS_READ:
+			{
+				ReadJSEvent* rje = dynamic_cast<ReadJSEvent*>(pEvt);
+				ReadJSTask* task = new ReadJSTask(this);
+				task->ctx = rje->ctx;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+				pEvt->SetHandled();
+				return 0;
+			}
+		case USER_EVT_JS_POSTONLINE:
+			{
+				PostOnlineJSEvent* poe = dynamic_cast<PostOnlineJSEvent*>(pEvt);
+				PostOnlineJSTask* task = new PostOnlineJSTask(this);
+				task->ctx = poe->ctx;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+				pEvt->SetHandled();
+				return 0;
+			}
+		case USER_EVT_JS_EJECT:
+			{
+				EjectJSEvent* eje = dynamic_cast<EjectJSEvent*>(pEvt);
+				EjectJSTask* task = new EjectJSTask(this);
+				task->ctx = eje->ctx;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+				pEvt->SetHandled();
+				return 0;
+			}
+		case USER_EVT_JS_CAPTURE:
+			{
+				CaptureJSEvent* cje = dynamic_cast<CaptureJSEvent*>(pEvt);
+				CaptureJSTask* task = new CaptureJSTask(this);
+				task->ctx = cje->ctx;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+				pEvt->SetHandled();
+				return 0;
+			}
+		case USER_EVT_JS_EXIT_MIAN_PAGE:
+			{
+				if (m_issueStatus) {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S4 receive exception exit to main page, begin capture card");
+					m_captureReason = "4001";
+					CaptureJSTask* task = new CaptureJSTask(this);
+					task->ctx = NULL;
+					GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+					pEvt->SetHandled();
+					return 1;
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S4 receive exception exit to main page,begin eject card");
+					EjectJSTask* task = new EjectJSTask(this);
+					task->ctx = NULL;
+					GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+					pEvt->SetHandled();
+					return 0;
+				}
+			}
 		case USER_EVT_READ:
 			{
 				CardReadEvent* crne = dynamic_cast<CardReadEvent*>(pEvt);
@@ -745,6 +866,20 @@ unsigned int CCardIssuerFSM::s6_on_event(FSMEvent* pEvt)
 		pEvt->SetHandled();
 		return 0;
 	}
+	else if (pEvt->iEvt == USER_EVT_JS_EJECT_FINISHED) {
+		pEvt->SetHandled();
+		if (pEvt->param1 == 0) {
+			LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_STORE_OP, "CardIssuer op.");
+			m_currCardNo = "";
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("客户取走卡片");
+			return 0;
+		}
+		else if (pEvt->param1 == 1) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("取卡时设备故障");
+			setQuickSelfCheck();
+			return 1;
+		}
+	}
 	return 0;
 }
 //Waiting fetch
@@ -955,6 +1090,16 @@ unsigned int CCardIssuerFSM::s8_on_event(FSMEvent* pEvt)
 			return 0;
 		else
 			return 1;
+	}
+	else if (pEvt->iEvt == USER_EVT_JS_CAPTURE_FINISHED) {
+		pEvt->SetHandled();
+		if (pEvt->param1 == 0) {
+			return 0;
+		}
+		else {
+			setQuickSelfCheck();
+			return 1;
+		}
 	}else if (pEvt->iEvt == USER_EVT_QUIT) {
 		pEvt->SetHandled();
 		return 0;
@@ -966,10 +1111,19 @@ void CCardIssuerFSM::s9_on_entry()
 {
 	LOG_FUNCTION();
 	m_currentFSMState = 9;
-	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to reset.");
 	SetDevState(DEVICE_STATUS_FAULT);
-	FSMEvent *e = new FSMEvent(USER_EVT_RESET);
-	PostEventFIFO(e);
+	if (m_quickSelfcheck) {
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to quickSelfcheck.");
+		m_testResult = Error_InvalidState;
+		QuickSelfcheckTask* task = new QuickSelfcheckTask(this);
+		GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuer in fault state, need to reset.");
+		FSMEvent* e = new FSMEvent(USER_EVT_RESET);
+		PostEventFIFO(e);
+	}
+
 }
 void CCardIssuerFSM::s9_on_exit()
 {
@@ -1128,6 +1282,112 @@ unsigned int CCardIssuerFSM::s14_on_event(FSMEvent* pEvt)
 	return ret;
 }
 
+void CCardIssuerFSM::s15_on_entry()
+{
+	LOG_FUNCTION();
+	m_currentFSMState = 15;
+	m_bReturnMainPage = false;
+}
+
+void CCardIssuerFSM::s15_on_exit()
+{
+	if (m_bReturnMainPage) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S15 exit, send exit main page event");
+		this->PostEventFIFO(new FSMEvent(USER_EVT_JS_EXIT_MIAN_PAGE));
+	}
+	LOG_FUNCTION();
+}
+
+unsigned int CCardIssuerFSM::s15_on_event(FSMEvent* pEvt)
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s15 evt (%d,%d)", pEvt->iEvt, pEvt->param1);
+	int ret = 0;
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_JS_POSTONLINE_FINISHED:
+	{
+		pEvt->SetHandled();
+		ret = 0;
+	}
+	break;
+	case USER_EVT_JS_READ_FINISHED:
+	{
+		pEvt->SetHandled();
+		if (pEvt->param1 == 0) {
+			ret = 0;
+		}
+		else if (pEvt->param1 == 1) {
+			ret = 1;
+		}
+	}
+	break;
+	case EVT_MAINPAGE_DISPLAY:
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S15 receive exit to main page");
+		pEvt->SetHandled();
+		m_captureReason = "4001";
+		m_bReturnMainPage = true;
+		ret = 0;
+	}
+	break;
+	default:
+		break;
+	}
+	return ret;
+}
+
+void CCardIssuerFSM::s16_on_entry()
+{
+	LOG_FUNCTION();
+	m_currentFSMState = 16;
+	m_bReturnMainPage = false;
+}
+
+void CCardIssuerFSM::s16_on_exit()
+{
+	LOG_FUNCTION();
+}
+
+unsigned int CCardIssuerFSM::s16_on_event(FSMEvent* pEvt)
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("s16 evt (%d,%d)", pEvt->iEvt, pEvt->param1));
+	int ret = 0;
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_JS_ISSUE_FROM_BOX_FINISHED:
+	{
+		pEvt->SetHandled();
+		ret = pEvt->param1;
+		if (ret == 2) {
+			setQuickSelfCheck();
+		}
+		else if (ret == 1) {
+			if (m_bReturnMainPage) {
+				
+				CaptureJSEvent* cje = dynamic_cast<CaptureJSEvent*>(pEvt);
+				CaptureJSTask* task = new CaptureJSTask(this);
+				task->ctx = NULL;
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+				pEvt->SetHandled();
+				ret = 3;
+			}
+		}
+	}
+	break;
+	case EVT_MAINPAGE_DISPLAY:
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S16 receive exit to main page");
+		pEvt->SetHandled();
+		m_captureReason = "4001";
+		m_bReturnMainPage = true;
+	}
+	break;
+	default:
+		break;
+	}
+	return ret;
+}
+
 ErrorCodeEnum CCardIssuerFSM::OnInit()
 {
 	LOG_FUNCTION();
@@ -1544,6 +1804,7 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCS);
 
 		int tmpCardnoMismatch = 0, tmpICRetryTimes = 1, tmpStopUseRF = 0;
+		int tmpSelfcheckSleepTime = 0;
 
 		spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "EacQueryFlag", m_eacQueryFlag);
 		spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UseCardnoMismatch", tmpCardnoMismatch);
@@ -1558,6 +1819,9 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		if (0 != m_csSyncMaterialUrl.GetLength()) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_csSyncMaterialUrl:%s", m_csSyncMaterialUrl.GetData());
 		}
+		spConfigCS->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SelfcheckSleepTime", tmpSelfcheckSleepTime);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("tmpSelfcheckSleepTime:%d", tmpSelfcheckSleepTime);
+
 		
 		spConfigCS->ReadConfigValue("Common", "EacQueryHost", m_EacQueryHost);
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("EacQueryFlag:%d,EacQueryHost:%s,UseCardnoMismatch:%d,ICRetryTimes:%d"
@@ -1572,6 +1836,10 @@ ErrorCodeEnum CCardIssuerFSM::OpenDevice(BYTE btOpenType, const char* pDevSN)
 		m_issueStatusFromFile = m_issueStatus = isIssue;
 		if (m_issueStatusFromFile == 0)
 			m_bCardFromHopper = false;
+		if (tmpSelfcheckSleepTime == 0) {
+			m_SelfcheckSleepTime = 10000;//默认10s
+		}
+
 		ret = UnAcceptCard();
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ret: %d, isIssue: %d, m_hasCardWhileDevOpen:%d, m_issueStatusFromFile:%d",
 			ret, isIssue, m_hasCardWhileDevOpen, m_issueStatusFromFile);
@@ -5213,4 +5481,2023 @@ bool CCardIssuerFSM::IfUseRf()
 	}
 
 	return false;
-}
+}
+
+int CCardIssuerFSM::EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("吐卡开始");
+	long l_beginTime, l_endTime;
+	Sleep(300);//oilyang@20230106 for keba said "maybe we need stay for machine to prepare..."
+	int ret = 0;
+	ErrorCodeEnum eErr;
+	m_pCardProcess->DataInit();
+	l_beginTime = GetTickCountRVC();
+	eErr = m_hDevHelper->MoveCard(CI_MOVECARD_FRONT_GATE);
+	l_endTime = GetTickCountRVC();
+	DWORD dwTmpUserErrCode = 0;
+	if (eErr != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::MoveCard(CI_MOVECARD_FRONT_GATE) err");
+		if (m_bCardFromHopper) {
+			if (IsInBusiness() && ctx != NULL) {
+				dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FRONT_GATE, "DevAdapter::MoveCard", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220342", "");
+			}
+			else {
+				dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FRONT_GATE, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
+			}
+		}
+		else {
+			if (IsInBusiness() && ctx != NULL) {
+				dwTmpUserErrCode = SetErrorAndLog(eErr, CardIssuer_UserErrorCode_MoveCardToGate_Failed, "DevAdapter::MoveCard", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220342", "");
+			}
+			else {
+				dwTmpUserErrCode = SetErrorAndLog(eErr, CardIssuer_UserErrorCode_MoveCardToGate_Failed, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
+			}
+		}
+		if (ctx != NULL) {
+			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		}
+		return 1;//S9
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220342")("EjectCard, ret: %d", ret);
+		//等待取卡
+		DWORD dwStart, dwEnd;
+		dwStart = GetTickCountRVC();
+		ErrorCodeEnum errState = Error_Succeed;
+		long l_beginTime, l_endTime;
+		DWORD dwTmpUserErrCode = 0;
+		LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON, "CardReader(fetch) warning on");
+		do {
+
+			l_beginTime = GetTickCountRVC();
+			errState = m_hDevHelper->GetDevStatus(m_devStatus);
+			l_endTime = GetTickCountRVC();
+
+			if (Error_Succeed == errState) {
+				dwEnd = GetTickCountRVC();
+				if (m_devStatus.eMedia == CI_MEDIA_ENTERING) {
+					Sleep(WAIT_INTERVAL);
+				}
+				else {
+					
+					l_beginTime = GetTickCountRVC();
+					ErrorCodeEnum eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+					l_endTime = GetTickCountRVC();
+
+
+					if (eErr != Error_Succeed) {
+						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN) err");
+						SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
+					}
+					else {
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("EjectJS::SetCardInType");
+					}
+
+					LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader(fetch) warning off");
+					if (ctx != NULL) {
+						ctx->Answer(Error_Succeed);
+					}
+					return 0;//成功取走
+				}
+			}
+			else
+			{
+				LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader(fetch) warning off");
+				
+				if (IsInBusiness() && ctx != NULL) {
+					dwTmpUserErrCode = SetErrorAndLog(errState, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220342", "");
+				}
+				else {
+					dwTmpUserErrCode = SetErrorAndLog(errState, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
+				}
+				
+				if (ctx != NULL)
+				{
+					ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+				}
+				return 1;//S9
+			}
+		} while ((dwEnd - dwStart) < 55 * 1000);//预留5秒给吞卡操作
+		LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader(fetch) warning off");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("客户未取卡超时");
+
+		//超时未取卡进行吞卡操作
+		l_beginTime = GetTickCountRVC();
+		eErr = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
+		l_endTime = GetTickCountRVC();
+
+		if (eErr == Error_Succeed) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("EjectJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD)");
+			m_CardCaptured++;
+			m_captureReason = "4998";//超时未取卡引起吞卡
+			ToRegistCaptureCardInfo();//登记吞卡记录
+			m_currCardNo = m_addCardNo = "";
+
+			l_beginTime = GetTickCountRVC();
+			ErrorCodeEnum eErrSet = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+			l_endTime = GetTickCountRVC();
+
+			if (eErrSet != Error_Succeed) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::SetCardInType err");
+				SetErrorAndLog(eErrSet, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("EjectJS::SetCardInType");
+			}
+			//超时吞卡成功
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Succ, "forget fetch card ,capture succ");
+			if (ctx != NULL) {
+				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Succ);
+			}
+			return 0;//超时吞卡成功
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD) err");
+			if (ctx != NULL) {
+				SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220342", "");
+			}
+			//超时吞卡失败
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Fail, "forget fetch card ,capture fail");
+			if (ctx != NULL) {
+				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Fail);
+			}
+			return 1;//S9 超时吞卡失败
+		}
+
+	}
+}
+
+int CCardIssuerFSM::CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("吞卡开始");
+	long l_beginTime, l_endTime;
+	int ret = 0;
+	if (ctx != NULL) {
+		if (!ctx->Req.captureCode.IsNullOrEmpty()) {
+			m_captureReason = ctx->Req.captureCode;
+		}
+		else {
+			m_captureReason = "9999";//默认值,未分类的业务吞卡
+		}
+		LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CaptureCard_FromBusiness, CSimpleStringA::Format("CaptureCard called from Business. captureReason=%s", ctx->Req.captureCode.GetData()));
+	}
+	m_pCardProcess->DataInit();
+
+	//判断是否无卡
+	l_beginTime = GetTickCountRVC();
+	ErrorCodeEnum eErr = m_hDevHelper->GetDevStatus(m_devStatus);
+	l_endTime = GetTickCountRVC();
+
+	if (eErr == Error_Succeed) {
+
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CaptureJS::GetDevStatus succ,m_devStatus.eMedia=%d", (int)m_devStatus.eMedia);
+		if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT) {
+			//读卡器无卡
+			l_beginTime = GetTickCountRVC();
+			ErrorCodeEnum eErrSet = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+			l_endTime = GetTickCountRVC();
+
+			if (eErrSet != Error_Succeed) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::SetCardInType err");
+				SetErrorAndLog(eErrSet, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("CaptureJS::SetCardInType");
+			}
+			CSimpleStringA maskCardno = MaskCardno(m_currCardNo.GetData());
+			m_currCardNo = m_addCardNo = "";
+			if (ctx != NULL) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::GetDevStatus succ, No card found in cardReader, m_currCardNo=%s", maskCardno.GetData());
+				LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Capture_NoCard_Failed, "Capture card, No card found in cardReader");
+				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Capture_NoCard_Failed);//读卡器无卡
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CaptureJS::GetDevStatus succ, No card found in cardReader");
+			}
+			return 0;//回到无卡状态
+		}
+	}
+	else {
+		SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
+	}
+
+	DWORD dwTmpUserErrCode = 0;
+	l_beginTime = GetTickCountRVC();
+	eErr = m_hDevHelper->MoveCard(CI_MOVECARD_BACK_NOT_HOLD);
+	l_endTime = GetTickCountRVC();
+
+	if (eErr == Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("CaptureJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD)");
+		m_CardCaptured++;
+		ToRegistCaptureCardInfo();//登记吞卡记录
+		m_currCardNo = m_addCardNo = "";
+
+		l_beginTime = GetTickCountRVC();
+		ErrorCodeEnum eErrSet = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+		l_endTime = GetTickCountRVC();
+
+		if (eErrSet != Error_Succeed) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::SetCardInType err");
+			SetErrorAndLog(eErrSet, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("CaptureJS::SetCardInType");
+		}
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS::MoveCard(CI_MOVECARD_BACK_NOT_HOLD) err");
+		if (ctx != NULL && IsInBusiness()) {
+			dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, "DevAdapter::MoveCard", __FUNCTION__, true, l_endTime - l_beginTime, "QLR040220343", "");
+		}
+		else {
+			dwTmpUserErrCode = SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_BACK_NOT_HOLD, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220343", "");
+		}
+		ret = 1;
+	}
+	//业务返回
+	if (ctx != NULL) {
+		if (Error_Succeed == eErr) {
+			ctx->Answer(Error_Succeed);
+		}
+		else {
+			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		}
+	}
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CapturedJS, ret:%d", ret);
+	return ret;
+}
+
+void CCardIssuerFSM::QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	int ret = 0;
+	if (m_hDevHelper == nullptr) {
+		ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_DevOpen_Failed);
+	}
+	else {
+		ErrorCodeEnum errCode;
+		long l_beginTime, l_endTime;
+		l_beginTime = GetTickCountRVC();
+		errCode = m_hDevHelper->GetDevStatus(m_devStatus);
+		l_endTime = GetTickCountRVC();
+
+		if (Error_Succeed == errCode)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("QueryHasCardJS::GetDevStatus, m_devStatus.eMedia:%d", m_devStatus.eMedia);
+			//ret = (m_devStatus.eMedia == CI_MEDIA_PRESENT) ? 1 : 0;
+			ret = (int)m_devStatus.eMedia;
+			ctx->Ans.position = ret;
+			ctx->Answer(Error_Succeed);
+		}
+		else
+		{
+			DWORD dwTmpUserErrCode = SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		}
+
+	}
+}
+
+int CCardIssuerFSM::IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("卡箱发卡");
+	CSimpleStringA errMsg(true);
+	long l_beginTime, l_endTime;
+
+	//Req.hopper
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssueCard, issue hopper:%d", ctx->Req.hopper);
+	ctx->Ans.reserved1.Init(2);
+
+	//param Req.hopper is wrong
+	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, CardIssuer_UserErrorCode_Invalid_Hopper, errMsg.GetData());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA23CW")(errMsg.GetData());
+		ctx->Answer(Error_Param, CardIssuer_UserErrorCode_Invalid_Hopper);
+		return 1;
+	}
+	m_currentHopper = ctx->Req.hopper;//设置发送的卡箱号
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssueCard, current hopper:%d", m_currentHopper);
+	m_pCardProcess->DataInit();
+
+	ErrorCodeEnum errCode;
+	CardIssuerStatus cis;
+	memset(&cis, 0, sizeof(CardIssuerStatus));
+	bool bEmpty = false;
+
+	l_beginTime = GetTickCountRVC();
+	errCode = m_hDevHelper->GetDevStatus(cis);
+	l_endTime = GetTickCountRVC();
+
+	if (errCode != Error_Succeed) {
+		SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("IssueFromBoxJS::GetDevStatus");
+		if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY || cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP) {
+			bEmpty = true;
+		}
+	}
+
+	if (bEmpty)
+	{
+		//卡箱无卡时返回错误信息
+		CSimpleStringA warnInfo = CSimpleStringA::Format("IssuerCard, hopper%d no more cards to issue. Vendor return:NoCard(%d), CardCount(%d)",
+			cis.eIssuerBin[m_currentHopper - 1], cis.dwIssuerCount[m_currentHopper - 1]);
+		LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_No_More_Card_Issue, warnInfo.GetData());
+
+		DWORD dwUsrErrCode = 0;
+		if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_NOTSUPP)
+		{
+			if (m_currentHopper == 1)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230B")("未检测到卡箱1,请检测卡箱1是否放好");
+				dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper1;
+			}
+			else if (m_currentHopper == 2)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230C")("未检测到卡箱2,请检测卡箱2是否放好");
+				dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper2;
+			}
+			else if (m_currentHopper == 3)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230D")("未检测到卡箱3,请检测卡箱3是否放好");
+				dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper3;
+			}
+			else if (m_currentHopper == 4)
+				dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper4;
+			else if (m_currentHopper == 5)
+				dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper5;
+			else if (m_currentHopper == 6)
+				dwUsrErrCode = CardIssuer_UserErrorCode_NotHas_Hopper6;
+		}
+		else if (cis.eIssuerBin[m_currentHopper - 1] == CI_ISSUEHOPPER_EMPTY)
+		{
+			if (m_currentHopper == 1)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230E")("卡箱1未检测到卡片,请检测卡箱1中卡片是否放好或卡片余量过低");
+				dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper1;
+			}
+			else if (m_currentHopper == 2)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230F")("卡箱2未检测到卡片,请检测卡箱2中卡片是否放好或卡片余量过低");
+				dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper2;
+			}
+			else if (m_currentHopper == 3)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040220345").setResultCode("RTA230G")("卡箱3未检测到卡片,请检测卡箱3中卡片是否放好或卡片余量过低");
+				dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper3;
+			}
+			else if (m_currentHopper == 4)
+				dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper4;
+			else if (m_currentHopper == 5)
+				dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper5;
+			else if (m_currentHopper == 6)
+				dwUsrErrCode = CardIssuer_UserErrorCode_NoCardInHopper6;
+		}
+		ctx->Answer(Error_DevNotAvailable, dwUsrErrCode);
+		return 1;
+	}
+
+	//forbid front enter
+
+	l_beginTime = GetTickCountRVC();
+	errCode = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+	l_endTime = GetTickCountRVC();
+
+	if (errCode != Error_Succeed)
+	{
+		SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("IssueFromBoxJS::SetCardInType");
+	}
+
+	FSMSetIssueFlag(1);
+	//move card to holder
+
+	l_beginTime = GetTickCountRVC();
+	errCode = m_hDevHelper->MoveCard(CI_MOVECARD_FROM_HOPPER, m_currentHopper);
+	l_endTime = GetTickCountRVC();
+
+	m_bCardFromHopper = true;//用于区分吐卡报错不同
+	if (errCode != Error_Succeed)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IssueFromBoxJS::MoveCard err, m_currentHopper:%d", m_currentHopper);
+		FSMSetIssueFlag(2);
+		DWORD dwTmpUserErrCode = SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_CI_MOVECARD_FROM_HOPPER, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220345", "");
+		ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		return 2;//S9 
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220345")("IssueCard::MoveCard succ, m_currentHopper:%d", m_currentHopper);
+	}
+	LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_MoveCard_FromHopper, "MoveCard from hopper succ.");
+
+	m_bUseRFTillNext = false;
+	Sleep(1000);
+	ctx->Ans.reserved1[0] = ctx->Ans.reserved1[1] = 0;
+
+	ctx->Answer(Error_Succeed);
+	return 0;
+}
+
+int CCardIssuerFSM::PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	if (m_bUseRFTillNext) {
+		return PostOnlineJS_RF(ctx);
+	}
+	bool bCtOK = false;
+	int ret = PostOnlineJS_Contact(ctx, bCtOK);
+	if (!bCtOK && IfUseRf()) {
+		return PostOnlineJS_RF(ctx);
+	}
+	else {
+		return ret;
+	}
+}
+
+int CCardIssuerFSM::PostOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx, bool& bICOK)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PostOnlineJS_Contact) 联机后IC接触处理");
+	m_pCardProcess->DataInit();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS_Contact>, postOnLine data[%s]", ctx->Req.data.GetData());
+	m_pCardProcess->SplitOnlineReplyData(ctx->Req.data.GetData(), strlen(ctx->Req.data));
+	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER, m_hDevHelper);
+	CSimpleStringA csTransEnd;
+	if (issBnkAuth == 0)
+	{
+		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER, 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_USER).setLogCode("QLR040220341")("<PostOnlineJS_Contact>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
+	ctx->Answer(Error_Succeed);
+	return 0;
+}
+
+int CCardIssuerFSM::PostOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PostOnlineJS_RF) 联机后IC非接处理");
+	m_pCardProcess->DataInit();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PostOnlineJS_RF>, postOnLine data[%s]", ctx->Req.data.GetData());
+	m_pCardProcess->SplitOnlineReplyData(ctx->Req.data.GetData(), strlen(ctx->Req.data));
+	int issBnkAuth = m_pCardProcess->IssueBankAuth(CARD_MACHINE_ISSUER_RF, m_hDevHelper);
+	CSimpleStringA csTransEnd;
+	if (issBnkAuth == 0)
+	{
+		int transEnd = m_pCardProcess->TransEnd(CARD_MACHINE_ISSUER_RF, 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_USER).setLogCode("QLR040220341")("<PostOnlineJS_RF>, issBnkAuth:%d, csTransEnd:%s", issBnkAuth, csTransEnd.GetData());
+	ctx->Answer(Error_Succeed);
+	return 0;
+}
+
+int CCardIssuerFSM::ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool& bReadCardInfo, bool& bReadMag, CSimpleStringA& t2Account)
+{
+	m_currCardNo = "";
+	ctx->Ans.magStatus = 0; //读磁硬件状态默认值
+
+	ErrorCodeEnum eErr, eMagReadErr;
+	int activeCardType;
+	bool bIC(false);
+	long l_beginTime, l_endTime;
+	CSimpleString errMsg("");
+	errMsg = CSimpleString::Format("ReadCard, inParam: m_issueStatus:%d, m_currentHopper:%d", m_issueStatus, m_currentHopper);
+	LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_ReadCard_Process, errMsg.GetData());
+
+	MagTracks magTracks;
+	memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data));
+	memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data));
+	memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data));
+	magTracks.eRange = CI_TRACK_RANGE_2_3;
+
+	int readTries = 0;
+	do {
+		l_beginTime = GetTickCountRVC();
+		eMagReadErr = m_hDevHelper->MagRead(magTracks);
+		l_endTime = GetTickCountRVC();
+		if (Error_Succeed == eMagReadErr) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MagRead").setCostTime(l_endTime - l_beginTime)("ReadMag::MagRead t1Status:%d, t2Status:%d, t3Status:%d, t1Len:%d, t2Len:%d, t3Len:%d",
+				magTracks.track[0].eStatus, magTracks.track[1].eStatus, magTracks.track[2].eStatus, magTracks.track[0].dwSize, magTracks.track[1].dwSize, magTracks.track[2].dwSize);
+			bReadMag = true;//读卡成功
+			ctx->Ans.magStatus = 1;//成功
+			ctx->Ans.track1 = (char*)magTracks.track[0].data;
+			ctx->Ans.track2 = (char*)magTracks.track[1].data;
+			ctx->Ans.track3 = (char*)magTracks.track[2].data;
+			ctx->Ans.track1Size = magTracks.track[0].dwSize;
+			ctx->Ans.track2Size = magTracks.track[1].dwSize;
+			ctx->Ans.track3Size = magTracks.track[2].dwSize;
+			ctx->Ans.track1Status = (int)magTracks.track[0].eStatus;
+			ctx->Ans.track2Status = (int)magTracks.track[1].eStatus;
+			ctx->Ans.track3Status = (int)magTracks.track[2].eStatus;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadMag::MagRead fail");
+			SetErrorAndLog(eMagReadErr, MEC_DEVAPI_CARDISSUER_MagRead, "DevAdapter::MagRead", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			bReadMag = false;//读卡失败
+			ctx->Ans.magStatus = 0;//失败
+			ctx->Ans.track1 = "";
+			ctx->Ans.track2 = "";
+			ctx->Ans.track3 = "";
+			ctx->Ans.track1Size = 0;
+			ctx->Ans.track2Size = 0;
+			ctx->Ans.track3Size = 0;
+			ctx->Ans.track1Status = 1;
+			ctx->Ans.track2Status = 1;
+			ctx->Ans.track3Status = 1;
+		}
+		readTries++;
+
+		//判断返回值长度
+		if (magTracks.track[1].dwSize > sizeof(magTracks.track[1].data) || magTracks.track[2].dwSize > sizeof(magTracks.track[2].data))
+		{
+			errMsg = CSimpleString::Format("MagRead, trackSize maybe wrong:t2Size:%d(%d), t3Size:%d(%d)",
+				magTracks.track[1].dwSize, sizeof(magTracks.track[1].data),
+				magTracks.track[2].dwSize, sizeof(magTracks.track[2].data));
+			LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_TrackSize_Wrong, errMsg.GetData());
+			bReadMag = false;//读卡失败
+			ctx->Ans.magStatus = 0;//失败
+			break;
+		}
+
+		if (Error_Succeed == eMagReadErr && magTracks.track[1].eStatus == CI_DATA_OK)
+		{
+			LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op.");
+			if (magTracks.track[1].dwSize > 40)
+			{
+				errMsg = CSimpleString::Format("MagRead, track2Size maybe wrong:t2Size:%d", magTracks.track[1].dwSize);
+				LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_Track2Size_Wrong, errMsg.GetData());
+				//ctx->Ans.magStatus = 0;//失败
+				break;
+			}
+			//ctx->Ans.track2 = (char*)magTracks.track[1].data;
+			bool bT3OK = false;
+			if (magTracks.track[2].eStatus == CI_DATA_OK)
+			{
+				bT3OK = true;
+				//ctx->Ans.track3 = (char*)magTracks.track[2].data;
+			}
+			Track2Data track2Data;
+			track2Data.status = 0;
+			track2Data.t2Account = "";
+			char* tmpMag2 = new char[256];
+			ZeroMemory(tmpMag2, 256);
+			DecodeTracksData((const char*)magTracks.track[1].data, magTracks.track[1].dwSize, (const char*)magTracks.track[2].data, magTracks.track[2].dwSize, tmpMag2, true, bT3OK);
+
+			int pos = 0;
+			for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos)
+			{
+				if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e || magTracks.track[1].data[i] == 0x44)// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况
+					break;
+			}
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleString::Format("<ReadMag::MagRead>, split pos:%d", pos));
+			if (pos <= 0 || pos == magTracks.track[1].dwSize)
+			{
+				//ctx->Ans.magStatus = 0;//失败
+				if (tmpMag2 != NULL)
+				{
+					delete[]tmpMag2;
+					tmpMag2 = NULL;
+				}
+				break;
+			}
+
+			char* ddd = new char[40];
+			memset(ddd, 0, 40);
+			memcpy(ddd, magTracks.track[1].data, pos);
+
+			if (SplitTrack2(tmpMag2, track2Data) == 0)
+			{
+
+				//ctx->Ans.magStatus = 1;//成功
+				//ctx->Ans.t2Account = track2Data.t2Account;
+				//ctx->Ans.t2Region = track2Data.t2Region;
+				//ctx->Ans.t2CardSerial = track2Data.t2CardSerial;
+				//ctx->Ans.t2CVC = track2Data.t2CVC;
+				//ctx->Ans.t2ExpireDate = track2Data.t2ExpireDate;
+				bReadCardInfo = true;//成功
+				m_currCardNo = track2Data.t2Account;
+				t2Account = track2Data.t2Account;
+				if (m_issueStatus)
+				{
+					//设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
+					SetDevState(DEVICE_STATUS_NORMAL);
+				}
+			}
+			if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))
+			{
+
+				//ctx->Ans.magStatus = 1;//成功
+				//ctx->Ans.t2Account = (char*)ddd;
+				//ctx->Ans.t2Region = "";
+				//ctx->Ans.t2CardSerial = "";
+				//ctx->Ans.t2CVC = "";
+				//ctx->Ans.t2ExpireDate = "";
+				bReadCardInfo = true;//成功
+				m_currCardNo = (char*)ddd;
+				t2Account = (char*)ddd;
+				delete[]ddd;
+
+			}
+			if (tmpMag2 != NULL)
+			{
+				delete[]tmpMag2;
+				tmpMag2 = NULL;
+			}
+			CSimpleString maskCardno = MaskCardno(m_currCardNo.GetData());
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<ReadCard::MagRead>, t2Account len:%d, %s", m_currCardNo.GetLength(), maskCardno.GetData());
+
+			CSimpleStringA cardInfo(true);
+			cardInfo = CSimpleStringA::Format("cardBin:%s", maskCardno.GetData());
+			LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardBin, cardInfo.GetData());
+
+			if (!ctx->Ans.track2.IsNullOrEmpty() && (pos + 8) < magTracks.track[1].dwSize)
+			{
+				cardInfo = CSimpleStringA::Format("cardServiceCode:%s", (ctx->Ans.track2.SubString(pos + 1, 7)).GetData());
+				LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Track2_ServiceCode, cardInfo.GetData());
+			}
+
+			break;
+		}
+	} while (readTries < READ_TRY_NUM);
+
+	return 0;
+}
+
+int CCardIssuerFSM::CheckCardType(CSimpleStringA cardNo, bool bReadMag, int& ICtype)
+{
+	LOG_FUNCTION();
+	long l_beginTime, l_endTime;
+	ErrorCodeEnum eErr;
+	//oilyang@20230331
+	//1、发卡且读磁成功,不再继续检测IC,一律ICType=1,以便读取IC
+	//2、其他情况(发卡未读到磁条或前端插卡),先查询户口系统进行卡片介质判定:
+	//	2a:户口系统返回非纯磁条介质类型,ICType以户口为准(ICType影响后续IC读取,即:都会读IC)
+	//	2b:其他情况(户口系统访问错(未走户口系统查或访问微服务失败或未返回介质类型或返回纯磁条卡),一律探测是否芯片卡
+	if (m_issueStatus && bReadMag)//发卡默认给芯片卡,且读到磁道(考虑卡片放错)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, issueStatus is true and read mag OK");
+		ICtype = 1;
+	}
+	else {
+		int cardTypeFromHost = 0;
+		bool bMismatch = false;
+		//开关控制是否主机查询cardtype
+		if (m_eacQueryFlag == 1) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin query host to check cardType");
+			cardTypeFromHost = JudgeCardType(cardNo, bMismatch);//0:失败 1:复合 2:磁条 3:ic
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, cardTypeFromHost=%d", cardTypeFromHost);
+		}
+		if (cardTypeFromHost > 0 && cardTypeFromHost != 2)//户口系统返回非纯磁条介质类型
+		{
+			ICtype = cardTypeFromHost;
+			//卡号不同则直接返回报错
+			if (m_bUseCardnoMismatch && bMismatch)
+			{
+				return 1;//账户和户口系统的最新账户不匹配
+			}
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType>, begin detect cardType");
+			//主动探测
+			int activeCardType;
+			int icRetryTimes = 0;
+			bool bIC(false);
+			while (1)
+			{//for poor mag only card,we always retry...
+				bIC = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_hDevHelper, activeCardType);
+				if (!bIC)
+					icRetryTimes++;
+				else
+					break;
+				Sleep(500);
+				if (icRetryTimes >= m_ICRetryTimes)
+					break;
+			}
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard>, bIC:%d", bIC);
+
+			//ic探测成功,0.无磁条IC 1.复合 2.磁条 3.纯IC 
+			if (bIC) {
+				if (bReadMag) {
+					ICtype = 1;
+				}
+				else {
+					ICtype = 3;
+					LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, "<CheckCardType>, maybe IC only.");
+				}
+				//释放资源
+				l_beginTime = GetTickCountRVC();
+				eErr = m_hDevHelper->DeactivateICCard();
+				l_endTime = GetTickCountRVC();
+
+				if (eErr != Error_Succeed) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::DeactivateICCard err");
+					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("CheckCardType::DeactivateICCard");
+				}
+
+				l_beginTime = GetTickCountRVC();
+				eErr = m_hDevHelper->ReleaseIC();
+				l_endTime = GetTickCountRVC();
+
+				if (eErr != Error_Succeed) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::ReleaseIC err");
+					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("CheckCardType::ReleaseIC");
+				}
+			}
+			else {
+				//判断是否支持非接
+				if (!IfUseRf()) {
+					m_bUseRFTillNext = false;//无非接
+					if (bReadMag) {
+						ICtype = 2;
+					}
+					else {
+						ICtype = 0;
+						//既没有读到磁条,又不是IC,很大概率是插反了
+						LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
+					}
+				}
+				else {
+					m_bUseRFTillNext = true;//使用非接
+
+					l_beginTime = GetTickCountRVC();
+					eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
+					l_endTime = GetTickCountRVC();
+
+					if (eErr != Error_Succeed)
+					{
+						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::MoveCard err");
+						SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+					}
+					else {
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("CheckCardType::MoveCard, (CI_MOVECARD_RF_POSITION)");
+					}
+
+					icRetryTimes = 0;
+					bool bICRF(false);
+					while (1)
+					{//for poor mag only card,we always retry...
+						bICRF = m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER_RF, m_hDevHelper, activeCardType);
+						if (!bICRF)
+							icRetryTimes++;
+						else
+							break;
+						Sleep(500);
+						if (icRetryTimes >= m_ICRetryTimes)
+							break;
+					}
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<CheckCardType::DetectIfICCard_RF>, bIC:%d", bICRF);
+					if (!(bICRF && activeCardType == 'A')) {
+						bICRF = false;
+					}
+
+					if (bICRF) {
+						if (bReadMag) {
+							ICtype = 1;
+						}
+						else {
+							ICtype = 3;
+							LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_MaybeIC_Only, "<CheckCardType>, maybe IC only.");
+						}
+						//释放资源
+						l_beginTime = GetTickCountRVC();
+						eErr = m_hDevHelper->DeactContactlessICCard();
+						l_endTime = GetTickCountRVC();
+
+						if (eErr != Error_Succeed) {
+							DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CheckCardType::DeactContactlessICCard err");
+							SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+						}
+						else {
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("ReadCard_RF::DeactContactlessICCard");
+						}
+					}
+					else {
+						if (bReadMag) {
+							ICtype = 2;
+						}
+						else {
+							ICtype = 0;
+							//既没有读到磁条,又不是IC,很大概率是插反了
+							LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_Maybe_InsertCard_InWrongStyle, "<CheckCardType>, 既没读到磁条,又没检测到IC,可能插反了");
+						}
+					}
+				}
+
+			}
+		}
+	}
+
+	CSimpleStringA cardType = CSimpleStringA::Format("cardType:%d", ICtype);
+	LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CardType, cardType.GetData());
+	return 0;
+}
+
+int CCardIssuerFSM::PreOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool& bICOK, bool& bContinue)
+{
+	LOG_FUNCTION();
+	long l_beginTime, l_endTime;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PreOnlineJS_Contact) IC接触读卡");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnlineJS_Contact, aid[%s], business data[%s]", ctx->Req.aid.GetData(), ctx->Req.businessData.GetData());
+
+	m_pCardProcess->DataInit();
+	//数据已读出,开始pmoc流程
+	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)("<PreOnlineJS_Contact>, the front BusinessData have not provide aid data.");
+		int icRetryTimes = 0;
+		while (1)
+		{
+			l_beginTime = GetTickCountRVC();
+			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
+			l_endTime = GetTickCountRVC();
+			if (retDetectAndRead == -1)//only retry for active ic card failed!
+				icRetryTimes++;
+			else
+				break;
+			Sleep(500);
+			if (icRetryTimes >= m_ICRetryTimes)
+				break;
+		}
+	}
+	else {
+		char* pAIDTmp = new char[64];
+		memset(pAIDTmp, 0, 64);
+		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, the aid from business is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		int icRetryTimes = 0;
+		while (1)
+		{
+			l_beginTime = GetTickCountRVC();
+			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
+			l_endTime = GetTickCountRVC();
+			if (retDetectAndRead == -1)//only retry for active ic card failed!
+				icRetryTimes++;
+			else
+				break;
+			Sleep(500);
+			if (icRetryTimes >= m_ICRetryTimes)
+				break;
+		}
+		if (pAIDTmp != NULL)
+			delete[]pAIDTmp;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType);
+
+	if (retDetectAndRead < 0)
+	{
+		ErrorCodeEnum eErrCode = Error_Unexpect;
+		CSimpleStringA ApiName = "";
+		CSimpleStringA alarmMsg = "";
+		CSimpleStringA csErrMsgWithReturnCode = "";
+
+		if (IfUseRf()) {
+			bContinue = true; //继续后面的非接流程
+			if (retDetectAndRead == -1) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
+				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
+
+				if (m_issueStatus) {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
+				}
+			}
+			else if (retDetectAndRead == -2) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读取IC数据失败");
+				if (m_issueStatus) {
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220320", "");
+				}
+				else {
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220303", "");
+				}
+			}
+			else if (retDetectAndRead == -3) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
+				if (m_issueStatus) {
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220320", "");
+				}
+				else {
+					SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220303", "");
+				}
+			}
+		}
+		else {
+			if (retDetectAndRead == -1) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败");
+				GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
+
+				if (m_issueStatus) {
+					if (IsInBusiness()) {
+						DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
+						LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, alarmMsg.GetData());
+					}
+					else {
+						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA230V")(csErrMsgWithReturnCode.GetData());
+						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed, alarmMsg.GetData());
+					}
+					ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveICCard_Failed);
+				}
+				else {
+					if (IsInBusiness()) {
+						DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
+						LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, alarmMsg.GetData());
+					}
+					else {
+						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA230M")(csErrMsgWithReturnCode.GetData());
+						LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed, alarmMsg.GetData());
+					}
+					ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveICCard_Failed);
+				}
+			}
+			else if (retDetectAndRead == -2) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读取IC数据失败");
+				DWORD dwTmpUserErrCode = 0;
+				if (m_issueStatus) {
+					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
+				}
+				else {
+					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
+				}
+				ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+			}
+			else if (retDetectAndRead == -3) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
+				DWORD dwTmpUserErrCode = 0;
+				if (m_issueStatus) {
+					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
+				}
+				else {
+					dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ICCommand, "DevAdapter::ICCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
+				}
+				ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+			}
+		}
+		bICOK = false;
+		return 0;//上电读卡失败
+	}
+
+	m_pCardProcess->TermRiskManage();
+	CSimpleStringA taaResult;
+	BYTE bt9f27 = 0;
+	int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER, m_hDevHelper, taaResult, true, m_bCDA, bt9f27);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, TermActionAnalyze, retTAA:%d, taaResult:%s", retTAA, taaResult.GetData());
+	switch (retTAA)
+	{//to be added oiltmp 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)
+	{
+		if (IfUseRf()) {
+			bContinue = true; //继续后面的非接流程
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>,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[ONE_K];
+	ZeroMemory(pSomeICData, ONE_K);
+	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));
+	_itoa(lenRet, arqcLen, 10);
+
+	ICData track2(false, 0x57, 0x00), ICCardSerial(false, 0x5f, 0x34), appExpiryDate(false, 0x5f, 0x24);
+	ErrorCodeEnum eErr = Error_Unexpect;
+	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)("<PreOnlineJS_Contact>, can't find expire date");
+		if (IfUseRf()) {
+			bContinue = true; //继续后面的非接流程
+			delete[] pExpireDate;
+			return 0;
+		}
+	}
+	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)("<PreOnlineJS_Contact>, 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)("<PreOnlineCrossJS_Contact>, ic no track2 data");
+		l_beginTime = GetTickCountRVC();
+		eErr = m_hDevHelper->ReleaseIC();
+		l_endTime = GetTickCountRVC();
+		if (eErr != Error_Succeed) {
+			SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("PreOnlineJS_Contact::ReleaseIC");
+		}
+	}
+	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)("<PreOnlineJS_Contact>, ic.track2, split pos:%d", pos);
+		char* ddd = new char[40];
+		memset(ddd, 0, 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;
+		}
+		else {
+			LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_Split_ICTrack2_Failed, CSimpleStringA::Format("<PreOnlineJS_Contact> SplitTrack2 fail,ic pTrack2.len:%d", strlen(icTrack2Data)));
+		}
+		if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)))
+		{
+			t2ICAccount = (char*)ddd;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+		}
+		delete[]ddd;
+	}
+	delete[]pICTrack2;
+
+	//80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
+	if (m_pCardProcess->GetP1() == 0x1) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, actionType:%s", actionType.c_str());
+		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 + "|MAGT2," + (const char*)csMagT2Track
+	//	+ "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion
+	//	+ "|MAGCARDSERIAL," + (const char*)csMagCardSerial + "|MAGCVC," + (const char*)csMagCVC + "|MAGEXPIREDATAE," + (const char*)csMagExpireDate;
+
+	//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();
+
+	//DbgWithLink(LOG_LEVEL_DEBUG, 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_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, data to host(less)[%s]", txtresult.c_str());
+
+	m_currCardNo = t2ICAccount.c_str();
+	//LogWarn(Severity_Low, Error_Unexpect, CardIssuerStore_UserErrorCode_CardBin, cardInfo.GetData());
+
+	if (pCID != NULL)
+		delete[]pCID;
+	if (pIssueBankLen != NULL)
+		delete[]pIssueBankLen;
+
+	if (m_pDataToARQC != NULL)
+	{
+		delete[]m_pDataToARQC;
+		m_pDataToARQC = NULL;
+	}
+
+	ctx->Ans.result = result.c_str();
+	ctx->Ans.icState = 1;//成功
+	bICOK = true;
+	bContinue = false;
+	ctx->Answer(Error_Succeed);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")();
+	return 0;//不再继续后面的非接流程
+}
+
+int CCardIssuerFSM::PreOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	long l_beginTime, l_endTime;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(PreOnlineJS_RF) IC非接读卡");
+	l_beginTime = GetTickCountRVC();
+	ErrorCodeEnum eErr = m_hDevHelper->MoveCard(CI_MOVECARD_RF_POSITION);
+	l_endTime = GetTickCountRVC();
+	if (eErr == Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::MoveCard").setCostTime(l_endTime - l_beginTime)("PreOnlineJS_RF::MoveCard, (CI_MOVECARD_RF_POSITION)");
+	}
+	else {
+		SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_MoveCard, "DevAdapter::MoveCard", __FUNCTION__, false, l_endTime - l_beginTime, "QLR040220340", "");
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnlineJS_RF, aid[%s], business data[%s]", ctx->Req.aid.GetData(), ctx->Req.businessData.GetData());
+
+	m_pCardProcess->DataInit();
+	//数据已读出,开始pmoc流程
+	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)("<PreOnlineJS_RF>, the front BusinessData have not provide aid data.");
+		int icRetryTimes = 0;
+		while (1)
+		{
+			l_beginTime = GetTickCountRVC();
+			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, m_aidList, activeCardType, m_issueStatus);
+			l_endTime = GetTickCountRVC();
+			if (retDetectAndRead == -1)//only retry for active ic card failed!
+				icRetryTimes++;
+			else
+				break;
+			Sleep(500);
+			if (icRetryTimes >= m_ICRetryTimes)
+				break;
+		}
+	}
+	else {
+		char* pAIDTmp = new char[64];
+		memset(pAIDTmp, 0, 64);
+		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, the aid from business is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		int icRetryTimes = 0;
+		while (1)
+		{
+			l_beginTime = GetTickCountRVC();
+			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER_RF, m_hDevHelper, preAIDs, activeCardType, m_issueStatus);
+			l_endTime = GetTickCountRVC();
+			if (retDetectAndRead == -1)//only retry for active ic card failed!
+				icRetryTimes++;
+			else
+				break;
+			Sleep(500);
+			if (icRetryTimes >= m_ICRetryTimes)
+				break;
+		}
+		if (pAIDTmp != NULL)
+			delete[]pAIDTmp;
+	}
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, After invoke DetectAndReadICData, retDetectAndRead:%d, activeCardType:%d", retDetectAndRead, activeCardType);
+
+	if (retDetectAndRead < 0)
+	{
+		ErrorCodeEnum eErrCode = Error_Unexpect;
+		CSimpleStringA ApiName = "";
+		CSimpleStringA alarmMsg = "";
+		CSimpleStringA csErrMsgWithReturnCode = "";
+
+		if (retDetectAndRead == -1) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("检测卡片类型时上电失败(非接)");
+			GetCardProcessLastErr(eErrCode, ApiName, alarmMsg, csErrMsgWithReturnCode);
+
+			if (m_issueStatus) {
+				if (IsInBusiness())
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
+					LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, alarmMsg.GetData());
+				}
+				else {
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220320").setResultCode("RTA2327")(csErrMsgWithReturnCode.GetData());
+					LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed, alarmMsg.GetData());
+				}
+
+				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_IssueCard_ActiveRF_Failed);
+			}
+			else {
+				if (IsInBusiness())
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
+					LogError(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
+				}
+				else
+				{
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(ApiName.GetData()).setCostTime(l_endTime - l_beginTime).setLogCode("QLR040220303").setResultCode("RTA2326")(csErrMsgWithReturnCode.GetData());
+					LogWarn(Severity_Middle, Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed, alarmMsg.GetData());
+				}
+
+				ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_ActiveContactlessICCard_Failed);
+			}
+		}
+		else if (retDetectAndRead == -2) {
+
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("读取IC数据失败");
+			DWORD dwTmpUserErrCode = 0;
+			if (m_issueStatus) {
+				dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
+			}
+			else {
+				dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
+			}
+			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		}
+		else if (retDetectAndRead == -3) {
+
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IC卡建立应用列表失败");
+			DWORD dwTmpUserErrCode = 0;
+			if (m_issueStatus) {
+				dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220320", "");
+			}
+			else {
+				dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_RFTypeABCommand, "DevAdapter::RFTypeABCommand", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220303", "");
+			}
+			ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		}
+		return 0;//上电读卡失败
+	}
+
+	m_pCardProcess->TermRiskManage();
+	CSimpleStringA taaResult;
+	BYTE bt9f27 = 0;
+	int retTAA = m_pCardProcess->TermActionAnalyze(CARD_MACHINE_ISSUER_RF, m_hDevHelper, taaResult, true, m_bCDA, bt9f27);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, TermActionAnalyze, retTAA:%d, taaResult:%s", retTAA, taaResult.GetData());
+	switch (retTAA)
+	{//to be added oiltmp 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_RF>,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[ONE_K];
+	ZeroMemory(pSomeICData, ONE_K);
+	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));
+	_itoa(lenRet, arqcLen, 10);
+
+
+	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)("<PreOnlineJS_RF>, 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)("<PreOnlineJS_RF>, 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)("<PreOnlineJS_RF>, ic no track2 data");
+	}
+	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)(CSimpleStringA::Format("<PreOnlineJS_RF>, ic.track2, split pos:%d", pos));
+		char* ddd = new char[40];
+		memset(ddd, 0, 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;
+		}
+		else {
+			LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_Split_ICTrack2_Failed, CSimpleStringA::Format("<PreOnlineJS_RF> SplitTrack2 fail,ic pTrack2.len:%d", strlen(icTrack2Data)));
+		}
+		if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)))
+		{
+			t2ICAccount = (char*)ddd;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("count:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+		}
+		delete[]ddd;
+	}
+	delete[]pICTrack2;
+
+	//80 1e 80 0008 328ab54bfc986b85 07010103a0b000010a010000000000754048769000
+	if (m_pCardProcess->GetP1() == 0x1) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_RF>, actionType:%s", actionType.c_str());
+		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 + "|MAGT2," + (const char*)csMagT2Track
+	//	+ "|MAGT3," + (const char*)csMagT3Track + "|MAGACCOUNT," + (const char*)csMagAccout + "|MAGREGION," + (const char*)csMagRegion
+	//	+ "|MAGCARDSERIAL," + (const char*)csMagCardSerial + "|MAGCVC," + (const char*)csMagCVC + "|MAGEXPIREDATAE," + (const char*)csMagExpireDate;
+
+	//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();
+
+	//DbgWithLink(LOG_LEVEL_DEBUG, 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_INFO, LOG_TYPE_SYSTEM)("<PreOnlineJS_Contact>, data to host(less)[%s]", txtresult.c_str());
+
+	m_currCardNo = t2ICAccount.c_str();
+
+	if (pCID != NULL)
+		delete[]pCID;
+	if (pIssueBankLen != NULL)
+		delete[]pIssueBankLen;
+
+	if (m_pDataToARQC != NULL)
+	{
+		delete[]m_pDataToARQC;
+		m_pDataToARQC = NULL;
+	}
+
+	ctx->Ans.result = result.c_str();
+	ctx->Ans.icState = 1;//成功
+	ctx->Answer(Error_Succeed);
+	LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_ReadByRF, CSimpleStringA::Format("PreOnline_RF ok.iIssue:%d ", m_issueStatus));
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040220306")();
+	return 0;
+}
+
+int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
+{
+	//判断是否有卡,无卡则报错
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("读卡开始");
+	long l_beginTime, l_endTime;
+	l_beginTime = GetTickCountRVC();
+	ErrorCodeEnum errCode = m_hDevHelper->GetDevStatus(m_devStatus);
+	l_endTime = GetTickCountRVC();
+
+	if (Error_Succeed == errCode)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevStatus").setCostTime(l_endTime - l_beginTime)("ReadJS::GetDevStatus, m_devStatus.eMedia:%d", m_devStatus.eMedia);
+		if (m_devStatus.eMedia != CI_MEDIA_PRESENT) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS read fail , has no card.");
+			ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Read_NoCard_Failed);//无卡
+			return 1;//跳转到无卡状态?
+		}
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS::GetDevStatus err");
+		DWORD dwTmpUserErrCode = SetErrorAndLog(errCode, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+		ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+		return 0;
+	}
+
+	//有卡读磁,返回读磁操作和磁条解析结果。
+	bool bReadCardInfo(false), bReadMag(false);
+	CSimpleStringA t2Account("");
+	ReadMag(ctx, bReadCardInfo, bReadMag, t2Account);//读卡
+
+	//判定卡片ICtype
+	int ICtype = 0;//0:失败 1:复合 2:磁条 3:ic
+	m_bUseRFTillNext = false;//默认初始值
+	int ret = CheckCardType(t2Account, bReadMag, ICtype);
+
+	if (ret == 0) {
+		if (ICtype == 3) {
+			ctx->Ans.magStatus = 0;//单IC设置磁条为空,后续进行ic上电
+		}
+
+		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) {
+			ctx->Ans.magStatus = 1;
+			ctx->Ans.icState = 0;
+			ctx->Ans.icMode = -1;
+			ctx->Ans.result = "";
+			ctx->Answer(Error_Succeed);//单磁条直接返回
+		}
+		else if (ICtype == 1 || ICtype == 3) {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to PreOnline");//联机上电
+			ctx->Ans.icState = 0;//默认值
+			ctx->Ans.icMode = -1;//默认值
+			if (m_bUseRFTillNext) {
+				ctx->Ans.icMode = 1;
+				PreOnlineJS_RF(ctx);
+				PowerOffIC(1);
+			}
+			else {
+				//先接触上电,有条件进行非接上电
+				bool bCtOK = false;
+				bool bContinue = false;//是否继续非接流程
+				ctx->Ans.icMode = 0;
+				PreOnlineJS_Contact(ctx, bCtOK, bContinue);
+				PowerOffIC(0);
+				if (bContinue) {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PreOnlineJS_Contact 用非接兜底");
+					ctx->Ans.icMode = 1;
+					PreOnlineJS_RF(ctx);
+					PowerOffIC(1);
+				}
+			}
+		}
+		return 0;
+	}
+	else {
+		ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Account_EAC_Mismatch);//账户和户口系统的最新账户不匹配
+		return 0;
+	}
+}
+
+int CCardIssuerFSM::InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	m_pCardProcess->DataInit();//??是否需要此处就初始化
+	//m_bCancelByRFIC = false;//??无用变量
+	LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON, "CardReader warning on");
+	m_bWaitAccepteMore = false;//是否还继续使用
+	//查询插卡前卡机是否有卡
+	long l_beginTime, l_endTime;
+	ErrorCodeEnum eErr = Error_Unexpect;
+	l_beginTime = GetTickCountRVC();
+	eErr = m_hDevHelper->GetDevStatus(m_devStatus);
+	l_endTime = GetTickCountRVC();
+	if (Error_Succeed == eErr) {
+		if (m_devStatus.eMedia == CI_MEDIA_PRESENT) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InsertJS::InternalInsert,internal has card before insert");
+			ctx->Answer(Error_Unexpect, CardIssuer_UserErrorCode_Insert_Card_HasCard_Failed);
+			return 5;
+		}
+	}
+	else {
+		DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, 10, "QLR040220303", "");
+		return 1;
+		ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+	}
+	//等待插卡
+	int rc = InternalInsert();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("InsertJS::InternalInsert, result:%d", rc));
+	LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF, "CardReader warning off");
+	if (rc == 0) {
+		FSMSetIssueFlag(0);
+		m_bCardFromHopper = false;
+		LogWarn(Severity_Low, Error_Succeed, CardIssuer_UserErrorCode_InsertCardSucceed, "InsertJS, insert succeed");
+		m_bUseRFTillNext = false;
+		ctx->Answer(Error_Succeed);
+	}
+	else if (rc == 2)
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InsertJS, insert timeout");
+		ctx->Answer(Error_TimeOut,CardIssuer_UserErrorCode_Insert_Card_TimeOut);
+	}
+	else if (rc == 3 || rc == 4)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InsertJS, insert cancel");
+		ctx->Answer(Error_Cancel, CardIssuer_UserErrorCode_Insert_Card_Cancel);
+	}
+	else
+	{
+		DWORD dwTmpUserErrCode = SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, false, 10, "QLR040220303", "");
+		ctx->Answer(Error_Unexpect, dwTmpUserErrCode);
+	}
+	return rc;
+}
+
+int CCardIssuerFSM::InternalInsert()
+{
+	LOG_FUNCTION();
+	long l_beginTime, l_endTime;
+	ErrorCodeEnum eErr = Error_Unexpect;
+	int acceptTries = 0, errRet = 0;//0成功,1查询状态失败 2超时 3取消 4取消有卡
+	//m_bWaitingAccept = true;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("InternalInsert, m_bExit:%d, m_bCancelInsert:%d, m_bWaitAccepteMore:%d",m_bExit, m_bCancelInsert, m_bWaitAccepteMore));
+	bool bHasSetCardInType = false;
+	DWORD64 dwStart = GetTickCountRVC();
+	DWORD64 dwEnd = dwStart;
+
+	errRet = 2;//默认是超时
+	do {
+		if (m_bExit)
+		{	//页面退到首页
+			m_bCancelInsert = true;
+			errRet = 3;
+			break;
+		}
+		if (m_bCancelInsert)
+		{	//取消插卡
+			errRet = 3;
+			break;
+		}
+
+		l_beginTime = GetTickCountRVC();
+		eErr = m_hDevHelper->GetDevStatus(m_devStatus);
+		l_endTime = GetTickCountRVC();
+
+		if (Error_Succeed == eErr)
+		{
+			//成功
+			if (m_devStatus.eMedia == CI_MEDIA_PRESENT)
+			{
+				LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_OP, "CardIssuer op.");
+				errRet = 0;
+				break;//插卡成功
+			}
+			else if (m_devStatus.eMedia == CI_MEDIA_NOTPRESENT)
+			{
+				//无卡
+				Sleep(ACCEPT_TRY_INTERVAL);
+				//打开进口
+				if (!m_bCancelInsert) {
+					if (!bHasSetCardInType) {
+						l_beginTime = GetTickCountRVC();
+						eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_ALL);
+						l_endTime = GetTickCountRVC();
+						if (Error_Succeed == eErr) {
+							bHasSetCardInType = true;
+						}
+						else {
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_ALL err");
+							SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+						}
+					}	
+				}
+
+			}
+		}
+		else
+		{
+			//失败
+			Sleep(ACCEPT_TRY_INTERVAL*3);
+			errRet = 1;
+			break;//查询硬件状态失败。???要退吗
+		}
+
+		dwEnd = GetTickCountRVC();
+	} while ((dwEnd - dwStart) < 58 * 1000);
+
+	m_bExit = false;
+
+	if (errRet == 0 || errRet ==1) {
+		//关闭进口
+		l_beginTime = GetTickCountRVC();
+		eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+		l_endTime = GetTickCountRVC();
+		if (Error_Succeed != eErr)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN err");
+			SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN");
+		}
+	}
+	else {
+		//2和3情况
+		if (m_bCancelInsert) {
+			//判定是否有卡,有卡则走吐卡流程
+			l_beginTime = GetTickCountRVC();
+			eErr = m_hDevHelper->GetDevStatus(m_devStatus);
+			l_endTime = GetTickCountRVC();
+			if (Error_Succeed == eErr) {
+				if (m_devStatus.eMedia == CI_MEDIA_PRESENT) {
+					errRet = 4;//取消时有卡
+				}
+				else {
+					errRet = 3;//取消无卡
+				}
+			}
+			else {
+				errRet = 1;//查询硬件状态失败。???要退吗
+			}
+		}
+		else {
+			errRet = 2;//正常超时
+		}
+
+		if (errRet != 4) {
+			//关闭进口
+			l_beginTime = GetTickCountRVC();
+			eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
+			l_endTime = GetTickCountRVC();
+			if (Error_Succeed != eErr)
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN err");
+				SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			}
+			else {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetCardInType").setCostTime(l_endTime - l_beginTime)("InternalInsert::SetCardInType CI_CARD_IN_TYPE_FORBIDDEN");
+			}
+		}
+	}
+	return errRet;
+}
+
+
+
+DWORD CCardIssuerFSM::GetFsmStateErrCode()
+{
+	int state = GetFSMState();
+	switch (state)
+	{
+	case 2:
+		return CardIssuer_UserErrorCode_PROCESS_IDLE;
+	case 3:
+		return CardIssuer_UserErrorCode_PROCESS_ACCEPT;
+	case 4:
+		return CardIssuer_UserErrorCode_PROCESS_HOLD;
+	case 5:
+	case 15:
+		return CardIssuer_UserErrorCode_PROCESS_READ;
+	case 6:
+		return CardIssuer_UserErrorCode_PROCESS_EJECT;
+	case 7:
+		return CardIssuer_UserErrorCode_PROCESS_WAIT_FETCH;
+	case 8:
+		return CardIssuer_UserErrorCode_PROCESS_CAPTURE;
+	case 9:
+		return CardIssuer_UserErrorCode_PROCESS_FAULT;
+	case 10:
+	case 16:
+		return CardIssuer_UserErrorCode_PROCESS_ISSUE;
+	default:
+		return CardIssuer_UserErrorCode_EntityInStateCannotProcess;
+	}
+}
+
+CSimpleStringA CCardIssuerFSM::MaskCardno(const char* cardno)
+{
+	CSimpleStringA maskCardno = "";
+
+	if (cardno == NULL) {
+		maskCardno = "(null)****(null)";
+	}
+	else {
+		CSimpleStringA xTestStr(cardno);
+		if (xTestStr.GetLength() == 0) {
+			maskCardno = "(null)****(null)";
+		}
+		else if (xTestStr.GetLength() > 6) {
+			maskCardno = CSimpleStringA::Format("%s****%s", xTestStr.SubString(0, 6).GetData(), xTestStr.SubString(xTestStr.GetLength() - 4, 4).GetData());
+		}
+		else {
+			maskCardno = CSimpleStringA::Format("%s****", xTestStr.GetData());
+		}
+	}
+
+	return maskCardno;
+}
+
+void CCardIssuerFSM::GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& ApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode)
+{
+	if (m_pCardProcess == NULL) {
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetCardProcessLastErr m_pCardProcess is null");
+		eErrCode = Error_Null;
+		ApiName = "";
+		alarmMsg = "";
+		csErrMsgWithReturnCode = "";
+		return;
+	}
+
+	ErrorCodeEnum lastErrCode = Error_Succeed;
+	CSimpleStringA lastErrMsg = "";
+	CSimpleStringA lastApiName = "";
+	m_pCardProcess->getCardAssistLastErr(lastErrCode, lastErrMsg, lastApiName);
+
+	const CSimpleStringA alarmMsgStr = CSimpleStringA::Format("{\"Function\":\"%s\", \"DevApi\":\"%s\", \"ReturnCode\":\"%s\", \"Msg\":\"%s\", \"Context\":\"%s\"}"
+		, __FUNCTION__, lastApiName.GetData(), SpStrError(lastErrCode), lastErrMsg.GetData(), "");
+
+	std::map<std::string, std::string> msgInfo;
+	msgInfo["ReturnCode"] = SpStrError(lastErrCode);
+	msgInfo["ErrMsg"] = lastErrMsg.GetData();
+	msgInfo["Context"] = "";
+	std::pair<bool, std::string> strResult;
+	strResult = generateJsonStr(msgInfo);
+	CSimpleStringA csErrMsgWithReturnCodeStr = strResult.second.c_str();
+
+	eErrCode = lastErrCode;
+	ApiName = lastApiName;
+	alarmMsg = alarmMsgStr.GetData();
+	csErrMsgWithReturnCode = csErrMsgWithReturnCodeStr.GetData();
+}
+
+int CCardIssuerFSM::QuickSelfCheckImpl()
+{
+	//通知健康快速自检
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("快速自检开始");
+	int ret = 0;//失败
+	ErrorCodeEnum eErr = Error_Unexpect;
+	HealthManager::HealthManagerService_ClientBase* pClient = new HealthManager::HealthManagerService_ClientBase(GetEntityBase());
+	eErr = pClient->Connect();
+	if (eErr == Error_Succeed)
+	{
+		HealthManager::HealthManagerService_RealCheck_Req req1 = {};
+		HealthManager::HealthManagerService_RealCheck_Ans ans1 = {};
+		req1.name = "CardIssuerStand";
+		if (Error_Succeed == (*pClient)(EntityResource::getLink().upgradeLink())->RealCheck(req1, ans1, 10000))
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("RealCheck success");
+			ret = 1;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("RealCheck fail");
+			ret = 0;
+		}
+		pClient->GetFunction()->CloseSession();
+		pClient->SafeDelete();
+		return ret;
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QuickSelfCheckImpl")("connect to HealthManager fail,err=%d", (int)eErr);
+		pClient->SafeDelete();
+		return ret;
+	}
+}
+
+int CCardIssuerFSM::PowerOffIC(int type)
+{
+	int ret = 0;
+	long l_beginTime, l_endTime;
+	if (type == 0) {
+		l_beginTime = GetTickCountRVC();
+		ErrorCodeEnum eErr = m_hDevHelper->DeactivateICCard();
+		l_endTime = GetTickCountRVC();
+
+		if (eErr != Error_Succeed) {
+			SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactivateICCard, "DevAdapter::DeactivateICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ret = 1;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactivateICCard").setCostTime(l_endTime - l_beginTime)("PowerOffIC::DeactivateICCard");
+		}
+
+		l_beginTime = GetTickCountRVC();
+		eErr = m_hDevHelper->ReleaseIC();
+		l_endTime = GetTickCountRVC();
+
+		if (eErr != Error_Succeed) {
+			SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_ReleaseIC, "DevAdapter::ReleaseIC", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ret = 1;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ReleaseIC").setCostTime(l_endTime - l_beginTime)("PowerOffIC::ReleaseIC");
+		}
+
+	}
+	else {
+		l_beginTime = GetTickCountRVC();
+		ErrorCodeEnum eErr = m_hDevHelper->DeactContactlessICCard();
+		l_endTime = GetTickCountRVC();
+
+		if (eErr != Error_Succeed) {
+			SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_DeactContactlessICCard, "DevAdapter::DeactContactlessICCard", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
+			ret = 1;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DeactContactlessICCard").setCostTime(l_endTime - l_beginTime)("PowerOffIC::DeactContactlessICCard");
+		}
+	}
+	return ret;
+}

+ 314 - 4
Module/mod_CardIssuerStand/CardIssuerFSM.h

@@ -5,9 +5,9 @@
 
 #include "SpFSM.h"
 #include "CardIssuerStand_server_g.h"
-//#include "GUIConsole_client_g.h"
 #include "HeartBeat_client_g.h"
 #include "AccessAuthorization_client_g.h"
+#include "HealthManager_client_g.h"
 #include "DevFSMCommBase.hpp"
 #include "CardIssuerClass.h"
 #include "CardAssist.h"
@@ -55,6 +55,23 @@ enum EvtType
 	USER_EVT_SAM_IC,
 	USER_EVT_SAM_IC_FINISHED,
 	USER_EVT_BACK_TO_INIT,
+	//新定义JS状态机事件枚举
+	USER_EVT_JS_CAPTURE = EVT_USER + 38,
+	USER_EVT_JS_CAPTURE_FINISHED,
+	USER_EVT_JS_EJECT,
+	USER_EVT_JS_EJECT_FINISHED,
+	USER_EVT_JS_POSTONLINE,
+	USER_EVT_JS_POSTONLINE_FINISHED,
+	USER_EVT_JS_ISSUE_FROM_BOX,
+	USER_EVT_JS_ISSUE_FROM_BOX_FINISHED,
+	USER_EVT_QUICK_SELF_CHECK,
+	USER_EVT_QUICK_SELF_CHECK_FINISHED,
+	USER_EVT_JS_READ,
+	USER_EVT_JS_READ_FINISHED,
+	USER_EVT_JS_INSERT,
+	USER_EVT_JS_INSERT_FINISHED,
+	USER_EVT_JS_INSERT_CANCEL,
+	USER_EVT_JS_EXIT_MIAN_PAGE
 };
 enum SAMICCommandType
 {
@@ -355,6 +372,120 @@ public:
 		}
 	}
 };
+#pragma region JS接口 event
+//JS接口
+class EjectJSEvent : public FSMEvent
+{
+public:
+	EjectJSEvent() : FSMEvent(USER_EVT_JS_EJECT) {}
+	~EjectJSEvent() {}
+	SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("EjectJS Operate unhandled");
+		}
+	}
+};
+
+class CaptureJSEvent : public FSMEvent
+{
+public:
+	CaptureJSEvent() : FSMEvent(USER_EVT_JS_CAPTURE) {}
+	~CaptureJSEvent() {}
+	SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS Operate unhandled");
+		}
+	}
+};
+
+class PostOnlineJSEvent : public FSMEvent
+{
+public:
+	PostOnlineJSEvent() : FSMEvent(USER_EVT_JS_POSTONLINE) {}
+	~PostOnlineJSEvent() {}
+	SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PostOnlineJS Operate unhandled");
+		}
+	}
+};
+
+class IssueFromBoxJSEvent : public FSMEvent
+{
+public:
+	IssueFromBoxJSEvent() : FSMEvent(USER_EVT_JS_ISSUE_FROM_BOX) {}
+	~IssueFromBoxJSEvent() {}
+	SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("IssueFromBoxJS Operate unhandled");
+		}
+	}
+};
+
+class QuickSelfcheckFinishEvent : public FSMEvent
+{
+public:
+	QuickSelfcheckFinishEvent() : FSMEvent(USER_EVT_QUICK_SELF_CHECK_FINISHED) {}
+	~QuickSelfcheckFinishEvent() {}
+protected:
+private:
+};
+
+class ReadJSEvent : public FSMEvent
+{
+public:
+	ReadJSEvent() : FSMEvent(USER_EVT_JS_READ) {}
+	~ReadJSEvent() {}
+	SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ReadJS Operate unhandled");
+		}
+	}
+};
+
+class InsertJSEvent : public FSMEvent
+{
+public:
+	InsertJSEvent() : FSMEvent(USER_EVT_JS_INSERT) {}
+	~InsertJSEvent() {}
+	SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx;
+	virtual void OnUnhandled()
+	{
+		if (ctx != NULL)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("InsertJS Operate unhandled");
+		}
+	}
+};
+
+class CancelInsertJSEvent : public FSMEvent
+{
+public:
+	CancelInsertJSEvent() : FSMEvent(USER_EVT_JS_INSERT_CANCEL) {}
+	~CancelInsertJSEvent() {}
+	virtual void OnUnhandled()
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CancelInsertJS Operate unhandled");
+	}
+};
+
+#pragma endregion JS接口 event
+
 
 typedef struct EacQueryByEac_X1 {
 	string xEacNbr;
@@ -684,7 +815,7 @@ struct SyncMaterialCountHTTPRet : CHTTPRet {
 class CCardIssuerFSM : public CCommDevFSM<CCardIssuerFSM, CardIssuerClass>
 {
 public:
-	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s14};
+	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s14,s15,s16};
 	BEGIN_FSM_STATE(CCardIssuerFSM)
 		FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
 		FSM_STATE_ENTRY(s1,"Initializing",s1_on_entry,s1_on_exit,s1_on_event)
@@ -699,6 +830,8 @@ public:
 		FSM_STATE_ENTRY(s10,"Issuing",s10_on_entry,s10_on_exit,s10_on_event)
 		FSM_STATE_ENTRY(s11,"Writing",s11_on_entry,s11_on_exit,s11_on_event)
 		FSM_STATE_ENTRY(s14, "SAMIC", s14_on_entry, s14_on_exit, s14_on_event)
+		FSM_STATE_ENTRY(s15, "ReadJSing", s15_on_entry, s15_on_exit, s15_on_event)
+		FSM_STATE_ENTRY(s16, "IssueJSing", s16_on_entry, s16_on_exit, s16_on_event)
 		END_FSM_STATE()
 
 	BEGIN_FSM_RULE(CCardIssuerFSM,s0)
@@ -714,12 +847,21 @@ public:
 		FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s2,s10,USER_EVT_ISSUE,0)
 		FSM_RULE_ENTRY(s2, s10, USER_EVT_ISSUE_EX, 0)
+		FSM_RULE_ENTRY(s2, s3, USER_EVT_JS_INSERT, 0)//JS 插卡
+		FSM_RULE_ENTRY(s2, s16, USER_EVT_JS_ISSUE_FROM_BOX, 0)//JS 卡箱发卡
+		FSM_RULE_ENTRY(s2, s8, USER_EVT_JS_CAPTURE, 0)//JS 吞卡
 		FSM_RULE_ENTRY(s3,s4,USER_EVT_ACCEPTFINISHED,0)
 		FSM_RULE_ENTRY(s3,s9,USER_EVT_ACCEPTFINISHED,1)
 		FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,2)
 		FSM_RULE_ENTRY(s3,s2,USER_EVT_ACCEPTFINISHED,3)
 		FSM_RULE_ENTRY(s3,s7,USER_EVT_ACCEPTFINISHED,4)
 		FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
+		FSM_RULE_ENTRY(s3, s4, USER_EVT_JS_INSERT_FINISHED, 0)//JS 插卡成功
+		FSM_RULE_ENTRY(s3, s9, USER_EVT_JS_INSERT_FINISHED, 1)//JS 查询硬件报错
+		FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 2)//JS 超时
+		FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 3)//JS 取消
+		FSM_RULE_ENTRY(s3, s6, USER_EVT_JS_INSERT_FINISHED, 4)//JS 取消时有卡,吐卡
+		FSM_RULE_ENTRY(s3, s2, USER_EVT_JS_INSERT_FINISHED, 5)//JS 插卡前内部已有卡
 		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)
@@ -733,6 +875,12 @@ public:
 		FSM_RULE_ENTRY(s4, s6, USER_EVT_ISSUE_EX_FINISHED, 6)
 		FSM_RULE_ENTRY(s4, s5, USER_EVT_PREONLINE, 0)
 		FSM_RULE_ENTRY(s4, s5, USER_EVT_POSTONLINE, 0)
+		FSM_RULE_ENTRY(s4, s15, USER_EVT_JS_READ, 0)//JS 读卡
+		FSM_RULE_ENTRY(s4, s15, USER_EVT_JS_POSTONLINE, 0)//JS 联机后
+		FSM_RULE_ENTRY(s4, s6, USER_EVT_JS_EJECT, 0)//JS 吐卡
+		FSM_RULE_ENTRY(s4, s8, USER_EVT_JS_CAPTURE, 0)//JS 吞卡
+		FSM_RULE_ENTRY(s4, s6, USER_EVT_JS_EXIT_MIAN_PAGE, 0)//JS 退回首页吐卡
+		FSM_RULE_ENTRY(s4, s8, USER_EVT_JS_EXIT_MIAN_PAGE, 1)//JS 退回首页吞卡
 		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,0)
 		FSM_RULE_ENTRY(s5,s9,USER_EVT_READ_FINISHED,1)
 		FSM_RULE_ENTRY(s5,s4,USER_EVT_READ_FINISHED,2)
@@ -743,6 +891,8 @@ public:
 		FSM_RULE_ENTRY(s6,s7,USER_EVT_EJECTFINISHED,0)
 		FSM_RULE_ENTRY(s6,s9,USER_EVT_EJECTFINISHED,1)
 		FSM_RULE_ENTRY(s6, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
+		FSM_RULE_ENTRY(s6, s2, USER_EVT_JS_EJECT_FINISHED, 0)//JS 吐卡取卡成功,取卡超时吞卡成功
+		FSM_RULE_ENTRY(s6, s9, USER_EVT_JS_EJECT_FINISHED, 1)//JS 吐卡失败,取卡超时吞卡失败
 		FSM_RULE_ENTRY(s7,s2,USER_EVT_WAITFINISHED,0)
 		FSM_RULE_ENTRY(s7,s9,USER_EVT_WAITFINISHED,1)
 		FSM_RULE_ENTRY(s7,s8,USER_EVT_WAITFINISHED,2)
@@ -750,6 +900,8 @@ public:
 		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(s8, s2, USER_EVT_JS_CAPTURE_FINISHED, 0)//JS 吞卡成功
+		FSM_RULE_ENTRY(s8, s9, USER_EVT_JS_CAPTURE_FINISHED, 1)//JS 吞卡失败
 		FSM_RULE_ENTRY(s9, s2, USER_EVT_RESETFINISHED, 0)
 		FSM_RULE_ENTRY(s9, s0, USER_EVT_RESETFINISHED, 2)
 		FSM_RULE_ENTRY(s9, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
@@ -767,7 +919,14 @@ public:
 		FSM_RULE_ENTRY(s11,s4,USER_EVT_WRITE_FINISHED,1)
 		FSM_RULE_ENTRY(s14, s4, USER_EVT_SAM_IC_FINISHED, 0)
 
-		
+		FSM_RULE_ENTRY(s15, s4, USER_EVT_JS_READ_FINISHED, 0)//JS 读卡结果返回
+		FSM_RULE_ENTRY(s15, s2, USER_EVT_JS_READ_FINISHED, 1)//JS 无卡
+		FSM_RULE_ENTRY(s15, s4, USER_EVT_JS_POSTONLINE_FINISHED, 0)//JS
+		FSM_RULE_ENTRY(s15, s4, USER_EVT_JS_EXIT_MIAN_PAGE, 0)//退出事件
+		FSM_RULE_ENTRY(s16, s4, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 0)//JS 发卡成功
+		FSM_RULE_ENTRY(s16, s2, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 1)//JS 发卡失败
+		FSM_RULE_ENTRY(s16, s9, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 2)//JS 发卡故障
+		FSM_RULE_ENTRY(s16, s8, USER_EVT_JS_ISSUE_FROM_BOX_FINISHED, 3)//JS 退回首页进行吞卡
 	END_FSM_RULE()
 
 	CCardIssuerFSM() : m_bCancelAccept(false),m_bWaitingAccept(false),
@@ -780,6 +939,7 @@ public:
 	,  m_bCancelByRFIC(false), m_devOpenFailedCount(0)
 			, m_EacQueryHost(""),m_eacQueryFlag(0), m_bUseCardnoMismatch(false), m_ICRetryTimes(1)
 			, m_bCardFromHopper(true), m_bStopUseRF(false),m_rfVendorList(""), m_bUseRFTillNext(false), m_csSwallowCardUrl(""), m_csSyncMaterialUrl("")
+			, m_quickSelfcheck(false), m_SelfcheckSleepTime(10000), m_bCancelInsert(false), m_bReturnMainPage(false)
 		{
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
 			cmdDecodeMag2 = NULL;
@@ -833,6 +993,14 @@ public:
 	void s14_on_entry();
 	void s14_on_exit();
 	unsigned int s14_on_event(FSMEvent* event);
+
+	void s15_on_entry();
+	void s15_on_exit();
+	unsigned int s15_on_event(FSMEvent* event);
+
+	void s16_on_entry();
+	void s16_on_exit();
+	unsigned int s16_on_event(FSMEvent* event);
 	
 	ErrorCodeEnum OpenDevice(BYTE btOpenType, const char *pDevSN);
 	int Initial();
@@ -894,7 +1062,7 @@ public:
 	void DecodeTracksData(const char *track2, DWORD dwT2size, const char *track3, DWORD dwT3size,char *&magData,bool bT2OK=true,bool bT3OK=true);
 	int GetFSMState()
 	{ 
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_currentFSMState:%d", m_currentFSMState));
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_currentFSMState:%d", m_currentFSMState));
 		return m_currentFSMState;
 	}
 	void GetCardInfo(int &findCard, int &cardPos)
@@ -963,6 +1131,48 @@ private:
 	bool IfUseRf();
 	CSimpleStringA m_EacQueryHost, m_csSwallowCardUrl, m_csSyncMaterialUrl;
 	MagTracks m_magTracks;
+
+public:
+	int EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx);
+
+	int CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx);
+
+	void QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx);
+
+	int PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx);
+
+	int IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx);
+
+	int ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
+
+	int InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx);
+	int InternalInsert();
+
+	int PostOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx, bool& bICOK);
+	int PostOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx);
+
+	int ReadMag(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool& bReadCardInfo, bool& bReadMag, CSimpleStringA& t2Account);
+	int CheckCardType(CSimpleStringA cardNo, bool bReadMag, int& ICtype);
+	int PreOnlineJS_Contact(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx, bool& bICOK, bool& bContinue);
+	int PreOnlineJS_RF(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
+
+	DWORD GetFsmStateErrCode();
+	CSimpleStringA MaskCardno(const char* cardno);
+	void GetCardProcessLastErr(ErrorCodeEnum& eErrCode, CSimpleStringA& lastApiName, CSimpleStringA& alarmMsg, CSimpleStringA& csErrMsgWithReturnCode);
+	
+	int QuickSelfCheckImpl();
+	void setQuickSelfCheck() {
+		m_quickSelfcheck = true;
+	}
+	void SetDoExitFlag(bool bFlag) { m_bDoExit = bFlag; }
+	int PowerOffIC(int type);//0:接触IC 1:非接
+private:
+	bool m_bCancelInsert;
+	bool m_quickSelfcheck;
+	bool m_bDoExit;
+	bool m_bReturnMainPage;//正在处理过程中是否退到首页变量
+public:
+	int  m_SelfcheckSleepTime;
 };
 struct InitTask : public ITaskSp
 {
@@ -1116,6 +1326,7 @@ struct DoExitWhenIdleTask : public ITaskSp
 	void Process()
 	{
 		fsm->DoExitWhenIdle();
+		fsm->SetDoExitFlag(false);
 	}
 };
 struct SAMICCommandTask : public ITaskSp
@@ -1161,4 +1372,103 @@ struct SyncMaterialCountTask : public ITaskSp
 	}
 };
 
+#pragma region JS接口 工作线程
+//吐卡
+struct EjectJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx;
+	EjectJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_EJECT_FINISHED);
+		e->param1 = fsm->EjectJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+//吞卡
+struct CaptureJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx;
+	CaptureJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_CAPTURE_FINISHED);
+		e->param1 = fsm->CaptureJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+//联机后处理
+struct PostOnlineJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx;
+	PostOnlineJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_POSTONLINE_FINISHED);
+		e->param1 = fsm->PostOnlineJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+//卡箱发卡
+struct IssueFromBoxJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx;
+	IssueFromBoxJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_ISSUE_FROM_BOX_FINISHED);
+		e->param1 = fsm->IssueFromBoxJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+//读卡
+struct ReadJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx;
+	ReadJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_READ_FINISHED);
+		e->param1 = fsm->ReadJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+struct InsertJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx;
+	InsertJSTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		LOG_FUNCTION();
+		FSMEvent* e = new FSMEvent(USER_EVT_JS_INSERT_FINISHED);
+		e->param1 = fsm->InsertJS(ctx);
+		fsm->PostEventFIFO(e);
+	}
+};
+
+//故障自检task
+struct QuickSelfcheckTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	QuickSelfcheckTask(CCardIssuerFSM* f) : fsm(f) {}
+	void Process()
+	{
+		QuickSelfcheckFinishEvent* e = new QuickSelfcheckFinishEvent();
+		Sleep(fsm->m_SelfcheckSleepTime);
+		e->param1 = fsm->QuickSelfCheckImpl();
+		fsm->PostEventFIFO(e);
+	}
+};
+#pragma endregion JS接口 工作线程
 #endif //__CARD_ISSUER_FSM_H

+ 169 - 2
Module/mod_CardIssuerStand/CardIssuerStand.xml

@@ -428,17 +428,184 @@
 				<param name="reserved3" type="array_string"/>
 				<param name="reserved4" type="array_string"/>				
 			</res>			
-		</twoway>																		
-		<twoway name="GetDevInfo" overlap="true" method_id="65535">
+		</twoway>
+		<!--查询卡机设备状态接口 -->
+		<!--1、卡库打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
+		<!--2、卡库正在打开中, errorCode为Error_NotInit(769),rtaCode为RTA2311-->		
+		<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 正常运行 2卡箱未准备好需要维护 3卡机异常不可工作-->
 				<param name="state" type="int" />
 			</res>			
 		</twoway>							
+	
+		
+		<!--读卡接口 -->
+		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
+		<!--2、读卡器无卡, errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CR-->
+		<!--3、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2322-->
+		<!--4、发卡时,上电失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA230V-->
+		<!--5、发卡时,上电失败(非接) errorCode为Error_Unexpect(2147483646),rtaCode为RTA2327-->
+		<!--6、上电失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA230M-->
+		<!--7、上电失败(非接) errorCode为Error_Unexpect(2147483646),rtaCode为RTA2326-->
+		<!--8、读卡失败,读取IC数据失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2302-->
+		<!--9、读卡失败,读取IC数据失败(非接) errorCode为Error_Unexpect(2147483646),rtaCode为RTA23C9-->
+		<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="array_int"/>
+				<param name="reserved2" type="array_string"/>
+			</req>
+			<res>
+				<!--读磁条结果 0失败 1成功-->
+				<param name="magStatus" type="int" />
+				<!--磁道1数据-->
+				<param name="track1" type="string"/>
+				<!--磁道2数据-->
+				<param name="track2" type="string"/>
+				<!--磁道3数据-->
+				<param name="track3" type="string"/>
+				<!--磁道1数据长度-->
+				<param name="track1Size" type="int"/>
+				<!--磁道2数据长度-->
+				<param name="track2Size" type="int"/>
+				<!--磁道3数据长度-->
+				<param name="track3Size" type="int"/>
+				<!--磁道1数据状态 0成功 1无效-->
+				<param name="track1Status" type="int"/>
+				<!--磁道2数据状态 0成功 1无效-->
+				<param name="track2Status" type="int"/>
+				<!--磁道3数据状态 0成功 1无效-->
+				<param name="track3Status" type="int"/>
+				<!--读IC结果 0失败 1成功-->
+				<param name="icState" type="int"/>
+				<!--读IC成功下接触方式 -1未知 0接触 1非接-->
+				<param name="icMode" 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为RTA2311-->
+		<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为RTA2311-->
+		<!--2、卡机吐卡失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2308-->
+		<!--3、超时未取卡,已吞卡 errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CU-->
+		<!--4、超时未取卡,吞卡失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CV-->
+		<!--5、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2W22-->
+		<twoway name="EjectJS" overlap="true" method_id="42" jsflag="true">
+			<req>
+			</req>
+			<res>
+			</res>			
+		</twoway>
+		
+		<!--吞卡接口-->
+		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
+		<!--2、吞卡失败, errorCode为Error_Unexpect(2147483646),rtaCode为RTA2307-->
+		<!--3、吞卡时卡机无卡, errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CS-->
+		<twoway name="CaptureJS" overlap="true" method_id="43" jsflag="true">
+			<req>
+				<!--吞卡原因码-->
+				<param name="captureCode" type="string"/>
+			</req>
+			<res>
+			</res>			
+		</twoway>
+		
+		<!--查询卡机是否有卡接口-->
+		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
+		<!--2、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2322-->
+		<twoway name="QueryHasCardJS" overlap="true" method_id="44" jsflag="true">
+			<req>
+			</req>
+			<res>
+				<!--卡片位置0:卡机没有发现卡片 1:卡机内部发现卡片 3:卡片在进卡口-->
+				<param name="position" type="int"/>
+				<param name="reserved1" type="int"/>
+				<param name="reserved2" type="string"/>
+			</res>			
+		</twoway>		
+		
+		<!--卡箱发卡接口-->
+		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
+		<!--2、卡箱1未检测到 errorCode为Error_DevMedia(2054),rtaCode为RTA230B-->
+		<!--3、卡箱2未检测到 errorCode为Error_DevMedia(2054),rtaCode为RTA230C-->
+		<!--4、卡箱3未检测到 errorCode为Error_DevMedia(2054),rtaCode为RTA230D-->
+		<!--5、卡箱1未检测到卡片 errorCode为Error_DevNotAvailable(2050),rtaCode为RTA230E-->
+		<!--6、卡箱2未检测到卡片 errorCode为Error_DevNotAvailable(2050),rtaCode为RTA230F-->
+		<!--7、卡箱3未检测到卡片 errorCode为Error_DevNotAvailable(2050),rtaCode为RTA230G-->
+		<!--8、从卡箱移动卡片到读卡器失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2306-->
+		<!--9、发卡箱号参数错误 errorCode为Error_Param(102),rtaCode为RTA23CW-->
+		<twoway name="IssueFromBoxJS" overlap="true" method_id="45" jsflag="true">
+			<req>
+				<!--卡箱号-->
+				<param name="hopper" type="int"/>
+				<param name="reserved1" type="array_int"/>
+				<param name="reserved2" type="array_string"/>			
+			</req>
+			<res>
+				<param name="reserved1" type="array_int"/>
+				<param name="reserved2" type="array_string"/>					
+			</res>			
+		</twoway>	
+		
+		<!--前端插卡接口-->
+		<!--1、卡机打开失败, errorCode为Error_DevNotAvailable(2050),rtaCode为RTA2311-->
+		<!--2、查询卡机状态失败 errorCode为Error_Unexpect(2147483646),rtaCode为RTA2322-->
+		<!--3、卡机未插卡时,内部已存在卡片 errorCode为Error_Unexpect(2147483646),rtaCode为RTA23CN-->
+		<!--4、卡机插卡超时 errorCode为Error_TimeOut(1792),rtaCode为RTA23CP-->
+		<!--5、卡机插卡取消 errorCode为Error_Cancel(1026),rtaCode为RTA23CQ-->
+		
+		<twoway name="InsertJS" overlap="true" method_id="47" jsflag="true">
+			<req>
+				<param name="reserved1" type="array_int"/>
+				<param name="reserved2" type="array_string"/>
+			</req>
+			<res>
+				<param name="reserved1" type="array_int"/>
+				<param name="reserved2" type="array_string"/>
+			</res>
+		</twoway>	
+		
+		<!--取消插卡接口-->
+		<oneway name="CancelInsertJS" overlap="true" method_id="48" jsflag="true">			
+		</oneway>	
+		
 	</class>
 	<message name="FetchCard">
 			<param name="status" type="int"/>

+ 357 - 0
Module/mod_CardIssuerStand/CardIssuerStand_client_g.h

@@ -1584,6 +1584,363 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum ReadJS(CardIssuerStandService_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(CardIssuerStandService_Method_ReadJS, CardIssuerStandService_MethodSignature_ReadJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum ReadJS(CardIssuerStandService_ReadJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_ReadJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_ReadJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_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(CardIssuerStandService_Method_PostOnlineJS, CardIssuerStandService_MethodSignature_PostOnlineJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum PostOnlineJS(CardIssuerStandService_PostOnlineJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_PostOnlineJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_PostOnlineJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_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(CardIssuerStandService_Method_EjectJS, CardIssuerStandService_MethodSignature_EjectJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum EjectJS(CardIssuerStandService_EjectJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_EjectJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_EjectJS_Req &Req, CardIssuerStandService_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 CaptureJS(CardIssuerStandService_CaptureJS_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(CardIssuerStandService_Method_CaptureJS, CardIssuerStandService_MethodSignature_CaptureJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum CaptureJS(CardIssuerStandService_CaptureJS_Req &Req, CardIssuerStandService_CaptureJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CaptureJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum CaptureJS(CardIssuerStandService_CaptureJS_Req &Req, CardIssuerStandService_CaptureJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CaptureJS(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 CaptureJS(CardIssuerStandService_CaptureJS_Req &Req, CardIssuerStandService_CaptureJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CaptureJS(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(CardIssuerStandService_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(CardIssuerStandService_Method_QueryHasCardJS, CardIssuerStandService_MethodSignature_QueryHasCardJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum QueryHasCardJS(CardIssuerStandService_QueryHasCardJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_QueryHasCardJS_Req &Req, CardIssuerStandService_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(CardIssuerStandService_QueryHasCardJS_Req &Req, CardIssuerStandService_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 IssueFromBoxJS(CardIssuerStandService_IssueFromBoxJS_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(CardIssuerStandService_Method_IssueFromBoxJS, CardIssuerStandService_MethodSignature_IssueFromBoxJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum IssueFromBoxJS(CardIssuerStandService_IssueFromBoxJS_Req &Req, CardIssuerStandService_IssueFromBoxJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = IssueFromBoxJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum IssueFromBoxJS(CardIssuerStandService_IssueFromBoxJS_Req &Req, CardIssuerStandService_IssueFromBoxJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = IssueFromBoxJS(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 IssueFromBoxJS(CardIssuerStandService_IssueFromBoxJS_Req &Req, CardIssuerStandService_IssueFromBoxJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = IssueFromBoxJS(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 InsertJS(CardIssuerStandService_InsertJS_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(CardIssuerStandService_Method_InsertJS, CardIssuerStandService_MethodSignature_InsertJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum InsertJS(CardIssuerStandService_InsertJS_Req &Req, CardIssuerStandService_InsertJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = InsertJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum InsertJS(CardIssuerStandService_InsertJS_Req &Req, CardIssuerStandService_InsertJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = InsertJS(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 InsertJS(CardIssuerStandService_InsertJS_Req &Req, CardIssuerStandService_InsertJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = InsertJS(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 CancelInsertJS()
+	{
+		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(CardIssuerStandService_Method_CancelInsertJS, CardIssuerStandService_MethodSignature_CancelInsertJS, m_context);
+		m_context.clear();
+		return ret;
+	}
+
 
 	bool SafeDelete()
 	{

+ 203 - 0
Module/mod_CardIssuerStand/CardIssuerStand_def_g.h

@@ -46,6 +46,14 @@ namespace CardIssuerStand {
 #define CardIssuerStandService_Method_PrintCardImmediately 31
 #define CardIssuerStandService_Method_QueryCIStatus 32
 #define CardIssuerStandService_Method_GetDevInfo 65535
+#define CardIssuerStandService_Method_ReadJS 40
+#define CardIssuerStandService_Method_PostOnlineJS 41
+#define CardIssuerStandService_Method_EjectJS 42
+#define CardIssuerStandService_Method_CaptureJS 43
+#define CardIssuerStandService_Method_QueryHasCardJS 44
+#define CardIssuerStandService_Method_IssueFromBoxJS 45
+#define CardIssuerStandService_Method_InsertJS 47
+#define CardIssuerStandService_Method_CancelInsertJS 48
 
 #define CardIssuerStandService_MethodSignature_Insert 1091033773
 #define CardIssuerStandService_MethodSignature_CancelInsert -1202478828
@@ -81,6 +89,14 @@ namespace CardIssuerStand {
 #define CardIssuerStandService_MethodSignature_PrintCardImmediately -1976184201
 #define CardIssuerStandService_MethodSignature_QueryCIStatus -1907000703
 #define CardIssuerStandService_MethodSignature_GetDevInfo 296205965
+#define CardIssuerStandService_MethodSignature_ReadJS 1204749665
+#define CardIssuerStandService_MethodSignature_PostOnlineJS -92324905
+#define CardIssuerStandService_MethodSignature_EjectJS -687956608
+#define CardIssuerStandService_MethodSignature_CaptureJS 141697186
+#define CardIssuerStandService_MethodSignature_QueryHasCardJS -2034090823
+#define CardIssuerStandService_MethodSignature_IssueFromBoxJS -372937885
+#define CardIssuerStandService_MethodSignature_InsertJS 2065772372
+#define CardIssuerStandService_MethodSignature_CancelInsertJS 715056722
 
 #define CardIssuerStandService_LogCode_Insert "QLR040220300"
 #define CardIssuerStandService_LogCode_CancelInsert "QLR040220301"
@@ -116,6 +132,14 @@ namespace CardIssuerStand {
 #define CardIssuerStandService_LogCode_PrintCardImmediately "QLR040220331"
 #define CardIssuerStandService_LogCode_QueryCIStatus "QLR040220332"
 #define CardIssuerStandService_LogCode_GetDevInfo "QLR040220399"
+#define CardIssuerStandService_LogCode_ReadJS "QLR040220340"
+#define CardIssuerStandService_LogCode_PostOnlineJS "QLR040220341"
+#define CardIssuerStandService_LogCode_EjectJS "QLR040220342"
+#define CardIssuerStandService_LogCode_CaptureJS "QLR040220343"
+#define CardIssuerStandService_LogCode_QueryHasCardJS "QLR040220344"
+#define CardIssuerStandService_LogCode_IssueFromBoxJS "QLR040220345"
+#define CardIssuerStandService_LogCode_InsertJS "QLR040220347"
+#define CardIssuerStandService_LogCode_CancelInsertJS "QLR040220348"
 
 struct CardIssuerStandService_Insert_Req
 {
@@ -991,6 +1015,185 @@ struct CardIssuerStandService_GetDevInfo_Ans
 
 };
 
+struct CardIssuerStandService_ReadJS_Req
+{
+	CSimpleStringA aid;
+	CSimpleStringA businessData;
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & aid & businessData & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_ReadJS_Ans
+{
+	int magStatus;
+	CSimpleStringA track1;
+	CSimpleStringA track2;
+	CSimpleStringA track3;
+	int track1Size;
+	int track2Size;
+	int track3Size;
+	int track1Status;
+	int track2Status;
+	int track3Status;
+	int icState;
+	int icMode;
+	CSimpleStringA result;
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & magStatus & track1 & track2 & track3 & track1Size & track2Size & track3Size & track1Status & track2Status & track3Status & icState & icMode & result & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_PostOnlineJS_Req
+{
+	CSimpleStringA data;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & data;
+	}
+
+};
+
+struct CardIssuerStandService_PostOnlineJS_Ans
+{
+	CSimpleStringA result;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & result;
+	}
+
+};
+
+struct CardIssuerStandService_EjectJS_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CardIssuerStandService_EjectJS_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CardIssuerStandService_CaptureJS_Req
+{
+	CSimpleStringA captureCode;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & captureCode;
+	}
+
+};
+
+struct CardIssuerStandService_CaptureJS_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CardIssuerStandService_QueryHasCardJS_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct CardIssuerStandService_QueryHasCardJS_Ans
+{
+	int position;
+	int reserved1;
+	CSimpleStringA reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & position & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_IssueFromBoxJS_Req
+{
+	int hopper;
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & hopper & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_IssueFromBoxJS_Ans
+{
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_InsertJS_Req
+{
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_InsertJS_Ans
+{
+	CAutoArray<int> reserved1;
+	CAutoArray<CSimpleStringA> reserved2;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & reserved1 & reserved2;
+	}
+
+};
+
+struct CardIssuerStandService_CancelInsertJS_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 
 ///////////////////////////
 

+ 216 - 0
Module/mod_CardIssuerStand/CardIssuerStand_server_g.h

@@ -268,6 +268,62 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case CardIssuerStandService_Method_ReadJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_ReadJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_PostOnlineJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_PostOnlineJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_EjectJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_EjectJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_CaptureJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_CaptureJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_QueryHasCardJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_QueryHasCardJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_IssueFromBoxJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_IssueFromBoxJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_InsertJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_InsertJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_CancelInsertJS:
+			if (dwSignature == CardIssuerStandService_MethodSignature_CancelInsertJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -449,6 +505,46 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case CardIssuerStandService_Method_ReadJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_ReadJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_PostOnlineJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_PostOnlineJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_EjectJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_EjectJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_CaptureJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_CaptureJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_QueryHasCardJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_QueryHasCardJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_IssueFromBoxJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_IssueFromBoxJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_InsertJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_InsertJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case CardIssuerStandService_Method_CancelInsertJS:
+			if (dwSignature != CardIssuerStandService_MethodSignature_CancelInsertJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -626,6 +722,46 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_CancelInsertJS(SpOnewayCallContext<CardIssuerStandService_CancelInsertJS_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -982,6 +1118,86 @@ public:
 						Handle_GetDevInfo(ctx);
 					}
 					break;
+				case CardIssuerStandService_Method_ReadJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_ReadJS_Req,CardIssuerStandService_ReadJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_ReadJS_Req,CardIssuerStandService_ReadJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_ReadJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_PostOnlineJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req,CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req,CardIssuerStandService_PostOnlineJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_PostOnlineJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_EjectJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_EjectJS_Req,CardIssuerStandService_EjectJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_EjectJS_Req,CardIssuerStandService_EjectJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_EjectJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_CaptureJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_CaptureJS_Req,CardIssuerStandService_CaptureJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_CaptureJS_Req,CardIssuerStandService_CaptureJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_CaptureJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_QueryHasCardJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req,CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req,CardIssuerStandService_QueryHasCardJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_QueryHasCardJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_IssueFromBoxJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req,CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req,CardIssuerStandService_IssueFromBoxJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_IssueFromBoxJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_InsertJS:
+					{
+						SpReqAnsContext<CardIssuerStandService_InsertJS_Req,CardIssuerStandService_InsertJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<CardIssuerStandService_InsertJS_Req,CardIssuerStandService_InsertJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_InsertJS(ctx);
+					}
+					break;
+				case CardIssuerStandService_Method_CancelInsertJS:
+					{
+						SpOnewayCallContext<CardIssuerStandService_CancelInsertJS_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<CardIssuerStandService_CancelInsertJS_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_CancelInsertJS(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 21 - 0
Module/mod_CardIssuerStand/CardIssuer_UserErrorCode.h

@@ -215,4 +215,25 @@
 
 #define CardIssuer_UserErrorCode_EnterMainPage_SetFlag		0x20300300 //卡机进入首页设置运行时标志位
 #define CardIssuer_UserErrorCode_CopyRuncfg					0x20300301 //卡机拷贝旧运行时文件
+
+#define CardIssuer_UserErrorCode_Insert_Card_HasCard_Failed						0x20300302 //卡机未插卡时,内部已存在卡片
+#define CardIssuer_UserErrorCode_Insert_Card_TimeOut							0x20300303 //卡机插卡超时
+#define CardIssuer_UserErrorCode_Insert_Card_Cancel								0x20300304 //卡机插卡取消
+#define CardIssuer_UserErrorCode_Read_NoCard_Failed								0x20300305 //读卡时读卡器无卡
+#define CardIssuer_UserErrorCode_Capture_NoCard_Failed							0x20300306 //吞卡时发现读卡器无卡
+#define CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Succ					0x20300307 //超时未取卡,已吞卡,请从吞卡箱中取卡
+#define CardIssuer_UserErrorCode_Forget_Fetch_Card_Capture_Fail					0x20300308 //超时未取卡,吞卡失败,请从发卡器取卡
+#define CardIssuer_UserErrorCode_Split_ICTrack2_Failed							0x20300309 //IC磁道2解析失败
+
+
+//卡机流程状态报错
+#define CardIssuer_UserErrorCode_PROCESS_IDLE				0x20300402		//当前处于卡机无卡空闲状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_ACCEPT				0x20300403		//当前处于卡机插卡状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_HOLD				0x20300404		//当前处于卡机有卡等待状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_READ				0x20300405		//当前处于正在读卡状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_EJECT				0x20300406		//当前处于正在吐卡状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_WAIT_FETCH			0x20300407		//当前处于正在取卡状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_CAPTURE			0x20300408		//当前处于正在吞卡状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_FAULT				0x20300409		//当前处于卡机故障异常状态,无法处理此请求
+#define CardIssuer_UserErrorCode_PROCESS_ISSUE				0x2030040A		//当前处于卡机发卡操作状态,无法处理此请求
 #endif //_CARDISSUERSTAND_USER_ERRORCODE_H

+ 59 - 0
Module/mod_CardIssuerStand/mod_cardissuer.cpp

@@ -145,6 +145,65 @@ void CardIssuerServerSession::Handle_GetDevInfo(SpReqAnsContext<CardIssuerStandS
 	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setAPI(__FUNCTION__)("GetDevInfo");
 	m_pEntity->GetDevInfo(ctx);
 }
+
+//JS½Ó¿ÚʵÏÖ
+void CardIssuerServerSession::Handle_ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_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 CardIssuerServerSession::Handle_PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_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 CardIssuerServerSession::Handle_EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_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 CardIssuerServerSession::Handle_CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_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 CaptureJS");
+	m_pEntity->CaptureJS(ctx);
+}
+void CardIssuerServerSession::Handle_QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_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 CardIssuerServerSession::Handle_IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_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 IssueFromBoxJS");
+	m_pEntity->IssueFromBoxJS(ctx);
+}
+void CardIssuerServerSession::Handle_InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_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 InsertJS");
+	m_pEntity->InsertJS(ctx);
+}
+void CardIssuerServerSession::Handle_CancelInsertJS(SpOnewayCallContext<CardIssuerStandService_CancelInsertJS_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 CancelInsertJS");
+	m_pEntity->CancelInsertJS(ctx);
+}
+
 void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
 {
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))

+ 151 - 0
Module/mod_CardIssuerStand/mod_cardissuer.h

@@ -30,6 +30,17 @@ public:
 	virtual void Handle_SAMICCommand(SpReqAnsContext<CardIssuerStandService_SAMICCommand_Req, CardIssuerStandService_SAMICCommand_Ans>::Pointer ctx);
 	virtual void Handle_QueryCIStatus(SpReqAnsContext<CardIssuerStandService_QueryCIStatus_Req, CardIssuerStandService_QueryCIStatus_Ans>::Pointer ctx);
 	virtual void Handle_GetDevInfo(SpReqAnsContext<CardIssuerStandService_GetDevInfo_Req, CardIssuerStandService_GetDevInfo_Ans>::Pointer ctx);
+
+	//JS接口定义
+	virtual void Handle_ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx);
+	virtual void Handle_PostOnlineJS(SpReqAnsContext<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx);
+	virtual void Handle_EjectJS(SpReqAnsContext<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx);
+	virtual void Handle_CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx);
+	virtual void Handle_QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx);
+	virtual void Handle_IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx);
+	virtual void Handle_InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx);
+	virtual void Handle_CancelInsertJS(SpOnewayCallContext<CardIssuerStandService_CancelInsertJS_Info>::Pointer ctx);
+
 private:
 	CCardIssuerEntity* m_pEntity;
 };
@@ -154,6 +165,7 @@ public:
 			if (ctx->Req.reserved1.GetLength() > 0 && strnicmp("kaku#", (const char*)ctx->Req.reserved1, 5) == 0)
 			{
 				int state = m_fsm.GetFSMState();
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_currentFSMState:%d", state));
 				if (state == 9)
 				{
 					ctx->Answer(Error_BridgeNotOK);
@@ -258,6 +270,7 @@ public:
 	{
 		LOG_FUNCTION();
 		int state = m_fsm.GetFSMState();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("m_currentFSMState:%d", state));
 		if (!m_fsm.GetDevInitFlag()) {
 			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
 		}
@@ -308,6 +321,144 @@ public:
 	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;}
+
+	//JS接口实现
+	void ReadJS(SpReqAnsContext<CardIssuerStandService_ReadJS_Req, CardIssuerStandService_ReadJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Hold") != 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<CardIssuerStandService_PostOnlineJS_Req, CardIssuerStandService_PostOnlineJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Hold") != 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<CardIssuerStandService_EjectJS_Req, CardIssuerStandService_EjectJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Hold") != 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 CaptureJS(SpReqAnsContext<CardIssuerStandService_CaptureJS_Req, CardIssuerStandService_CaptureJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
+		}
+		else if (_stricmp(m_fsm.GetCurrStateName(), "Hold") == 0 || _stricmp(m_fsm.GetCurrStateName(), "Idle") == 0) {
+			CaptureJSEvent* e = new CaptureJSEvent();
+			e->ctx = ctx;
+			m_fsm.PostEventFIFO(e);
+		}
+		else {
+			DWORD errCode = m_fsm.GetFsmStateErrCode();
+			int state = m_fsm.GetFSMState();
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CaptureJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+
+	}
+	void QueryHasCardJS(SpReqAnsContext<CardIssuerStandService_QueryHasCardJS_Req, CardIssuerStandService_QueryHasCardJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed);
+		}
+		else {
+			m_fsm.QueryHasCardJS(ctx);
+		}
+
+	}
+	void IssueFromBoxJS(SpReqAnsContext<CardIssuerStandService_IssueFromBoxJS_Req, CardIssuerStandService_IssueFromBoxJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_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)("IssueFromBoxJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+		else {
+			IssueFromBoxJSEvent* pEvt = new IssueFromBoxJSEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
+	}
+	void InsertJS(SpReqAnsContext<CardIssuerStandService_InsertJS_Req, CardIssuerStandService_InsertJS_Ans>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuer_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)("InsertJS req is unhandled ,CurrState=%d", state);
+			ctx->Answer(Error_Unexpect, errCode);
+		}
+		else {
+			InsertJSEvent* pEvt = new InsertJSEvent();
+			pEvt->ctx = ctx;
+			m_fsm.PostEventFIFO(pEvt);
+		}
+
+	}
+	void CancelInsertJS(SpOnewayCallContext<CardIssuerStandService_CancelInsertJS_Info>::Pointer ctx)
+	{
+		LOG_FUNCTION();
+		if (!m_fsm.GetDevInitFlag()) {
+			LogWarn(Severity_Middle, Error_DevNotAvailable, CardIssuer_UserErrorCode_DevOpen_Failed, "CancelInsertJS but DevOpen failed.");
+		}
+		else {
+			CancelInsertJSEvent* evt = new CancelInsertJSEvent();
+			m_fsm.PostEventFIFO(evt);
+		}
+	}
+
 protected:
 private:
 	CCardIssuerFSM m_fsm;

+ 1 - 1
Module/mod_CardReadAdapter/CardReadAdapterFSM.cpp

@@ -838,7 +838,7 @@ int CCardReadAdapterFSM::CardIssuerRead(SpReqAnsContext<CardReadAdapterService_R
 			bool bHasCard = false, bNeedPreOnline = false, bCardMismatch = false;
 			DWORD dwUsrErrCode = 0;
 			CSimpleStringA csRetStr(true);
-			eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryCardInfo(qciReq, qciAns, 10000, dwUsrErrCode, csRetStr);
+			eErr = (*m_pCardIssuerStore)(EntityResource::getLink().upgradeLink())->QueryCardInfo(qciReq, qciAns, 12000, dwUsrErrCode, csRetStr);
 			if (eErr == Error_Succeed)
 			{
 				if (qciAns.position == 2)//有卡

+ 2 - 2
Module/mod_FingerPrint/mod_FingerPrint.h

@@ -106,8 +106,8 @@ public:
 	void GetFingerPrint(SpReqAnsContext<FingerPrintService_GetFingerPrint_Req, FingerPrintService_GetFingerPrint_Ans>::Pointer ctx)
 	{
 		if(!m_fsm.GetDevInitFlag()){
-			ctx->Answer(Error_DevNotAvailable);
-			LogWarn(Severity_Middle, Error_DevNotAvailable, FingerPrint_UserErrorCode_DevOpen_Failed_Registe, "GetFingerPrint but DevOpen failed.");
+			ctx->Answer(Error_DevNotAvailable, FingerPrint_UserErrorCode_DEVOPENFAILED_GETFINGERPRINT);
+			LogWarn(Severity_Middle, Error_DevNotAvailable, FingerPrint_UserErrorCode_DEVOPENFAILED_GETFINGERPRINT, "GetFingerPrint but DevOpen failed.");
 		}
 		else{
 			GetFingerEvent* e = new GetFingerEvent();

+ 13 - 13
Module/mod_HSPScanner/HSPScannerFSM.h

@@ -393,7 +393,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_StartPreview)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -412,7 +412,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_CancelPreview)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -431,7 +431,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImage)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -450,7 +450,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImageEx)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -469,7 +469,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ShowProperty)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -488,7 +488,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetProperty)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -507,7 +507,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetWinPos)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -526,7 +526,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_GetDevStatus)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -547,7 +547,7 @@ public:
 		if (m_ctx != NULL)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_GetDevInfo)
-				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState");
+				.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 		}
 	}
@@ -568,7 +568,7 @@ namespace JS {
 			if (m_ctx != NULL)
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_StartPreviewJS)
-					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("StartPreviewEvent::Error_InvalidState");
+					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("StartPreviewEvent::Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 			}
 		}
@@ -586,7 +586,7 @@ namespace JS {
 			if (m_ctx != NULL)
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_CancelPreviewJS)
-					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("CancelPreviewEvent::Error_InvalidState");
+					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("CancelPreviewEvent::Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 			}
 		}
@@ -604,7 +604,7 @@ namespace JS {
 			if (m_ctx != NULL)
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImageJS)
-					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("ScanImageEvent::Error_InvalidState");
+					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("ScanImageEvent::Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 			}
 		}
@@ -622,7 +622,7 @@ namespace JS {
 			if (m_ctx != NULL)
 			{
 				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetParamJS)
-					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("SetParamEvent::Error_InvalidState");
+					.setResultCode(m_fsm->MapCode2RTAString(LOG_WARN_HSPS_INVALID_OPERATION))("SetParamEvent::Error_InvalidState in [%s] State", m_fsm->GetCurrStateName());
 				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
 			}
 		}

+ 24 - 33
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -813,26 +813,15 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 					ctx->Ans.hasscan = 0;
 					if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能
 					{
-						curDeleteType = Bmp_ZP | Bmp_SCAN;
 						m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 						eErr = m_hDevHelper->ScanIDAndSaveImage();
 						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)();
-						}
-						else
-						{
-							if (eErr != Error_NotImpl)
-								SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
-									false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-						}
+							curDeleteType = Bmp_ZP | Bmp_SCAN;
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)();
 
-						if (eErr == Error_Succeed)
-						{
 							transImgMsg.Clear();
-
 							//idfront.bmp" and "idback.bmp
 							ErrorCodeEnum eErrFront, eErrBack;
 							eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
@@ -874,6 +863,12 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 									IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild, warnMsg.GetData());
 							}
 						}
+						else
+						{
+							if (eErr != Error_NotImpl)
+								SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
+									false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
+						}
 					}
 
 #ifdef RVC_OS_WIN
@@ -1033,14 +1028,14 @@ 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);
-				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
+				ctx->Answer(Error_TimeOut, GetAlarmDEC()); //RTA2109
 			}
 		}
 		else if (!bOpenRF)
 		{
 			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__,
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-			ctx->Answer(Error_Unexpect, GetAlarmDEC());
+			ctx->Answer(Error_TimeOut, GetAlarmDEC());
 		}
 		else
 		{
@@ -1048,13 +1043,13 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 			{
 				LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_OtherCard, "读证超时,插入的卡片非身份.");
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
-				ctx->Answer(Error_Unexpect, GetAlarmDEC());
+				ctx->Answer(Error_TimeOut);
 			}
 			else if(errAuth == Error_Dev_IDCardNotFound)
 			{
 				LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_NoCard, "读证超时,未检测到有卡片插入.");
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
-				ctx->Answer(Error_Unexpect, GetAlarmDEC());
+				ctx->Answer(Error_TimeOut);
 			}
 			else
 			{
@@ -1376,25 +1371,15 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 					if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能
 					{
-						curDeleteType = Bmp_ZP | Bmp_SCAN;
 						m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
 						eErr = m_hDevHelper->ScanIDAndSaveImage();
 						m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 						if (eErr == Error_Succeed)
 						{
+							curDeleteType = Bmp_ZP | Bmp_SCAN;
 							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)();
-						}
-						else
-						{
-							if(eErr != Error_NotImpl)
-							SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
-								false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
-						}
-
-						if (eErr == Error_Succeed)
-						{
+							
 							transImgMsg.Clear();
-
 							//idfront.bmp" and "idback.bmp
 							ErrorCodeEnum eErrFront, eErrBack;
 							eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
@@ -1436,6 +1421,12 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 									IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild, warnMsg.GetData());
 							}
 						}
+						else
+						{
+							if(eErr != Error_NotImpl)
+							SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
+								false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
+						}
 					}
 
 #ifdef RVC_OS_WIN
@@ -1614,7 +1605,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 					true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
 
-				ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109
+				ctx->Answer(Error_TimeOut, GetAlarmDEC()); //RTA2109
 			}
 		}
 		else if (!bOpenRF)
@@ -1623,7 +1614,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 				true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 			//DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
 
-			ctx->Answer(Error_Unexpect, GetAlarmDEC());
+			ctx->Answer(Error_TimeOut, GetAlarmDEC());
 		}
 		else
 		{
@@ -1632,13 +1623,13 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 			{
 				LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_OtherCard, "读证超时,插入的卡片非身份.");
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
-				ctx->Answer(Error_Unexpect, GetAlarmDEC());
+				ctx->Answer(Error_TimeOut);
 			}
 			else if (errAuth == Error_Dev_IDCardNotFound)
 			{
 				LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_NoCard, "读证超时,未检测到有卡片插入.");
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
-				ctx->Answer(Error_Unexpect, GetAlarmDEC());
+				ctx->Answer(Error_TimeOut);
 			}
 			else
 			{

+ 8 - 0
Module/mod_cardissuerstore/CardIssuerFSM.h

@@ -1314,6 +1314,14 @@ public:
 	bool SyncMaterialCount(IHttpFunc* client,SyncMaterialCountInfo syncInfo);
 	bool CheckIsCrossPreOnline() { return m_bCrossPreOnline; }
 	void ClearCrossPreOnlineFlag() { m_bCrossPreOnline = false; }
+	bool IsInMainPage() {
+		if (m_iInWhatPage == PageType_MainPage) {
+			return true;
+		}
+		else {
+			return false;
+		}
+	}
 protected:
 	int m_iInsertTries;
 	int m_resetTries;

+ 11 - 0
Module/mod_cardissuerstore/mod_cardissuer.h

@@ -151,6 +151,12 @@ public:
 					ctx->Answer(Error_InvalidState, CardIssuerStore_UserErrorCode_CardActive_CardStore_Issuing);
 					return;
 				}
+				else if (!m_fsm.IsInMainPage()) {//判断是否在首页
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PreOnline req is unhandled ,CardissuerStore is busying");
+					ctx->Answer(Error_InvalidState, CardIssuerStore_UserErrorCode_CardActive_CardStore_Issuing);
+					return;
+
+				}
 			}
 			PreOnlineEvent* e = new PreOnlineEvent();
 			e->ctx = ctx;
@@ -623,6 +629,11 @@ public:
 			ctx->Answer(Error_InvalidState, CardIssuerStore_UserErrorCode_CardActive_CardStore_Issuing);
 			return;
 		}
+		else if (!m_fsm.IsInMainPage()) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PreOnlineCrossJS req is unhandled ,CardissuerStore is busying");
+			ctx->Answer(Error_InvalidState, CardIssuerStore_UserErrorCode_CardActive_CardStore_Issuing);
+			return;
+		}
 		else {
 			PreOnlineCrossJSEvent* pEvt = new PreOnlineCrossJSEvent();
 			pEvt->ctx = ctx;

+ 0 - 2
Module/mod_chromium/CWebsocketServer.cpp

@@ -1209,8 +1209,6 @@ namespace Chromium {
 		}
 		else if (ConfigManager::getInstance().m_connection_ws_sm2_hdls.find(dstHdl) != ConfigManager::getInstance().m_connection_ws_sm2_hdls.end())
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dstHdl:%d, save:%d", dstHdl,
-				ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl].lock().get());
 			if(ConfigManager::getInstance().m_ws_sm2_hdls_manager[dstHdl]->getState() == SM2ProtocolState::WAIT_KEY_EXCHANGE)
 				m_ws_sm2_server.send(ConfigManager::getInstance().m_connection_ws_sm2_hdls[dstHdl], msg, websocketpp::frame::opcode::TEXT, dstExption);
 			else

+ 1 - 0
Module/mod_facetracking/CMakeLists.txt

@@ -3,6 +3,7 @@ define_module("facetracking")
 set(${MODULE_PREFIX}_SRCS
 	sysvar.h
 	Event.h
+	mod_facetracking.h
 	mod_facetracking.cpp
 	)
 

+ 338 - 319
Module/mod_facetracking/mod_facetracking.cpp

@@ -1,11 +1,7 @@
 #include "stdafx.h"
-#include "SpBase.h"
-#include "SpIni.h"
 
 #include "rvc_media_common.h"
-
-#include "libvideoqueue.h"
-#include "libfacecapture.h"
+#include "mod_facetracking.h"
 
 #include "y2k_time.h"
 
@@ -47,384 +43,407 @@ static struct {
 	{9, EVENT_MOD_NODETECT_BODY,"未检测到人脸"},
 };
 
-class CFaceTrackingEntity : public CEntityBase, public CHostApi , public CVideoMonitorEvent, public ISysVarListener, public ITimerListener,public ILogListener
+
+CFaceTrackingEntity::CFaceTrackingEntity()
 {
-public:
-	CFaceTrackingEntity() : m_facecapture(NULL), bIsSessionChange(false),strCustomerID(false),strSessionID(false),bIsCustomerChange(false), m_bSingleCamera(false)
-	{
-		// note: this object initialize at DllMain, so it suggests keep your code simple here. 
-		// 1) do simple initializing here
-		// 2) dont do complex operation, complex operation such as create new process(thread) and so on
-	}
-	virtual ~CFaceTrackingEntity() {}
-	virtual const char *GetEntityName() const { return "FaceTracking"; }
+	m_facecapture = NULL;
+	bIsSessionChange = false;
+	strCustomerID = false;
+	strSessionID = false;
+	bIsCustomerChange = false;
+	m_bSingleCamera = false;
+}
+
+void CFaceTrackingEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
+{
+	CSmartPointer<IEntityFunction> spFunction = GetFunction();
 
-	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
-	{
-		CSmartPointer<IEntityFunction> spFunction = GetFunction();
+	CSystemStaticInfo stStaticinfo;
+	spFunction->GetSystemStaticInfo(stStaticinfo);
+	if (stricmp(stStaticinfo.strMachineType.GetData(), "RVC.Stand1SPlus") == 0) {
+		m_bSingleCamera = true;
+	}
 
-		CSystemStaticInfo stStaticinfo;
-		spFunction->GetSystemStaticInfo(stStaticinfo);
-		if (stricmp(stStaticinfo.strMachineType, "RVC.Stand1SPlus") == 0) {
-			m_bSingleCamera = true;
-		}
+	ErrorCodeEnum Error;
+	bool bRet = false;
+	if (!m_bSingleCamera) {
+		m_facecapture = new Clibfacecapture(&bRet, this, this, REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
+	}
+	else {
+		m_facecapture = new Clibfacecapture(&bRet, this, this, REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE);
+	}
 
-		ErrorCodeEnum Error;
-		bool bRet = false;
-		if (!m_bSingleCamera) {
-			m_facecapture = new Clibfacecapture(&bRet, this, this, REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
-		}
-		else {
-			m_facecapture = new Clibfacecapture(&bRet, this, this, REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE);
-		}
+	if (!bRet) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load libface capture failed!");
+		pTransactionContext->SendAnswer(Error_Resource);
+		return;
+	}
 
-		if (!bRet) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load libface capture failed!");
-			pTransactionContext->SendAnswer(Error_Resource);
-			return;
-		}
+	Error = GetFunction()->RegistSysVarEvent("SessionID", this);
+	if (Error != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "SessionID");
+	}
 
-		Error = GetFunction()->RegistSysVarEvent("SessionID", this);
-		if (Error != Error_Succeed) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "SessionID");
-		}
+	Error = GetFunction()->RegistSysVarEvent("CustomerID", this);
+	if (Error != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "CustomerID");
+	}
 
-		Error = GetFunction()->RegistSysVarEvent("CustomerID", this);
-		if (Error != Error_Succeed) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "CustomerID");
-		}
+	Error = GetFunction()->RegistSysVarEvent(SYSVAR_CAMERASTATE, this);
+	if (Error != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", SYSVAR_CAMERASTATE);
+	}
 
-		Error = GetFunction()->RegistSysVarEvent(SYSVAR_CAMERASTATE, this);
-		if (Error != Error_Succeed) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", SYSVAR_CAMERASTATE);
-		}
+	CSimpleStringA strValue;
+	GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
+	if (strValue[0]  == 'N'){
+		m_facecapture->SetCameraState(0);
+	}
+	else if (strValue[0]  == 'E'){
+		m_facecapture->SetCameraState(1);
+	}
+	else if (strValue[0]  == 'O'){
+		m_facecapture->SetCameraState(2);
+	}
+	else if (strValue[0]  == 'B'){
+		m_facecapture->SetCameraState(3);
+	}	
+
+	spFunction->SubscribeLog(m_UUid1, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_HEADLIGHT_GREEN_OFF,NULL,false);
+	spFunction->SubscribeLog(m_UUid2, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED,NULL,false);
+	spFunction->SubscribeLog(m_UUid3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED,NULL,false);
+	spFunction->SubscribeLog(m_UUid4, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_RESET_ACTIVECAMERA, NULL, false); 
+		
+	pTransactionContext->SendAnswer(Error);
+}
 
-		CSimpleStringA strValue;
-		GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
-		if (strValue[0]  == 'N'){
-			m_facecapture->SetCameraState(0);
-		}
-		else if (strValue[0]  == 'E'){
-			m_facecapture->SetCameraState(1);
-		}
-		else if (strValue[0]  == 'O'){
-			m_facecapture->SetCameraState(2);
-		}
-		else if (strValue[0]  == 'B'){
-			m_facecapture->SetCameraState(3);
-		}	
+void CFaceTrackingEntity::OnStarted()
+{
+	LogEvent(Severity_Middle, LOG_EVT_MOD_FACETRACKING_STARTED_SUCCESS, "facetracking entity started successfully.");
 
-		spFunction->SubscribeLog(m_UUid1, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_HEADLIGHT_GREEN_OFF,NULL,false);
-		spFunction->SubscribeLog(m_UUid2, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED,NULL,false);
-		spFunction->SubscribeLog(m_UUid3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED,NULL,false);
-		spFunction->SubscribeLog(m_UUid4, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_RESET_ACTIVECAMERA, NULL, false); 
-		
-		pTransactionContext->SendAnswer(Error);
+	if (GetCameraOnStatus()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("camera is alreay on, start face tracking.");
+		StartFaceDetect();
+	}
+}
+
+void CFaceTrackingEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
+{ 
+	CSmartPointer<IEntityFunction> spFunction = GetFunction();
+	delete m_facecapture;
+	m_facecapture = NULL;
+	spFunction->UnsubscribeLog(m_UUid1);
+	spFunction->UnsubscribeLog(m_UUid2);
+	spFunction->UnsubscribeLog(m_UUid3);
+	spFunction->UnsubscribeLog(m_UUid4);
+	spFunction->UnregistSysVarEvent("SessionID");
+	spFunction->UnregistSysVarEvent("CustomerID");
+	spFunction->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
+	pTransactionContext->SendAnswer(Error_Succeed); 
+}
+
+int CFaceTrackingEntity::TransCameraStateToInt(char cData)
+{
+	int iRet = 0;
+	if ('E' == cData){
+		iRet = 1;
+	}
+	else if('O' == cData){
+		iRet = 2;
+	}
+	else if('B' == cData){
+		iRet = 3;
 	}
 
-	virtual void OnStarted()
-	{
-		LogEvent(Severity_Middle, LOG_EVT_MOD_FACETRACKING_STARTED_SUCCESS, "facetracking entity started successfully.");
+	return iRet;
+}
+
+
+void CFaceTrackingEntity::StartFaceDetect()
+{
+	CSimpleStringA strValue;
+	GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
+	int iState = TransCameraStateToInt(strValue[0]);
+	if (3 != iState) {
+		m_facecapture->SetCameraState(iState);
+		m_facecapture->StartFaceCapture();
+	}
+	else {
+		m_facecapture->SetCameraState(3);
 	}
 
-	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) 
-	{ 
-		CSmartPointer<IEntityFunction> spFunction = GetFunction();
-		delete m_facecapture;
-		m_facecapture = NULL;
-		spFunction->UnsubscribeLog(m_UUid1);
-		spFunction->UnsubscribeLog(m_UUid2);
-		spFunction->UnsubscribeLog(m_UUid3);
-		spFunction->UnsubscribeLog(m_UUid4);
-		spFunction->UnregistSysVarEvent("SessionID");
-		spFunction->UnregistSysVarEvent("CustomerID");
-		spFunction->UnregistSysVarEvent(SYSVAR_CAMERASTATE);
-		pTransactionContext->SendAnswer(Error_Succeed); 
+	if (!m_bSingleCamera) {
+		GetFunction()->SetTimer(1, this, 1000);
 	}
+}
 
-	int TransCameraStateToInt(char cData)
+void CFaceTrackingEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
+	const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
+	const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
+{
+	switch (dwUserCode)
 	{
-		int iRet = 0;
-		if ('E' == cData){
-			iRet = 1;
-		}
-		else if('O' == cData){
-			iRet = 2;
-		}
-		else if('B' == cData){
-			iRet = 3;
-		}
+	case LOG_EVT_HEADLIGHT_GREEN_OFF:
+		m_facecapture->SetLightChange();
+		break;
 
-		return iRet;
-	}
+	case LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED:
+		StartFaceDetect();
+		break;
 
-	void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
-		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
-		const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
-	{
-		switch (dwUserCode)
+	case LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED:
 		{
-		case LOG_EVT_HEADLIGHT_GREEN_OFF:
-			m_facecapture->SetLightChange();
-			break;
+			m_facecapture->StopFaceCapture();
+			CSimpleStringA strValue;
+			GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
+			int iState = TransCameraStateToInt(strValue[0]);
+			m_facecapture->SetCameraState(iState);
 
-		case LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED:
-			{
-				CSimpleStringA strValue;
-				GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
-				int iState = TransCameraStateToInt(strValue[0]);
-				if (3 != iState) {
-					m_facecapture->SetCameraState(iState);
-					m_facecapture->StartFaceCapture();
-				}
-				else {
-					m_facecapture->SetCameraState(3);
-				}
-
-				if (!m_bSingleCamera) {
-					GetFunction()->SetTimer(1, this, 1000);
-				}
+			if (!m_bSingleCamera) {
+				GetFunction()->KillTimer(1);
 			}
-			break;
 
-		case LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED:
-			{
-				m_facecapture->StopFaceCapture();
-				CSimpleStringA strValue;
-				GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
-				int iState = TransCameraStateToInt(strValue[0]);
-				m_facecapture->SetCameraState(iState);
-
-				if (!m_bSingleCamera) {
-					GetFunction()->KillTimer(1);
-				}
+			GetFunction()->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_ENV); // from Operation -> Environment
+		}
+		break;
 
+	case LOG_EVT_MEDIACONTROLLER_RESET_ACTIVECAMERA:
+		{
+			CSimpleStringA strValue;
+			GetFunction()->GetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, strValue); // E or O
+			if ('O' == strValue[0]) {
 				GetFunction()->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_ENV); // from Operation -> Environment
 			}
-			break;
-
-		case LOG_EVT_MEDIACONTROLLER_RESET_ACTIVECAMERA:
-			{
-				CSimpleStringA strValue;
-				GetFunction()->GetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, strValue); // E or O
-				if ('O' == strValue[0]) {
-					GetFunction()->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_ENV); // from Operation -> Environment
-				}
-			}
-			break;
-		default:
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown event.");
-			break;
 		}
+		break;
+	default:
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown event.");
+		break;
 	}
+}
 
-	//////////////////////////////////////////////////////////////////////////////////////////////////////
-	// ITimerListener implementation
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+// ITimerListener implementation
 	
-	virtual void OnTimeout(DWORD dwTimerID)
+void CFaceTrackingEntity::OnTimeout(DWORD dwTimerID)
+{
+	uint64_t uid;
+	CCustomerStatus status;
+	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before GetMainCustomerStatus");
+	if (m_facecapture->GetMainCustomerStatus(uid, status)) 
 	{
-		uint64_t uid;
-		CCustomerStatus status;
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before GetMainCustomerStatus");
-		if (m_facecapture->GetMainCustomerStatus(uid, status)) 
+		CSmartPointer<IEntityFunction> spFunction = GetFunction();
+		CSimpleStringA strValue;
+		spFunction->GetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, strValue); // E or O
+		if (status.stCustomerPos.eCamera == EnvironCamera) 
 		{
-			CSmartPointer<IEntityFunction> spFunction = GetFunction();
-			CSimpleStringA strValue;
-			spFunction->GetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, strValue); // E or O
-			if (status.stCustomerPos.eCamera == EnvironCamera) 
+			if (strValue[0] == 'O') 
 			{
-				if (strValue[0] == 'O') 
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ActiveTrackingCamera change from Opt->Env!");
-					spFunction->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_ENV); // from Operation -> Environment
-				}
-			} 
-			else 
-			{
-				if (strValue[0] == 'E') 
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ActiveTrackingCamera change from Env->Opt!");
-					spFunction->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_OPT); // from Environment -> Operation
-				}
-			}			
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ActiveTrackingCamera change from Opt->Env!");
+				spFunction->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_ENV); // from Operation -> Environment
+			}
 		} 
 		else 
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetMainCustomerStatus failed!");
-		}
+			if (strValue[0] == 'E') 
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ActiveTrackingCamera change from Env->Opt!");
+				spFunction->SetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, ACTIVETRACKINGCAMERA_OPT); // from Environment -> Operation
+			}
+		}			
+	} 
+	else 
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetMainCustomerStatus failed!");
 	}
+}
 
-	//////////////////////////////////////////////////////////////////////////////////////////////////////
-	// CHostApi implementation
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+// CHostApi implementation
 
-	virtual uint64_t GenerateUUID()
-	{
-		m_lastUUID = CUUID::Create(m_lastUUID);
-		return m_lastUUID;
-	}
+uint64_t CFaceTrackingEntity::GenerateUUID()
+{
+	m_lastUUID = CUUID::Create(m_lastUUID);
+	return m_lastUUID;
+}
 
-	virtual bool IsCustomerChange()
-	{
-		bool bChange = bIsSessionChange||bIsCustomerChange;
-		return bChange;
-	}
+bool CFaceTrackingEntity::IsCustomerChange()
+{
+	bool bChange = bIsSessionChange||bIsCustomerChange;
+	return bChange;
+}
 
-	virtual void GetFaceImgName(char* FaceName, uint32_t uLen)
+void CFaceTrackingEntity::GetFaceImgName(char* FaceName, uint32_t uLen)
+{
+	CSimpleStringA strPath;
+	ErrorCodeEnum Error = GetFunction()->GetPath("UploadPhoto", strPath);
+	if (Error == Error_Succeed) 
 	{
-		CSimpleStringA strPath;
-		ErrorCodeEnum Error = GetFunction()->GetPath("UploadPhoto", strPath);
-		if (Error == Error_Succeed) 
+		if (((const char*)strCustomerID == NULL)||(_stricmp(strCustomerID,"N") == 0))
 		{
-
-			if (((const char*)strCustomerID == NULL)||(_stricmp(strCustomerID,"N") == 0))
-			{
-				rvc_snprintf(FaceName, uLen,"%s%s%s_0", strPath.GetData(), SPLIT_SLASH_STR, strSessionID.GetData());
-			}
-			else
-			{
-				rvc_snprintf(FaceName, uLen, "%s%s%s_%s", strPath.GetData(), SPLIT_SLASH_STR, strSessionID.GetData(), strCustomerID.GetData());
-			}
-			bIsSessionChange = false;
-			bIsCustomerChange = false;
-		} 
-		else 
+			rvc_snprintf(FaceName, uLen,"%s%s%s_0", strPath.GetData(), SPLIT_SLASH_STR, strSessionID.GetData());
+		}
+		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("getpath uploadphoto failed!");
+			rvc_snprintf(FaceName, uLen, "%s%s%s_%s", strPath.GetData(), SPLIT_SLASH_STR, strSessionID.GetData(), strCustomerID.GetData());
 		}
+		bIsSessionChange = false;
+		bIsCustomerChange = false;
+	} 
+	else 
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("getpath uploadphoto failed!");
 	}
+}
 
-	virtual bool LoadConfig(CFaceCaptureConfig &config)
-	{
-		CSmartPointer<IEntityFunction> spFunction = GetFunction();
-		CSmartPointer<IConfigInfo> spConfig;
-		ErrorCodeEnum Error(Error_Succeed);
-
-		/*
-		PrimCamera=1
-		UpCameraEdgeLimit=3
-		DownCameraEdgeLimit=2
-		ServersType=0
-		ContourMinAera=14400
-		FaceDataDirPath=facedata
-		OperateFaceSize=4.2
-		CloseFaceSize=6.6
-		FarFaceSize=8.2
-		SearchFaceSize=8.2
-		DetectFaceSize=6.6
-		FaceSizeOffset=18
-		SleepLong=800
-		SleepMiddle=600
-		SleepShort=500
-		ThresholdNum=10
-		*/
-		CSimpleStringA strPath;
-		config.nServersType = 0;
-		GetFunction()->GetPath("cfg", strPath);
-		strcpy(config.strFaceDataDirPath, strPath);
-		strcat(config.strFaceDataDirPath, SPLIT_SLASH_STR "facedata");
-
-		config.nPrimCamera = 1;
-		if (m_bSingleCamera) {
-			config.nPrimCamera = 0;
-		}
-		config.nContourMinAera = 14400;
-		config.nUpCameraEdgeLimit = 3;
-		config.nDownCameraEdgeLimit = 2;
-		config.fOperateFaceSize = 4.2f;
-		config.fCloseFaceSize = 6.6f;
-		config.fFarFaceSize = 8.2f;
-		config.fSearchFaceSize = 8.2f;
-		config.fDetectFaceSize = 6.6f;
-		config.nFaceSizeOffset = 18;
-		config.nSleepLong = 800;
-		config.nSleepMiddle = 600;
-		config.nSleepShort = 500;
-		config.nThresholdNum = 10;
-		Error = Error_Succeed;
-		return Error == Error_Succeed;
+bool CFaceTrackingEntity::LoadConfig(CFaceCaptureConfig &config)
+{
+	CSmartPointer<IEntityFunction> spFunction = GetFunction();
+	CSmartPointer<IConfigInfo> spConfig;
+	ErrorCodeEnum Error(Error_Succeed);
+
+	/*
+	PrimCamera=1
+	UpCameraEdgeLimit=3
+	DownCameraEdgeLimit=2
+	ServersType=0
+	ContourMinAera=14400
+	FaceDataDirPath=facedata
+	OperateFaceSize=4.2
+	CloseFaceSize=6.6
+	FarFaceSize=8.2
+	SearchFaceSize=8.2
+	DetectFaceSize=6.6
+	FaceSizeOffset=18
+	SleepLong=800
+	SleepMiddle=600
+	SleepShort=500
+	ThresholdNum=10
+	*/
+	CSimpleStringA strPath;
+	config.nServersType = 0;
+	GetFunction()->GetPath("cfg", strPath);
+	strcpy(config.strFaceDataDirPath, strPath);
+	strcat(config.strFaceDataDirPath, SPLIT_SLASH_STR "facedata");
+
+	config.nPrimCamera = 1;
+	if (m_bSingleCamera) {
+		config.nPrimCamera = 0;
+	}
+	config.nContourMinAera = 14400;
+	config.nUpCameraEdgeLimit = 3;
+	config.nDownCameraEdgeLimit = 2;
+	config.fOperateFaceSize = 4.2f;
+	config.fCloseFaceSize = 6.6f;
+	config.fFarFaceSize = 8.2f;
+	config.fSearchFaceSize = 8.2f;
+	config.fDetectFaceSize = 6.6f;
+	config.nFaceSizeOffset = 18;
+	config.nSleepLong = 800;
+	config.nSleepMiddle = 600;
+	config.nSleepShort = 500;
+	config.nThresholdNum = 10;
+	Error = Error_Succeed;
+	return Error == Error_Succeed;
+}
+
+void CFaceTrackingEntity::Debug(facecap_loglevel elevel, const char *fmt, ...)
+{
+	va_list arg;
+	va_start(arg, fmt);
+	int n = vsnprintf(NULL, 0, fmt, arg);
+
+	if (n >= MAX_LOG_LEN) {
+		char* buf = (char*)malloc((size_t)(n + 1));
+		vsnprintf(buf, n + 1, fmt, arg);
+		DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", buf);
+		free(buf);
+	}
+	else{
+		char strlog[MAX_LOG_LEN] = {0};
+		vsnprintf(strlog, MAX_LOG_LEN, fmt, arg);
+		DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", strlog);
 	}
+	va_end(arg);
+}
 
-	virtual void Debug(facecap_loglevel elevel, const char *fmt, ...)
-	{
-		va_list arg;
-		va_start(arg, fmt);
-		int n = vsnprintf(NULL, 0, fmt, arg);
-
-		if (n >= MAX_LOG_LEN) {
-			char* buf = (char*)malloc((size_t)(n + 1));
-			vsnprintf(buf, n + 1, fmt, arg);
-			DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", buf);
-			free(buf);
-		}
-		else{
-			char strlog[MAX_LOG_LEN] = {0};
-			vsnprintf(strlog, MAX_LOG_LEN, fmt, arg);
-			DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", strlog);
-		}
-		va_end(arg);
+////////////////////////////////////////////////////////////////////////////////////
+// CVideoMonitorEvent
+void CFaceTrackingEntity::GenerateMonitorEvent(video_monitor_event_type eType, char* strMsg)
+{
+	if (!strMsg) {
+		LogEvent(Severity_Middle, monitor_id_evtmsg[eType].evt_code, monitor_id_evtmsg[eType].evt_msg);
 	}
+	else {
+		LogEvent(Severity_Middle, monitor_id_evtmsg[eType].evt_code, strMsg);
+	}
+}
+
 
-	////////////////////////////////////////////////////////////////////////////////////
-	// CVideoMonitorEvent
-	void GenerateMonitorEvent(video_monitor_event_type eType, char* strMsg)
+void CFaceTrackingEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
+{
+	if (_stricmp(pszKey,"SessionID") == 0)
 	{
-		if (!strMsg) {
-			LogEvent(Severity_Middle, monitor_id_evtmsg[eType].evt_code, monitor_id_evtmsg[eType].evt_msg);
-		}
-		else {
-			LogEvent(Severity_Middle, monitor_id_evtmsg[eType].evt_code, strMsg);
-		}
+		GetFunction()->GetSysVar("SessionID",strSessionID);
+		bIsSessionChange = true;
 	}
 
-private:
+	if (_stricmp(pszKey,"CustomerID") == 0)
+	{
+		GetFunction()->GetSysVar("CustomerID",strCustomerID);
+		bIsCustomerChange = true;
+	}
 
-	virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
+	if (_stricmp(pszKey, SYSVAR_CAMERASTATE) == 0)
 	{
-		if (_stricmp(pszKey,"SessionID") == 0)
+		CSimpleStringA str;
+		GetFunction()->GetSysVar(SYSVAR_CAMERASTATE,str);
+		if (str == 'N')
 		{
-			GetFunction()->GetSysVar("SessionID",strSessionID);
-			bIsSessionChange = true;
+			m_facecapture->SetCameraState(0);
 		}
-
-		if (_stricmp(pszKey,"CustomerID") == 0)
+		else if (str == 'E')
 		{
-			GetFunction()->GetSysVar("CustomerID",strCustomerID);
-			bIsCustomerChange = true;
+			m_facecapture->SetCameraState(1);
 		}
-
-		if (_stricmp(pszKey, SYSVAR_CAMERASTATE) == 0)
+		else if (str == 'O')
 		{
-			CSimpleStringA str;
-			GetFunction()->GetSysVar(SYSVAR_CAMERASTATE,str);
-			if (str == 'N')
-			{
-				m_facecapture->SetCameraState(0);
-			}
-			else if (str == 'E')
-			{
-				m_facecapture->SetCameraState(1);
-			}
-			else if (str == 'O')
-			{
-				m_facecapture->SetCameraState(2);
-			}
-			else if (str == 'B')
-			{
-				m_facecapture->SetCameraState(3);
-			}	
+			m_facecapture->SetCameraState(2);
 		}
+		else if (str == 'B')
+		{
+			m_facecapture->SetCameraState(3);
+		}	
 	}
+}
 
-private:
-	CUUID m_UUid1,m_UUid2,m_UUid3,m_UUid4;
-	bool bIsSessionChange;
-	bool bIsCustomerChange;
-	CSimpleStringA strCustomerID;
-	CSimpleStringA strSessionID;
-	CUUID m_lastUUID;
-	Clibfacecapture *m_facecapture;
-	bool m_bSingleCamera;
-};
+bool CFaceTrackingEntity::GetCameraOnStatus()
+{
+	bool bRet = false;
+	MediaControlClient* pMediaControlClient = new MediaControlClient(this);
+	ErrorCodeEnum erroCode = pMediaControlClient->Connect();
+	if (Error_Succeed != erroCode) {
+		pMediaControlClient->SafeDelete();
+		pMediaControlClient = NULL;
+	}
+	else {
+		MediaService_IsCameraOnStatus_Req req;
+		MediaService_IsCameraOnStatus_Ans ans;
+		if (Error_Succeed == pMediaControlClient->IsCameraOnStatus(req, ans, 5000)) {
+			bRet = ans.biscameraon;
+		}
+		pMediaControlClient->GetFunction()->CloseSession();
+		pMediaControlClient = NULL;
+	}
+
+	return bRet;
+}
+
+
+MediaControlClient::MediaControlClient(CFaceTrackingEntity* pEntity) : MediaService_ClientBase(pEntity)
+{
+
+}
 
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CFaceTrackingEntity)

+ 65 - 0
Module/mod_facetracking/mod_facetracking.h

@@ -0,0 +1,65 @@
+#ifndef __MOD_FACETRACKING_H
+#define __MOD_FACETRACKING_H
+#pragma once
+
+#include "SpBase.h"
+#include "SpIni.h"
+
+#include "libvideoqueue.h"
+#include "libfacecapture.h"
+
+#include "../mod_mediacontroller/MediaController_client_g.h"
+using namespace MediaController;
+
+class CFaceTrackingEntity : public CEntityBase, public CHostApi, public CVideoMonitorEvent, public ISysVarListener, public ITimerListener, public ILogListener
+{
+public:
+	CFaceTrackingEntity();
+	virtual ~CFaceTrackingEntity() {}
+	virtual const char* GetEntityName() const { return "FaceTracking"; }
+	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext);
+	virtual void OnStarted();
+	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointer<ITransactionContext> pTransactionContext);
+	int TransCameraStateToInt(char cData);
+	void OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
+		const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
+		const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo);
+	//////////////////////////////////////////////////////////////////////////////////////////////////////
+	// ITimerListener implementation
+	virtual void OnTimeout(DWORD dwTimerID);
+	//////////////////////////////////////////////////////////////////////////////////////////////////////
+	// CHostApi implementation
+	virtual uint64_t GenerateUUID();
+	virtual bool IsCustomerChange();
+	virtual void GetFaceImgName(char* FaceName, uint32_t uLen);
+	virtual bool LoadConfig(CFaceCaptureConfig& config);
+	virtual void Debug(facecap_loglevel elevel, const char* fmt, ...);
+	////////////////////////////////////////////////////////////////////////////////////
+	// CVideoMonitorEvent
+	void GenerateMonitorEvent(video_monitor_event_type eType, char* strMsg);
+
+private:
+	virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName);
+	bool GetCameraOnStatus();
+	void StartFaceDetect();
+
+private:
+	CUUID m_UUid1, m_UUid2, m_UUid3, m_UUid4;
+	bool bIsSessionChange;
+	bool bIsCustomerChange;
+	CSimpleStringA strCustomerID;
+	CSimpleStringA strSessionID;
+	CUUID m_lastUUID;
+	Clibfacecapture* m_facecapture;
+	bool m_bSingleCamera;
+};
+
+
+class MediaControlClient : public MediaService_ClientBase
+{
+public:
+	MediaControlClient(CFaceTrackingEntity* pEntity);
+};
+
+
+#endif	__MOD_FACETRACKING_H

+ 1 - 1
Module/mod_mediacontroller/capture.cpp

@@ -2049,7 +2049,7 @@ namespace MediaController {
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_GETCAMERA_INFOS, CSimpleStringA::Format("[{%s}]", strCamInfoJson.GetData()).GetData());
 		
 			cJSON_AddItemToObject(root, "CameraDevInfo", array);
-			char* pjsonstr = cJSON_Print(root);
+			char* pjsonstr = cJSON_PrintUnformatted(root);
 			strCamListInfoJson = pjsonstr;
 			cJSON_free(pjsonstr);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402208V1").setAPI("RvcMedia_GetCameraDevInfo")(CSimpleStringA::Format("%s", strCamListInfoJson.GetData()).GetData());

+ 1 - 1
Module/mod_sipphone/audio_session.cpp

@@ -992,7 +992,7 @@ CSimpleStringA audio_get_dev_infos(bool in_direction)
 	}
 	cJSON_AddItemToObject(root, strkey, array);
 
-	char* pjsonstr = cJSON_Print(root);
+	char* pjsonstr = cJSON_PrintUnformatted(root);
 	strAudioJson = pjsonstr;
 
 	cJSON_free(pjsonstr);

+ 1 - 1
Module/mod_sipphone/mod_sipphone.cpp

@@ -2394,7 +2394,7 @@ CSimpleStringA CSIPEntity::GetAudioDeviceJsonInfos(bool bmicro)
 		cJSON_AddItemToObject(root, strkey, array);
 	}
 	
-	char* pjsonstr = cJSON_Print(root);
+	char* pjsonstr = cJSON_PrintUnformatted(root);
 	strAudioDevJson = pjsonstr;
 
 	cJSON_free(pjsonstr);

+ 1 - 4
Other/libaudiomgr/linux/libaudiomgr_linux.cpp

@@ -983,10 +983,7 @@ int AudioMgrImpl::stop_audio_capture()
 	/*assertions*/
 	assert(m_audio_context != NULL);
 	m_audio_context->stream_flag = AUDIO_STRM_OFF;
-	if (0 == __THREAD_JOIN(m_readthread)){
-        audiolog("read thread join success!");
-	}
-	else{
+	if (0 != __THREAD_JOIN(m_readthread)){
         audiolog("read thread join failed!");
 	}
 	return 0;

Diff do ficheiro suprimidas por serem muito extensas
+ 240 - 200
Other/libfacecapture/libfacecapture.cpp


+ 1 - 1
Other/libfacecapture/libfacecapture.h

@@ -102,7 +102,7 @@ struct CCustomerPosition
 //脸部覆盖物
 struct  CCover
 {
-	bool	bClearFace;		//脸部是否可见
+	bool	bIsClearFace;	//脸部是否可见
 	bool	bShowEyes;		//眼睛是否可见
 	bool	bShowNose;		//鼻子是否可见
 	bool	bShowMouth;		//嘴巴是否可见

+ 1 - 1
addin/cmake/DependencyConanFiles.cmake

@@ -69,7 +69,7 @@ if(MSVC)
 			#mod_chromium
 			CEFControl/1.0@LR04.02_ThirdParty/testing
 			#mod_chromium
-			cefclient_mutable/2.0.53@LR04.02_ThirdParty/testing
+			cefclient_mutable/2.0.55@LR04.02_ThirdParty/testing
 			#libaudiorender
 			speex/1.2.1@LR04.02_ThirdParty/testing
 			#libvideoframework

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff