소스 검색

!10713 合并ST2
Merge pull request !10713 from 80174847/ST2

杨诗友80174847 5 달 전
부모
커밋
bde351e567
100개의 변경된 파일3393개의 추가작업 그리고 2039개의 파일을 삭제
  1. 1 0
      .gitignore
  2. BIN
      DevAdapter/simulator/assets/simulator_hsps_01.jpg
  3. BIN
      DevAdapter/simulator/assets/simulator_hsps_02.jpg
  4. BIN
      DevAdapter/simulator/assets/simulator_hsps_03.jpg
  5. 10 0
      DevAdapter/simulator/hspscanner.1.1/hspscanner_httpans.h
  6. 46 14
      DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.cpp
  7. 1 2
      DevAdapter/simulator/include/DeviceSimulator.h
  8. 5 4
      Framework/Common/IHttpFunc.h
  9. 66 13
      Framework/Common/SpBase.h
  10. 1 0
      Framework/Common/SpFSM.h
  11. 14 0
      Framework/Common/httpTrace_define.hpp
  12. 79 4
      Framework/RVCComm/HTTPClient.cpp
  13. 7 5
      Framework/RVCComm/HTTPClient.h
  14. 2 2
      Framework/RvcLogSdk/baseFun.cpp
  15. 1 1
      Framework/RvcLogSdk/log_api.cpp
  16. 2 1
      Framework/RvcRestfulSdk/RestfulFunc.h
  17. 14 1
      Framework/RvcRestfulSdk/RestfulFuncImpl.cpp
  18. 4 4
      Framework/RvcRestfulSdk/test/testNormlReqAns.cpp
  19. 1 1
      Framework/spbase/CMakeLists.txt
  20. 2 1
      Framework/spbase/SpBase.cpp
  21. 0 2
      Framework/spbase/SpEntity.cpp
  22. 2 2
      Framework/spbase/SpFSM.cpp
  23. 10 7
      Framework/spbase/sp_httpDefine.cpp
  24. 3 1
      Framework/spshell/spshell.cpp
  25. 2 13
      Module/include/DevEntityCommBase.hpp
  26. 17 11
      Module/include/DevFSMCommBase.hpp
  27. 14 80
      Module/mod_CardIssuerStand/CardIssuerFSM.cpp
  28. 8 4
      Module/mod_CenterSetting/CenterSettingConn.cpp
  29. 19 14
      Module/mod_ContactlessCard/ContactlessFSM.cpp
  30. 7 5
      Module/mod_ContactlessCard/ContactlessFSM.h
  31. 0 3
      Module/mod_ContactlessCard/mod_ContactlessCard.cpp
  32. 14 7
      Module/mod_HSPScanner/HSPSCanner_UserErrorCode.h
  33. 130 11
      Module/mod_HSPScanner/HSPScanner.xml
  34. 401 344
      Module/mod_HSPScanner/HSPScannerFSM.cpp
  35. 563 283
      Module/mod_HSPScanner/HSPScannerFSM.h
  36. 196 0
      Module/mod_HSPScanner/HSPScanner_client_g.h
  37. 110 0
      Module/mod_HSPScanner/HSPScanner_def_g.h
  38. 108 0
      Module/mod_HSPScanner/HSPScanner_server_g.h
  39. 28 0
      Module/mod_HSPScanner/mod_HSPScanner.cpp
  40. 41 11
      Module/mod_HSPScanner/mod_HSPScanner.h
  41. 72 77
      Module/mod_IDCertificate/IDCertFSM.cpp
  42. 0 1
      Module/mod_IDCertificate/IDCertFSM.h
  43. 1 11
      Module/mod_IDCertificate/IDCertificate.xml
  44. 0 77
      Module/mod_IDCertificate/IDCertificate_client_g.h
  45. 0 45
      Module/mod_IDCertificate/IDCertificate_def_g.h
  46. 0 81
      Module/mod_IDCertificate/IDCertificate_server_g.h
  47. 16 11
      Module/mod_UpgradeMgr/UpgradeTaskFSM.cpp
  48. 6 3
      Module/mod_accessauth/AccessAuthFSM.cpp
  49. 2 1
      Module/mod_accessauth/mod_AccessAuth.cpp
  50. 4 3
      Module/mod_alarm/AlarmFSM.cpp
  51. 2 2
      Module/mod_assistantchannel/mod_assistantchannel.cpp
  52. 14 89
      Module/mod_cardissuerstore/CardIssuerFSM.cpp
  53. 27 3
      Module/mod_cardissuerstore/CardIssuerFSM.h
  54. 0 2
      Module/mod_cardissuerstore/mod_cardissuer.cpp
  55. 9 2
      Module/mod_cardissuerstore/mod_cardissuer.h
  56. 4 1
      Module/mod_chromium/CModTools.cpp
  57. 1 1
      Module/mod_chromium/EntitySessionManager.cpp
  58. 1 1
      Module/mod_chromium/baseEx.cpp
  59. 1 1
      Module/mod_chromium/baseEx.h
  60. 2 0
      Module/mod_chromium/mod_chromium.cpp
  61. 2 1
      Module/mod_counterconnector/http_callrouter.cpp
  62. 1 1
      Module/mod_counterconnector/mod_counterconnector.cpp
  63. 2 3
      Module/mod_facetracking/CMakeLists.txt
  64. 17 10
      Module/mod_facetracking/Event.h
  65. 54 168
      Module/mod_facetracking/mod_facetracking.cpp
  66. 1 0
      Module/mod_gpio/GpioFSM.cpp
  67. 2 2
      Module/mod_heartbeat/HeartBeatFSM.cpp
  68. 12 7
      Module/mod_initiativetransfer/FlowControlFSM.cpp
  69. 26 0
      Module/mod_interactivecontrol/InteractiveControl.xml
  70. 98 0
      Module/mod_interactivecontrol/InteractiveControl_client_g.h
  71. 55 0
      Module/mod_interactivecontrol/InteractiveControl_def_g.h
  72. 15 0
      Module/mod_interactivecontrol/InteractiveControl_msg_g.h
  73. 54 0
      Module/mod_interactivecontrol/InteractiveControl_server_g.h
  74. 156 42
      Module/mod_interactivecontrol/mod_interactivecontrol.cpp
  75. 11 15
      Module/mod_interactivecontrol/mod_interactivecontrol.h
  76. 7 1
      Module/mod_livenessdetection/mod_livenessdetection.cpp
  77. 4 3
      Module/mod_mediacontroller/brightnessinfo.cpp
  78. 1 1
      Module/mod_pinpad/PinPadFSM.cpp
  79. 5 3
      Module/mod_recorder/mod_recorder.cpp
  80. 2 1
      Module/mod_recorder/recordinfo.cpp
  81. 9 9
      Module/mod_sipphone/Event.h
  82. 49 0
      Module/mod_sipphone/SIPPhone_client_g.h
  83. 32 0
      Module/mod_sipphone/SIPPhone_def_g.h
  84. 27 0
      Module/mod_sipphone/SIPPhone_server_g.h
  85. 15 0
      Module/mod_sipphone/SipService.xml
  86. 92 33
      Module/mod_sipphone/mod_sipphone.cpp
  87. 3 1
      Module/mod_sipphone/mod_sipphone.h
  88. 2 2
      Module/mod_sipphone/unix/video_session.cpp
  89. 136 18
      Module/mod_sipphone/video_render.cpp
  90. 8 1
      Module/mod_sipphone/video_render.h
  91. 10 12
      Module/mod_sipphone/win/video_session.cpp
  92. 1 1
      Module/mod_snapshot/CMakeLists.txt
  93. 10 5
      Module/mod_upload/UploadFSM.cpp
  94. 1 0
      Other/CMakeLists.txt
  95. 2 1
      Other/libRestfulFunc/RestfulFunc.h
  96. 15 1
      Other/libRestfulFunc/RestfulFuncImpl.cpp
  97. 4 4
      Other/libRestfulFunc/test/testNormlReqAns.cpp
  98. 26 21
      Other/libfacecapture/CMakeLists.txt
  99. 0 0
      Other/libfacecapture/ReadMe.txt
  100. 335 409
      Other/libfacecapture/libfacecapture.cpp

+ 1 - 0
.gitignore

@@ -197,6 +197,7 @@ compile_commands.json
 CTestTestfile.cmake
 _deps
 #CMakeSettings.json
+CMakePresets.json
 /Other/libimageproc/RCa15420
 /cpp.hint
 !/ThirdParty/Include/msgpack/msgpack/preprocessor/debug

BIN
DevAdapter/simulator/assets/simulator_hsps_01.jpg


BIN
DevAdapter/simulator/assets/simulator_hsps_02.jpg


BIN
DevAdapter/simulator/assets/simulator_hsps_03.jpg


+ 10 - 0
DevAdapter/simulator/hspscanner.1.1/hspscanner_httpans.h

@@ -16,3 +16,13 @@ typedef struct HspsDevStatusAns {
 
 	JSONCONVERT2OBJECT_MEMEBER_REGISTER(isConnected, inPreview, inShow)
 }HspsDevStatusAns;
+
+typedef struct ScanImageAns {
+	int ImageType;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(ImageType)
+}ScanImageAns;
+
+typedef struct DevOpenAns {
+	int timeoutMillsec;
+	JSONCONVERT2OBJECT_MEMEBER_REGISTER(timeoutMillsec)
+}DevOpenAns;

+ 46 - 14
DevAdapter/simulator/hspscanner.1.1/hspscanner_impl.cpp

@@ -121,10 +121,18 @@ DEVICEBASE_API ErrorCodeEnum  GetDevAdapterVersion(DevSoftVersion& retVesion)
 ErrorCodeEnum HSPSClassImpl::DevOpen()
 {
     ErrorCodeEnum err = Error_Succeed;
-
-    err = SimulatorHttpFunction(EntityName, "DevOpen");
+    DevOpenAns ans;
+    err = SimulatorHttpFunction(EntityName, "DevOpen", ans);
     LOG4VTM(INFO, "DevOpen err = " << err);
-
+    if (err == Error_Succeed) {
+        if (ans.timeoutMillsec > 0) {
+#ifdef _MSC_VER
+            Sleep(ans.timeoutMillsec);
+#else
+            usleep(ans.timeoutMillsec * 1000);
+#endif 
+        }
+    }
     return err;
 }
 
@@ -151,24 +159,48 @@ ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
 ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
 {
     ErrorCodeEnum err = Error_NotImpl;
+    static unsigned long times = 0;
+	ScanImageAns ans;
 
-    err = SimulatorHttpFunction(EntityName, "ScanImage");
+    err = SimulatorHttpFunction(EntityName, "ScanImage", ans);
     LOG4VTM(INFO, "ScanImage err = " << err);
-
     if (err == Error_Succeed)
     {
-        string srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "HspTest.jpg";
-
+		string srcPath("");
+        bool doit(true);
+        if (ans.ImageType == 2) {
+			srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "simulator_hsps_01.jpg";
+        }
+        else if (ans.ImageType == 1) {
+            srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "simulator_hsps_02.jpg";
+        }
+        else if (ans.ImageType == 3) {
+            doit = false;
+        }
+        else {
+            if (times % 3 == 0) {
+				srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "simulator_hsps_01.jpg";
+            }
+            else if (times % 3 == 1) {
+				srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "simulator_hsps_02.jpg";
+			}
+			else if (times % 3 == 2) {
+				srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "simulator_hsps_03.jpg";
+			}
+            times++;
+        }
+        if (doit) {
+			LOG4VTM(INFO, "ScanImage file = " << srcPath);
 #ifdef _WIN32
-        CopyFileA(srcPath.c_str(), pszFileName, TRUE);
+			CopyFileA(srcPath.c_str(), pszFileName, TRUE);
 #else
-        string cmdStr = "cp " + srcPath + " " + pszFileName;
-        char buff[256] = { 0 };
-        sprintf(buff, cmdStr.c_str());
-        system(buff);
+			string cmdStr = "cp " + srcPath + " " + pszFileName;
+			char buff[256] = { 0 };
+			sprintf(buff, cmdStr.c_str());
+			system(buff);
 #endif 
+        }
     }
-
     return err;
 }
 
@@ -182,7 +214,7 @@ ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg, int& nBtLen, const char*
 
     if (err == Error_Succeed)
     {
-        string srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "HspTest.jpg";
+        string srcPath = GetCurrentDirectory() + SPLIT_SLASH_STR + "agent.jpg";
 
 #ifdef _WIN32
         CopyFileA(srcPath.c_str(), pszFileName, TRUE);

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

@@ -35,7 +35,7 @@
 #endif
 
 using namespace std;
-#define DEFAULT_DATA_URL "http://emulator.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData"
+#define DEFAULT_DATA_URL "http://emulatoruser.paasst.cmbchina.cn/emulator/avs/retrieveEmulatorData"
 
 //获取模拟器库文件所在目录
 string GetCurrentDirectory() {
@@ -380,7 +380,6 @@ ErrorCodeEnum SimulatorHttpFunction(string entityName, string devFuncName)
 	HttpClientRequestConfig config(HttpRequestMethod::POST, GetSimulatorUrl().c_str(), NULL);
 	SP::Simulator::Restful::FulfillRequestJsonBody(&config, simulatorCommonReq);
 	RestfulClient client = RestfulClient::getInstance();
-
 	config.PreDo();
 	client.Do(&config, &result);
 	if (result.ResponseOK()) {

+ 5 - 4
Framework/Common/IHttpFunc.h

@@ -5,6 +5,7 @@
 
 #include <unordered_map>
 #include "RVCComm.h"
+#include "httpTrace_define.hpp"
 
 using namespace std;
 
@@ -87,13 +88,13 @@ public:
 	//销毁对象
 	virtual void Destory() = 0;
 	//get请求
-	virtual const bool Get(CHTTPReq& req, CHTTPRet& ret) = 0;
+	virtual const bool Get(CHTTPReq& req, CHTTPRet& ret, HttpClientTraceLink* pTrace) = 0;
 	//post请求
-	virtual const bool Post(CHTTPReq& req, CHTTPRet& ret) = 0;
+	virtual const bool Post(CHTTPReq& req, CHTTPRet& ret, HttpClientTraceLink* pTrace) = 0;
 	//文件块上传
-	virtual const bool UploadFileBlock(CHTTPUploadReq& req, CHTTPUploadRet& ret) = 0;
+	virtual const bool UploadFileBlock(CHTTPUploadReq& req, CHTTPUploadRet& ret, HttpClientTraceLink* pTrace) = 0;
 	//文件块下载
-	virtual const bool DownloadFileBlock(const char* url, const char* jsonReqStr, fileContentArray &content, long& httpCode, unordered_map<string, string>& responseHeaders, long timeout) = 0;
+	virtual const bool DownloadFileBlock(const char* url, const char* jsonReqStr, fileContentArray &content, long& httpCode, unordered_map<string, string>& responseHeaders, long timeout, HttpClientTraceLink* pTrace) = 0;
 };
 
 typedef void (*LogFnCallback)(const char*);

+ 66 - 13
Framework/Common/SpBase.h

@@ -57,6 +57,7 @@
 #endif // __cplusplus
 
 #include "ErrorCode.h"
+#include "httpTrace_define.hpp"
 
 #ifndef MODULE_VERSION_FULL
 	#define MODULE_VERSION_FULL  "0.0.0"
@@ -388,25 +389,24 @@ struct CLightPackInfo
 
 SPBASE_API CSimpleStringA uuid4_generateStr(int len);
 
-struct linkContext
-{
+struct linkContext {
 	CSimpleStringA bussinessId;
 	CSimpleStringA traceId;
 	CSimpleStringA spanId;
 	CSimpleStringA parentSpanId;
+	CSimpleStringA timestamp; // 新增的 timestamp 字段
 
-	linkContext():bussinessId(true), traceId(true), spanId(true), parentSpanId(true){}
-	linkContext(CSimpleStringA t_bussinessId, CSimpleStringA t_traceId, CSimpleStringA t_spanId, CSimpleStringA t_parentSpanId) {
-		bussinessId = t_bussinessId;
-		traceId = t_traceId;
-		spanId = t_spanId;
-		parentSpanId = t_parentSpanId;
+	linkContext() : bussinessId(true), traceId(true), spanId(true), parentSpanId(true) {
+		updateTimestamp(); // 初始化时生成时间戳
 	}
 
-	void Init(const char* t_bussId, const char* t_traceId, const char* t_spanId, const char* t_parentSpanId)
-	{
-		if (t_bussId && t_traceId && t_spanId && t_parentSpanId)
-		{
+	linkContext(CSimpleStringA t_bussinessId, CSimpleStringA t_traceId, CSimpleStringA t_spanId, CSimpleStringA t_parentSpanId)
+		: bussinessId(t_bussinessId), traceId(t_traceId), spanId(t_spanId), parentSpanId(t_parentSpanId) {
+		updateTimestamp(); // 初始化时生成时间戳
+	}
+
+	void Init(const char* t_bussId, const char* t_traceId, const char* t_spanId, const char* t_parentSpanId) {
+		if (t_bussId && t_traceId && t_spanId && t_parentSpanId) {
 			char copy_bussId[LINKINFO_BUSSID_LEN + 1], copy_traceId[LINKINFO_TRACEID_LEN + 1];
 			char copy_spanId[LINKINFO_SPANID_LEN + 1], copy_parentSpanId[LINKINFO_PARENTSPANID_LEN + 1];
 			memset(copy_bussId, 0, sizeof(copy_bussId));
@@ -421,21 +421,47 @@ struct linkContext
 			traceId = copy_traceId;
 			spanId = copy_spanId;
 			parentSpanId = copy_parentSpanId;
+			updateTimestamp(); // 初始化时生成时间戳
 		}
 	}
 
+	void updateTimestamp()
+	{
+		time_t timestamp_seconds = time(NULL);
+
+		// 将时间戳转换为字符串
+		timestamp = CSimpleStringA::Format("%ld", timestamp_seconds);
+	}
+	HttpClientTraceLink convertToHttpClientTraceLink()
+	{
+		HttpClientTraceLink traceLink;
+		memset(&traceLink, 0, sizeof(traceLink)); // 初始化结构体
+
+		// 复制字段数据
+		strncpy(traceLink.X_B3_BusinessId, bussinessId.GetData(), sizeof(traceLink.X_B3_BusinessId) - 1);
+		strncpy(traceLink.X_B3_TraceId, traceId.GetData(), sizeof(traceLink.X_B3_TraceId) - 1);
+		strncpy(traceLink.X_B3_SpanId, spanId.GetData(), sizeof(traceLink.X_B3_SpanId) - 1);
+		strncpy(traceLink.X_B3_ParentSpanId, parentSpanId.GetData(), sizeof(traceLink.X_B3_ParentSpanId) - 1);
+		strncpy(traceLink.X_B3_Timestamp, timestamp.GetData(), sizeof(traceLink.X_B3_Timestamp) - 1);
+
+		return traceLink; // 返回结构体副本
+	}
+
 	linkContext& operator=(const linkContext& tmp) {
 		bussinessId = tmp.bussinessId;
 		traceId = tmp.traceId;
 		spanId = tmp.spanId;
 		parentSpanId = tmp.parentSpanId;
+		timestamp = tmp.timestamp;
 		return *this;
 	}
+
 	void clear() {
 		bussinessId = "";
 		traceId = "";
 		spanId = "";
 		parentSpanId = "";
+		timestamp = "";
 	}
 
 	linkContext upgradeLink() const {
@@ -449,8 +475,9 @@ struct linkContext
 		if (bussinessId.GetLength() == 0 || traceId.GetLength() == 0)
 			return *this;
 		else {
-			spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
 			parentSpanId = spanId;
+			spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
+			updateTimestamp(); // 更新时生成时间戳
 			return *this;
 		}
 	}
@@ -464,6 +491,15 @@ struct linkContext
 		traceId = uuid4_generateStr(LINKINFO_TRACEID_LEN);
 		spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
 		parentSpanId = "0";
+		updateTimestamp(); // 自动生成时生成时间戳
+	}
+
+	void AutoGenerate(CSimpleString t_bussinessId) {
+		bussinessId = t_bussinessId;
+		traceId = uuid4_generateStr(LINKINFO_TRACEID_LEN);
+		spanId = uuid4_generateStr(LINKINFO_SPANID_LEN);
+		parentSpanId = "0";
+		updateTimestamp(); // 自动生成时生成时间戳
 	}
 };
 
@@ -1550,6 +1586,23 @@ private:
 	const DbgToBeidou& operator=(const DbgToBeidou&) { return *this; };
 };
 
+/*
+#define PROCESS_LINK_CONTEXT(linkName) \
+	linkContext linkContextVar; \
+    linkContextVar.AutoGenerate(linkName); \
+	DbgWithLink(LOG_LEVEL_E::LOG_LEVEL_DEBUG, LOG_TYPE_E::LOG_TYPE_SYSTEM)("linkContextVar, bussinessId:%s, traceId:%s, spanId:%s, parentSpanId:%s", linkContextVar.bussinessId.GetData(), linkContextVar.traceId.GetData(), linkContextVar.spanId.GetData(), linkContextVar.parentSpanId.GetData()); \
+    DbgToBeidou(linkContextVar, __FUNCTION__)(); \
+    linkContextVar.upgradeLinkAndSave(); \
+	DbgWithLink(LOG_LEVEL_E::LOG_LEVEL_DEBUG, LOG_TYPE_E::LOG_TYPE_SYSTEM)("update linkContextVar, bussinessId:%s, traceId:%s, spanId:%s, parentSpanId:%s", linkContextVar.bussinessId.GetData(), linkContextVar.traceId.GetData(), linkContextVar.spanId.GetData(), linkContextVar.parentSpanId.GetData()); \
+    HttpClientTraceLink nextLink = linkContextVar.convertToHttpClientTraceLink();
+*/
+
+#define PROCESS_LINK_CONTEXT(linkName) \
+	linkContext linkContextVar; \
+    linkContextVar.AutoGenerate(linkName); \
+	DbgToBeidou(linkContextVar, __FUNCTION__)(); \
+    linkContextVar.upgradeLinkAndSave(); \
+	HttpClientTraceLink nextLink = linkContextVar.convertToHttpClientTraceLink();
 
 class SPBASE_API DbgWithLink {
 public:

+ 1 - 0
Framework/Common/SpFSM.h

@@ -29,6 +29,7 @@ enum FSMEventEnum
 {
 	EVT_INTERNAL, // internal usage
 	EVT_TIMER, // timer evt
+	EVT_MAINPAGE_DISPLAY, //the business main page display
 	EVT_USER, // use defin Event must from here
 };
 

+ 14 - 0
Framework/Common/httpTrace_define.hpp

@@ -0,0 +1,14 @@
+#ifndef _HTTP_CLIENT_TRACE_HEADER_
+#define _HTTP_CLIENT_TRACE_HEADER_
+#pragma once
+#include <stdio.h>
+
+struct HttpClientTraceLink {
+    char X_B3_BusinessId[33];  // 业务ID
+    char X_B3_TraceId[33];     // 跟踪ID
+    char X_B3_SpanId[17];       // 跨度ID
+    char X_B3_ParentSpanId[17]; // 父跨度ID
+    char X_B3_Timestamp[17];    // 时间戳
+};
+
+#endif

+ 79 - 4
Framework/RVCComm/HTTPClient.cpp

@@ -665,7 +665,7 @@ const bool CHTTPClient::UploadForm(const std::string& strURL,
 /************************************************************************/
 /* add by cfq 添加文件块上传                                            */
 /************************************************************************/
-const bool CHTTPClient:: UploadFileBlock(CHTTPUploadReq &req, CHTTPUploadRet &ret)
+const bool CHTTPClient:: UploadFileBlock(CHTTPUploadReq &req, CHTTPUploadRet &ret, HttpClientTraceLink* pTrace)
 {	
 	if(req.url.empty()){
 		if (m_eSettingsFlags & ENABLE_LOG)
@@ -696,6 +696,28 @@ const bool CHTTPClient:: UploadFileBlock(CHTTPUploadReq &req, CHTTPUploadRet &re
 	/** Now specify we want to POST data */
 	curl_easy_setopt(m_pCurlSession, CURLOPT_POST, 1L);
 
+   unordered_map<string, string> m_headers;
+   if (pTrace != NULL
+		&& strlen(pTrace->X_B3_BusinessId) > 0
+		&& strlen(pTrace->X_B3_TraceId) > 0
+		&& strlen(pTrace->X_B3_SpanId) > 0
+		&& strlen(pTrace->X_B3_ParentSpanId) > 0
+		&& strlen(pTrace->X_B3_Timestamp) > 0)
+	{
+		m_headers.emplace(std::make_pair("X_B3_BusinessId", pTrace->X_B3_BusinessId));
+		m_headers.emplace(std::make_pair("X_B3_TraceId", pTrace->X_B3_TraceId));
+		m_headers.emplace(std::make_pair("X_B3_SpanId", pTrace->X_B3_SpanId));
+		m_headers.emplace(std::make_pair("X_B3_ParentSpanId", pTrace->X_B3_ParentSpanId));
+		m_headers.emplace(std::make_pair("X_B3_Timestamp", pTrace->X_B3_Timestamp));
+	}
+   std::string strHeader;
+   for (HeadersMap::const_iterator it = m_headers.cbegin();
+      it != m_headers.cend();
+      ++it)
+   {
+      strHeader = it->first + ": " + it->second; // build header string
+      AddHeader(strHeader);
+   }
 	/* stating that Expect: 100-continue is not wanted */
 	AddHeader("Expect:");
 	curl_httppost* pFormPost = NULL;
@@ -804,7 +826,7 @@ const bool CHTTPClient:: UploadFileBlock(CHTTPUploadReq &req, CHTTPUploadRet &re
 /************************************************************************/
 /* add by cfq 添加文件块下载                                            */
 /************************************************************************/
-const bool CHTTPClient:: DownloadFileBlock(const char* url, const char* jsonReqStr, fileContentArray& content, long &httpCode, unordered_map<string, string>& responseHeaders, long timeout)
+const bool CHTTPClient:: DownloadFileBlock(const char* url, const char* jsonReqStr, fileContentArray& content, long &httpCode, unordered_map<string, string>& responseHeaders, long timeout, HttpClientTraceLink* pTrace)
 {
 	if (url == nullptr)
 		return false;
@@ -822,6 +844,30 @@ const bool CHTTPClient:: DownloadFileBlock(const char* url, const char* jsonReqS
 	CheckURL(url);
 
 	if(content.copyPtr != NULL){
+      // Add headers
+      unordered_map<string, string> m_headers;
+      if (pTrace != NULL
+         && strlen(pTrace->X_B3_BusinessId) > 0
+         && strlen(pTrace->X_B3_TraceId) > 0
+         && strlen(pTrace->X_B3_SpanId) > 0
+         && strlen(pTrace->X_B3_ParentSpanId) > 0
+         && strlen(pTrace->X_B3_Timestamp) > 0)
+      {
+         m_headers.emplace(std::make_pair("X_B3_BusinessId", pTrace->X_B3_BusinessId));
+         m_headers.emplace(std::make_pair("X_B3_TraceId", pTrace->X_B3_TraceId));
+         m_headers.emplace(std::make_pair("X_B3_SpanId", pTrace->X_B3_SpanId));
+         m_headers.emplace(std::make_pair("X_B3_ParentSpanId", pTrace->X_B3_ParentSpanId));
+         m_headers.emplace(std::make_pair("X_B3_Timestamp", pTrace->X_B3_Timestamp));
+      }
+      std::string strHeader;
+      for (HeadersMap::const_iterator it = m_headers.cbegin();
+         it != m_headers.cend();
+         ++it)
+      {
+         strHeader = it->first + ": " + it->second; // build header string
+         AddHeader(strHeader);
+      }
+
 		curl_easy_setopt(m_pCurlSession, CURLOPT_HTTPPOST, 1);
 		curl_easy_setopt(m_pCurlSession, CURLOPT_POSTFIELDS, jsonReqStr);
 		//接受响应头
@@ -1483,7 +1529,7 @@ size_t CHTTPClient::RestReadCallback(void* pCurlData, size_t usBlockCount, size_
 }
 
 //add by cfq
-const bool CHTTPClient::Get(CHTTPReq &req, CHTTPRet &ret){
+const bool CHTTPClient::Get(CHTTPReq &req, CHTTPRet &ret, HttpClientTraceLink* pTrace){
 	//拼接请求参数
 	string param;
 	std::string jsonStr="";
@@ -1581,6 +1627,21 @@ const bool CHTTPClient::Get(CHTTPReq &req, CHTTPRet &ret){
 		}
 	}
 
+	if (pTrace != NULL
+		&& strlen(pTrace->X_B3_BusinessId) > 0
+		&& strlen(pTrace->X_B3_TraceId) > 0
+		&& strlen(pTrace->X_B3_SpanId) > 0
+		&& strlen(pTrace->X_B3_ParentSpanId) > 0
+		&& strlen(pTrace->X_B3_Timestamp) > 0)
+	{
+		req.m_headers.emplace(std::make_pair("X_B3_BusinessId", pTrace->X_B3_BusinessId));
+		req.m_headers.emplace(std::make_pair("X_B3_TraceId", pTrace->X_B3_TraceId));
+		req.m_headers.emplace(std::make_pair("X_B3_SpanId", pTrace->X_B3_SpanId));
+		req.m_headers.emplace(std::make_pair("X_B3_ParentSpanId", pTrace->X_B3_ParentSpanId));
+		req.m_headers.emplace(std::make_pair("X_B3_Timestamp", pTrace->X_B3_Timestamp));
+		
+	}
+
 	//set timeout
 	m_iCurlTimeout = req.m_timeOut;
 
@@ -1649,7 +1710,7 @@ const bool CHTTPClient::Get(CHTTPReq &req, CHTTPRet &ret){
 
 }
 //add by cfq
-const bool CHTTPClient::Post(CHTTPReq &req, CHTTPRet &ret){
+const bool CHTTPClient::Post(CHTTPReq &req, CHTTPRet &ret, HttpClientTraceLink* pTrace){
 
 	if(!req.m_url.empty()){
 		if(req.m_printDbg){
@@ -1712,6 +1773,20 @@ const bool CHTTPClient::Post(CHTTPReq &req, CHTTPRet &ret){
 		
 	}
 
+	if (pTrace != NULL
+		&& strlen(pTrace->X_B3_BusinessId) > 0
+		&& strlen(pTrace->X_B3_TraceId) > 0
+		&& strlen(pTrace->X_B3_SpanId) > 0
+		&& strlen(pTrace->X_B3_ParentSpanId) > 0
+		&& strlen(pTrace->X_B3_Timestamp) > 0)
+	{
+		req.m_headers.emplace(std::make_pair("X_B3_BusinessId", pTrace->X_B3_BusinessId));
+		req.m_headers.emplace(std::make_pair("X_B3_TraceId", pTrace->X_B3_TraceId));
+		req.m_headers.emplace(std::make_pair("X_B3_SpanId", pTrace->X_B3_SpanId));
+		req.m_headers.emplace(std::make_pair("X_B3_ParentSpanId", pTrace->X_B3_ParentSpanId));
+		req.m_headers.emplace(std::make_pair("X_B3_Timestamp", pTrace->X_B3_Timestamp));
+	}
+
 	//set timeout
 	m_iCurlTimeout = req.m_timeOut;
 

+ 7 - 5
Framework/RVCComm/HTTPClient.h

@@ -122,6 +122,7 @@ public:
                       std::string& strText,
                       long& lHTTPStatusCode);
 
+private:
    const bool DownloadFile(const std::string& strLocalFile,
                            const std::string& strURL,
                            long& lHTTPStatusCode);
@@ -129,7 +130,7 @@ public:
    const bool UploadForm(const std::string& strURL,
                          const PostFormInfo& data,
                          long& lHTTPStatusCode);
-
+public:
    inline void AddHeader(const std::string& strHeader)
    {
       m_pHeaderlist = curl_slist_append(m_pHeaderlist, strHeader.c_str());
@@ -147,12 +148,13 @@ public:
             const ByteBuffer& Data, HttpResponse& Response);
 
    //add by cfq  override IHttpFunc
-   virtual const bool Get(CHTTPReq &req, CHTTPRet &ret);
-   virtual const bool Post(CHTTPReq &req, CHTTPRet &ret);
-   virtual const bool UploadFileBlock(CHTTPUploadReq &req, CHTTPUploadRet &ret);
+   virtual const bool Get(CHTTPReq &req, CHTTPRet &ret, HttpClientTraceLink* pTrace);
+   virtual const bool Post(CHTTPReq &req, CHTTPRet &ret, HttpClientTraceLink* pTrace);
+   virtual const bool UploadFileBlock(CHTTPUploadReq &req, CHTTPUploadRet &ret, HttpClientTraceLink* pTrace);
    virtual const bool DownloadFileBlock(const char* url, const char* jsonReqStr, fileContentArray& content,
-	   long &httpCode, unordered_map<string, string>& responseHeaders, long timeout);
+	   long &httpCode, unordered_map<string, string>& responseHeaders, long timeout, HttpClientTraceLink* pTrace);
    
+private:
    // SSL certs
    static const std::string& GetCertificateFile() { return s_strCertificationAuthorityFile; }
    static void SetCertificateFile(const std::string& strPath) { s_strCertificationAuthorityFile = strPath; }

+ 2 - 2
Framework/RvcLogSdk/baseFun.cpp

@@ -45,7 +45,7 @@ int RvcLogSdkManager::LOG_OS_TestLogPost(const char* url, const char* body)
     config.SetJsonBody(str.c_str());
     RestfulClient client = RestfulClient::getInstance();
     config.PreDo();
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);//Test Logs
     return 0;
 }
 int RvcLogSdkManager::SendTestLog(const char* body)
@@ -62,7 +62,7 @@ int RvcLogSdkManager::SendTestLog(const char* body)
     sendErr.SetJsonBody(jsonReq.c_str());
     RestfulClient client = RestfulClient::getInstance();
     sendErr.PreDo();
-    client.Do(&sendErr, &curResult);
+    client.Do(&sendErr, &curResult, NULL);//Test Logs
     return 0;
 }
 

+ 1 - 1
Framework/RvcLogSdk/log_api.cpp

@@ -226,7 +226,7 @@ int LOG_OS_HttpPost(const char* url,
 
 	RestfulClient client = RestfulClient::getInstance();
 	config.PreDo();
-	client.Do(&config, &result);
+	client.Do(&config, &result, NULL);//upload log should not add trace link, which will cause infinite loop
 	if (result.ResponseOK()) {
 
 		retCode = 481;

+ 2 - 1
Framework/RvcRestfulSdk/RestfulFunc.h

@@ -25,6 +25,7 @@
 #include <map>
 #include <vector>
 #include <sstream>
+#include "httpTrace_define.hpp"
 
 enum HttpRequestMethod
 {
@@ -232,7 +233,7 @@ public:
     static RestfulClient& getInstance(); // Singleton
     ~RestfulClient();
 
-    void Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse) const;
+    void Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse, HttpClientTraceLink* pTrace) const;
 
 private:
     RestfulClient();

+ 14 - 1
Framework/RvcRestfulSdk/RestfulFuncImpl.cpp

@@ -174,7 +174,7 @@ namespace
 #define WSTR(str) (str)
 #endif //_MSC_VER
 
-void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse) const
+void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse, HttpClientTraceLink* pTrace) const
 {
     http_client_config config;
     config.set_validate_certificates(pRequestConfig->NeedValidCert());
@@ -202,6 +202,19 @@ void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, Http
         request.headers().add(STRW("token"), STRW(token));
         request.headers().add(STRW("terminalno"), STRW(terminalno));
     }
+    if (pTrace != NULL
+        && strlen(pTrace->X_B3_BusinessId) > 0
+        && strlen(pTrace->X_B3_TraceId) > 0
+        && strlen(pTrace->X_B3_SpanId) > 0
+        && strlen(pTrace->X_B3_ParentSpanId) > 0
+        && strlen(pTrace->X_B3_Timestamp) > 0)
+    {
+        request.headers().add(STRW("X_B3_BusinessId"), STRW(pTrace->X_B3_BusinessId));
+        request.headers().add(STRW("X_B3_TraceId"), STRW(pTrace->X_B3_BusinessId));
+        request.headers().add(STRW("X_B3_SpanId"), STRW(pTrace->X_B3_BusinessId));
+        request.headers().add(STRW("X_B3_ParentSpanId"), STRW(pTrace->X_B3_BusinessId));
+        request.headers().add(STRW("X_B3_Timestamp"), STRW(pTrace->X_B3_BusinessId));
+    }
 
     if (pRequestConfig->GetRequestType() != HttpRequestMethod::GET) {
         request.set_body(STRW(pRequestConfig->GetBodyContent()), STRW(pRequestConfig->GetContentType()));

+ 4 - 4
Framework/RvcRestfulSdk/test/testNormlReqAns.cpp

@@ -8,7 +8,7 @@ TEST_CASE("test api manage", "[restful]")
     HttpClientResponseResult result;
     config.SetChildUri("/api/manage/regist/7555980103");
     RestfulClient client = RestfulClient::getInstance();
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }
@@ -20,7 +20,7 @@ TEST_CASE("test  api stage get api", "[restful]")
     config.SetChildUri("/api/stage");
     config.AppendQuery("terminalNo", "7555980001");
     RestfulClient client = RestfulClient::getInstance();
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }
@@ -33,7 +33,7 @@ TEST_CASE("test  api stage post api", "[restful]")
     config.SetJsonBody("{\"terminalNo\":\"7555980001\", \"errEntityList\":\"566666\"}");
     RestfulClient client = RestfulClient::getInstance();
     HttpClientResponseResult result;
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }
@@ -47,7 +47,7 @@ TEST_CASE("test  api stage upload api", "[restful]")
     RestfulClient client = RestfulClient::getInstance();
     HttpClientResponseResult result;
     config.PreDo();
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }

+ 1 - 1
Framework/spbase/CMakeLists.txt

@@ -1,7 +1,7 @@
 set(MODULE_NAME "spbase")
 set(MODULE_PREFIX "SPBASE")
 
-file(GLOB ${MODULE_PREFIX}_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h" "*.cpp" "*.c")
+file(GLOB ${MODULE_PREFIX}_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.h" "*.cpp" "*.c" "*.hpp")
 
 list(REMOVE_ITEM ${MODULE_PREFIX}_SRCS
     "SpVitualDevice.h" 

+ 2 - 1
Framework/spbase/SpBase.cpp

@@ -41,6 +41,7 @@
 #include <winpr/locale.h>
 #include <winpr/exception.h>
 #include "uuid4.h"
+#include <chrono>
 
 
 #ifndef RVC_OS_WIN
@@ -929,4 +930,4 @@ CSimpleStringA uuid4_generateStr(int len)
 {
 	auto ret = uuid4_generate(len);
 	return ret.c_str();
-}
+}

+ 0 - 2
Framework/spbase/SpEntity.cpp

@@ -166,8 +166,6 @@ static void task_callback(threadpool_t *threadpool, void *arg, param_size_t para
 	ITaskSp *pTask = (ITaskSp*)arg;
 	SpEntity *pEntity = (SpEntity*)param1;
 
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("task_callback pTask = %p", pTask);
-
 #ifdef _WIN32
 	SetthreadGroup(GetCurrentThreadId(), pEntity->GetEntityBase()->GetEntityName());
 	try {

+ 2 - 2
Framework/spbase/SpFSM.cpp

@@ -128,7 +128,7 @@ ErrorCodeEnum FSMBase::PostExitEvent()
 
 void FSMBase::PostEventLIFO(FSMEvent *e)
 {
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event last in first out: %d", e->iEvt);
+	//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event last in first out: %d", e->iEvt);
 	try
 	{
 		SpEntity *pEntity = dynamic_cast<SpEntity*>(m_pEntity->m_pEntityFunction);
@@ -142,7 +142,7 @@ void FSMBase::PostEventLIFO(FSMEvent *e)
 
 void FSMBase::PostEventFIFO(FSMEvent *e)
 {
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event first in first out: %d", e->iEvt);
+	//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("post event first in first out: %d", e->iEvt);
 	try
 	{
 		SpEntity *pEntity = dynamic_cast<SpEntity*>(m_pEntity->m_pEntityFunction);

+ 10 - 7
Framework/spbase/sp_httpDefine.cpp

@@ -506,8 +506,8 @@ DWORD getTerminalCfgInfoThread(LPVOID param)
 	TerminalCfgReq* req = (TerminalCfgReq*)param;
 	IHttpFunc* http_client = create_http(LogCallback);
 	if (http_client != NULL) {
-
-		bool ret = http_client->Post(*req, req->ret);
+		PROCESS_LINK_CONTEXT("LR0402000GetTerminalCfg")
+		bool ret = http_client->Post(*req, req->ret, &nextLink);
 		http_client->Destory();
 		if (!ret)
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("getTerminalCfgInfoThread failed, url:%s, terminalNo:%s, center_version:%s, root_version:%s",
@@ -524,7 +524,8 @@ DWORD getVTMErrMsgCfgInfoThread(LPVOID param)
 	VTMErrMsgCfgReq* req = (VTMErrMsgCfgReq*)param;
 	IHttpFunc* http_client = create_http(LogCallback);
 	if (http_client != NULL) {
-		bool ret = http_client->Post(*req, req->ret);
+		PROCESS_LINK_CONTEXT("LR0402000GetVTMErrCfg")
+		bool ret = http_client->Post(*req, req->ret, &nextLink);
 		http_client->Destory();
 		if (!ret)
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("getVTMErrMsgCfgInfoThread failed, url:%s, terminalNo:%s, page_num:%d",
@@ -542,7 +543,8 @@ DWORD getTokenThread(LPVOID param)
 
 	IHttpFunc* http_client = create_http(LogCallback);
 	if (http_client != NULL) {
-		bool ret = http_client->Post(*req, req->ret);
+		PROCESS_LINK_CONTEXT("LR0402000GetToken")
+		bool ret = http_client->Post(*req, req->ret, &nextLink);
 		http_client->Destory();
 		if (ret && req->ret.m_token.length() > 0)
 		{
@@ -674,7 +676,8 @@ std::pair<bool, VTMErrMsgCfgRet> GetVTMErrMsgCfgFromUrl(CSimpleString url, const
 
 		IHttpFunc* http_client = create_http(LogCallback);
 		if (http_client != NULL) {
-			ret = http_client->Post(req, req.ret);
+			PROCESS_LINK_CONTEXT("LR0402000GetVTMErrCfg")
+			ret = http_client->Post(req, req.ret, &nextLink);
 			http_client->Destory();
 			if (!ret)
 			{
@@ -765,8 +768,8 @@ DWORD uploadTerminalVersionThread(LPVOID param)
 	TerminalVerUpdateRet dst;
 	IHttpFunc* http_client = create_http(LogCallback);
 	if (http_client != NULL) {
-
-		bool ret = http_client->Post(*req, dst);
+		PROCESS_LINK_CONTEXT("LR0402000UploadTerminalVersion")
+		bool ret = http_client->Post(*req, dst, &nextLink);
 		http_client->Destory();
 		if (!ret)
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uplaodTerminalVersionThread failed, url:%s, terminalNo:%s, rootVer:%s, centerVer:%s",

+ 3 - 1
Framework/spshell/spshell.cpp

@@ -127,6 +127,8 @@ static bool IsSpPathType(const CSimpleStringA& value, const char* key)
         lastIsNum = !(path[i] == '.');
         if (!lastIsNum) dotCnt++;
     }
+	//if (i == path.GetLength() && dotCnt == 3 && lastIsNum) return true; //D:\Run\version\3.7.1.0
+
     if (i >= path.GetLength() || dotCnt != 3 || !lastIsNum)
         return false;
     return true;
@@ -183,7 +185,7 @@ static void ResetEnvPath()
     // append bin sub dir to %PATH%
 	strcat(path, SPLIT_SLASH_STR "bin");
 	strcat(buf, path);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nwe path:%s", buf);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("new path:%s", buf);
 	SetEnvironmentVariableA(name, buf);
 	free(buf);
 	SetEnvironmentVariableA("ModuleName", "SpShell");

+ 2 - 13
Module/include/DevEntityCommBase.hpp

@@ -258,7 +258,6 @@ inline void CDevAdptEntityBase::InitializeVendorLogSwitch()
 		stLogConfig.strLevel = str;
 	}
 
-	bool fromLocal = false;
 	if (stLogConfig.strLevel.Compare("OFF", true) != 0) {
 
 		stLogConfig.strType = "UPLOAD";
@@ -271,18 +270,8 @@ inline void CDevAdptEntityBase::InitializeVendorLogSwitch()
 		GetFunction()->GetPath("Dbg", stLogConfig.strLogPath);
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DbgPath: %s", stLogConfig.strLogPath.GetData());
 		stLogConfig.Settle();
-
-        do {
-            CEntityStaticInfo staticInfo;
-            GetFunction()->GetEntityStaticInfo(GetEntityName(), staticInfo);
-            DWORD dwUsrCode = fromLocal ? 0xFFFEE : 0xFFFEF;
-            dwUsrCode |= (staticInfo.wEntityDevelopID << 20);
-            LogWarn(Severity_Low, Error_Debug, dwUsrCode,
-                    CSimpleStringA::Format("{\"RecordLevel\":\"%s\", \"RecordType\":\"%s\", \"DeterminedBy\":\"%s\"}",
-                                           stLogConfig.strLevel.GetData(),
-                                           stLogConfig.strType.GetData(),
-                                           fromLocal ? "LocalMaintain" : "CenterSettings"));
-        } while (false);
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("{\"RecordLevel\":\"%s\", \"RecordType\":\"%s\"}",
+			stLogConfig.strLevel.GetData(),stLogConfig.strType.GetData());
 	}
 }
 

+ 17 - 11
Module/include/DevFSMCommBase.hpp

@@ -602,7 +602,7 @@ class CCommDevFSM : public FSMImpl<TFSM>
 {
 
 public:
-	CCommDevFSM() :m_FirstStart(TRUE), m_iInWhatPage(PageType_Init),m_bOpened(false), m_bOpening(true), m_eDevState(DEVICE_STATUS_NOT_READY),m_contiErrTimes(0)
+	CCommDevFSM() : m_iInWhatPage(PageType_Init),m_bOpened(false), m_bOpening(true), m_eDevState(DEVICE_STATUS_NOT_READY),m_contiErrTimes(0), m_preUIState('X')
 	{
 
 	}
@@ -849,6 +849,7 @@ public:
 
 	void OnUIState4SetWhatPage(const char* pcszValue) {
 		if (pcszValue != NULL && strlen(pcszValue) > 0) {
+			bool trigger(false);
 			//增加页面位置判断
 			if (_strnicmp(pcszValue, "M", strlen("M")) == 0) {
 				SetInWhatPage(PageType_MainPage);
@@ -859,13 +860,25 @@ public:
 			else {
 				SetInWhatPage(PageType_Other);
 			}
+			
+			if (m_preUIState != pcszValue[0]) {
+				if (pcszValue[0] == 'M') {
+					trigger = true;
+				}
+				m_preUIState = pcszValue[0];
+			}
+
+			if (trigger) {
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("just test EVT_MAINPAGE_DISPLAY");
+				this->PostEventFIFO(new FSMEvent(EVT_MAINPAGE_DISPLAY));
+			}
 		}
 	}
 
 	virtual DevStateEnum GetDevState() const { 
 		return m_eDevState; 
 	}
-	void SetDevState(DevStateEnum val) { 
+	void SetDevState(DevStateEnum val = DEVICE_STATUS_NORMAL) {
 		m_eDevState = val; 
 	}
 
@@ -878,7 +891,6 @@ protected:
 
 	DevAdptLibHelper<TDevClass> m_hDevHelper;
 	DevEntityErrorCode m_entCode;
-	BOOL m_FirstStart;
 	int m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
 
 	ErrorPackageEx m_errPkgEx;
@@ -975,7 +987,7 @@ protected:
 	virtual void OnHardwareShakeHand(CSmartPointer<ITransactionContext> pTransactionContext);
 
 private:
-		std::map<std::string, DWORD> m_WarnCodeMap;
+	char m_preUIState;
 };
 
 template<class TFSM, class TDevClass>
@@ -1005,15 +1017,9 @@ inline ErrorCodeEnum CCommDevFSM<TFSM, TDevClass>::GetAndSplitDevErrInfo(
 		if (devErrInfo.dwErrMsgLen > MAX_DEV_ERROR_MSG_LEN) {
 			wdDevErrCode = (WORD)((devErrInfo.dwErrMsgLen >> 16) & 0x0000FFFF);
 		}
-		if (bDisplayFunName) {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(lpszFuncNameForDisplay)("Invoke <%s> failed, Dev_GLE: DevErrCode[%d], ErrMsg[%s]",
-				lpszFuncNameForDisplay, wdDevErrCode, (LPCTSTR)csErrMsg);
-		} else {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Dev_GLE: DevErrCode[%d], ErrMsg[%s]", wdDevErrCode, (LPCTSTR)csErrMsg);
-		}
 	} else {
 		if (bDisplayFunName) {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetLastErr")("Invoke <%s> failed, and unfortunately Dev_GLE failed returned EC: %s",
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetLastErr")("Invoke <%s> failed, and Dev_GLE failed returned EC: %s",
 				lpszFuncNameForDisplay, SpStrError(erroCode));
 			csErrMsg = CSimpleStringA::Format("Invoke <%s> failed", lpszFuncNameForDisplay);
 		} else {

+ 14 - 80
Module/mod_CardIssuerStand/CardIssuerFSM.cpp

@@ -780,7 +780,6 @@ unsigned int CCardIssuerFSM::s7_on_event(FSMEvent* pEvt)
 			FetchCard evt;
 			evt.status = 1;
 			SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt);
-			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("取卡时设备故障");
 			return 1;
 		}
 		else {
@@ -1151,96 +1150,26 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(CSimpleStringA::Format("CardIssuer, MachineType:%s, TerminalNo:%s, MachineVersion:%d.%d",
 		m_csMachineType.GetData(), m_terminalNo.GetData(), m_majorVerion, m_minorVerion));
 
-	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件,卡机分离后,拷贝旧版运行时文件,后期稳定后直接去除
-	//////////////////////////////////////////////////////////////////////////
+
 	CSimpleStringA runinfoPath(true);
-	CSmartPointer<IConfigInfo> spConfig;
 	ErrorCodeEnum  err = GetEntityBase()->GetFunction()->GetPath("RunInfo", runinfoPath);
 	if (err != Error_Succeed) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get system RunInfo value failed.");
-		return Error_Exception;
-	}
-	err = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
-	if (err != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get cfg file failed ");
-		return err;
-	}
-	
+	}	
 	CSimpleStringA runinfoOldFile = runinfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "CardIssuer.ini"; 
 	CSimpleStringA runinfoNewFile = runinfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "CardIssuerStand.ini";
-
-	int enterMainPageInt = 0;
-
 	if (ExistsFile(runinfoNewFile.GetData())) {
-		if (ExistsFile(runinfoOldFile)) {
-			//新在,旧也在,新进入首页则不拷贝,否则重新拷贝
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is Exist. CardIssuer.ini is Exist");
-			spConfig->ReadConfigValueInt("all", "enterMainPage", enterMainPageInt);
-			if (enterMainPageInt == 2) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is Exist. enterMainPage=%d, no recopy", enterMainPageInt);
-			}
-			else if (enterMainPageInt == 1) {
-				//先删再拷贝
-				if (RemoveFileA(runinfoNewFile.GetData())) {
-					if (CopyFileA(runinfoOldFile.GetData(), runinfoNewFile.GetData(), FALSE)) {
-						LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CopyRuncfg, "Recopy old CardIssuer.ini succ");
-						spConfig->WriteConfigValueInt("all", "enterMainPage", 1);//写入初值
-					}
-					else {
-#ifdef RVC_OS_WIN
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recopy old CardIssuer.ini failed.err=%d", (int)GetLastError());
-#else
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recopy old CardIssuer.ini failed.err=%d", errno);
-#endif
-						return Error_Exception;
-					}
-				}
-				else {
-#ifdef RVC_OS_WIN
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("remove CardIssuerStand.ini failed.err=%d", (int)GetLastError());
-#else
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("remove CardIssuerStand.ini failed.err=%d", errno);
-#endif
-					return Error_Exception;
-				}
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is Exist. but enterMainPage=%d is invalid, continued use CardIssuerStand.ini", enterMainPageInt);
-			}
-
-		}
-		else {
-			//新在,旧不在,不处理
-			spConfig->ReadConfigValueInt("all", "enterMainPage", enterMainPageInt);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is Exist. CardIssuer.ini not Exist .enterMainPage=%d", enterMainPageInt);
-		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is Exist.");
 	}
 	else {
 		if (ExistsFile(runinfoOldFile)) {
-			//新不在,旧在,拷贝,附初值
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is not Exist. CardIssuer.ini is Exist");
-			if (CopyFileA(runinfoOldFile.GetData(), runinfoNewFile.GetData(), FALSE)) {
-				LogWarn(Severity_Low, Error_Unexpect, CardIssuer_UserErrorCode_CopyRuncfg, "copy old CardIssuer.ini succ.");
-				spConfig->WriteConfigValueInt("all", "enterMainPage", 1);//写入初值
-			}
-			else {
-#ifdef RVC_OS_WIN
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("copy old CardIssuer.ini failed.err=%d", (int)GetLastError());
-#else
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("copy old CardIssuer.ini failed.err=%d", errno);
-#endif
-				return Error_Exception;
-			}
-
 		}
 		else {
-			//新旧都不在,附初值
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStand.ini is not Exist. CardIssuer.ini is not Exist");
-			spConfig->WriteConfigValueInt("all", "enterMainPage", 1);//写入初值
 		}
 	}
 
-	//////////////////////////////////////////////////////////////////////////
 	m_devStatus.eMedia = CI_MEDIA_NOTPRESENT;
 	m_bHasHopper[0] = false;
 	m_bHasHopper[1] = false;
@@ -2119,19 +2048,20 @@ int CCardIssuerFSM::WaitFetchingCard()
 	DWORD dwStart, dwEnd;
 	dwStart = GetTickCountRVC();
 	LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_ON,"CardReader(fetch) warning on");
+	long l_beginTime, l_endTime;
 	do {
+		l_beginTime = GetTickCountRVC();
 		if (GetDevStatus(false)){
 			dwEnd = GetTickCountRVC();
 			if (m_devStatus.eMedia == CI_MEDIA_ENTERING){
 				Sleep(WAIT_INTERVAL);
 			}
 			else{
-				long l_beginTime, l_endTime;
+				
 				l_beginTime = GetTickCountRVC();
 				ErrorCodeEnum eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 				l_endTime = GetTickCountRVC();
 
-
 				if (eErr != Error_Succeed) {			
 					SetErrorAndLog(eErr, MEC_DEVAPI_CARDISSUER_SetCardInType, "DevAdapter::SetCardInType", __FUNCTION__, false, l_endTime - l_beginTime, "", "");
 				}
@@ -2143,7 +2073,9 @@ int CCardIssuerFSM::WaitFetchingCard()
 			}
 		}else
 		{
+			l_endTime = GetTickCountRVC();
 			LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_GREEN_OFF,"CardReader(fetch) warning off");
+			SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040220305", "取卡时设备故障");
 			return 1;
 		}
 	}while ((dwEnd-dwStart) < 60*1000);
@@ -4440,7 +4372,8 @@ bool CCardIssuerFSM::RegistCardWhileCaptureCard(CSimpleStringA cardno)
 		csDate.GetData(), csTime.GetData(), cardno.GetLength(), cardno.SubString(0, 6).GetData(),
 		cardno.SubString(cardno.GetLength() - 4, 4).GetData(), m_captureReason.GetData());
 	long beg = GetTickCountRVC();
-	bool ret = client->Post(qRegistCardReq, qRegistCardRet);
+	PROCESS_LINK_CONTEXT("LR0402203RegisterCard")
+	bool ret = client->Post(qRegistCardReq, qRegistCardRet, &nextLink);
 	long end = GetTickCountRVC();
 	if (ret)
 	{
@@ -4534,8 +4467,8 @@ bool CCardIssuerFSM::SyncMaterialCount(IHttpFunc* client,SyncMaterialCountInfo s
 		pReq2.CardPercent = syncInfo.arrCardPercent[i];
 		qTempReq.reqData.push_back(pReq2);
 	}
-
-	if (!client->Post(qTempReq, qTempRet)) {
+	PROCESS_LINK_CONTEXT("LR0402203SyncMaterialCount")
+	if (!client->Post(qTempReq, qTempRet, &nextLink)) {
 		LogWarn(Severity_Middle, Error_Exception, CardIssuer_UserErrorCode_SyncMaterialCount_Failed, CSimpleStringA::Format("<SyncMaterialCount>, http req fail,url=%s, err=%s", qTempReq.m_url.c_str(), qTempRet.m_errMsg.c_str()).GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402203Z02").setResultCode("RTA2330")("同步物料计数通讯失败");
 		return false;//通讯失败
@@ -5154,7 +5087,8 @@ int CCardIssuerFSM::JudgeCardType(CSimpleStringA cardno, bool& bMismatch)
 	qCardTypeReq.BODY.x1.xEacNbr = cardno.GetData();
 	qCardTypeReq.BODY.x1.xIacNbr = "";
 	long beg = GetTickCountRVC();
-	bool ret = client->Post(qCardTypeReq, qCardTypeRet);
+	PROCESS_LINK_CONTEXT("LR0402203CardType")
+	bool ret = client->Post(qCardTypeReq, qCardTypeRet, &nextLink);
 	long end = GetTickCountRVC();
 	if (ret)
 	{

+ 8 - 4
Module/mod_CenterSetting/CenterSettingConn.cpp

@@ -487,7 +487,8 @@ void CenterSettingsMicroServiceHelper::UpdateVersion()
 	GetTimeoutValue(sReq.m_timeOut);
 	
 	//IHttpFunc* m_pHttpFunc = create_http(HTTPLogCallback);
-	bool ret =  m_pHttpFunc->Post(sReq, sResponse);
+    PROCESS_LINK_CONTEXT("LR0402101UploadVersion")
+	bool ret =  m_pHttpFunc->Post(sReq, sResponse, &nextLink);
 
 	if(ret && sResponse.m_success)
 	{
@@ -523,8 +524,9 @@ void CenterSettingsMicroServiceHelper::UpdateVersion()
     SP::Module::Restful::FulfillRequestJsonBody(&config, updateVersionReq);
 
     RestfulClient client = RestfulClient::getInstance();
+    PROCESS_LINK_CONTEXT("LR0402101UpdateVersion");
     config.PreDo();
-    client.Do(&config, &result);
+    client.Do(&config, &result, &nextLink);
 
     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("返回内容为 %s", result.content.length() > 1000 ? result.content.substr(0, 1000).c_str() : result.content.c_str());
 
@@ -617,7 +619,8 @@ void CenterSettingsMicroServiceHelper::GetTimeoutValue(int& timeout)
 #ifdef RVC_OS_WIN
 int CenterSettingsMicroServiceHelper::OnRequest(CenterSettingReq& req, CenterSettingResponse& res, string& errMsg)
 {
-	bool ret = m_pHttpFunc->Post(req, res);
+    PROCESS_LINK_CONTEXT("LR0402101SyncCenter")
+	bool ret = m_pHttpFunc->Post(req, res, &nextLink);
 
 	if(ret && res.m_success)
 	{
@@ -711,8 +714,9 @@ int CenterSettingsMicroServiceHelper::GetCenterSettingsFromHttp(CenterSettingReq
     Dbg("Geting centtersetting...");
 
     RestfulClient client = RestfulClient::getInstance();
+    PROCESS_LINK_CONTEXT("LR0402101GetCenterSetting");
     config.PreDo();
-    client.Do(&config, &result);
+    client.Do(&config, &result, &nextLink);
 
     Dbg("ret result.ResponseOK() = %d.", result.ResponseOK());
     if (!result.ResponseOK()) {

+ 19 - 14
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -486,8 +486,14 @@ void CContactlessCardFSM::s9_on_entry()
 	LOG_FUNCTION();
 	m_currentFSMState = 9;
 	SetDevState(DEVICE_STATUS_FAULT);
-	FSMEvent *e = new FSMEvent(USER_EVT_RESET);
-	PostEventFIFO(e);
+	if (m_bNeedReset) {
+		FSMEvent* e = new FSMEvent(USER_EVT_RESET);
+		PostEventFIFO(e);
+	}
+	else {
+		m_testResult = Error_InvalidState;
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("device is fault, wait for restart entity");
+	}
 }
 void CContactlessCardFSM::s9_on_exit()
 {
@@ -580,8 +586,9 @@ unsigned int CContactlessCardFSM::s10_on_event(FSMEvent* pEvt)
 			ret = 0;
 		}
 	break;
-	case USER_EVT_EXIT_MIAN_PAGE:
+	case EVT_MAINPAGE_DISPLAY:
 		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S10 receive exit to main page");
 			m_bPageExit = true;
 			pEvt->SetHandled();
 			ret = 0;
@@ -616,8 +623,9 @@ unsigned int CContactlessCardFSM::s11_on_event(FSMEvent* pEvt)
 			ret = pEvt->param1;
 		}
 	break;
-	case USER_EVT_EXIT_MIAN_PAGE:
+	case EVT_MAINPAGE_DISPLAY:
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S11 receive exit to main page");
 		m_bPageExit = true;
 		pEvt->SetHandled();
 		ret = 0;
@@ -655,8 +663,7 @@ ErrorCodeEnum CContactlessCardFSM::OnInit()
 	if (errCode != Error_Succeed)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load failed(%d).",errCode);
-		m_bOpening = false;
-		return errCode;
+		SetDevInitFlag(false);//打开失败
 	}
 	devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
 	m_bOpening = false;
@@ -862,6 +869,12 @@ ErrorCodeEnum CContactlessCardFSM::Load()
 }
 int CContactlessCardFSM::Initial()
 {
+	if (!m_bOpened) {
+		m_bNeedReset = false;
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Initial,ret = 1");
+		return 1;//故障模式
+	}
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Initial,ret = 0");
 	return 0;
 }
 bool CContactlessCardFSM::GetDevStatus(bool bPrint)
@@ -2186,11 +2199,3 @@ int CContactlessCardFSM::PreOnlineJS(SpReqAnsContext<ContactlessCardService_Read
 	return 0;
 
 }
-
-int CContactlessCardFSM::ExitToMainPage()
-{
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit to main page, send event");
-	FSMEvent* evt = new FSMEvent(USER_EVT_EXIT_MIAN_PAGE);
-	PostEventFIFO(evt);
-	return 0;
-}

+ 7 - 5
Module/mod_ContactlessCard/ContactlessFSM.h

@@ -45,8 +45,7 @@ enum EvtType
 	USER_EVT_JS_EJECTFINISHED,
 	USER_EVT_JS_POSTONLINE,
 	USER_EVT_JS_POSTONLINEFINISHED,
-	USER_EVT_JS_READ_CANCEL,
-	USER_EVT_EXIT_MIAN_PAGE
+	USER_EVT_JS_READ_CANCEL
 };
 
 using namespace ContactlessCard;
@@ -244,6 +243,10 @@ public:
 		FSM_RULE_ENTRY(s2,s3,USER_EVT_ACCEPT,0)
 		FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
 		FSM_RULE_ENTRY(s2, s6, USER_EVT_EJECT, 0)
+		FSM_RULE_ENTRY(s2, s10, USER_EVT_JS_READ, 0)//JS	¶Á¿¨
+		FSM_RULE_ENTRY(s2, s10, USER_EVT_JS_POSTONLINE, 0)//JS	Áª»úºó
+		FSM_RULE_ENTRY(s2, s11, USER_EVT_JS_EJECT, 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)
@@ -281,7 +284,7 @@ public:
 		CContactlessCardFSM() : m_bCancelAccept(false), m_bWaitingAccept(false),
 		m_bWaitAccepteMore(false), m_bExit(false), m_resetTimes(0), m_testResult(Error_Succeed)
 		, m_bCDA(false), m_pDataToARQC(NULL), m_csMachineType(true), m_csDevNo(""), m_devInit(false), m_repeatErrTimes(0),
-		m_bCancelRead(false),m_bPageExit(false)
+		m_bCancelRead(false),m_bPageExit(false), m_bNeedReset(true)
 		{
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x213); 
 			cmdDecodeMag2 = NULL;
@@ -374,8 +377,6 @@ public:
 
 	int PreOnlineJS(SpReqAnsContext<ContactlessCardService_ReadJS_Req, ContactlessCardService_ReadJS_Ans>::Pointer ctx);
 
-	int ExitToMainPage();
-
 protected:
 	int m_iInsertTries;
 	int m_resetTries;
@@ -409,6 +410,7 @@ private:
 	//new
 	bool m_bCancelRead;
 	bool m_bPageExit;
+	bool m_bNeedReset;
 };
 struct InitTask : public ITaskSp
 {

+ 0 - 3
Module/mod_ContactlessCard/mod_ContactlessCard.cpp

@@ -117,9 +117,6 @@ void CContactlessCardEntity::OnSysVarEvent(const char* pszKey, const char* pszVa
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))
 	{
 		m_fsm.OnUIState4SetWhatPage(pszValue);
-		if (_strnicmp(pszValue, "M", strlen("M")) == 0) {
-			m_fsm.ExitToMainPage();
-		}
 	}
 }
 

+ 14 - 7
Module/mod_HSPScanner/HSPSCanner_UserErrorCode.h

@@ -7,11 +7,11 @@
 
 
 #define LOG_ERR_HSPS_DEVOPEN_FAILED 0x21700001
-#define LOG_EVT_HSPS_LIGHT_ON 0x21700002
-#define LOG_EVT_HSPS_LIGHT_OFF 0x21700003
-#define LOG_EVT_HSPS_LOST_CONNECT 0x21700004
-#define LOG_EVT_HSPS_READ_IMAGE_FILE_FAILED 0x21700005
+#define LOG_ERR_HSPS_PREVIEW_FAILED 0x21700003
+#define LOG_EVT_HSPS_CANCEL_PREVIEW_FAILED 0x21700004
+#define LOG_EVT_HSPS_SCANIMAGE_FAILED 0x21700005
 #define LOG_EVT_HSPS_READ_IMAGEEX_FILE_FAILED 0x21700006
+#define HSPScanner_UserErrorCode_SetParam_Position 0x21700007
 #define LOG_EVT_SCANNERSET_HSPSCNT_UPLOAD_VENDORINFO 0x21700102
 #define LOG_EVT_SCANNERSET_HSPSCNT_ROOTINFO 0x21700103
 #define LOG_EVT_HSPSCANNER_SetPreview_Close 0x21700104
@@ -30,11 +30,10 @@
 #define HSPScanner_UserErrorCode_DLLNAME_FAILED						0x2170020A
 #define HSPScanner_UserErrorCode_DLLNAME_NOCFG						0x2170020B
 #define HSPScanner_UserErrorCode_DEVICE_OFFLINE						0x2170020C
-#define HSPScanner_UserErrorCode_IMAGE_CLEAR					0x2170020D
 #define HSPScanner_UserErrorCode_NOT_SUPPORT					0x2170020E
 #define HSPScanner_UserErrorCode_REAL_ROOT_CONFIG	0x2170020F
 
-#define LOG_DEBUG_HSPS_CRITICAL_OPERATION_START						 0x21700210
+#define LOG_DEBUG_HSPS_CRITICAL_OPERATION_START			0x21700210
 #define LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGE_START  0x21700211
 #define LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGEEX_START  0x21700212
 
@@ -45,8 +44,9 @@
 #define LOG_WARN_HSPS_RESIZE_IMAGEEX_FILE_FAILED				0x21700217 //ex图片缩小失败
 #define LOG_WARN_HSPS_RESIZE_FUNCTION_SUCCEED					0x21700218 //resize函数执行成功
 
-#define LOG_WARN_HSPS_VENDORDLL_CHANGE					0x21700219 //修改加载DLL的名称
 #define LOG_WARN_HSPS_VENDORDLL_KEBA_MATCHED	    0x2170021A //符合切换科堡适配器的告警
+#define LOG_WARN_HSPS_INVALID_OPERATION	    0x2170021B
+#define LOG_WARN_HSPS_OPENING_NOW 0x2170021C
 
 #define LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGE_SUCC   0x21700220
 #define LOG_DEBUG_HSPS_CRITICAL_OPERATION_SCANIMAGE_FAILED 0x21700221
@@ -55,4 +55,11 @@
 
 #define HSPScanner_UserErrorCode_FindFile_in_DepBak 0x21700225
 
+#define HSPScanner_UserErrorCode_SetParam_Color 0x21700226
+#define HSPScanner_UserErrorCode_SetParam_Rotate 0x21700227
+#define HSPScanner_UserErrorCode_SetParam_Scan 0x21700228
+#define HSPScanner_UserErrorCode_SetParam_View 0x21700229
+#define HSPScanner_UserErrorCode_SetParam_Hide 0x2170022A
+
+
 #endif

+ 130 - 11
Module/mod_HSPScanner/HSPScanner.xml

@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="gb2312" ?>
+<?xml version="1.0" encoding="utf-8" ?>
 <entity name="HSPScanner">
 	<class name="HSPScannerService" overlap="true" exclusive="false">
 		<twoway name="StartPreview" overlap="true">
@@ -15,7 +15,7 @@
 				<param name="reserved4" type="short"/>
 			</req>
 			<res>
-				<!--failed bit: 1, 2, 4, 8 ... 预览成功通过上下文返回,retCode用于各项参数的设置结果-->
+				<!--failed bit: 1, 2, 4, 8 ... 棰勮�鎴愬姛閫氳繃涓婁笅鏂囪繑鍥烇紝retCode鐢ㄤ簬鍚勯」鍙傛暟鐨勮�缃�粨鏋�-->
 				<param name="retCode" type="int" />
 				<param name="reserved1" type="int" />
 				<param name="reserved2" type="array_int" />
@@ -29,7 +29,7 @@
 			<res>
 			</res>
 		</twoway>
-    <!--接口名称和功能:请求拍照。拍照成功后会调用硬件适配器隐藏窗口-->
+    <!--鎺ュ彛鍚嶇О鍜屽姛鑳斤細璇锋眰鎷嶇収銆傛媿鐓ф垚鍔熷悗浼氳皟鐢ㄧ‖浠堕€傞厤鍣ㄩ殣钘忕獥鍙�-->
 		<twoway name="ScanImage" overlap="true">
 			<req>
 				<param name="reserved1" type="int"/>
@@ -68,7 +68,7 @@
 				<param name="reserved4" type="short"/>
 			</req>
 			<res>
-				<!--failed bit: 1, 2, 4, 8 ... 预览成功通过上下文返回,retCode用于各项参数的设置结果-->
+				<!--failed bit: 1, 2, 4, 8 ... 棰勮�鎴愬姛閫氳繃涓婁笅鏂囪繑鍥烇紝retCode鐢ㄤ簬鍚勯」鍙傛暟鐨勮�缃�粨鏋�-->
 				<param name="retCode" type="int" />
 				<param name="reserved1" type="int" />
 				<param name="reserved2" type="array_int" />
@@ -78,7 +78,7 @@
 			<req>
 				<!--0:hide 1:show 2:custom -->
 				<param name="type" type="int"/>
-				<!--默认比例16:9 reserved4保留使用,注意在 type = 2 时以下值有效-->
+				<!--榛樿�姣斾緥16:9 reserved4淇濈暀浣跨敤锛屾敞鎰忓湪 type = 2 鏃朵互涓嬪€兼湁鏁�-->
 				<param name="pointX" type="int"/>
 				<param name="pointY" type="int"/>
 				<param name="nWidth" type="int"/>
@@ -88,7 +88,7 @@
 			</res>
 		</twoway>
 		<twoway name="ShowProperty" overlap="true">
-      <!--直接调用厂商硬件适配器接口-->
+      <!--鐩存帴璋冪敤鍘傚晢纭�欢閫傞厤鍣ㄦ帴鍙�-->
 			<req>
 			</req>
 			<res>
@@ -105,18 +105,137 @@
 				<param name="reserved2" type="array_string"/>	
 			</res>
 		</twoway>
-		<twoway name="GetDevInfo" overlap="true" method_id="65535">
+    <!-- 鑾峰彇璁惧�妯″潡淇℃伅锛屾垚鍔熸椂errorCode涓篍rror_Succeed(0)锛屽強鐩稿叧鏁版嵁 -->
+    <!-- 1銆佽�澶囨湭鎵撳紑锛宔rrorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N01 -->
+    <!-- 2銆佺‖浠舵湭閰嶇疆锛宔rrorCode涓篍rror_NotConfig,rtaCode涓篟TA2N0J -->
+    <!-- 3銆佺‖浠舵帀绾匡紝errorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N0K -->
+    <twoway name="GetDevInfo" overlap="true" jsflag="true" method_id="65535">
 			<req>
 			</req>
 			<res>
-				<param name="type" type="string" />
+        <!--璁惧�閫傞厤鍣―evCategoryInfo鐨剆zType-->
+        <param name="type" type="string" />
+        <!--璁惧�閫傞厤鍣―evCategoryInfo鐨剆zModel-->
 				<param name="model" type="string" />
-				<param name="version" type="string" />
-				<param name="state" type="int" />
+        <!--璁惧�閫傞厤鍣―evCategoryInfo鐨剉ersion-->
+        <param name="version" type="string" />
+        <!--纭�欢瀹炰綋鍐呯疆鐨勭姸鎬侊紝鐩�墠鏆傛棤浣跨敤鍦烘櫙锛屾湁闇€瑕佸湪璁ㄨ�濡備綍瀹氫箟-->
+        <param name="state" type="int" />
 			</res>
 		</twoway>
 		<oneway name="Exit" overlap="true">			
-		</oneway>							
+		</oneway>
+    <!-- 棰勮�锛屾垚鍔熸椂杩斿洖Error_Succeed锛屽強鐩稿叧鏁版嵁 -->
+    <!-- 1銆佽�澶囨湭鎵撳紑锛宔rrorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N01 -->
+    <!-- 2銆佺‖浠舵湭閰嶇疆锛宔rrorCode涓篍rror_NotConfig,rtaCode涓篟TA2N0J -->
+    <!-- 3銆佺‖浠舵帀绾匡紝errorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N0K -->
+    <!-- 4銆佽皟鐢ㄧ‖浠�-棰勮�澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N03 -->
+    <!-- 5銆佽皟鐢ㄧ‖浠�-璁剧疆瑙掑害澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0Y -->
+    <!-- 6銆佽皟鐢ㄧ‖浠�-璁剧疆鐢诲箙澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0Z -->
+    <!-- 7銆佽皟鐢ㄧ‖浠�-璁剧疆鑹插僵澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0W -->
+    <!-- 8銆佽皟鐢ㄧ‖浠�-璁剧疆鍧愭爣澶у皬澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N07 -->
+    <!-- 9銆佽皟鐢ㄧ‖浠�-鏄剧ず棰勮�绐楀彛澶辫触锛堥�瑙�&闅愯棌鐨勭姸鎬侊級锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0R -->
+    <!-- 璇存槑琛ュ厖锛�
+     * 濡傞渶璁剧疆鍙傛暟锛屽皢鍦ㄩ�瑙堝墠璁剧疆锛岃�缃�弬鏁板け璐ュ垯鎻愬墠杩斿洖锛屾棤璁哄綋鏃舵槸鍚﹀凡缁忓�浜庨�瑙堢姸鎬�
+     * 澶勪簬棰勮�浣嗛殣钘忥紙鍏充簬闅愯棌锛岃�涓嬫柟瀵瑰彇娑堥�瑙堢殑璇存槑锛夌姸鎬侊紝鍒欎細鐩存帴鏄剧ず绐楀彛锛屽�鏋滃叾浠栧弬鏁版湁鍊硷紝浠嶇劧浼樺厛璁剧疆鍙傛暟锛堝け璐ュ垯鎻愬墠杩斿洖锛夛紝鍐嶆樉绀虹獥鍙�
+    -->
+    <twoway name="StartPreviewJS" jsflag="true" overlap="true">
+      <req>
+        <!--0锛氳烦杩囪�搴﹁�缃�紝涓嶇敓鏁堬紱1锛氫笉鏃嬭浆瑙掑害锛�2锛氶『鏃堕拡鏃嬭浆90锛�3锛氶『鏃堕拡鏃嬭浆180锛�4锛氶『鏃堕拡鏃嬭浆270-->
+        <param name="rotate" type="short" />
+        <!--0锛氳烦杩囩敾骞呰�缃�紝涓嶇敓鏁堬紱1锛氬叏鐢诲箙锛�2锛欰4鐢诲箙锛�3锛氳韩浠借瘉澶у皬鐢诲箙-->
+        <param name="scan" type="short"/>
+        <!--0锛氳烦杩囪壊褰╄�缃�紝涓嶇敓鏁堬紱1锛氬僵鑹诧紱2锛氶粦鐧�-->
+        <param name="color" type="short" />
+        <!--0锛氳烦杩囧潗鏍�&澶у皬璁剧疆锛屼笉鐢熸晥锛�1锛氳�缃��瑙堢獥鍙e潗鏍囷紝鍙�湁姝ゅ€间负1鏃舵墠浼氳�鍙杙os_x|y|w-->
+        <param name="pos" type="short"/>
+        <!--璁剧疆棰勮�绐楀彛鍧愭爣鐨刋杞村潗鏍囷紝褰損os涓嶄负0鏃惰�鍊兼墠鏈夋晥-->
+        <param name="pos_x" type="short"/>
+        <!--璁剧疆棰勮�绐楀彛鍧愭爣鐨刌杞村潗鏍囷紝褰損os涓嶄负0鏃惰�鍊兼墠鏈夋晥-->
+        <param name="pos_y" type="short"/>
+        <!--璁剧疆棰勮�绐楀彛鐨勭獥鍙e�搴︼紝褰損os涓嶄负0鏃惰�鍊兼墠鏈夋晥-->
+        <param name="pos_w" type="short"/>
+        <param name="reserved1" type="int"/>
+      </req>
+      <res>
+      </res>
+    </twoway>
+    <!-- 鍙栨秷棰勮�锛屾垚鍔熸椂杩斿洖Error_Succeed(0)锛屽強鐩稿叧鏁版嵁 -->
+    <!-- 1銆佽�澶囨湭鎵撳紑锛宔rrorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N01 -->
+    <!-- 2銆佺‖浠舵湭閰嶇疆锛宔rrorCode涓篍rror_NotConfig,rtaCode涓篟TA2N0J -->
+    <!-- 3銆佺‖浠舵帀绾匡紝errorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N0K -->
+    <!-- 4銆佽皟鐢ㄧ‖浠�-鍙栨秷棰勮�澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N04 -->
+    <!-- 5銆佽皟鐢ㄧ‖浠�-闅愯棌棰勮�绐楀彛澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0Q -->
+    <!-- 璇存槑琛ュ厖锛�
+     * 褰撹�姹備粎涓洪殣钘忛�瑙堢獥鍙f椂锛�1锛夐�瑙�&闅愯棌鐘舵€佹椂鐩存帴杩斿洖鎴愬姛锛�2锛夐�瑙�&闈為殣钘忔椂璋冪敤闅愯棌锛�3锛夐潪棰勮�鏃惰繑鍥炴棤鏁堟搷浣滐紝errorCode涓篍rror_InvalidState锛宺taCode涓篟TA2N0V
+     * 褰撶洿鎺ュ叧闂��瑙堟椂锛�1锛夐潪棰勮�鏃剁洿鎺ヨ繑鍥炴垚鍔燂紱2锛夐�瑙�&闅愯棌鐘舵€佹椂璋冪敤纭�欢鍙栨秷棰勮�
+    -->
+    <twoway name="CancelPreviewJS" jsflag="true" overlap="true">
+      <req>
+        <!--鏄�惁浠呬负闅愯棌棰勮�绐楀彛锛屽�鏋滀负false锛岃〃绀鸿皟鐢ㄧ‖浠跺叧闂�憚鍍忓ご锛宼rue琛ㄧず浠呬负闅愯棌棰勮�绐楀彛涓嶅叧闂�憚鍍忓ご锛岄粯璁ゆ槸鍏抽棴鎽勫儚澶�-->
+        <param name="hide" type="bool"/>
+      </req>
+      <res>
+      </res>
+    </twoway>
+    <!--鎷嶇収锛屾垚鍔熸椂杩斿洖Error_Succeed(0)锛屽強鐩稿叧鏁版嵁-->
+    <!-- 1銆佽�澶囨湭鎵撳紑锛宔rrorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N01 -->
+    <!-- 2銆佺‖浠舵湭閰嶇疆锛宔rrorCode涓篍rror_NotConfig,rtaCode涓篟TA2N0J -->
+    <!-- 3銆佺‖浠舵帀绾匡紝errorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N0K -->
+    <!-- 4銆侀潪棰勮�鐘舵€佹棤娉曟媿鐓э紝errorCode涓篍rror_InvalidState,rtaCode涓篟TA2N0V -->
+    <!-- 5銆佽皟鐢ㄧ‖浠�-鎷嶇収澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N05 -->
+    <!-- 6銆佽皟鐢ㄧ‖浠�-闅愯棌棰勮�绐楀彛澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0Q -->
+    <!-- 7銆佹媿鐓ф垚鍔熷悗锛屽帇缂╃収鐗囧け璐ワ紝errorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0N -->
+    <!-- 璇存槑琛ュ厖锛�
+     * 褰撻渶瑕侀殣钘忔椂锛屽墠鎻愭槸銆愭媿鐓ф垚鍔熴€戞墠浼氳皟鐢ㄩ殣钘忛�瑙堢獥鍙o紝濡傛灉闅愯棌绐楀彛澶辫触锛屼竴鏍锋墧瀹氫负鎷嶇収涓嶆垚鍔�
+     * 鍙��澶勪簬棰勮�鐘舵€佷腑锛屽氨璁や负鍙�繘琛屾媿鐓э紝涓嶅尯鍒嗘槸鍚﹂殣钘忛�瑙堢獥鍙�
+     * 璋冪敤鎷嶇収鎴愬姛锛屼絾鏄�‖浠舵病鏈夎繑鍥炲浘鐗囨暟鎹�紝浠嶈�涓烘垚鍔熴€傚彧鏈夐渶瑕佸帇缂╂椂锛堝簲鐢ㄤ粙鍏ワ級锛屼細鍥犱负鍘嬬缉鍥剧墖澶辫触鑰屾姤閿欒繑鍥�
+    -->
+    <twoway name="ScanImageJS" jsflag="true" overlap="true">
+      <req>
+        <!--鎷嶇収鍚庢槸鍚﹁嚜鍔ㄩ殣钘忛�瑙堢獥鍙o紝濡傛灉涓篺alse锛岃〃绀轰粎涓烘媿鐓т笉鍋氬叾浠栨搷浣滐紝true琛ㄧず鎷嶇収鍚庤嚜鍔ㄩ殣钘忛�瑙堢獥鍙o紝搴曞眰榛樿�鏄�媿鐓у悗鑷�姩闅愯棌棰勮�绐楀彛-->
+        <param name="hide" type="bool"/>
+        <!-- 鏄�惁鍘嬬缉鍥剧墖鍜屽帇缂╃殑闃堝€硷紝鍗曚綅KB锛屼负0琛ㄧず涓嶅帇缂╋紝涓氬姟鐩�墠瀹氱殑鏄�500KB -->
+        <param name="compress" type="int" />
+        <param name="reserved1" type="int" />
+      </req>
+      <res>
+        <!--杩斿洖鐓х墖鐨勬暟鎹�祦-->
+        <param name="imageData" type="blob"/>
+      </res>
+    </twoway>
+    <!-- 璁剧疆鍙傛暟锛屾垚鍔熸椂杩斿洖Error_Succeed(0)锛屽強鐩稿叧鏁版嵁 -->
+    <!-- 1銆佽�澶囨湭鎵撳紑锛宔rrorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N01 -->
+    <!-- 2銆佺‖浠舵湭閰嶇疆锛宔rrorCode涓篍rror_NotConfig,rtaCode涓篟TA2N0J -->
+    <!-- 3銆佺‖浠舵帀绾匡紝errorCode涓篍rror_DevNotAvailable,rtaCode涓篟TA2N0K -->
+    <!-- 4銆佽皟鐢ㄧ‖浠�-璁剧疆瑙掑害澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0Y -->
+    <!-- 5銆佽皟鐢ㄧ‖浠�-璁剧疆鐢诲箙澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0Z -->
+    <!-- 6銆佽皟鐢ㄧ‖浠�-璁剧疆鑹插僵澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N0W -->
+    <!-- 7銆佽皟鐢ㄧ‖浠�-璁剧疆鍧愭爣澶у皬澶辫触锛宔rrorCode涓篍rror_Unexpect,rtaCode涓篟TA2N07 -->
+    <!-- 璇存槑琛ュ厖锛�
+     * 闄や互涓婄�1-3绉嶆儏鍐碉紝鍦ㄥ叾浠栦换浣曠姸鎬佷腑閮芥敮鎸佽�缃�弬鏁帮紝鎴愬姛涓庡惁鐢辫皟鐢ㄧ‖浠剁粨鏋滃喅瀹�
+    -->
+    <twoway name="SetParamJS" jsflag="true" overlap="true">
+      <req>
+        <!--0锛氳烦杩囪�缃�紝涓嶇敓鏁堬紱1锛氫笉鏃嬭浆瑙掑害锛�2锛氶『鏃堕拡鏃嬭浆90锛�3锛氶『鏃堕拡鏃嬭浆180锛�4锛氶『鏃堕拡鏃嬭浆270-->
+        <param name="rotate" type="short" />
+        <!--0锛氳烦杩囪�缃�紝涓嶇敓鏁堬紱1锛氬叏鐢诲箙锛�2锛欰4鐢诲箙锛�3锛氳韩浠借瘉澶у皬鐢诲箙-->
+        <param name="scan" type="short"/>
+        <!--0锛氳烦杩囪�缃�紝涓嶇敓鏁堬紱1锛氬僵鑹诧紱2锛氶粦鐧�-->
+        <param name="color" type="short" />
+        <!--0锛氳烦杩囪�缃�紝涓嶇敓鏁堬紱1锛氳�缃��瑙堢獥鍙e潗鏍囷紝鍙�湁姝ゅ€间负1鏃舵墠浼氳�鍙杙os_x|y|w-->
+        <param name="pos" type="short"/>
+        <!--璁剧疆棰勮�绐楀彛鍧愭爣鐨刋杞村潗鏍囷紝褰損os涓嶄负0鏃惰�鍊兼墠鏈夋晥-->
+        <param name="pos_x" type="short"/>
+        <!--璁剧疆棰勮�绐楀彛鍧愭爣鐨刌杞村潗鏍囷紝褰損os涓嶄负0鏃惰�鍊兼墠鏈夋晥-->
+        <param name="pos_y" type="short"/>
+        <!--璁剧疆棰勮�绐楀彛鐨勭獥鍙e�搴︼紝褰損os涓嶄负0鏃惰�鍊兼墠鏈夋晥-->
+        <param name="pos_w" type="short"/>
+        <param name="reserved1" type="int"/>
+      </req>
+      <res>
+      </res>
+    </twoway>
 	</class>
 		<message name="StatusMsg">
 			<param name="status" type="int"/>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 401 - 344
Module/mod_HSPScanner/HSPScannerFSM.cpp


+ 563 - 283
Module/mod_HSPScanner/HSPScannerFSM.h

@@ -21,23 +21,23 @@ using namespace HSPScanner;
 #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
 #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
 
-#define SAFE_FREE_LIBRARY(hModule)	\
-	do {							\
-	if(hModule){					\
-	FreeLibrary(hModule);		\
-	hModule = NULL;				\
-	}							\
-	}while(0)
-
-
-
-
 enum EvtType
 {
 	USER_EVT_STARTPREVIEW = (EVT_USER + 1),
 	USER_EVT_STARTPREVIEW_FINISHED,
 	USER_EVT_SETPROPERTYINVIEW_FINISHED,
 
+	USER_EVT_STARTPREVIEW_JS,
+	USER_EVT_STARTPREVIEW_JS_DONE,
+
+	USER_EVT_CANCELPREVIEW_JS,
+	USER_EVT_CANCELPREVIEW_JS_DONE,
+
+	USER_EVT_SCANIMAGE_JS,
+	USER_EVT_SCANIMAGE_JS_DONE,
+
+	USER_EVT_SETPARAM_JS,
+
 	USER_EVT_STOPPREVIEW,
 	USER_EVT_HIDEPREVIEW,
 	USER_EVT_STOPPREVIEW_FINISHED,
@@ -64,165 +64,41 @@ enum EvtType
 	USER_EVT_EXIT,
 	USER_EVT_EXIT_FINISHED,
 
-	USER_EVT_NOCFG,
 	USER_EVT_GOTOHELL,
-	USER_EVT_OPENSUCC,
-
-	USER_EVT_QUIT
+	USER_EVT_QUIT,
+	USER_EVT_INIT,
+	USER_EVT_INIT_FINISHED
 };
 
-class StartPreviewEvent : public FSMEvent
+namespace JS
 {
-public:
-	StartPreviewEvent() : FSMEvent(USER_EVT_STARTPREVIEW){}
-	~StartPreviewEvent(){}
-	SpReqAnsContext<HSPScannerService_StartPreview_Req, HSPScannerService_StartPreview_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
+	struct PreviewSettings
 	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_StartPreview).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
+		short rotate;
+		short scan;
+		short color;
+		short pos;
+		short pos_x;
+		short pos_y;
+		short pos_w;
 
-class StopPreviewEvent : public FSMEvent
-{
-public:
-	StopPreviewEvent() : FSMEvent(USER_EVT_STOPPREVIEW){}
-	~StopPreviewEvent(){}
-	SpReqAnsContext<HSPScannerService_CancelPreview_Req,
-		HSPScannerService_CancelPreview_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_CancelPreview).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
+		//0:do nothing,1:show, 2:hide
+		short view;
 
-class ScanImageEvent : public FSMEvent
-{
-public:
-	ScanImageEvent() : FSMEvent(USER_EVT_SCANIMAGE){}
-	~ScanImageEvent(){}
-	SpReqAnsContext<HSPScannerService_ScanImage_Req, 
-		HSPScannerService_ScanImage_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
+		PreviewSettings(const HSPScannerService_SetParamJS_Req& rhs) :rotate(rhs.rotate), scan(rhs.scan), color(rhs.color), pos(rhs.pos)
+			, pos_x(rhs.pos_x), pos_y(rhs.pos_y), pos_w(rhs.pos_w),view(0) {}
 
-class ScanImageExEvent : public FSMEvent
-{
-public:
-	ScanImageExEvent() : FSMEvent(USER_EVT_SCANIMAGE_EX){}
-	~ScanImageExEvent(){}
-	SpReqAnsContext<HSPScannerService_ScanImageEx_Req, 
-		HSPScannerService_ScanImageEx_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ScanImageEx).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
+		PreviewSettings(const HSPScannerService_StartPreviewJS_Req& rhs) :rotate(rhs.rotate), scan(rhs.scan), color(rhs.color), pos(rhs.pos)
+			, pos_x(rhs.pos_x), pos_y(rhs.pos_y), pos_w(rhs.pos_w),view(0) {}
 
-class ShowPropertyEvent : public FSMEvent
-{
-public:
-	ShowPropertyEvent() : FSMEvent(USER_EVT_SHOWPROPERTY){}
-	~ShowPropertyEvent(){}
-	SpReqAnsContext<HSPScannerService_ShowProperty_Req, 
-		HSPScannerService_ShowProperty_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_ShowProperty).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
+		PreviewSettings(bool show) :rotate(0), scan(0), color(0), pos(0), pos_x(0), pos_y(0), pos_w(0), view(show ? 1 : 2) {}
 
-class SetPropertyEvent : public FSMEvent
-{
-public:
-	SetPropertyEvent() : FSMEvent(USER_EVT_SETPROPERTY){}
-	~SetPropertyEvent(){}
-	SpReqAnsContext<HSPScannerService_SetProperty_Req, 
-		HSPScannerService_SetProperty_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetProperty).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
+		bool IsAvailable() const {
+			return (rotate != 0 || scan != 0 || color != 0 || pos != 0);
 		}
-	}
-};
-
-class SetWinPosEvent : public FSMEvent
-{
-public:
-	SetWinPosEvent() : FSMEvent(USER_EVT_SETWINPOS){}
-	~SetWinPosEvent(){}
-	SpReqAnsContext<HSPScannerService_SetWinPos_Req, 
-		HSPScannerService_SetWinPos_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_SetWinPos).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
-
-class GetDevStatusEvent : public FSMEvent
-{
-public:
-	GetDevStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
-	~GetDevStatusEvent(){}
-	SpReqAnsContext<HSPScannerService_GetDevStatus_Req, 
-		HSPScannerService_GetDevStatus_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_GetDevStatus).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
-
-class GetDevInfoEvent : public FSMEvent
-{
-public:
-	GetDevInfoEvent() : FSMEvent(USER_EVT_GETINFO){}
-	~GetDevInfoEvent(){}
-	SpReqAnsContext<HSPScannerService_GetDevInfo_Req, 
-		HSPScannerService_GetDevInfo_Ans>::Pointer m_ctx;
-	virtual void OnUnhandled()
-	{
-		if(m_ctx != NULL)
-		{
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode(HSPScannerService_LogCode_GetDevInfo).setResultCode("RTA2N0V")("Error_InvalidState");
-			m_ctx->Answer(Error_InvalidState, HSPScanner_UserErrorCode_FSM_INVALID);
-		}
-	}
-};
-
+		void SetDisplay(bool display) { if (display) view = 1; else view = 2; }
+	};
+}
 
 class CHSPScannerFSM : public CCommDevFSM<CHSPScannerFSM, CHSPSClass>, public IFSMStateHooker
 {
@@ -235,141 +111,181 @@ public:
 
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 
-	enum {s0, s1, s2, s3, s4, s5, s6, s7, s8};
+	enum {
+		sIdle, sPreview, sProperty, sFault, sPicture, sFault_Offline, sHidePreview, sExit, sInit
+	};
 
 	BEGIN_FSM_STATE(CHSPScannerFSM)
-		FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
-		FSM_STATE_ENTRY(s1, "Previewing", s1_on_entry, s1_on_exit, s1_on_event)
-		FSM_STATE_ENTRY(s2, "Property", s2_on_entry, s2_on_exit, s2_on_event)
-		FSM_STATE_ENTRY(s3, "Failed", s3_on_entry, s3_on_exit, s3_on_event)
-		FSM_STATE_ENTRY(s4, "Picturing", s4_on_entry, s4_on_exit, s4_on_event)
-		FSM_STATE_ENTRY(s5, "DeviceOff", s5_on_entry, s5_on_exit, s5_on_event)
-		FSM_STATE_ENTRY(s6, "HidPreviewing", s6_on_entry, s6_on_exit, s6_on_event)
-		FSM_STATE_ENTRY(s7, "Exit", s7_on_entry, s7_on_exit, s7_on_event)
-		FSM_STATE_ENTRY(s8, "Idiot", s8_on_entry, s8_on_exit, s8_on_event)
+		FSM_STATE_ENTRY(sIdle, "Idle", s0_Idle_on_entry, s0_Idle_on_exit, s0_Idle_on_event)
+		FSM_STATE_ENTRY(sPreview, "Previewing", s1_Preview_on_entry, s1_Preview_on_exit, s1_Preview_on_event)
+		FSM_STATE_ENTRY(sProperty, "Property", s2_on_entry, s2_on_exit, s2_on_event)
+		FSM_STATE_ENTRY(sFault, "Failed", s3_Failed_on_entry, s3_Failed_on_exit, s3_Failed_on_event)
+		FSM_STATE_ENTRY(sPicture, "Picturing", s4_ScanImage_on_entry, s4_ScanImage_on_exit, s4_ScanImage_on_event)
+		FSM_STATE_ENTRY(sFault_Offline, "DeviceOff", s5_DeviceOff_on_entry, s5_DeviceOff_on_exit, s5_DeviceOff_on_event)
+		FSM_STATE_ENTRY(sHidePreview, "HidePreview", s6_HidePreview_on_entry, s6_HidePreview_on_exit, s6_HidePreview_on_event)
+		FSM_STATE_ENTRY(sExit, "Exit", s7_Exit_on_entry, s7_Exit_on_exit, s7_Exit_on_event)
+		FSM_STATE_ENTRY(sInit, "Init", s8_Init_on_entry, s8_Init_on_exit, s8_Init_on_event)
 	END_FSM_STATE()
 
 	
-	BEGIN_FSM_RULE(CHSPScannerFSM, s0)
-		//2 reserved in s0 state.
-		FSM_RULE_ENTRY(s0, s1, USER_EVT_STARTPREVIEW_FINISHED, 0)
-		FSM_RULE_ENTRY(s0, s3, USER_EVT_STARTPREVIEW_FINISHED, 1)
-		FSM_RULE_ENTRY(s0, s0, USER_EVT_STARTPREVIEW_FINISHED, 2)
+	BEGIN_FSM_RULE(CHSPScannerFSM, sIdle)
+		//2 reserved in sIdle state.
+		FSM_RULE_ENTRY(sIdle, sPreview, USER_EVT_STARTPREVIEW_FINISHED, 0) //成功预览
+		FSM_RULE_ENTRY(sIdle, sFault, USER_EVT_STARTPREVIEW_FINISHED, 1) //预览失败
+		FSM_RULE_ENTRY(sIdle, sIdle, USER_EVT_STARTPREVIEW_FINISHED, 2) // 错误还不足够严重,停留在当前状态
 
-		FSM_RULE_ENTRY(s3, s1, USER_EVT_STARTPREVIEW_FINISHED, 0)
-		FSM_RULE_ENTRY(s3, s0, USER_EVT_RESET, 0)
-		FSM_RULE_ENTRY(s3, s3, USER_EVT_RESET, 1)
-		FSM_RULE_ENTRY(s3, s1, USER_EVT_RESET, 2)
-		FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_OPENSUCC)
+		FSM_RULE_ENTRY(sFault, sPreview, USER_EVT_STARTPREVIEW_FINISHED, 0)
+		FSM_RULE_ENTRY(sFault, sIdle, USER_EVT_RESET, 0)
+		//FSM_RULE_ENTRY(sFault, sFault, USER_EVT_RESET, 1)
+		FSM_RULE_ENTRY(sFault, sPreview, USER_EVT_RESET, 2)
 
-		FSM_RULE_ENTRY(s1, s2, USER_EVT_SHOWPROPERTY, 0)
-		FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_SHOWPROPERTY_FINISHED)
+		FSM_RULE_ENTRY(sPreview, sProperty, USER_EVT_SHOWPROPERTY, 0)
+		FSM_RULE_ENTRY_ANY(sProperty, sPreview, USER_EVT_SHOWPROPERTY_FINISHED)
 
-		//3 reserved in s1 state.
-		FSM_RULE_ENTRY(s1, s3, USER_EVT_STOPPREVIEW_FINISHED, 0)
-		FSM_RULE_ENTRY(s1, s3, USER_EVT_STOPPREVIEW_FINISHED, 4)
+		//3 reserved in sPreview state.
+		FSM_RULE_ENTRY(sPreview, sFault, USER_EVT_STOPPREVIEW_FINISHED, 0)
+		FSM_RULE_ENTRY(sPreview, sFault, USER_EVT_STOPPREVIEW_FINISHED, 4)
 
-		// Try s6 state --Josephus at 10:10:05 2016/11/22
-		//FSM_RULE_ENTRY(s1, s0, USER_EVT_STOPPREVIEW_FINISHED, 1) //隐藏
-		FSM_RULE_ENTRY(s1, s6, USER_EVT_STOPPREVIEW_FINISHED, 1)
+		// Try sHidePreview state --Josephus at 10:10:05 2016/11/22
+		//FSM_RULE_ENTRY(sPreview, sIdle, USER_EVT_STOPPREVIEW_FINISHED, 1) //隐藏
+		FSM_RULE_ENTRY(sPreview, sHidePreview, USER_EVT_STOPPREVIEW_FINISHED, 1)
 
-		FSM_RULE_ENTRY(s1, s0, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
-		FSM_RULE_ENTRY(s1, s1, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重
+		FSM_RULE_ENTRY(sPreview, sIdle, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
+		FSM_RULE_ENTRY(sPreview, sPreview, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重,停留在当前状态
 
-		FSM_RULE_ENTRY(s1, s4, USER_EVT_SCANIMAGE, 0)
-		FSM_RULE_ENTRY(s1, s4, USER_EVT_SCANIMAGE_EX, 0)
+		FSM_RULE_ENTRY(sPreview, sPicture, USER_EVT_SCANIMAGE, 0)
+		FSM_RULE_ENTRY(sPreview, sPicture, USER_EVT_SCANIMAGE_EX, 0)
 
-		//5 reserved in s4 state.
-		FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 1) //删除旧照片获取照片名称失败
-		FSM_RULE_ENTRY(s4, s3, USER_EVT_SCANIMAGEFINISHED, 2) //拍摄返回失败
-		FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 3) //EX 分配资源失败
-		FSM_RULE_ENTRY(s4, s3, USER_EVT_SCANIMAGEFINISHED, 4) //打开照片文件失败
+		//5 reserved in sPicture state.
+		FSM_RULE_ENTRY(sPicture, sPreview, USER_EVT_SCANIMAGEFINISHED, 1) //删除旧照片获取照片名称失败
+		FSM_RULE_ENTRY(sPicture, sFault, USER_EVT_SCANIMAGEFINISHED, 2) //拍摄返回失败
+		FSM_RULE_ENTRY(sPicture, sPreview, USER_EVT_SCANIMAGEFINISHED, 3) //EX 分配资源失败
+		FSM_RULE_ENTRY(sPicture, sFault, USER_EVT_SCANIMAGEFINISHED, 4) //打开照片文件失败
 
 		
-		FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 0) //成功拍摄
-		// Try s6 state. --Josephus at 11:13:02 2016/11/22
-		FSM_RULE_ENTRY(s4, s6, USER_EVT_SCANIMAGEFINISHED, 6) //成功拍摄且做了隐藏操作
+		FSM_RULE_ENTRY(sPicture, sPreview, USER_EVT_SCANIMAGEFINISHED, 0) //成功拍摄
+		// Try sHidePreview state. --Josephus at 11:13:02 2016/11/22
+		FSM_RULE_ENTRY(sPicture, sHidePreview, USER_EVT_SCANIMAGEFINISHED, 6) //成功拍摄且做了隐藏操作
 
-		FSM_RULE_ENTRY(s4, s1, USER_EVT_SCANIMAGEFINISHED, 5)
+		FSM_RULE_ENTRY(sPicture, sPreview, USER_EVT_SCANIMAGEFINISHED, 5)
 
-		FSM_RULE_ENTRY_ANY(s3, s5, USER_EVT_DISCONNECT)
-		FSM_RULE_ENTRY(s5, s0, EVT_TIMER, 1)
-		FSM_RULE_ENTRY(s5, s1, EVT_TIMER, 2)
+		FSM_RULE_ENTRY_ANY(sFault, sFault_Offline, USER_EVT_DISCONNECT)
+		FSM_RULE_ENTRY(sFault_Offline, sIdle, EVT_TIMER, 1)
+		FSM_RULE_ENTRY(sFault_Offline, sPreview, EVT_TIMER, 2)
+		FSM_RULE_ENTRY(sFault_Offline, sHidePreview, EVT_TIMER, 3)
 
-		FSM_RULE_ENTRY(s0, s5, USER_EVT_DISCONNECT, 0)
-		FSM_RULE_ENTRY(s1, s5, USER_EVT_DISCONNECT, 0)
-		FSM_RULE_ENTRY(s4, s5, USER_EVT_DISCONNECT, 0)
-		FSM_RULE_ENTRY(s6, s5, USER_EVT_DISCONNECT, 0)
+		FSM_RULE_ENTRY(sIdle, sFault_Offline, USER_EVT_DISCONNECT, 0)
+		FSM_RULE_ENTRY(sPreview, sFault_Offline, USER_EVT_DISCONNECT, 0)
+		FSM_RULE_ENTRY(sPicture, sFault_Offline, USER_EVT_DISCONNECT, 0)
+		FSM_RULE_ENTRY(sHidePreview, sFault_Offline, USER_EVT_DISCONNECT, 0)
 
-		FSM_RULE_ENTRY(s6, s1, USER_EVT_STARTPREVIEW_FINISHED, 0) //成功预览
-		FSM_RULE_ENTRY(s6, s3, USER_EVT_STARTPREVIEW_FINISHED, 1) //预览失败
-		FSM_RULE_ENTRY(s6, s6, USER_EVT_STARTPREVIEW_FINISHED, 2) // 错误还不足够严重
-		FSM_RULE_ENTRY(s6, s0, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
-		FSM_RULE_ENTRY(s6, s3, USER_EVT_STOPPREVIEW_FINISHED, 0) //关闭预览失败
-		FSM_RULE_ENTRY(s6, s6, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重
+		FSM_RULE_ENTRY(sHidePreview, sPreview, USER_EVT_STARTPREVIEW_FINISHED, 0) //成功预览
+		FSM_RULE_ENTRY(sHidePreview, sFault, USER_EVT_STARTPREVIEW_FINISHED, 1) //预览失败
+		FSM_RULE_ENTRY(sHidePreview, sHidePreview, USER_EVT_STARTPREVIEW_FINISHED, 2) // 错误还不足够严重,停留在当前状态
+		FSM_RULE_ENTRY(sHidePreview, sIdle, USER_EVT_STOPPREVIEW_FINISHED, 2) //关闭预览
+		FSM_RULE_ENTRY(sHidePreview, sFault, USER_EVT_STOPPREVIEW_FINISHED, 0) //关闭预览失败
+		FSM_RULE_ENTRY(sHidePreview, sHidePreview, USER_EVT_STOPPREVIEW_FINISHED, 3) //错误还不足够严重,停留在当前状态
 
 
-		FSM_RULE_ENTRY_ANY(s1, s7, USER_EVT_EXIT)
-		FSM_RULE_ENTRY_ANY(s2, s7, USER_EVT_EXIT)
-		FSM_RULE_ENTRY_ANY(s6, s7, USER_EVT_EXIT)
-		FSM_RULE_ENTRY(s7, s0, USER_EVT_EXIT_FINISHED, 0)
-		FSM_RULE_ENTRY(s7, s3, USER_EVT_EXIT_FINISHED, 1)
+		FSM_RULE_ENTRY_ANY(sPreview, sExit, USER_EVT_EXIT)
+		FSM_RULE_ENTRY_ANY(sProperty, sExit, USER_EVT_EXIT)
+		FSM_RULE_ENTRY_ANY(sHidePreview, sExit, USER_EVT_EXIT)
+		FSM_RULE_ENTRY(sExit, sIdle, USER_EVT_EXIT_FINISHED, 0)
+		FSM_RULE_ENTRY(sExit, sPreview, USER_EVT_EXIT_FINISHED, 2)
+		FSM_RULE_ENTRY(sExit, sHidePreview, USER_EVT_EXIT_FINISHED, 3)
+		FSM_RULE_ENTRY(sExit, sFault_Offline, USER_EVT_EXIT_FINISHED, 4)
+
+		FSM_RULE_ENTRY(sExit, sFault, USER_EVT_EXIT_FINISHED, 1)
+
+		FSM_RULE_ENTRY_ANY(sIdle, sInit, USER_EVT_INIT)
+		FSM_RULE_ENTRY_ANY(sIdle, sFault, USER_EVT_GOTOHELL)
+
+		/** JS Compoent  [Gifur@20241114]*/
+		FSM_RULE_ENTRY(sIdle, sPreview, USER_EVT_STARTPREVIEW_JS_DONE, 0)
+		FSM_RULE_ENTRY(sIdle, sFault, USER_EVT_STARTPREVIEW_JS_DONE, 1) //预览失败
+		FSM_RULE_ENTRY(sIdle, sIdle, USER_EVT_STARTPREVIEW_JS_DONE, 2) // 错误还不足够严重,停留在当前状态
+
+		FSM_RULE_ENTRY(sHidePreview, sPreview, USER_EVT_STARTPREVIEW_JS, 1)
+
+		FSM_RULE_ENTRY(sPreview, sIdle, USER_EVT_CANCELPREVIEW_JS_DONE, 1) //取消预览成功
+		FSM_RULE_ENTRY(sPreview, sHidePreview, USER_EVT_CANCELPREVIEW_JS_DONE, 2) //隐藏成功
+		FSM_RULE_ENTRY(sPreview, sFault, USER_EVT_CANCELPREVIEW_JS_DONE, 4)
+
+		FSM_RULE_ENTRY(sHidePreview, sIdle, USER_EVT_CANCELPREVIEW_JS_DONE, 0)
+
+		FSM_RULE_ENTRY(sPreview, sHidePreview, USER_EVT_SCANIMAGE_JS_DONE, 2)
+		FSM_RULE_ENTRY(sPreview, sFault, USER_EVT_SCANIMAGE_JS_DONE, 4)
+
+		FSM_RULE_ENTRY_ANY(sPreview, sExit, EVT_MAINPAGE_DISPLAY)
+		FSM_RULE_ENTRY_ANY(sHidePreview, sExit, EVT_MAINPAGE_DISPLAY)
+		/** JS Compoent Done [Gifur@20241114]*/
+
+		FSM_RULE_ENTRY_ANY(sInit, sIdle, USER_EVT_INIT_FINISHED)
+		FSM_RULE_ENTRY_ANY(sInit, sFault, USER_EVT_GOTOHELL)
 
-		FSM_RULE_ENTRY_ANY(s0, s8, USER_EVT_NOCFG)
-		FSM_RULE_ENTRY_ANY(s0, s3, USER_EVT_GOTOHELL)
-		
 	END_FSM_RULE()
 
-	virtual void s0_on_entry();
-	virtual void s0_on_exit();
-	virtual unsigned int s0_on_event(FSMEvent* e);
+	virtual void s0_Idle_on_entry();
+	virtual void s0_Idle_on_exit();
+	virtual unsigned int s0_Idle_on_event(FSMEvent* e);
 
-	virtual void s1_on_entry();
-	virtual void s1_on_exit();
-	virtual unsigned int s1_on_event(FSMEvent* e);
+	virtual void s1_Preview_on_entry();
+	virtual void s1_Preview_on_exit();
+	virtual unsigned int s1_Preview_on_event(FSMEvent* e);
 
 	virtual void s2_on_entry();
 	virtual void s2_on_exit();
 	virtual unsigned int s2_on_event(FSMEvent* e);
 
-	virtual void s3_on_entry();
-	virtual void s3_on_exit();
-	virtual unsigned int s3_on_event(FSMEvent* e);
+	virtual void s3_Failed_on_entry();
+	virtual void s3_Failed_on_exit();
+	virtual unsigned int s3_Failed_on_event(FSMEvent* e);
 
-	virtual void s4_on_entry();
-	virtual void s4_on_exit();
-	virtual unsigned int s4_on_event(FSMEvent* e);
+	virtual void s4_ScanImage_on_entry();
+	virtual void s4_ScanImage_on_exit();
+	virtual unsigned int s4_ScanImage_on_event(FSMEvent* e);
 
-	virtual void s5_on_entry();
-	virtual void s5_on_exit();
-	virtual unsigned int s5_on_event(FSMEvent* e);
+	virtual void s5_DeviceOff_on_entry();
+	virtual void s5_DeviceOff_on_exit();
+	virtual unsigned int s5_DeviceOff_on_event(FSMEvent* e);
 
-	virtual void s6_on_entry();
-	virtual void s6_on_exit();
-	virtual unsigned int s6_on_event(FSMEvent* e);
+	virtual void s6_HidePreview_on_entry();
+	virtual void s6_HidePreview_on_exit();
+	virtual unsigned int s6_HidePreview_on_event(FSMEvent* e);
 
-	virtual void s7_on_entry();
-	virtual void s7_on_exit();
-	virtual unsigned int s7_on_event(FSMEvent* e);
+	virtual void s7_Exit_on_entry();
+	virtual void s7_Exit_on_exit();
+	virtual unsigned int s7_Exit_on_event(FSMEvent* e);
 
-	virtual void s8_on_entry() {
-		SetDevState(DEVICE_STATUS_NOCFG);
-		SetLastUserCode(HSPScanner_UserErrorCode_DLLNAME_NOCFG);
-	}
-	virtual void s8_on_exit() {
-		SetDevState(DEVICE_STATUS_NORMAL);
-	}
-	virtual unsigned int s8_on_event(FSMEvent* e);
+	virtual void s8_Init_on_entry();
+	virtual void s8_Init_on_exit();
+	virtual unsigned int s8_Init_on_event(FSMEvent* e);
 
 	virtual void OnStateTrans(int iSrcState, int iDstState);
 
+	/** JS Component  [Gifur@20241112]*/
+	//0,succ;1 failed;
+	int StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req,
+		HSPScannerService_StartPreviewJS_Ans>::Pointer ctx);
+	//0,succ;1 failed;
+	int CancelPreview(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req,
+		HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx);
+	//0,succ;1 failed;
+	int ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req,
+		HSPScannerService_ScanImageJS_Ans>::Pointer ctx);
+	//0,succ;1 failed;
+	int SetParam(SpReqAnsContext<HSPScannerService_SetParamJS_Req,
+		HSPScannerService_SetParamJS_Ans>::Pointer ctx);
+	/** JS Component Done  [Gifur@20241112]*/
+
+	//0,succ;1 failed
 	int StartPreview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
 		HSPScannerService_StartPreview_Ans>::Pointer ctx);
-
+	//1隐藏成功;4:隐藏失败;2:取消预览成功;0:取消预览失败
 	int StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
 		HSPScannerService_CancelPreview_Ans>::Pointer ctx);
 	
-	bool ResizeImage(const CSimpleStringA& fileName);
+	bool ResizeImage(const CSimpleStringA& fileName, int kbSize);
 	
 	int ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
 		HSPScannerService_ScanImage_Ans>::Pointer ctx);
@@ -402,41 +318,40 @@ public:
 	{
 		return dwLastUserCode;
 	}
-	LPCTSTR MapCode2RTAString(DWORD dwValue = 0);
 
 	int SetPreviewParam(int colorType, int rotateType, int scanType, bool abortIfFault = false);
 
-private:
-	int m_version, m_batch;
+	ErrorCodeEnum TryToOpenDevice();
+	LPCTSTR MapCode2RTAString(DWORD dwValue);
+
 
+	int Initial();
+protected:
+	
+	ErrorCodeEnum SetPreviewProperty(const JS::PreviewSettings& val, const char* logCode = "");
+
+	void ToSwithLight(bool turnOn = true);
+private:
 	ErrorCodeEnum m_ecSelfTest;
-	DWORD m_dwErroCode;
-	BOOL m_bOperating;
-	int m_nTickTimes;
 	int m_nFatalTimes;
 	int m_nSrcState;
-
 	int m_nRecX, m_nRecY, m_nRecW;
 
 	EvtType m_desiredAction;
-	CSimpleStringA m_csMachineType;
-	DevCategoryInfo m_devCat;
-	CSimpleStringA m_csDevNo;
-
 	DWORD dwLastUserCode;
 	DWORD m_dwMaxImageSize;
-
-public:
-
-	DWORD GetCustLastErrorCode() { return m_dwErroCode; }
-	void SetCustLastErrorCode(DWORD dwVal = 0) { m_dwErroCode = dwVal; }
-	ErrorCodeEnum TryToOpenDevice();
+	bool m_lightOn;
 
 private:
+
 	BOOL GetCurImageName(CSimpleStringA& csImagName, bool bExt = false);
 	BOOL DelAndGetNewFileName(CSimpleStringA& csfileName, bool bInBusiness = false);
 	ErrorCodeEnum DeleteFileIfExisted(LPCTSTR fileName);
+
+	ErrorCodeEnum GetDevStatusFromAdapter(HspsDevStatus& status, bool fromBusiness = false);
+
 	//  --Josephus at 16:33:57 20161214
+	// to replace when JS
 	// 0: disconnected;
 	// 1: connected;
 	// -1: invalid;
@@ -444,17 +359,289 @@ private:
 	{
 		if(!m_hDevHelper || !m_bOpened) return -1;
 		HspsDevStatus status = {0};
-		if(m_hDevHelper->GetDevStatus(status) == Error_Succeed)
-		{
-			if(status.isConnected == 0)
-				return 0;
-			else
-				return 1;
-		}
+		if(GetDevStatusFromAdapter(status) == Error_Succeed)
+			return (status.isConnected == 0) ? 0 : 1;
 		return -1;
 	}
 	
 	void InitialMaxResizeValue();
+
+	void ClearPictureFileSure()
+	{
+		CSimpleStringA strNoUsed(true);
+		GetCurImageName(strNoUsed);
+		DelAndGetNewFileName(strNoUsed);
+		GetCurImageName(strNoUsed, true);
+		DelAndGetNewFileName(strNoUsed);
+	}
+};
+
+class StartPreviewEvent : public FSMEvent
+{
+public:
+	StartPreviewEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_STARTPREVIEW) {}
+	~StartPreviewEvent() {}
+	SpReqAnsContext<HSPScannerService_StartPreview_Req, HSPScannerService_StartPreview_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class StopPreviewEvent : public FSMEvent
+{
+public:
+	StopPreviewEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_STOPPREVIEW) {}
+	~StopPreviewEvent() {}
+	SpReqAnsContext<HSPScannerService_CancelPreview_Req,
+		HSPScannerService_CancelPreview_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class ScanImageEvent : public FSMEvent
+{
+public:
+	ScanImageEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SCANIMAGE) {}
+	~ScanImageEvent() {}
+	SpReqAnsContext<HSPScannerService_ScanImage_Req,
+		HSPScannerService_ScanImage_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class ScanImageExEvent : public FSMEvent
+{
+public:
+	ScanImageExEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SCANIMAGE_EX) {}
+	~ScanImageExEvent() {}
+	SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
+		HSPScannerService_ScanImageEx_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class ShowPropertyEvent : public FSMEvent
+{
+public:
+	ShowPropertyEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SHOWPROPERTY) {}
+	~ShowPropertyEvent() {}
+	SpReqAnsContext<HSPScannerService_ShowProperty_Req,
+		HSPScannerService_ShowProperty_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class SetPropertyEvent : public FSMEvent
+{
+public:
+	SetPropertyEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SETPROPERTY) {}
+	~SetPropertyEvent() {}
+	SpReqAnsContext<HSPScannerService_SetProperty_Req,
+		HSPScannerService_SetProperty_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class SetWinPosEvent : public FSMEvent
+{
+public:
+	SetWinPosEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SETWINPOS) {}
+	~SetWinPosEvent() {}
+	SpReqAnsContext<HSPScannerService_SetWinPos_Req,
+		HSPScannerService_SetWinPos_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+class GetDevStatusEvent : public FSMEvent
+{
+public:
+	GetDevStatusEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_GETSTATUS) {}
+	~GetDevStatusEvent() {}
+	SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
+		HSPScannerService_GetDevStatus_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+
+/** No use now  [Gifur@2025318]*/
+class GetDevInfoEvent : public FSMEvent
+{
+public:
+	GetDevInfoEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_GETINFO) {}
+	~GetDevInfoEvent() {}
+	SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
+		HSPScannerService_GetDevInfo_Ans>::Pointer m_ctx;
+	CHSPScannerFSM* m_fsm;
+	virtual void OnUnhandled()
+	{
+		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");
+			m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+		}
+	}
+};
+
+/** JS Component  [Gifur@20241112]*/
+namespace JS {
+
+	class StartPreviewEvent : public FSMEvent
+	{
+	public:
+		StartPreviewEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_STARTPREVIEW_JS) {}
+		~StartPreviewEvent() {}
+		SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer m_ctx;
+		CHSPScannerFSM* m_fsm;
+		virtual void OnUnhandled()
+		{
+			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");
+				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+			}
+		}
+	};
+
+	class CancelPreviewEvent : public FSMEvent
+	{
+	public:
+		CancelPreviewEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_CANCELPREVIEW_JS) {}
+		~CancelPreviewEvent() {}
+		SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer m_ctx;
+		CHSPScannerFSM* m_fsm;
+		virtual void OnUnhandled()
+		{
+			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");
+				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+			}
+		}
+	};
+
+	class ScanImageEvent : public FSMEvent
+	{
+	public:
+		ScanImageEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SCANIMAGE_JS) {}
+		~ScanImageEvent() {}
+		SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer m_ctx;
+		CHSPScannerFSM* m_fsm;
+		virtual void OnUnhandled()
+		{
+			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");
+				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+			}
+		}
+	};
+
+	class SetParamEvent : public FSMEvent
+	{
+	public:
+		SetParamEvent(CHSPScannerFSM* val): m_fsm(val), FSMEvent(USER_EVT_SETPARAM_JS) {}
+		~SetParamEvent() {}
+		SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer m_ctx;
+		CHSPScannerFSM* m_fsm;
+		virtual void OnUnhandled()
+		{
+			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");
+				m_ctx->Answer(Error_InvalidState, LOG_WARN_HSPS_INVALID_OPERATION);
+			}
+		}
+	};
+}
+/** JS Component Done  [Gifur@20241112]*/
+
+struct InitTask : public ITaskSp
+{
+	CHSPScannerFSM* fsm;
+	InitTask(CHSPScannerFSM* f) : fsm(f) {}
+
+	void Process()
+	{
+		const int ret = fsm->Initial();
+		if (ret == 0) {
+			FSMEvent* e = new FSMEvent(USER_EVT_INIT_FINISHED);
+			fsm->PostEventFIFO(e);
+		}
+		else {
+			FSMEvent* e = new FSMEvent(USER_EVT_GOTOHELL);
+			fsm->PostEventFIFO(e);
+		}
+	}
 };
 
 struct StartPreviewTask : public ITaskSp
@@ -517,7 +704,6 @@ struct SetPropertyInPreviewTask : public ITaskSp
 	}
 };
 
-
 struct StopPreviewTask : public ITaskSp
 {
 	CHSPScannerFSM* m_fsm;
@@ -686,18 +872,112 @@ struct GetDevInfoTask : public ITaskSp
 	}
 };
 
-struct OpenDeviceTask : public ITaskSp
+struct ExitClearTask : public ITaskSp
 {
 	CHSPScannerFSM* m_fsm;
-	OpenDeviceTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
+	ExitClearTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
 	void Process()
 	{
-		if (!m_fsm->m_bOpened) {
-				if (Error_Succeed == m_fsm->TryToOpenDevice()) {
-					m_fsm->PostEventFIFO(new FSMEvent(USER_EVT_OPENSUCC));
-				}
+		FSMEvent* pEvt = new FSMEvent(USER_EVT_EXIT_FINISHED);
+		if (ISSUCCEEDED(m_fsm->OnDevExit())) {
+			pEvt->param1 = 0;
 		}
+		else {
+			pEvt->param1 = 1;
+		}
+		m_fsm->PostEventFIFO(pEvt);
+		return;
 	}
 };
 
+/** JS Compoent  [Gifur@20241112]*/
+namespace JS {
+
+	struct StartPreviewTask : public ITaskSp
+	{
+		CHSPScannerFSM* m_fsm;
+		SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer m_ctx;
+		StartPreviewTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
+		void Process()
+		{
+			FSMEvent* pEvt = new FSMEvent(USER_EVT_STARTPREVIEW_JS_DONE);
+			pEvt->param1 = m_fsm->StartPreviewJS(m_ctx);
+			m_fsm->PostEventFIFO(pEvt);
+			return;
+		}
+		void SetContext(
+			SpReqAnsContext<HSPScannerService_StartPreviewJS_Req,
+			HSPScannerService_StartPreviewJS_Ans>::Pointer ctx)
+		{
+			m_ctx = ctx;
+			return;
+		}
+	};
+
+	struct CancelPreviewTask : public ITaskSp
+	{
+		CHSPScannerFSM* m_fsm;
+		SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer m_ctx;
+		CancelPreviewTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
+		void Process()
+		{
+			FSMEvent* pEvt = new FSMEvent(USER_EVT_CANCELPREVIEW_JS_DONE);
+			pEvt->param1 = m_fsm->CancelPreview(m_ctx);
+			pEvt->param2 = m_ctx->Req.hide ? 1 : 0;
+			m_fsm->PostEventFIFO(pEvt);
+			return;
+		}
+		void SetContext(
+			SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req,
+			HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx)
+		{
+			m_ctx = ctx;
+			return;
+		}
+	};
+
+	struct ScanImageTask : public ITaskSp
+	{
+		CHSPScannerFSM* m_fsm;
+		SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer m_ctx;
+		ScanImageTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
+		void Process()
+		{
+			FSMEvent* pEvt = new FSMEvent(USER_EVT_SCANIMAGE_JS_DONE);
+			////0,succ;1 failed;
+			pEvt->param1 = m_fsm->ScanImageJS(m_ctx);
+			///1 说明隐藏,0说明关闭
+			pEvt->param2 = m_ctx->Req.hide ? 1 : 0;
+			m_fsm->PostEventFIFO(pEvt);
+			return;
+		}
+		void SetContext(
+			SpReqAnsContext<HSPScannerService_ScanImageJS_Req,
+			HSPScannerService_ScanImageJS_Ans>::Pointer ctx)
+		{
+			m_ctx = ctx;
+			return;
+		}
+	};
+
+	struct SetParamTask : public ITaskSp
+	{
+		CHSPScannerFSM* m_fsm;
+		SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer m_ctx;
+		SetParamTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
+		void Process()
+		{
+			m_fsm->SetParam(m_ctx);
+			return;
+		}
+		void SetContext(
+			SpReqAnsContext<HSPScannerService_SetParamJS_Req,
+			HSPScannerService_SetParamJS_Ans>::Pointer ctx)
+		{
+			m_ctx = ctx;
+			return;
+		}
+	};
+}
+
 #endif //_HSPSCANNER_FSM_H_

+ 196 - 0
Module/mod_HSPScanner/HSPScanner_client_g.h

@@ -513,6 +513,202 @@ public:
 		return ret;
 	}
 
+	ErrorCodeEnum StartPreviewJS(HSPScannerService_StartPreviewJS_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(HSPScannerService_Method_StartPreviewJS, HSPScannerService_MethodSignature_StartPreviewJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum StartPreviewJS(HSPScannerService_StartPreviewJS_Req &Req, HSPScannerService_StartPreviewJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartPreviewJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum StartPreviewJS(HSPScannerService_StartPreviewJS_Req &Req, HSPScannerService_StartPreviewJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartPreviewJS(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 StartPreviewJS(HSPScannerService_StartPreviewJS_Req &Req, HSPScannerService_StartPreviewJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartPreviewJS(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 CancelPreviewJS(HSPScannerService_CancelPreviewJS_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(HSPScannerService_Method_CancelPreviewJS, HSPScannerService_MethodSignature_CancelPreviewJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum CancelPreviewJS(HSPScannerService_CancelPreviewJS_Req &Req, HSPScannerService_CancelPreviewJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CancelPreviewJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum CancelPreviewJS(HSPScannerService_CancelPreviewJS_Req &Req, HSPScannerService_CancelPreviewJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CancelPreviewJS(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 CancelPreviewJS(HSPScannerService_CancelPreviewJS_Req &Req, HSPScannerService_CancelPreviewJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = CancelPreviewJS(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 ScanImageJS(HSPScannerService_ScanImageJS_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(HSPScannerService_Method_ScanImageJS, HSPScannerService_MethodSignature_ScanImageJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum ScanImageJS(HSPScannerService_ScanImageJS_Req &Req, HSPScannerService_ScanImageJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ScanImageJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum ScanImageJS(HSPScannerService_ScanImageJS_Req &Req, HSPScannerService_ScanImageJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ScanImageJS(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 ScanImageJS(HSPScannerService_ScanImageJS_Req &Req, HSPScannerService_ScanImageJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = ScanImageJS(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 SetParamJS(HSPScannerService_SetParamJS_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(HSPScannerService_Method_SetParamJS, HSPScannerService_MethodSignature_SetParamJS, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SetParamJS(HSPScannerService_SetParamJS_Req &Req, HSPScannerService_SetParamJS_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetParamJS(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetParamJS(HSPScannerService_SetParamJS_Req &Req, HSPScannerService_SetParamJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetParamJS(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 SetParamJS(HSPScannerService_SetParamJS_Req &Req, HSPScannerService_SetParamJS_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetParamJS(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;
+	}
+
 
 	bool SafeDelete()
 	{

+ 110 - 0
Module/mod_HSPScanner/HSPScanner_def_g.h

@@ -22,6 +22,10 @@ namespace HSPScanner {
 #define HSPScannerService_Method_GetDevStatus 7
 #define HSPScannerService_Method_GetDevInfo 65535
 #define HSPScannerService_Method_Exit 8
+#define HSPScannerService_Method_StartPreviewJS 9
+#define HSPScannerService_Method_CancelPreviewJS 10
+#define HSPScannerService_Method_ScanImageJS 11
+#define HSPScannerService_Method_SetParamJS 12
 
 #define HSPScannerService_MethodSignature_StartPreview 220854261
 #define HSPScannerService_MethodSignature_CancelPreview 961536349
@@ -33,6 +37,10 @@ namespace HSPScanner {
 #define HSPScannerService_MethodSignature_GetDevStatus -321104988
 #define HSPScannerService_MethodSignature_GetDevInfo 296205965
 #define HSPScannerService_MethodSignature_Exit -1158854104
+#define HSPScannerService_MethodSignature_StartPreviewJS -364206811
+#define HSPScannerService_MethodSignature_CancelPreviewJS -771733850
+#define HSPScannerService_MethodSignature_ScanImageJS -719300712
+#define HSPScannerService_MethodSignature_SetParamJS 1301088866
 
 #define HSPScannerService_LogCode_StartPreview "QLR040221700"
 #define HSPScannerService_LogCode_CancelPreview "QLR040221701"
@@ -44,6 +52,10 @@ namespace HSPScanner {
 #define HSPScannerService_LogCode_GetDevStatus "QLR040221707"
 #define HSPScannerService_LogCode_GetDevInfo "QLR040221799"
 #define HSPScannerService_LogCode_Exit "QLR040221708"
+#define HSPScannerService_LogCode_StartPreviewJS "QLR040221709"
+#define HSPScannerService_LogCode_CancelPreviewJS "QLR040221710"
+#define HSPScannerService_LogCode_ScanImageJS "QLR040221711"
+#define HSPScannerService_LogCode_SetParamJS "QLR040221712"
 
 struct HSPScannerService_StartPreview_Req
 {
@@ -276,6 +288,104 @@ struct HSPScannerService_Exit_Info
 
 };
 
+struct HSPScannerService_StartPreviewJS_Req
+{
+	short rotate;
+	short scan;
+	short color;
+	short pos;
+	short pos_x;
+	short pos_y;
+	short pos_w;
+	int reserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & rotate & scan & color & pos & pos_x & pos_y & pos_w & reserved1;
+	}
+
+};
+
+struct HSPScannerService_StartPreviewJS_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct HSPScannerService_CancelPreviewJS_Req
+{
+	bool hide;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & hide;
+	}
+
+};
+
+struct HSPScannerService_CancelPreviewJS_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct HSPScannerService_ScanImageJS_Req
+{
+	bool hide;
+	int compress;
+	int reserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & hide & compress & reserved1;
+	}
+
+};
+
+struct HSPScannerService_ScanImageJS_Ans
+{
+	CBlob imageData;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & imageData;
+	}
+
+};
+
+struct HSPScannerService_SetParamJS_Req
+{
+	short rotate;
+	short scan;
+	short color;
+	short pos;
+	short pos_x;
+	short pos_y;
+	short pos_w;
+	int reserved1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & rotate & scan & color & pos & pos_x & pos_y & pos_w & reserved1;
+	}
+
+};
+
+struct HSPScannerService_SetParamJS_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 
 ///////////////////////////
 

+ 108 - 0
Module/mod_HSPScanner/HSPScanner_server_g.h

@@ -100,6 +100,34 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case HSPScannerService_Method_StartPreviewJS:
+			if (dwSignature == HSPScannerService_MethodSignature_StartPreviewJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case HSPScannerService_Method_CancelPreviewJS:
+			if (dwSignature == HSPScannerService_MethodSignature_CancelPreviewJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case HSPScannerService_Method_ScanImageJS:
+			if (dwSignature == HSPScannerService_MethodSignature_ScanImageJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case HSPScannerService_Method_SetParamJS:
+			if (dwSignature == HSPScannerService_MethodSignature_SetParamJS) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -161,6 +189,26 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case HSPScannerService_Method_StartPreviewJS:
+			if (dwSignature != HSPScannerService_MethodSignature_StartPreviewJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case HSPScannerService_Method_CancelPreviewJS:
+			if (dwSignature != HSPScannerService_MethodSignature_CancelPreviewJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case HSPScannerService_Method_ScanImageJS:
+			if (dwSignature != HSPScannerService_MethodSignature_ScanImageJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case HSPScannerService_Method_SetParamJS:
+			if (dwSignature != HSPScannerService_MethodSignature_SetParamJS) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -218,6 +266,26 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_CancelPreviewJS(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SetParamJS(SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -334,6 +402,46 @@ public:
 						Handle_Exit(ctx);
 					}
 					break;
+				case HSPScannerService_Method_StartPreviewJS:
+					{
+						SpReqAnsContext<HSPScannerService_StartPreviewJS_Req,HSPScannerService_StartPreviewJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<HSPScannerService_StartPreviewJS_Req,HSPScannerService_StartPreviewJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_StartPreviewJS(ctx);
+					}
+					break;
+				case HSPScannerService_Method_CancelPreviewJS:
+					{
+						SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req,HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req,HSPScannerService_CancelPreviewJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_CancelPreviewJS(ctx);
+					}
+					break;
+				case HSPScannerService_Method_ScanImageJS:
+					{
+						SpReqAnsContext<HSPScannerService_ScanImageJS_Req,HSPScannerService_ScanImageJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<HSPScannerService_ScanImageJS_Req,HSPScannerService_ScanImageJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_ScanImageJS(ctx);
+					}
+					break;
+				case HSPScannerService_Method_SetParamJS:
+					{
+						SpReqAnsContext<HSPScannerService_SetParamJS_Req,HSPScannerService_SetParamJS_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<HSPScannerService_SetParamJS_Req,HSPScannerService_SetParamJS_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_SetParamJS(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 28 - 0
Module/mod_HSPScanner/mod_HSPScanner.cpp

@@ -73,6 +73,34 @@ void CHSPScannerServerSession::Handle_Exit(SpOnewayCallContext<HSPScannerService
 	m_pEntity->Exit(ctx);
 }
 
+void CHSPScannerServerSession::Handle_StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setAPI(__FUNCTION__)(__FUNCTION__);
+	m_pEntity->StartPreviewJS(ctx);
+}
+
+void CHSPScannerServerSession::Handle_CancelPreviewJS(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setAPI(__FUNCTION__)(__FUNCTION__);
+	m_pEntity->CancelPreviewJS(ctx);
+}
+
+void CHSPScannerServerSession::Handle_ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setAPI(__FUNCTION__)(__FUNCTION__);
+	m_pEntity->ScanImageJS(ctx);
+}
+
+void CHSPScannerServerSession::Handle_SetParamJS(SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetParamJS).setAPI(__FUNCTION__)(__FUNCTION__);
+	m_pEntity->SetParamJS(ctx);
+}
+
 void CHSPScannerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName)
 {
 	if ((_strnicmp(pszKey, "UIState", strlen("UIState")) == 0))

+ 41 - 11
Module/mod_HSPScanner/mod_HSPScanner.h

@@ -51,6 +51,11 @@ public:
 
 	virtual void Handle_Exit(SpOnewayCallContext<HSPScannerService_Exit_Info>::Pointer ctx);
 
+	virtual void Handle_StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer ctx);
+	virtual void Handle_CancelPreviewJS(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx);
+	virtual void Handle_ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer ctx);
+	virtual void Handle_SetParamJS(SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer ctx);
+
 private:
 	CHSPScannerEntity *m_pEntity;
 };
@@ -109,7 +114,7 @@ public:
 	void Preview(SpReqAnsContext<HSPScannerService_StartPreview_Req,
 		HSPScannerService_StartPreview_Ans>::Pointer ctx)
 	{
-		StartPreviewEvent* pEvent = new StartPreviewEvent();
+		StartPreviewEvent* pEvent = new StartPreviewEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -117,7 +122,7 @@ public:
 	void CancelPreview(SpReqAnsContext<HSPScannerService_CancelPreview_Req,
 		HSPScannerService_CancelPreview_Ans>::Pointer ctx)
 	{
-		StopPreviewEvent* pEvent = new StopPreviewEvent();
+		StopPreviewEvent* pEvent = new StopPreviewEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -125,7 +130,7 @@ public:
 	void ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
 		HSPScannerService_ScanImage_Ans>::Pointer ctx)
 	{
-		ScanImageEvent* pEvent = new ScanImageEvent();
+		ScanImageEvent* pEvent = new ScanImageEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -133,7 +138,7 @@ public:
 	void ScanImageEx(SpReqAnsContext<HSPScannerService_ScanImageEx_Req,
 		HSPScannerService_ScanImageEx_Ans>::Pointer ctx)
 	{
-		ScanImageExEvent* pEvent = new ScanImageExEvent();
+		ScanImageExEvent* pEvent = new ScanImageExEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -147,15 +152,12 @@ public:
 		HSPScannerService_GetDevInfo_Ans>::Pointer ctx)
 	{
 		m_fsm.GetDevInfo(ctx);
-		//GetDevInfoEvent* pEvent = new GetDevInfoEvent();
-		//pEvent->m_ctx = ctx;
-		//m_fsm.PostEventFIFO(pEvent);
 	}
 
 	void GetDevStatus(SpReqAnsContext<HSPScannerService_GetDevStatus_Req,
 		HSPScannerService_GetDevStatus_Ans>::Pointer ctx)
 	{
-		GetDevStatusEvent* pEvent = new GetDevStatusEvent();
+		GetDevStatusEvent* pEvent = new GetDevStatusEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -163,7 +165,7 @@ public:
 	void SetWinPos(SpReqAnsContext<HSPScannerService_SetWinPos_Req,
 		HSPScannerService_SetWinPos_Ans>::Pointer ctx)
 	{
-		SetWinPosEvent* pEvent = new SetWinPosEvent();
+		SetWinPosEvent* pEvent = new SetWinPosEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -171,7 +173,7 @@ public:
 	void ShowProperty(SpReqAnsContext<HSPScannerService_ShowProperty_Req,
 		HSPScannerService_ShowProperty_Ans>::Pointer ctx)
 	{
-		ShowPropertyEvent* pEvent = new ShowPropertyEvent();
+		ShowPropertyEvent* pEvent = new ShowPropertyEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}
@@ -179,7 +181,35 @@ public:
 	void SetProperty(SpReqAnsContext<HSPScannerService_SetProperty_Req,
 		HSPScannerService_SetProperty_Ans>::Pointer ctx)
 	{
-		SetPropertyEvent* pEvent = new SetPropertyEvent();
+		SetPropertyEvent* pEvent = new SetPropertyEvent(&m_fsm);
+		pEvent->m_ctx = ctx;
+		m_fsm.PostEventFIFO(pEvent);
+	}
+
+	void StartPreviewJS(SpReqAnsContext<HSPScannerService_StartPreviewJS_Req, HSPScannerService_StartPreviewJS_Ans>::Pointer ctx)
+	{
+		JS::StartPreviewEvent* pEvent = new JS::StartPreviewEvent(&m_fsm);
+		pEvent->m_ctx = ctx;
+		m_fsm.PostEventFIFO(pEvent);
+	}
+
+	void CancelPreviewJS(SpReqAnsContext<HSPScannerService_CancelPreviewJS_Req, HSPScannerService_CancelPreviewJS_Ans>::Pointer ctx)
+	{
+		JS::CancelPreviewEvent* pEvent = new JS::CancelPreviewEvent(&m_fsm);
+		pEvent->m_ctx = ctx;
+		m_fsm.PostEventFIFO(pEvent);
+	}
+
+	void ScanImageJS(SpReqAnsContext<HSPScannerService_ScanImageJS_Req, HSPScannerService_ScanImageJS_Ans>::Pointer ctx)
+	{
+		JS::ScanImageEvent* pEvent = new JS::ScanImageEvent(&m_fsm);
+		pEvent->m_ctx = ctx;
+		m_fsm.PostEventFIFO(pEvent);
+	}
+
+	void SetParamJS(SpReqAnsContext<HSPScannerService_SetParamJS_Req, HSPScannerService_SetParamJS_Ans>::Pointer ctx)
+	{
+		JS::SetParamEvent* pEvent = new JS::SetParamEvent(&m_fsm);
 		pEvent->m_ctx = ctx;
 		m_fsm.PostEventFIFO(pEvent);
 	}

+ 72 - 77
Module/mod_IDCertificate/IDCertFSM.cpp

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

+ 0 - 1
Module/mod_IDCertificate/IDCertFSM.h

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

+ 1 - 11
Module/mod_IDCertificate/IDCertificate.xml

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

+ 0 - 77
Module/mod_IDCertificate/IDCertificate_client_g.h

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

+ 0 - 45
Module/mod_IDCertificate/IDCertificate_def_g.h

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

+ 0 - 81
Module/mod_IDCertificate/IDCertificate_server_g.h

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

+ 16 - 11
Module/mod_UpgradeMgr/UpgradeTaskFSM.cpp

@@ -133,8 +133,8 @@ namespace Task
 			if(m_fsm->m_PrintHttpLog){
 				qTempReq.m_printDbg = true;
 			}
-
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402506SendSM3")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				LogWarn(Severity_Middle, Error_Exception, ERR_TASK_SEND_SM3_HASH_FAIL,CSimpleStringA::Format("SendSM3Task http req fail,url=%s, err=%s",qTempReq.m_url.c_str(),qTempRet.m_errMsg.c_str()).GetData());
 				return false;//失败
 			}
@@ -260,7 +260,8 @@ namespace Task
 			}
 			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UpdateTaskStatus req=%s",qTempReq.m_reqStr.c_str());
 
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402506UpdateTaskStatus")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				LogWarn(Severity_Middle, Error_Exception, ERR_TASK_UPDATE_TASK_STATUS_FAIL,CSimpleStringA::Format("UpdateTaskStatus http req fail, upgradeTaskId=%s, url=%s, err=%s",m_fsm->m_currentTask.upgradeTaskId.GetData(),qTempReq.m_url.c_str(),qTempRet.m_errMsg.c_str()).GetData());
 				return false;//失败
 			}
@@ -386,7 +387,8 @@ namespace Task
 				qTempReq.m_printDbg = true;
 			}
 
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402506QueryCurrTask")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_CURR_TASK_FAIL,CSimpleStringA::Format("QueryCurrTask http req fail,url=%s, err=%s",qTempReq.m_url.c_str(),qTempRet.m_errMsg.c_str()).GetData());
 				return false;//失败
 			}
@@ -749,8 +751,8 @@ namespace Task
 			if(m_fsm->m_PrintHttpLog){
 				qTempReq.m_printDbg = true;
 			}
-
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402506QueryNewPreTask")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				if (qTempRet.m_sysCode == 6) {
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(UpgradeMgr_PerTask_HTTP_ERR).setResultCode("RTA5651")("终端查询任务域名解析失败");
 				}else if(qTempRet.m_sysCode == 28){
@@ -887,8 +889,8 @@ namespace Task
 			if(m_fsm->m_PrintHttpLog){
 				qTempReq.m_printDbg = true;
 			}
-
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402506QueryNewContinueTask")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_CONTINUE_NEW_TASK_FAIL,CSimpleStringA::Format("QueryNewContinueTask http req fail,url=%s, err=%s",qTempReq.m_url.c_str(),qTempRet.m_errMsg.c_str()).GetData());
 				return 0;//查询失败,继续查询
 			}
@@ -1230,8 +1232,8 @@ namespace Task
 			if(m_fsm->m_PrintHttpLog){
 				qTempReq.m_printDbg = true;
 			}
-
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402506QueryTaskStatus")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				LogWarn(Severity_Middle, Error_Exception, ERR_TASK_QUERY_TASK_STATUS_FAIL,CSimpleStringA::Format("QueryTaskStatus http req fail,upgradeTaskId=%s, url=%s, err=%s",m_fsm->m_currentTask.upgradeTaskId.GetData(), qTempReq.m_url.c_str(), qTempRet.m_errMsg.c_str()).GetData());
 				return false;//失败
 			}
@@ -1503,7 +1505,10 @@ namespace Task
 			content.maxLen = m_fsm->m_newEachDownloadLen;
 			int retlen = 0;
 			content.curLen = &retlen;
-			if(!client->DownloadFileBlock(downloadUrl.GetData(),jsonReq.c_str(), content,httpCode,responseHeaders,time_out)){
+			PROCESS_LINK_CONTEXT("LR0402506DownloadFile")
+
+
+			if(!client->DownloadFileBlock(downloadUrl.GetData(),jsonReq.c_str(), content,httpCode,responseHeaders,time_out, &nextLink)){
 				if (retlen > m_fsm->m_newEachDownloadLen) {
 					CSimpleStringA errMsg = CSimpleStringA::Format("retlen is over limit_length ,retlen= %d", retlen).GetData();
 					LogWarn(Severity_Middle, Error_Exception, ERR_TASK_DOWNLOAD_PACK_FAIL, CSimpleStringA::Format("DownloadPackTask http req fail, %s, url=%s", errMsg.GetData(), downloadUrl.GetData()).GetData());

+ 6 - 3
Module/mod_accessauth/AccessAuthFSM.cpp

@@ -143,6 +143,7 @@ struct TimeSynTask : ITaskSp
 		config.SetChildUri("/api/v3/sessionkey");
 		SP::Module::Restful::FulfillRequestJsonBody(&config, timeSyncReq);
 		RestfulClient client = RestfulClient::getInstance();
+		PROCESS_LINK_CONTEXT("LR0402502SessionKey");
 
 		if (m_fsm->containsChinese(m_fsm->GetmAccessAuthHost().GetData()))
 		{
@@ -161,7 +162,7 @@ struct TimeSynTask : ITaskSp
 		test = config.GetRequestUri();
 
 		config.PreDo();
-		client.Do(&config, &result);
+		client.Do(&config, &result, &nextLink);
 
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
@@ -306,9 +307,10 @@ struct UpdateWKTask : ITaskSp
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("请求地址:%s.", test.c_str());
 
 		RestfulClient client = RestfulClient::getInstance();
+		PROCESS_LINK_CONTEXT("LR0402502wkUpdate");
 		config.PreDo();
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to Post with new restful....");
-		client.Do(&config, &result);
+		client.Do(&config, &result, &nextLink);
 		if (result.ResponseOK()) {
 			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UpdateWKTask Connect With Restful Success.");
 			SP::Module::Restful::CommResponseJson responseStatus;
@@ -398,9 +400,10 @@ struct GetTokenTask : ITaskSp
 
 		SP::Module::Restful::FulfillRequestJsonBody(&config, getTokenReq);
 		RestfulClient client = RestfulClient::getInstance();
+		PROCESS_LINK_CONTEXT("LR0402502Access");
 		config.PreDo();
 
-		client.Do(&config, &result);
+		client.Do(&config, &result, &nextLink);
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
 			SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);

+ 2 - 1
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -74,9 +74,10 @@ struct InitializerInitMKTask : ITaskSp
 		config.SetChildUri("/api/v6/initmk");
 		SP::Module::Restful::FulfillRequestJsonBody(&config, instanceReq);
 		RestfulClient client = RestfulClient::getInstance();
+		PROCESS_LINK_CONTEXT("LR0402502Initmk");
 		config.PreDo();
 
-		client.Do(&config, &result);
+		client.Do(&config, &result, &nextLink);
 		if (result.ResponseOK()) {
 			SP::Module::Restful::CommResponseJson responseStatus;
 			SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);

+ 4 - 3
Module/mod_alarm/AlarmFSM.cpp

@@ -97,8 +97,8 @@ namespace Task
 			}
 			qTempReq.m_url=m_fsm->m_sendUrl.GetData();//访问地址
 			//DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("alarm send =%s",qTempReq.m_reqStr.c_str());
-
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402107SendAlarmTask")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask http req fail,url=%s",qTempReq.m_url.c_str());
 				return false;//失败
 			}
@@ -155,8 +155,9 @@ namespace Task
 			}
 			config.SetJsonBody(reqStr);
 			RestfulClient client = RestfulClient::getInstance();
+			PROCESS_LINK_CONTEXT("LR0402107SendAlarmTask");
 			config.PreDo();
-			client.Do(&config, &result);
+			client.Do(&config, &result, &nextLink);
 			//判断结果
 			if(result.ResponseOK()){
 				//解析返回字符串

+ 2 - 2
Module/mod_assistantchannel/mod_assistantchannel.cpp

@@ -374,7 +374,7 @@ void CBizChannelEntity::on_connect(int error, const char *remote_ip, int remote_
 					}
 				}
 					
-				ParseVideoViewParam((LPCSTR)strValue, local_view_x, local_view_y, local_view_cx, local_view_cy, 
+				ParseVideoViewParam(strValue.GetData(), local_view_x, local_view_y, local_view_cx, local_view_cy, 
 					remote_view_x, remote_view_y, remote_view_cx, remote_view_cy);
 				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get Video Window Initialize Param:%d,%d,%d,%d %d,%d,%d,%d",local_view_x, local_view_y, local_view_cx, local_view_cy, 
 					//remote_view_x, remote_view_y, remote_view_cx, remote_view_cy);
@@ -384,7 +384,7 @@ void CBizChannelEntity::on_connect(int error, const char *remote_ip, int remote_
 					REC_COMMON_VIDEO_FPS, local_view_x, local_view_y, local_view_cx, local_view_cy, 
 					remote_view_x, remote_view_y, remote_view_cx, remote_view_cy);
 				
-				ChangeState(eChannelState_Connected, (LPCSTR)param);
+				ChangeState(eChannelState_Connected, param.GetData());
 			} 
 			else {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get VideoWindowInitializeParam failed!");

+ 14 - 89
Module/mod_cardissuerstore/CardIssuerFSM.cpp

@@ -499,7 +499,7 @@ unsigned int CCardIssuerFSM::s4_on_event(FSMEvent* pEvt)
 				pEvt->SetHandled();
 				return 0;
 			}
-		case USER_EVT_EXIT_MIAN_PAGE:
+		case EVT_MAINPAGE_DISPLAY:
 			{
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("S4 receive exit to main page");
 				m_captureReason = "4001";
@@ -902,7 +902,7 @@ unsigned int CCardIssuerFSM::s7_on_event(FSMEvent* pEvt)
 			FetchCard evt;
 			evt.status = 1;
 			SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(FetchCard), SP_MSG_SIG_OF(FetchCard), evt);
-			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER)("取卡时设备故障");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("取卡时设备故障");
 			return 1;
 		}
 		else {
@@ -1449,96 +1449,24 @@ ErrorCodeEnum CCardIssuerFSM::OnInit()
 		}
 	}
 
-	//因替换实体名,需要兼容把以前旧的运行时文件拷贝成新的实体名运行文件,卡机分离后,拷贝旧版运行时文件,后期稳定后直接去除
-	//////////////////////////////////////////////////////////////////////////
 	CSimpleStringA runinfoPath(true);
-	CSmartPointer<IConfigInfo> spConfig;
 	ErrorCodeEnum  err = GetEntityBase()->GetFunction()->GetPath("RunInfo", runinfoPath);
 	if (err != Error_Succeed) {
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get system RunInfo value failed.");
-		return Error_Exception;
-	}
-	err = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
-	if (err != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get cfg file failed ");
-		return err;
 	}
-
 	CSimpleStringA runinfoOldFile = runinfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "CardIssuer.ini";
 	CSimpleStringA runinfoNewFile = runinfoPath + SPLIT_SLASH_STR + "runcfg" + SPLIT_SLASH_STR + "CardIssuerStore.ini";
-
-	int enterMainPageInt = 0;
-
 	if (ExistsFile(runinfoNewFile.GetData())) {
-		if (ExistsFile(runinfoOldFile)) {
-			//新在,旧也在,新进入首页则不拷贝,否则重新拷贝
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is Exist. CardIssuer.ini is Exist");
-			spConfig->ReadConfigValueInt("all", "enterMainPage", enterMainPageInt);
-			if (enterMainPageInt == 2) {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is Exist. enterMainPage=%d, no recopy", enterMainPageInt);
-			}
-			else if (enterMainPageInt == 1) {
-				//先删再拷贝
-				if (RemoveFileA(runinfoNewFile.GetData())) {
-					if (CopyFileA(runinfoOldFile.GetData(), runinfoNewFile.GetData(), FALSE)) {
-						LogWarn(Severity_Low, Error_Unexpect, CardIssuerStore_UserErrorCode_CopyRuncfg, "Recopy old CardIssuer.ini succ");
-						spConfig->WriteConfigValueInt("all", "enterMainPage", 1);//写入初值
-					}
-					else {
-#ifdef RVC_OS_WIN
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recopy old CardIssuer.ini failed.err=%d", (int)GetLastError());
-#else
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Recopy old CardIssuer.ini failed.err=%d", errno);
-#endif
-						return Error_Exception;
-					}
-				}
-				else {
-#ifdef RVC_OS_WIN
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("remove CardIssuerStore.ini failed.err=%d", (int)GetLastError());
-#else
-					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("remove CardIssuerStore.ini failed.err=%d", errno);
-#endif
-					return Error_Exception;
-				}
-			}
-			else {
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is Exist. but enterMainPage=%d is invalid, continued use CardIssuerStore.ini", enterMainPageInt);
-			}
-
-		}
-		else {
-			//新在,旧不在,不处理
-			spConfig->ReadConfigValueInt("all", "enterMainPage", enterMainPageInt);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is Exist. CardIssuer.ini not Exist .enterMainPage=%d", enterMainPageInt);
-		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is Exist.");
 	}
 	else {
-		if (ExistsFile(runinfoOldFile)) {
-			//新不在,旧在,拷贝,附初值
+		if (ExistsFile(runinfoOldFile.GetData())) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is not Exist. CardIssuer.ini is Exist");
-			if (CopyFileA(runinfoOldFile.GetData(), runinfoNewFile.GetData(), FALSE)) {
-				LogWarn(Severity_Low, Error_Unexpect, CardIssuerStore_UserErrorCode_CopyRuncfg, "copy old CardIssuer.ini succ.");
-				spConfig->WriteConfigValueInt("all", "enterMainPage", 1);//写入初值
-			}
-			else {
-#ifdef RVC_OS_WIN
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("copy old CardIssuer.ini failed.err=%d", (int)GetLastError());
-#else
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("copy old CardIssuer.ini failed.err=%d", errno);
-#endif
-				return Error_Exception;
-			}
-
 		}
 		else {
-			//新旧都不在,附初值
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CardIssuerStore.ini is not Exist. CardIssuer.ini is not Exist");
-			spConfig->WriteConfigValueInt("all", "enterMainPage", 1);//写入初值
 		}
 	}
-	
-	//////////////////////////////////////////////////////////////////////////
 
 #endif //RVC_OS_WIN
 	m_devStatus.eMedia = CI_MEDIA_NOTPRESENT;
@@ -2531,14 +2459,15 @@ int CCardIssuerFSM::WaitFetchingCard()
 	DWORD dwStart, dwEnd;
 	dwStart = GetTickCountRVC();
 	LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_STORE_GREEN_ON,"CardReader(fetch) warning on");
+	long l_beginTime, l_endTime;
 	do {
+		l_beginTime = GetTickCountRVC();
 		if (GetDevStatus(false)){
 			dwEnd = GetTickCountRVC();
 			if (m_devStatus.eMedia == CI_MEDIA_ENTERING){
 				Sleep(WAIT_INTERVAL);
 			}
 			else{
-				long l_beginTime, l_endTime;
 				l_beginTime = GetTickCountRVC();
 				ErrorCodeEnum eErr = m_hDevHelper->SetCardInType(CI_CARD_IN_TYPE_FORBIDDEN);
 				l_endTime = GetTickCountRVC();
@@ -2556,7 +2485,9 @@ int CCardIssuerFSM::WaitFetchingCard()
 			}
 		}else
 		{
+			l_endTime = GetTickCountRVC();
 			LogEvent(Severity_Middle, LOG_EVT_CARDISSUER_STORE_GREEN_OFF,"CardReader(fetch) warning off");
+			SetErrorAndLog(Error_Unexpect, MEC_DEVAPI_CARDISSUER_GetDevStatus, "DevAdapter::GetDevStatus", __FUNCTION__, IsInBusiness(), l_endTime - l_beginTime, "QLR040222005", "取卡时设备故障");
 			return 1;
 		}
 	}while ((dwEnd-dwStart) < 60*1000);
@@ -5124,7 +5055,8 @@ bool CCardIssuerFSM::RegistCardWhileCaptureCard(CSimpleStringA cardno)
 
 
 	long beg = GetTickCountRVC();
-	bool ret = client->Post(qRegistCardReq, qRegistCardRet);
+	PROCESS_LINK_CONTEXT("LR0402203RegisterCard")
+	bool ret = client->Post(qRegistCardReq, qRegistCardRet, &nextLink);
 	long end = GetTickCountRVC();
 	if (ret)
 	{
@@ -5202,8 +5134,8 @@ bool CCardIssuerFSM::SyncMaterialCount(IHttpFunc* client,SyncMaterialCountInfo s
 		pReq2.CardPercent = syncInfo.arrCardPercent[i];
 		qTempReq.reqData.push_back(pReq2);
 	}
-
-	if (!client->Post(qTempReq, qTempRet)) {
+	PROCESS_LINK_CONTEXT("LR0402203SyncMaterialCount")
+	if (!client->Post(qTempReq, qTempRet, &nextLink)) {
 		LogWarn(Severity_Middle, Error_Exception, CardIssuerStore_UserErrorCode_SyncMaterialCount_Failed, CSimpleStringA::Format("<SyncMaterialCount>, http req fail,url=%s, err=%s", qTempReq.m_url.c_str(), qTempRet.m_errMsg.c_str()).GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402220A1").setResultCode("RTA2W30")("同步物料计数通讯失败");
 		return false;//通讯失败
@@ -7097,7 +7029,8 @@ int CCardIssuerFSM::JudgeCardType(CSimpleStringA cardno, bool& bMismatch)
 	qCardTypeReq.BODY.x1.xEacNbr = cardno.GetData();
 	qCardTypeReq.BODY.x1.xIacNbr = "";
 	long beg = GetTickCountRVC();
-	bool ret = client->Post(qCardTypeReq, qCardTypeRet);
+	PROCESS_LINK_CONTEXT("LR0402203CardType")
+	bool ret = client->Post(qCardTypeReq, qCardTypeRet, &nextLink);
 	long end = GetTickCountRVC();
 	if (ret)
 	{
@@ -8801,14 +8734,6 @@ int CCardIssuerFSM::ReadJS(SpReqAnsContext<CardIssuerStoreService_ReadJS_Req, Ca
 	}
 }
 
-int CCardIssuerFSM::ExitToMainPage()
-{
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit to main page, send event");
-	FSMEvent* evt = new FSMEvent(USER_EVT_EXIT_MIAN_PAGE);
-	PostEventFIFO(evt);
-	return 0;
-}
-
 DWORD CCardIssuerFSM::GetFsmStateErrCode()
 {
 	int state = GetFSMState();

+ 27 - 3
Module/mod_cardissuerstore/CardIssuerFSM.h

@@ -92,7 +92,6 @@ enum EvtType
 	USER_EVT_JS_ADD_CRAD_FROMBOX_FINISHED,
 	USER_EVT_JS_MOVE_CARD_FROMSLOT,
 	USER_EVT_JS_MOVE_CARD_FROMSLOT_FINISHED,
-	USER_EVT_EXIT_MIAN_PAGE,
 };
 enum SAMICCommandType
 {
@@ -1085,7 +1084,7 @@ public:
 		FSM_RULE_ENTRY(s4, s18, USER_EVT_JS_PRINT_CARD, 0)//JS 打印
 		FSM_RULE_ENTRY(s4, s5, USER_EVT_JS_POSTONLINE, 0)//JS 联机后处理
 		FSM_RULE_ENTRY(s4, s5, USER_EVT_JS_READ, 0)//JS 读卡
-		FSM_RULE_ENTRY(s4, s8, USER_EVT_EXIT_MIAN_PAGE, 1)//退到首页事件
+		FSM_RULE_ENTRY(s4, s8, EVT_MAINPAGE_DISPLAY, 1)//退到首页事件
 		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)
@@ -1460,7 +1459,6 @@ public:
 
 	int ReadJS(SpReqAnsContext<CardIssuerStoreService_ReadJS_Req, CardIssuerStoreService_ReadJS_Ans>::Pointer ctx);
 
-	int ExitToMainPage();
 #pragma endregion JS接口具体实现方法
 
 #pragma region JS新增接口
@@ -1952,6 +1950,32 @@ struct QuickSelfcheckTask : public ITaskSp
 	}
 };
 
+struct GetCardInStoreJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStoreService_GetCardInStoreJS_Req, CardIssuerStoreService_GetCardInStoreJS_Ans>::Pointer ctx;
+	GetCardInStoreJSTask(CCardIssuerFSM* f) : fsm(f) { ctx = NULL; }
+	void Process()
+	{
+		if (ctx != NULL) {
+			fsm->GetCardInStoreJS(ctx);
+		}
+	}
+};
+
+struct QueryHasCardJSTask : public ITaskSp
+{
+	CCardIssuerFSM* fsm;
+	SpReqAnsContext<CardIssuerStoreService_QueryHasCardJS_Req, CardIssuerStoreService_QueryHasCardJS_Ans>::Pointer ctx;
+	QueryHasCardJSTask(CCardIssuerFSM* f) : fsm(f) { ctx = NULL; }
+	void Process()
+	{
+		if (ctx != NULL) {
+			fsm->QueryHasCardJS(ctx);
+		}
+	}
+};
+
 
 #pragma endregion JS接口 工作线程
 

+ 0 - 2
Module/mod_cardissuerstore/mod_cardissuer.cpp

@@ -333,8 +333,6 @@ void CCardIssuerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue,
 		m_fsm.OnUIState4SetWhatPage(pszValue);
 		if (_strnicmp(pszValue, "M", strlen("M")) == 0) {
 			m_fsm.SetEnterMainPage();//设置进入首页
-			//判断是否进入首页触发业务结束事件,发送事件给状态机。
-			m_fsm.ExitToMainPage();
 		}
 	}
 }

+ 9 - 2
Module/mod_cardissuerstore/mod_cardissuer.h

@@ -383,7 +383,13 @@ public:
 	void GetCardInStoreJS(SpReqAnsContext<CardIssuerStoreService_GetCardInStoreJS_Req, CardIssuerStoreService_GetCardInStoreJS_Ans>::Pointer ctx)
 	{
 		LOG_FUNCTION();
-		m_fsm.GetCardInStoreJS(ctx);
+		if (!m_fsm.GetDevInitFlag()) {
+			ctx->Answer(Error_DevNotAvailable, CardIssuerStore_UserErrorCode_DevOpen_Failed);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetCardInStoreJS but DevOpen failed.");
+		}
+		else {
+			m_fsm.GetCardInStoreJS(ctx);
+		}
 	}
 
 	void AddAndReadCardFromBoxJS(SpReqAnsContext<CardIssuerStoreService_AddAndReadCardFromBoxJS_Req, CardIssuerStoreService_AddAndReadCardFromBoxJS_Ans>::Pointer ctx)
@@ -491,7 +497,8 @@ public:
 	{
 		LOG_FUNCTION();
 		if (!m_fsm.GetDevInitFlag()) {
-			ctx->Answer(Error_DevNotAvailable, CardIssuerStore_UserErrorCode_DevOpen_Failed);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("QueryHasCardJS but DevOpen failed.");
+			ctx->Answer(Error_DevNotAvailable, CardIssuerStore_UserErrorCode_DevOpen_Failed);		
 		}
 		else {
 			m_fsm.QueryHasCardJS(ctx);

+ 4 - 1
Module/mod_chromium/CModTools.cpp

@@ -513,6 +513,9 @@ namespace Chromium {
     {
         CSimpleStringA strChromiumPath = GetCefHead(this->m_pEntity), strCmdLine = "";
         strCmdLine.Append(strChromiumPath).Append(" --url=").Append(mainUrl.c_str());
+
+		if (ConfigManager::getInstance().m_withUnsafeMain)
+			strCmdLine.Append(" --allow-running-insecure-content");
 		if (ConfigManager::getInstance().m_extension_debugOpen)
 			strCmdLine.Append(" --right-menu");
 		if (ConfigManager::getInstance().m_extension_withTerminal && ConfigManager::getInstance().m_extension_headerStr.length() > 0)
@@ -553,7 +556,7 @@ namespace Chromium {
 #if defined(_MSC_VER)
 		return generateCefclientCmd(false, mainUrl);
 #else
-        return generateBrowserCMDForEverything(mainUrl, 0, false);
+        return generateBrowserCMDForEverything(mainUrl, 0, ConfigManager::getInstance().m_withUnsafeMain);
 #endif //_MSC_VER
 	}
 

+ 1 - 1
Module/mod_chromium/EntitySessionManager.cpp

@@ -451,7 +451,7 @@ namespace Chromium {
 
 		root["headers"] = headers;
 		root["debug_mode"] = true;
-		root["use_url_contains"] = false;
+		root["use_url_excepts"] = true;
 
 		Json::StyledWriter writer;
 		std::string output = writer.write(root);

+ 1 - 1
Module/mod_chromium/baseEx.cpp

@@ -949,7 +949,7 @@ ConfigManager& ConfigManager::getInstance() {
 ConfigManager::ConfigManager()
 	: m_iTcpBridgePort(4504), m_strCustomMainUrl(""), m_strCustomAdUrl(""), m_runAd(false), m_runMain(false), m_runExtend(false), m_runLogin(false), m_withBrowser(false), m_withMin(false), m_withClose(false)
 	, m_withDebugMode(false), m_withMagic(false), m_withNoFileLog(false), m_installMode(false), m_withMedia(false), m_withSpecialTest(false), m_withConsole(false),
-	m_withLinkLog(false), m_withUnsafeAd(false), m_noStartupPage(false),  m_extension_debugOpen(false), m_extension_withTerminal(false)
+	m_withLinkLog(false), m_withUnsafeAd(false), m_withUnsafeMain(false), m_noStartupPage(false),  m_extension_debugOpen(false), m_extension_withTerminal(false)
 {
 	void* logProducer = nullptr;
 	std::map<std::string, void*> g_logProducerArr;

+ 1 - 1
Module/mod_chromium/baseEx.h

@@ -214,7 +214,7 @@ public:
 	std::string m_strCustomMainUrl, m_strCustomAdUrl;
 	bool m_runAd/*广告*/, m_runMain/*业务*/, m_runExtend/*低柜副屏*/, m_runLogin/*用户桌面,可能木有用*/, m_withBrowser/*是否需要与browser交互*/;
 	bool m_withDebugMode/*是否启动debug模式*/, m_withMagic/*启用随机共享内存*/, m_withNoFileLog/*是否不需要本地日志落盘*/, m_withMedia/*开启多媒体选项*/;
-	bool m_withUnsafeAd/*Ad页面忽略安全选项*/;
+	bool m_withUnsafeAd/*Ad页面忽略安全选项*/, m_withUnsafeMain/*业务页面忽略安全选项*/;
 	bool m_withConsole;
 	bool m_withSpecialTest/*开启一些终端功能的测试*/, m_withLinkLog/*开启链路中的中间链路日志*/;
 	bool m_withMin, m_withClose, m_installMode, m_existRootIni;

+ 2 - 0
Module/mod_chromium/mod_chromium.cpp

@@ -382,6 +382,8 @@ namespace Chromium {
 								ConfigManager::getInstance().m_withMedia = true;
 							else if (!trimStr.Compare("with_unsafe_ad", true))
 								ConfigManager::getInstance().m_withUnsafeAd = true;
+							else if (!trimStr.Compare("with_unsafe_main", true))
+								ConfigManager::getInstance().m_withUnsafeMain = true;
 							else if (!trimStr.Compare("with_specialTest", true))//chromium will run specical test
 								ConfigManager::getInstance().m_withSpecialTest = true;
 							else if (!trimStr.Compare("with_LinkLog", true))//control do_sendJson to print more logs(request)

+ 2 - 1
Module/mod_counterconnector/http_callrouter.cpp

@@ -96,7 +96,8 @@ node_list_head_t* get_http_callroute_list(http_call_info_t* pinfo, int itimeout,
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin http get request, timeout is %d, printdbg flag is %s.", req.m_timeOut, req.m_printDbg ? "true":"false");
 
 	CallRouteHTTPRet ret;
-	if (client->Get(req, ret)) {
+	PROCESS_LINK_CONTEXT("LR0402304CallRoute")
+	if (client->Get(req, ret, &nextLink)) {
 		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get result is %s, returnCode:%s, code:%s, errorMsg:%s, message:%s, terminalNo:%s, branchNo:%s, accessNum:%s, voiceGateAddress:%s, mediaGateAddress:%s, voiceGateAddressBackUp:%s, mediaGateAddressBackUp:%s, queueName:%s, clientLevel:%d.",
 		//	ret.m_success?"success":"failed", ret.m_returnCode.c_str(), ret.m_code.c_str(), ret.m_errorMsg.c_str(), ret.m_message.c_str(), 
 		//	ret.m_call_route.m_terminalNo.c_str(), ret.m_call_route.m_branchNo.c_str(), ret.m_call_route.m_accessNum.c_str(),ret.m_call_route.m_voiceGateAddress.c_str(), 

+ 1 - 1
Module/mod_counterconnector/mod_counterconnector.cpp

@@ -358,7 +358,7 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("界面拨号,免提呼叫");
 			if (pszMessage && strlen(pszMessage) > 0 && isdigit(pszMessage[0])) 
 			{
-				char tmp[32];
+				char tmp[32] = {0};
 				int i = 0;
 				const char *p = pszMessage;
 				while (isdigit(*p) && i < 30) {

+ 2 - 3
Module/mod_facetracking/CMakeLists.txt

@@ -13,8 +13,7 @@ add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
 target_include_directories(${MODULE_NAME} PRIVATE
 	${OTHER_LIB_BASE_DIR}/rvcmediacommon
 	${OTHER_LIB_BASE_DIR}/libvideoqueue
-	${OTHER_LIB_PLATFORM_BASE_DIR}/libbizchan
-	${OTHER_LIB_PLATFORM_BASE_DIR}/libfacecapture
+	${OTHER_LIB_BASE_DIR}/libfacecapture
 )
 
 target_link_directories(${MODULE_NAME} PRIVATE
@@ -23,7 +22,7 @@ target_link_directories(${MODULE_NAME} PRIVATE
 
 # 添加实体需要依赖的其他共享库(包括系统库)
 set(${MODULE_PREFIX}_LIBS  ${MODULE_BASE_ALL_LIBS} )
-target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} libbizchan libfacecapture videoqueue)
+target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} libfacecapture videoqueue)
 
 deploy_module(${MODULE_PREFIX} ${MODULE_NAME})
 

+ 17 - 10
Module/mod_facetracking/Event.h

@@ -1,17 +1,24 @@
 #pragma once
-#define		EVENT_MOD_FACE_ENVLIGHT_LESS			0x31280001	//环境光不足,级别3。
-#define		EVENT_MOD_FACE_IMG_VAGUE				0x31280002	//图像不清,外部线条和轮廓模糊,不能识别客户,影响到服务,级别3。
-#define		EVENT_MOD_FACE_FACELIGHT_LESS			0x31280003	//客户脸部光度不足,可能为外部光源过于强烈,或拍照光源故障,级别1。
+#define		EVENT_MOD_FACE_ENVLIGHT_LESS			0x30280001	//环境光不足,级别3。
+#define		EVENT_MOD_FACE_IMG_VAGUE				0x30280002	//图像不清,外部线条和轮廓模糊,不能识别客户,影响到服务,级别3。
+#define		EVENT_MOD_FACE_FACELIGHT_LESS			0x30280003	//客户脸部光度不足,可能为外部光源过于强烈,或拍照光源故障,级别1。
 
-#define		EVENT_MOD_FACE_BREAKDOWN				0x31280004	//人脸识别opencv库崩溃,原因不明,告知自检模块重启人脸模块,级别2。
+#define		EVENT_MOD_FACE_BREAKDOWN				0x30280004	//人脸识别opencv库崩溃,原因不明,告知自检模块重启人脸模块,级别2。
 
-#define		EVENT_MOD_FACE_CAMBUG_BLACK				0x31280005	//摄像头故障,导致采集的图像全黑,无法进行图像处理,级别3。
-#define		EVENT_MOD_FACE_CAMBUG_WHITE				0x31280006	//摄像头故障,导致采集的图像全白,无法进行图像处理,级别3。
-#define		EVENT_MOD_FACE_ENVLIGHT_TOOLIGHT		0x31280007	//环境光过亮,可能为摄像头故障或环境变化,已经不能进行服务,级别3。
-#define		EVENT_MOD_FACE_CAM_COVER				0x31280008	//摄像头遮挡,遮挡场景为,光度降低,没有任何可识别的图像,但有信号,级别2。
+#define		EVENT_MOD_FACE_CAMBUG_BLACK				0x30280005	//摄像头故障,导致采集的图像全黑,无法进行图像处理,级别3。
+#define		EVENT_MOD_FACE_CAMBUG_WHITE				0x30280006	//摄像头故障,导致采集的图像全白,无法进行图像处理,级别3。
+#define		EVENT_MOD_FACE_ENVLIGHT_TOOLIGHT		0x30280007	//环境光过亮,可能为摄像头故障或环境变化,已经不能进行服务,级别3。
+#define		EVENT_MOD_FACE_CAM_COVER				0x30280008	//摄像头遮挡,遮挡场景为,光度降低,没有任何可识别的图像,但有信号,级别2。
 
-
-	
+#define		EVENT_MOD_CUSTOMER_CLOSE				0x30200001  //客户接近 1.5m
+#define		EVENT_MOD_CUSTOMER_LEAVE				0x30200002  //客户消失或退出到接近距离1.5M之外
+#define		EVENT_MOD_CUSTOMER_ENTEROPERATE			0x30200003  //客户进入操作距离0.5m
+#define		EVENT_MOD_CUSTOMER_BACKTOCLOSE			0x30200004  //客户退回到接近距离
+#define		EVENT_MOD_CUSTOMER_APPEAR				0x30200006  //有人出现
+#define		EVENT_MOD_CUSTOMER_CHANGE				0x30200005  //客户已经换人
+#define		EVENT_MOD_CUSTOMER_CAPTUREFACE			0x30200011  //捕获脸部事件
+#define		EVENT_MOD_CUSTOMER_LOSEFACE				0x30200012  //失去脸部事件
+#define		EVENT_MOD_NODETECT_BODY					0x30200013  //未检测到人脸
 	
 	
 	

+ 54 - 168
Module/mod_facetracking/mod_facetracking.cpp

@@ -2,13 +2,9 @@
 #include "SpBase.h"
 #include "SpIni.h"
 
-#include "../mod_assistantchannel/AssistantChannel_client_g.h"
-using namespace AssistantChannel;
-#include "../mod_assistantchannel/chan_protocol.h"
 #include "rvc_media_common.h"
 
 #include "libvideoqueue.h"
-#include "jpeg2k.h"
 #include "libfacecapture.h"
 
 #include "y2k_time.h"
@@ -34,13 +30,21 @@ using namespace AssistantChannel;
 
 // 脸部跟踪&拍照 devel: 0x302
 
-class CFaceTrackingEntity;
-
-class ChannelClient : public ChannelService_ClientBase
-{
-public:
-	ChannelClient(CFaceTrackingEntity *pEntity);
-	virtual void OnMessage(ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData);
+static struct {
+	int monitor_id;
+	int evt_code;
+	char* evt_msg;
+} monitor_id_evtmsg[] = {
+	{0, EVENT_MOD_CUSTOMER_CLOSE, "客户接近 1.5m"},
+	{1, EVENT_MOD_CUSTOMER_LEAVE, "客户消失或退出到接近距离1.5M之外"},
+	{2, EVENT_MOD_CUSTOMER_ENTEROPERATE, "客户进入操作距离0.5m"},
+	{3, EVENT_MOD_CUSTOMER_BACKTOCLOSE, "客户退回到接近距离"},
+	{4, EVENT_MOD_CUSTOMER_APPEAR, "有人出现"},
+	{5, EVENT_MOD_CUSTOMER_CHANGE, "客户已经换人"},
+	{6, EVENT_MOD_CUSTOMER_CAPTUREFACE, "捕获脸部事件"},
+	{7, EVENT_MOD_CUSTOMER_LOSEFACE, "失去脸部事件"},
+	{8, EVENT_MOD_FACE_BREAKDOWN,"the opencv library breakdown"},
+	{9, EVENT_MOD_NODETECT_BODY,"未检测到人脸"},
 };
 
 class CFaceTrackingEntity : public CEntityBase, public CHostApi , public CVideoMonitorEvent, public ISysVarListener, public ITimerListener,public ILogListener
@@ -58,61 +62,63 @@ public:
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
 	{
 		CSmartPointer<IEntityFunction> spFunction = GetFunction();
+
+		CSystemStaticInfo stStaticinfo;
+		spFunction->GetSystemStaticInfo(stStaticinfo);
+		if (stricmp(stStaticinfo.strMachineType, "RVC.Stand1SPlus") == 0) {
+			m_bSingleCamera = true;
+		}
+
 		ErrorCodeEnum Error;
 		bool bRet = false;
-		m_facecapture = new Clibfacecapture(&bRet, this, this, REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE, REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE, REC_COMMON_VIDEO_OPT_SHM_RTP_QUEUE);
-		if (!bRet) 
-		{
+		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;
 		}
 
 		Error = GetFunction()->RegistSysVarEvent("SessionID", this);
-		if (Error != Error_Succeed) 
-		{
+		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) 
-		{
+		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) 
-		{
+		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')
-		{
+		if (strValue[0]  == 'N'){
 			m_facecapture->SetCameraState(0);
 		}
-		else if (strValue[0]  == 'E')
-		{
+		else if (strValue[0]  == 'E'){
 			m_facecapture->SetCameraState(1);
 		}
-		else if (strValue[0]  == 'O')
-		{
+		else if (strValue[0]  == 'O'){
 			m_facecapture->SetCameraState(2);
 		}
-		else if (strValue[0]  == 'B')
-		{
+		else if (strValue[0]  == 'B'){
 			m_facecapture->SetCameraState(3);
 		}	
 
-		//is Pad Version
-		CSystemStaticInfo stStaticinfo;
-		spFunction->GetSystemStaticInfo(stStaticinfo);
-		if (stricmp(stStaticinfo.strMachineType,"RVC.Stand1SPlus")==0){
-			m_bSingleCamera = true;
-		}
-
 		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);
 	}
 
@@ -136,11 +142,6 @@ public:
 		pTransactionContext->SendAnswer(Error_Succeed); 
 	}
 
-	virtual void OnPaused()
-	{
-		Capture(0);
-	}
-
 	int TransCameraStateToInt(char cData)
 	{
 		int iRet = 0;
@@ -169,10 +170,8 @@ public:
 
 		case LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED:
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED event");
 				CSimpleStringA strValue;
 				GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
-			#if defined(RVC_OS_WIN)
 				int iState = TransCameraStateToInt(strValue[0]);
 				if (3 != iState) {
 					m_facecapture->SetCameraState(iState);
@@ -181,26 +180,7 @@ public:
 				else {
 					m_facecapture->SetCameraState(3);
 				}
-			#else
-				if (strValue[0] == 'N') {
-					m_facecapture->SetCameraState(0);
-					m_facecapture->StartFaceCapture();
-				}
-				else if (strValue[0] == 'E')
-				{
-					m_facecapture->SetCameraState(1);
-					m_facecapture->StartFaceCapture();
-				}
-				else if (strValue[0] == 'O')
-				{
-					m_facecapture->SetCameraState(2);
-					m_facecapture->StartFaceCapture();
-				}
-				else if (strValue[0] == 'B')
-				{
-					m_facecapture->SetCameraState(3);
-				}
-			#endif //RVC_OS_WIN
+
 				if (!m_bSingleCamera) {
 					GetFunction()->SetTimer(1, this, 1000);
 				}
@@ -209,7 +189,6 @@ public:
 
 		case LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED:
 			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED event");
 				m_facecapture->StopFaceCapture();
 				CSimpleStringA strValue;
 				GetFunction()->GetSysVar(SYSVAR_CAMERASTATE, strValue);
@@ -239,55 +218,18 @@ public:
 		}
 	}
 
-	void Capture(int id)
-	{
-#if 0
-		CImageFrame frm;
-		frm.data = new unsigned char[REC_COMMON_VIDEO_SNAPSHOT_WIDTH*REC_COMMON_VIDEO_SNAPSHOT_HEIGHT*4];
-		frm.width = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
-		frm.height = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
-		frm.framesize = frm.width * frm.height * 3;
-		if (m_facecapture->SnapShot(frm)) {
-			int rc;
-			jpeg2k_raw_image raw_image;
-			jpeg2k_coded_image codec_image = {0};
-			raw_image.data = frm.data;
-			raw_image.width = frm.width;
-			raw_image.height = frm.height;
-			raw_image.len = raw_image.width * raw_image.height * 3;
-			rc = jpeg2k_encode(&raw_image, &codec_image, 10);
-			if (rc == 0) {
-				ChannelService_Send_Info Info;
-				Info.compress = false;
-				Info.encrypt = false;
-				Info.type = ACM_TYPE_PHT;
-				Info.id	 = id;
-				Info.sub_type = ACM_PHT_ANS | ACM_PHT_SNAPSHOT;
-				Info.data.m_pData = codec_image.data;
-				Info.data.m_iLength = codec_image.len;
-				(*m_pChannelClient)(EntityResource::getLink().upgradeLink())->Send(Info);
-			}
-			jpeg2k_encode_free(&codec_image);
-		} else {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get video frm failed!");
-		}
-		delete frm.data;
-#endif
-	}
-
 	//////////////////////////////////////////////////////////////////////////////////////////////////////
 	// ITimerListener implementation
 	
 	virtual void OnTimeout(DWORD dwTimerID)
 	{
-		__int64 uid;
+		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;
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnTimeout, check value, eCamera = %d", status.stCustomerPos.eCamera);
 			spFunction->GetSysVar(SYSVAR_ACTIVETRACKINGCAMERA, strValue); // E or O
 			if (status.stCustomerPos.eCamera == EnvironCamera) 
 			{
@@ -315,7 +257,7 @@ public:
 	//////////////////////////////////////////////////////////////////////////////////////////////////////
 	// CHostApi implementation
 
-	virtual unsigned __int64 GenerateUUID()
+	virtual uint64_t GenerateUUID()
 	{
 		m_lastUUID = CUUID::Create(m_lastUUID);
 		return m_lastUUID;
@@ -382,6 +324,9 @@ public:
 		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;
@@ -421,44 +366,14 @@ public:
 
 	////////////////////////////////////////////////////////////////////////////////////
 	// CVideoMonitorEvent
-
-	virtual void GenerateCloseEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200001, "客户接近 1.5m");
-	}
-	virtual void GenerateLeaveEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200002, "客户消失或退出到接近距离1.5M之外");
-	}
-	virtual void GenerateEnterOperateEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200003, "客户进入操作距离0.5m"); 
-	}
-	virtual void GenerateBackToCloseEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200004, "客户退回到接近距离"); 
-	}
-	virtual void GenerateAppearEvent()					//有人出现在视野中
-	{
-		LogEvent(Severity_Middle, 0x30200006, "有人出现"); 
-	}
-	virtual void GenerateCustomerChangeEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200005, "客户已经换人");
-	}
-	virtual void GenerateCaptureFaceEvent()
-	{
-		LogEvent(Severity_Middle, 0x30200011, "捕获脸部事件");
-	}
-	virtual void GenerateLoseFaceEvent()
+	void GenerateMonitorEvent(video_monitor_event_type eType, char* strMsg)
 	{
-		LogEvent(Severity_Middle, 0x30200012, "失去脸部事件");
-	}
-	 
-	virtual void GenerateFaceCaptureFC()
-	{
-		//发送最高等级错误事件,由健康模块重启对应实体
-		LogEvent(Severity_High,EVENT_MOD_FACE_BREAKDOWN,"the opencv library breakdown");
+		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);
+		}
 	}
 
 private:
@@ -468,14 +383,12 @@ private:
 		if (_stricmp(pszKey,"SessionID") == 0)
 		{
 			GetFunction()->GetSysVar("SessionID",strSessionID);
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sessionID change to %s",strSessionID);
 			bIsSessionChange = true;
 		}
 
 		if (_stricmp(pszKey,"CustomerID") == 0)
 		{
 			GetFunction()->GetSysVar("CustomerID",strCustomerID);
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("customerID change to %s",strCustomerID);
 			bIsCustomerChange = true;
 		}
 
@@ -483,7 +396,6 @@ private:
 		{
 			CSimpleStringA str;
 			GetFunction()->GetSysVar(SYSVAR_CAMERASTATE,str);
-			//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("customerID change to %s",strCustomerID);
 			if (str == 'N')
 			{
 				m_facecapture->SetCameraState(0);
@@ -499,7 +411,6 @@ private:
 			else if (str == 'B')
 			{
 				m_facecapture->SetCameraState(3);
-				//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set Camera State to 3");
 			}	
 		}
 	}
@@ -511,35 +422,10 @@ private:
 	CSimpleStringA strCustomerID;
 	CSimpleStringA strSessionID;
 	CUUID m_lastUUID;
-	ChannelClient *m_pChannelClient;
 	Clibfacecapture *m_facecapture;
 	bool m_bSingleCamera;
 };
 
-void ChannelClient::OnMessage( ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData )
-{
-	if (Error == Error_Succeed) 
-	{
-		CFaceTrackingEntity *pEntity = static_cast<CFaceTrackingEntity*>(m_pEntityBase);
-		int cat = ACM_PHT_CAT(Msg.sub_type);
-		if (cat == ACM_PHT_REQ) 
-		{
-			//SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
-			pEntity->Capture(Msg.id);
-			//SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
-		} else 
-		{
-			_ASSERT(0);
-		}
-	}
-}
-
-ChannelClient::ChannelClient( CFaceTrackingEntity *pEntity ) : ChannelService_ClientBase(pEntity)
-{
-
-}
-
-
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CFaceTrackingEntity)
 SP_END_ENTITY_MAP()

+ 1 - 0
Module/mod_gpio/GpioFSM.cpp

@@ -288,6 +288,7 @@ ErrorCodeEnum CGPIOFSM::OnInit()
 	initParam.dir[2] = false;
 	initParam.dir[3] = false;
 	initParam.dwPortNum = 3;
+	//Gpio.keba.1.1 , Gpio.Hyosung.1.1, Gpio.kxd.1.1 需要配置引脚数(PortNum)为 3
 	if (m_adapterInfo.GetPortNumInt() == 4) {
 		m_bNewVersion = TRUE;
 		initParam.dwPortNum = 4;

+ 2 - 2
Module/mod_heartbeat/HeartBeatFSM.cpp

@@ -449,8 +449,8 @@ bool CHeartBeatFSM::HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk) {
 
 
 	//qTempReq.m_printDbg = true;
-
-	if (!client->Post(qTempReq, qTempRet)) {
+	PROCESS_LINK_CONTEXT("LR0402503HandShake")
+	if (!client->Post(qTempReq, qTempRet, &nextLink)) {
 		LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_HTTP_ERROR, CSimpleStringA::Format("HandShakeHttp http req fail,url=%s, err=%s", qTempReq.m_url.c_str(), qTempRet.m_errMsg.c_str()).GetData());
 		return false;//通讯失败
 	}

+ 12 - 7
Module/mod_initiativetransfer/FlowControlFSM.cpp

@@ -13,11 +13,12 @@
 #define LOG_ERR_S5_REQAGENTFLOW_FAILED 		0x30500087
 #define LOG_ERR_S7_ENTRY 					0x30500088
 #define LOG_ERR_S1_ASSIS_IDEL	 			0x30500089
-#define LOG_ERR_S2_ASSIS_IDEL	 			0x3050008a
-#define LOG_ERR_S3_ASSIS_IDEL	 			0x3050008b
-#define LOG_ERR_S5_ASSIS_IDEL	 			0x3050008c
-#define LOG_EVT_CONNEC_ASSISTCHAN_FAILED	0x3050008d
-
+#define LOG_ERR_S2_ASSIS_IDEL	 			0x3050008A
+#define LOG_ERR_S3_ASSIS_IDEL	 			0x3050008B
+#define LOG_ERR_S5_ASSIS_IDEL	 			0x3050008C
+#define LOG_EVT_CONNEC_ASSISTCHAN_FAILED	0x3050008D
+#define LOG_ERR_S2_CHAN_OFF					0x3050008E
+#define LOG_ERR_S3_CHAN_OFF					0x3050008F
 
 void ChannelClient::OnMessage( ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData )
 {
@@ -243,6 +244,7 @@ unsigned int CFlowControlFSM::s2_on_event(FSMEvent* event)
 		AgentFlowResult evt;
 		evt.error = Error_NetBroken;
 		SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(AgentFlowResult), SP_MSG_SIG_OF(AgentFlowResult), evt);
+		LogWarn(Severity_Low, Error_Debug, LOG_ERR_S2_CHAN_OFF, "s2 chan off.");
 	} 
 	else if (event->iEvt == USER_EVT_ANSAGENTFLOW) {
 		AnsAgentFlowEvent *afe = static_cast<AnsAgentFlowEvent*>(event);
@@ -315,15 +317,18 @@ unsigned int CFlowControlFSM::s3_on_event(FSMEvent* event)
 #endif //RVC_OS_WIN
 			Info.data = buf.ToBlob();
 			Error = m_pClient->Send(Info);
-		} else {
+		} 
+		else {
 			Error = Error_NetBroken;
 			LogWarn(Severity_Low, Error_Debug, LOG_ERR_S3_ANSACMFLOW_FAILED, "s3 send ANSACMFLOW error.");
 		}
 		return Error == Error_Succeed ? 1 : 0;
-	} else if (event->iEvt == USER_EVT_CHAN_OFF) {
+	} 
+	else if (event->iEvt == USER_EVT_CHAN_OFF) {
 		AgentFlowResult evt;
 		evt.error = Error_NetBroken;
 		SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(AgentFlowResult), SP_MSG_SIG_OF(AgentFlowResult), evt);
+		LogWarn(Severity_Low, Error_Debug, LOG_ERR_S3_CHAN_OFF, "s3 chan off.");
 	}
 	else if (event->iEvt == USER_EVT_ASSIS_IDEL)
 	{

+ 26 - 0
Module/mod_interactivecontrol/InteractiveControl.xml

@@ -537,6 +537,28 @@
       </req>
       <res>
       </res>
+    </twoway>
+	<twoway name="StartFacetracking" overlap="true">
+      <req>
+        <param name="env_view_x" type="int"/>
+        <param name="env_view_y" type="int"/>
+        <param name="env_view_cx" type="int"/>
+        <param name="env_view_cy" type="int"/>
+        <param name="opt_view_x" type="int"/>
+        <param name="opt_view_y" type="int"/>
+        <param name="opt_view_cx" type="int"/>
+        <param name="opt_view_cy" type="int"/>
+      </req>
+      <res>
+        <param name="result" type="int"/>
+      </res>
+    </twoway>
+    <twoway name="StopFacetracking" overlap="true">
+      <req>
+      </req>
+      <res>
+        <param name="result" type="int"/>
+      </res>
     </twoway>
 	</class>
 	
@@ -656,4 +678,8 @@
   <message name="EnvCameraCapProcess">
     <param name="envcapmsg" type="wstring"/>
   </message>
+  <!-- 运动检测和脸部跟踪信息 -->
+  <message name="FaceTrackingMsg">
+    <param name="Trackingmsg" type="wstring"/>
+  </message>
 </entity>

+ 98 - 0
Module/mod_interactivecontrol/InteractiveControl_client_g.h

@@ -3017,6 +3017,104 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum StartFacetracking(UIService_StartFacetracking_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(UIService_Method_StartFacetracking, UIService_MethodSignature_StartFacetracking, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum StartFacetracking(UIService_StartFacetracking_Req &Req, UIService_StartFacetracking_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartFacetracking(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum StartFacetracking(UIService_StartFacetracking_Req &Req, UIService_StartFacetracking_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartFacetracking(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 StartFacetracking(UIService_StartFacetracking_Req &Req, UIService_StartFacetracking_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartFacetracking(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 StopFacetracking(UIService_StopFacetracking_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(UIService_Method_StopFacetracking, UIService_MethodSignature_StopFacetracking, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum StopFacetracking(UIService_StopFacetracking_Req &Req, UIService_StopFacetracking_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StopFacetracking(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum StopFacetracking(UIService_StopFacetracking_Req &Req, UIService_StopFacetracking_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StopFacetracking(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 StopFacetracking(UIService_StopFacetracking_Req &Req, UIService_StopFacetracking_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StopFacetracking(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;
+	}
+
 
 	bool SafeDelete()
 	{

+ 55 - 0
Module/mod_interactivecontrol/InteractiveControl_def_g.h

@@ -90,6 +90,8 @@ namespace InteractiveControl {
 #define UIService_Method_SetRemoteRecordCamera 68
 #define UIService_Method_StartCameraCapture 69
 #define UIService_Method_StopCameraCapture 70
+#define UIService_Method_StartFacetracking 71
+#define UIService_Method_StopFacetracking 72
 
 #define UIService_MethodSignature_SetUIState -649355360
 #define UIService_MethodSignature_SendAgentText -389826246
@@ -162,6 +164,8 @@ namespace InteractiveControl {
 #define UIService_MethodSignature_SetRemoteRecordCamera 644742714
 #define UIService_MethodSignature_StartCameraCapture -1747552500
 #define UIService_MethodSignature_StopCameraCapture -1434897600
+#define UIService_MethodSignature_StartFacetracking 1383398751
+#define UIService_MethodSignature_StopFacetracking -1524623181
 
 #define UIService_LogCode_SetUIState "QLR040230B00"
 #define UIService_LogCode_SendAgentText "QLR040230B01"
@@ -234,6 +238,8 @@ namespace InteractiveControl {
 #define UIService_LogCode_SetRemoteRecordCamera "QLR040230B68"
 #define UIService_LogCode_StartCameraCapture "QLR040230B69"
 #define UIService_LogCode_StopCameraCapture "QLR040230B70"
+#define UIService_LogCode_StartFacetracking "QLR040230B71"
+#define UIService_LogCode_StopFacetracking "QLR040230B72"
 
 struct UIService_SetUIState_Info
 {
@@ -1576,6 +1582,55 @@ struct UIService_StopCameraCapture_Ans
 
 };
 
+struct UIService_StartFacetracking_Req
+{
+	int env_view_x;
+	int env_view_y;
+	int env_view_cx;
+	int env_view_cy;
+	int opt_view_x;
+	int opt_view_y;
+	int opt_view_cx;
+	int opt_view_cy;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & env_view_x & env_view_y & env_view_cx & env_view_cy & opt_view_x & opt_view_y & opt_view_cx & opt_view_cy;
+	}
+
+};
+
+struct UIService_StartFacetracking_Ans
+{
+	int result;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & result;
+	}
+
+};
+
+struct UIService_StopFacetracking_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_StopFacetracking_Ans
+{
+	int result;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & result;
+	}
+
+};
+
 
 ///////////////////////////
 

+ 15 - 0
Module/mod_interactivecontrol/InteractiveControl_msg_g.h

@@ -31,6 +31,7 @@ namespace InteractiveControl {
 #define eMsg_H5BackSyncData 19
 #define eMsg_SalesRecordingFailed 20
 #define eMsg_EnvCameraCapProcess 21
+#define eMsg_FaceTrackingMsg 22
 
 #define eMsgSig_CustomerState 175614460
 #define eMsgSig_Stop -150723185
@@ -54,6 +55,7 @@ namespace InteractiveControl {
 #define eMsgSig_H5BackSyncData -1217690931
 #define eMsgSig_SalesRecordingFailed -1402924427
 #define eMsgSig_EnvCameraCapProcess -1158933893
+#define eMsgSig_FaceTrackingMsg 1447421404
 
 struct CustomerState
 {
@@ -347,5 +349,18 @@ struct EnvCameraCapProcess
 
 ///////////////////////////
 
+struct FaceTrackingMsg
+{
+	CSimpleStringW Trackingmsg;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & Trackingmsg;
+	}
+
+};
+
+///////////////////////////
+
 } // namespace InteractiveControl
 #endif // __INTERACTIVECONTROL_MSG_G_H

+ 54 - 0
Module/mod_interactivecontrol/InteractiveControl_server_g.h

@@ -527,6 +527,20 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case UIService_Method_StartFacetracking:
+			if (dwSignature == UIService_MethodSignature_StartFacetracking) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_StopFacetracking:
+			if (dwSignature == UIService_MethodSignature_StopFacetracking) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -893,6 +907,16 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case UIService_Method_StartFacetracking:
+			if (dwSignature != UIService_MethodSignature_StartFacetracking) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_StopFacetracking:
+			if (dwSignature != UIService_MethodSignature_StopFacetracking) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -1255,6 +1279,16 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_StartFacetracking(SpReqAnsContext<UIService_StartFacetracking_Req, UIService_StartFacetracking_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_StopFacetracking(SpReqAnsContext<UIService_StopFacetracking_Req, UIService_StopFacetracking_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -1981,6 +2015,26 @@ public:
 						Handle_StopCameraCapture(ctx);
 					}
 					break;
+				case UIService_Method_StartFacetracking:
+					{
+						SpReqAnsContext<UIService_StartFacetracking_Req,UIService_StartFacetracking_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_StartFacetracking_Req,UIService_StartFacetracking_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_StartFacetracking(ctx);
+					}
+					break;
+				case UIService_Method_StopFacetracking:
+					{
+						SpReqAnsContext<UIService_StopFacetracking_Req,UIService_StopFacetracking_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_StopFacetracking_Req,UIService_StopFacetracking_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_StopFacetracking(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 156 - 42
Module/mod_interactivecontrol/mod_interactivecontrol.cpp

@@ -17,6 +17,7 @@ using namespace SIPPhone;
 #include "../mod_SalesRecorder/Event.h"
 #include "../mod_mediacontroller/Event.h"
 #include "../mod_sipphone/Event.h"
+#include "../mod_facetracking/Event.h"
 
 struct CRecvValue
 {
@@ -208,13 +209,23 @@ ErrorCodeEnum CITCtrlEntity::__OnStart(ErrorCodeEnum preOperationError)
 	}
 
 	int i = 0;
-	m_arrListener.Init(6);
+	m_arrListener.Init(16);
 	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS,NULL,false);
 	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_LOCALPLAYER_STARTED_SUCCESS, NULL, false);
 	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_SALESRECORDER_STARTED_SUCCESS, NULL, false);
 	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_SIPPHONE_STARTED_SUCCESS, NULL, false);
 	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_MEDIACONTROLLER_STARTED_SUCCESS, NULL, false);
 	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RECORDFAILED, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_CLOSE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_LEAVE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_ENTEROPERATE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_BACKTOCLOSE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_APPEAR, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_CHANGE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_CAPTUREFACE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CUSTOMER_LOSEFACE, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_FACE_BREAKDOWN, NULL, false);
+	pFunc->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_NODETECT_BODY, NULL, false);
 	
 	return Error_Succeed;
 }
@@ -1086,6 +1097,21 @@ void CITCtrlEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,co
 			m_bSalesRecording = false;
 		}
 		break;
+#ifdef DEVOPS_ON_PRD
+#else
+	case  EVENT_MOD_CUSTOMER_CLOSE:
+	case  EVENT_MOD_CUSTOMER_LEAVE:
+	case  EVENT_MOD_CUSTOMER_ENTEROPERATE:
+	case  EVENT_MOD_CUSTOMER_BACKTOCLOSE:
+	case  EVENT_MOD_CUSTOMER_APPEAR:
+	case  EVENT_MOD_CUSTOMER_CHANGE:
+	case  EVENT_MOD_CUSTOMER_CAPTUREFACE:
+	case  EVENT_MOD_CUSTOMER_LOSEFACE:
+	case  EVENT_MOD_FACE_BREAKDOWN:
+	case  EVENT_MOD_NODETECT_BODY:
+		OnFaceTrackingMsg(pszMessage);
+		break;
+#endif
 	default:
 		break;
 	}
@@ -1216,45 +1242,6 @@ ErrorCodeEnum CITCtrlEntity::AppendWaterMark(CSimpleStringW strVideoName, CSimpl
 	return rc;
 }
 
-
-eRecordDeviceState CITCtrlEntity::GetRecordDeviceState()
-{
-	eRecordDeviceState eState = eNormal;
-
-	CSimpleStringA camstate;
-	GetFunction()->GetSysVar(SYSVAR_CAMERASTATE,camstate);
-	if (0 == camstate.GetLength()){
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetSysVar CameraState failed.");
-		return eState;
-	}
-
-	char cState = camstate[0];
-	switch (cState)
-	{
-	case 'N': 
-		eState = eNormal;
-		break;
-
-	case 'B':
-	case 'E':
-		eState = eEnvCamError;
-		break;
-
-	case 'U':
-		eState = eEwsCamError;
-		break;
-
-	case 'I':
-		eState = eEwsCamStarting;
-		break;
-
-	default:
-		break;
-	}
-
-	return eState;
-}
-
 static CSimpleStringA EncryptString(LPCTSTR lpszText)
 {
 	int	iEncrypt=0;
@@ -1632,6 +1619,32 @@ void CITCtrlEntity::OnSalesRecordingFailed(const char* pszFailedMsg)
 }
 
 
+void CITCtrlEntity::OnFaceTrackingMsg(const char* pszFaceTrackingMsg)
+{
+#ifdef DEVOPS_ON_PRD
+#else
+	char strTime[MAX_PATH] = { 0 };
+	CSimpleStringA strValue;
+	GetFunction()->GetSysVar("ActiveTrackingCamera", strValue); // E or O
+	CSimpleStringA strMsg = CSimpleStringA::Format("[%s] ", strValue.GetData());
+#ifdef _WIN32
+	SYSTEMTIME nowTime;                             // 系统时间结构体
+	GetLocalTime(&nowTime);
+	_snprintf(strTime, MAX_PATH, "(%02d:%02d:%02d)", nowTime.wHour, nowTime.wMinute, nowTime.wSecond);
+#else
+	struct tm* pst = NULL;
+	time_t t = time(NULL);
+	pst = localtime(&t);
+	snprintf(strTime, MAX_PATH, "(%02d:%02d:%02d)", pst->tm_hour, pst->tm_min, pst->tm_sec);
+#endif // _WIN32
+	strMsg += pszFaceTrackingMsg;
+	strMsg += strTime;
+	FaceTrackingMsg evt;
+	evt.Trackingmsg = CSimpleStringA2W(strMsg);
+	SpSendBroadcast(GetFunction(), SP_MSG_OF(FaceTrackingMsg), SP_MSG_SIG_OF(FaceTrackingMsg), evt);
+#endif
+}
+
 bool CITCtrlEntity::IsSupportTransRecordDeviceType()
 {
 	bool bRet = false;
@@ -1923,8 +1936,10 @@ ErrorCodeEnum CITCtrlEntity::StartCameraCaptrue()
 	MediaService_TurnOnCamera_Ans ans;
 	req.bPostCapInfo = true;
 	ErrorCodeEnum rc = (*m_pMediaCtlClient)(EntityResource::getLink().upgradeLink())->TurnOnCamera(req, ans, 10000);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("turn on camera result is 0x%08x.", rc).GetData());
-
+	if (Error_Succeed != rc) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("turn on camera result is 0x%08x.", rc).GetData());
+	}
+	
 	return rc;
 }
 
@@ -1946,6 +1961,77 @@ ErrorCodeEnum CITCtrlEntity::StopCameraCaptrue()
 }
 
 
+ErrorCodeEnum CITCtrlEntity::StartFacetracking(SpReqAnsContext<UIService_StartFacetracking_Req, UIService_StartFacetracking_Ans>::Pointer ctx)
+{
+	if (!IsSipPhoneEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("start facetracking failed for connect SipphoneClient failed!");
+		return Error_DevConnFailed;
+	}
+
+	if (!IsMediaCtrEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("start facetracking failed for connect MediaCtrClient failed!");
+		return Error_DevConnFailed;
+	}
+
+	MediaService_TurnOnCamera_Req req;
+	MediaService_TurnOnCamera_Ans ans;
+	req.bPostCapInfo = false;
+	ErrorCodeEnum rc = (*m_pMediaCtlClient)(EntityResource::getLink().upgradeLink())->TurnOnCamera(req, ans, 10000);
+	if (Error_Succeed != rc) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("turn on camera result is 0x%08x.", rc).GetData());
+		ctx->Ans.result = -1;
+		return rc;
+	}
+
+	PhoneService_StartBothCameraRender_Req render_req;
+	PhoneService_StartBothCameraRender_Ans render_ans;
+	render_req.env_view_cx = ctx->Req.env_view_cx;
+	render_req.env_view_cy = ctx->Req.env_view_cy;
+	render_req.env_view_x = ctx->Req.env_view_x;
+	render_req.env_view_y = ctx->Req.env_view_y;
+	render_req.opt_view_cx = ctx->Req.opt_view_cx;
+	render_req.opt_view_cy = ctx->Req.opt_view_cy;
+	render_req.opt_view_x = ctx->Req.opt_view_x;
+	render_req.opt_view_y = ctx->Req.opt_view_y;
+	rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->StartBothCameraRender(render_req, render_ans, 5000);
+	if (Error_Succeed != rc) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("start both camera render failed for 0x%08x.", rc).GetData());
+	}
+
+	ctx->Ans.result = render_ans.result;
+
+	return rc;
+}
+
+
+ErrorCodeEnum CITCtrlEntity::StopFacetracking()
+{
+	if (!IsMediaCtrEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("stop facetracking failed for connect MediaCtrClient failed!");
+		return Error_DevConnFailed;
+	}
+
+	if (!IsSipPhoneEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("stop facetracking failed for connect SipphoneClient failed!");
+		return Error_DevConnFailed;
+	}
+
+	MediaService_TurnOffCamera_Req req;
+	MediaService_TurnOffCamera_Ans ans;
+	ErrorCodeEnum rc = (*m_pMediaCtlClient)(EntityResource::getLink().upgradeLink())->TurnOffCamera(req, ans, 5000);
+	if (Error_Succeed != rc) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("turn off failed for 0x%08x.", rc).GetData());
+	}
+
+	PhoneService_StopCameraRender_Req render_req;
+	PhoneService_StopCameraRender_Ans render_ans;
+	rc = (*m_pSipPhoneClient)(EntityResource::getLink().upgradeLink())->StopCameraRender(render_req, render_ans, 5000);
+	if (Error_Succeed != rc) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)(CSimpleStringA::Format("stop camera render failed for 0x%08x.", rc).GetData());
+	}
+
+	return rc;
+}
 
 void UIServiceSession::Handle_SetUIState(SpOnewayCallContext<UIService_SetUIState_Info>::Pointer ctx)
 {
@@ -2658,6 +2744,34 @@ void UIServiceSession::Handle_StopCameraCapture(SpReqAnsContext<UIService_StopCa
 }
 
 
+void UIServiceSession::Handle_StartFacetracking(SpReqAnsContext<UIService_StartFacetracking_Req, UIService_StartFacetracking_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = Error_Succeed;
+#ifdef DEVOPS_ON_PRD
+#else
+	Error = m_pEntity->StartFacetracking(ctx);
+#endif
+	ctx->Answer(Error);
+}
+
+void UIServiceSession::Handle_StopFacetracking(SpReqAnsContext<UIService_StopFacetracking_Req, UIService_StopFacetracking_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = Error_Succeed;
+#ifdef DEVOPS_ON_PRD
+#else
+	Error = m_pEntity->StopFacetracking();
+	if (Error_Succeed == Error) {
+		ctx->Ans.result = 0;
+	}
+	else {
+		ctx->Ans.result = -1;
+	}
+#endif
+	ctx->Answer(Error);
+}
+
 ChannelClient::ChannelClient( CITCtrlEntity *pEntity ) : ChannelService_ClientBase(pEntity)
 {
 

+ 11 - 15
Module/mod_interactivecontrol/mod_interactivecontrol.h

@@ -33,19 +33,6 @@ using namespace Recorder;
 #include "../mod_counterconnector/CounterConnector_client_g.h"
 using namespace CounterConnector;
 
-enum eRecordDeviceState{
-	eNormal,					
-	eMicStarting,
-	eEnvCamStarting,
-	eOptCamStarting,
-	eEwsCamStarting,
-	eMicBreakDown,
-	eEnvCamError,
-	eOptCamError,
-	eEwsCamError,
-	eAllError
-};
-
 class CITCtrlEntity;
 
 class ChannelClient : public ChannelService_ClientBase
@@ -202,8 +189,6 @@ public:
 
 	ErrorCodeEnum AppendWaterMark(CSimpleStringW strVideoName, CSimpleStringW strWaterMark);
 
-	eRecordDeviceState GetRecordDeviceState();
-
 	void AdverPlayManage(const char* pszValue, const char* pszOldValue);
 
 	ErrorCodeEnum LoadEntityConfig();
@@ -236,6 +221,10 @@ public:
 
 	ErrorCodeEnum StopCameraCaptrue();
 
+	ErrorCodeEnum StartFacetracking(SpReqAnsContext<UIService_StartFacetracking_Req, UIService_StartFacetracking_Ans>::Pointer ctx);
+
+	ErrorCodeEnum StopFacetracking();
+
 private:
 	ErrorCodeEnum ConnectAssistChannel();
 
@@ -291,6 +280,9 @@ private:
 
 	void FreeCounterClient();
 
+	void OnFaceTrackingMsg(const char* pszFaceTrackingMsg);
+
+
 	SP_BEGIN_MSG_DISPATCH_MAP(CITCtrlEntity)
 		SP_BEGIN_ENTITY_MSG("LocalMediaPlay")
 #ifdef RVC_OS_WIN
@@ -496,6 +488,10 @@ public:
 
 	virtual void Handle_StopCameraCapture(SpReqAnsContext<UIService_StopCameraCapture_Req, UIService_StopCameraCapture_Ans>::Pointer ctx);
 
+	virtual void Handle_StartFacetracking(SpReqAnsContext<UIService_StartFacetracking_Req, UIService_StartFacetracking_Ans>::Pointer ctx);
+
+	virtual void Handle_StopFacetracking(SpReqAnsContext<UIService_StopFacetracking_Req, UIService_StopFacetracking_Ans>::Pointer ctx);
+
 private:
 	CITCtrlEntity *m_pEntity;
 };

+ 7 - 1
Module/mod_livenessdetection/mod_livenessdetection.cpp

@@ -384,8 +384,14 @@ ErrorCodeEnum CLivenessDetectionEntity::GetEntityConfigure()
 	}
 
 	SpIniMappingTable table;
-	table.AddEntryInt("LivenessDetection","WsServerPort", m_iWsPort, RVC_LIVENESS_WS_PORT);
+	int iWsPort = RVC_LIVENESS_WS_PORT;
+	table.AddEntryInt("LivenessDetection","WsServerPort", iWsPort, RVC_LIVENESS_WS_PORT);
 	eErrDev = table.Load(spConfig);
+	if (Error_Succeed == eErrDev) {
+		if (iWsPort > 0) {
+			m_iWsPort = iWsPort;
+		}
+	}
 
 	return eErrDev;
 }

+ 4 - 3
Module/mod_mediacontroller/brightnessinfo.cpp

@@ -59,9 +59,10 @@ int post_camera_brightness_info_list(unsigned int& uposttime, CSimpleStringA& er
 	unsigned int ustarttime = SP::Module::Comm::RVCGetTickCount();
 
 	BrightnessInfoHTTPRet ret;
-	if (client->Post(req, ret)) {
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("url:%s, post result is %s, returnCode:%s, code:%s, errorMsg:%s, message:%s.",
-		//	ret.m_success ? "success" : "failed", req.m_url.c_str(), ret.m_returnCode.c_str(), ret.m_code.c_str(), ret.m_errorMsg.c_str(), ret.m_message.c_str());
+	PROCESS_LINK_CONTEXT("LR0402208BringnessInfo")
+	if (client->Post(req, ret, &nextLink)) {
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("post result is %s, returnCode:%s, code:%s, errorMsg:%s, message:%s.",
+		//	ret.m_success ? "success" : "failed", ret.m_returnCode.c_str(), ret.m_code.c_str(), ret.m_errorMsg.c_str(), ret.m_message.c_str());
 		uposttime = SP::Module::Comm::RVCGetTickCount() - ustarttime;
 		iret = 0;
 	}

+ 1 - 1
Module/mod_pinpad/PinPadFSM.cpp

@@ -675,7 +675,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputS
 		DWORD dwUserCode = SetErrorAndLog(errCode, MEC_DEVAPI_EPP_StartPinInput, "DevAdapter::StartPinInput", __FUNCTION__, IsInBusiness(), m_ullEndTime - m_ullBeginTime, PinPadService_LogCode_GetInputSM);
 		CSimpleStringA tmpRTA(true), tmpDesc(true);
 		if (GetEntityBase()->GetFunction()->GetVTMErrMsg(dwUserCode, tmpDesc, tmpRTA) == Error_Succeed)
-			DbgToBeidou(ctxSM->link, "GetEncryptTextJS").setReturnCode(tmpRTA)();
+			DbgToBeidou(ctxSM->link, "GetEncryptText").setReturnCode(tmpRTA)();
 		ctxSM->Answer(Error_DevCommFailed, dwUserCode);
 		return Error_DevCommFailed;
 	}

+ 5 - 3
Module/mod_recorder/mod_recorder.cpp

@@ -445,7 +445,7 @@ ErrorCodeEnum CRecorderEntity::PostVideoRecordInfos()
 	unsigned int uposttime = 0;
 	CSimpleStringA strErrorMsg("");
 	if (0 == post_video_recordinfo_list(uposttime, strErrorMsg, &video_params, m_iHttpTimeOut, false)) {
-		if (500 < uposttime) {
+		if (1000 < uposttime) {
 			LogWarn(Severity_Low, Error_Debug, LOG_EVT_POST_RECORDINFO_COST_TIME, CSimpleStringA::Format("post video record infos cost time is %ums.", uposttime).GetData());
 		}
 		Error = Error_Succeed;
@@ -647,7 +647,11 @@ void CRecorderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,
 		break;
 
 	case LOG_EVT_UI_STOPCAMERACAPTURE:
+#ifdef RVC_OS_WIN
+
+#else
 		StopRecord();
+#endif
 		break;
 
 	default:
@@ -660,7 +664,6 @@ void CRecorderEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,con
 {	
 	if (_stricmp(pszKey, SYSVAR_CAMERASTATE) == 0)
 	{
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent Key = %s, Value = %s.", pszKey, pszValue);
 		m_iCameraState = pszValue[0]; 
 		if (pszValue[0] == 'E'){
 			m_iActiveCamera = CAMERA_TYPE_OPT;
@@ -677,7 +680,6 @@ void CRecorderEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,con
 	}
 	else if (_stricmp(pszKey, SYSVAR_ACTIVETRACKINGCAMERA) == 0)
 	{
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent Key = %s, Value = %s.", pszKey, pszValue);
 		if (m_iCameraState == 'N'){
 			if (pszValue[0] == 'E'){
 				m_iActiveCamera = CAMERA_TYPE_ENV;

+ 2 - 1
Module/mod_recorder/recordinfo.cpp

@@ -71,7 +71,8 @@ int post_video_recordinfo_list(unsigned int& uposttime, CSimpleStringA& errormsg
 	unsigned int ustarttime = SP::Module::Comm::RVCGetTickCount();
 
 	RecordInfoHTTPRet ret;
-	if (client->Post(req, ret)) {
+	PROCESS_LINK_CONTEXT("LR0402312Record")
+	if (client->Post(req, ret, &nextLink)) {
 	/*	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("post result is %s, returnCode:%s, code:%s, errorMsg:%s, message:%s.",
 			ret.m_success ? "success" : "failed", ret.m_returnCode.c_str(), ret.m_code.c_str(), ret.m_errorMsg.c_str(), ret.m_message.c_str());*/
 		uposttime = SP::Module::Comm::RVCGetTickCount() - ustarttime;

+ 9 - 9
Module/mod_sipphone/Event.h

@@ -37,18 +37,18 @@
 
 //前端媒体错误
 	
-#define ERROR_MOD_SIP_AUDIO_INITFAIL					0x30180160	//音频初始化失败,级别3	
+#define ERROR_MOD_SIP_AUDIO_INITFAIL					0x30180160	 //音频初始化失败,级别3	
 
-#define ERROR_MOD_SIP_HANDFREE_OPENFAIL					0x30180161	//免提打开失败,级别3	
-#define ERROR_MOD_SIP_HANDFREE_NOSIGNAL					0x30180162  //免提没有信号,级别3	
-#define ERROR_MOD_SIP_HANDFREE_CLOSEFAIL				0x30180163  //禁止免提失败,级别3	
+#define ERROR_MOD_SIP_HANDFREE_OPENFAIL					0x30180161	 //免提打开失败,级别3	
+#define ERROR_MOD_SIP_HANDFREE_NOSIGNAL					0x30180162   //免提没有信号,级别3	
+#define ERROR_MOD_SIP_HANDFREE_CLOSEFAIL				0x30180163   //禁止免提失败,级别3	
 
-#define ERROR_MOD_SIP_PICKUP_OPENFAIL					0x30180166	//话筒打开失败,级别3	
-#define ERROR_MOD_SIP_PICKUP_NOSIGNAL					0x30180167  //话筒没有信号,级别3	
-#define ERROR_MOD_SIP_PICKUP_CLOSEFAIL					0x30180168  //禁止话筒失败,级别3	
+#define ERROR_MOD_SIP_PICKUP_OPENFAIL					0x30180166	 //话筒打开失败,级别3	
+#define ERROR_MOD_SIP_PICKUP_NOSIGNAL					0x30180167   //话筒没有信号,级别3	
+#define ERROR_MOD_SIP_PICKUP_CLOSEFAIL					0x30180168   //禁止话筒失败,级别3	
 
-#define ERROR_MOD_SIP_HANDFREE_ADDVOLUMNFAIL			0x30180170  //免提加强音量失败,级别2	
-#define ERROR_MOD_SIP_HANDFREE_REDUCEVOLUMNFAIL			0x30180171  //免提恢复音量失败,级别2
+#define ERROR_MOD_SIP_HANDFREE_ADDVOLUMNFAIL			0x30180170   //免提加强音量失败,级别2	
+#define ERROR_MOD_SIP_HANDFREE_REDUCEVOLUMNFAIL			0x30180171   //免提恢复音量失败,级别2
 
 #define EVENT_MOD_SIP_LOCAL_WINDOW_CREATE_FAILED		0x30190501	 //创建本地视频框失败
 #define EVENT_MOD_SIP_REMOTE_WINDOW_CREATE_FAILED		0x30190502   //创建远端视频框失败

+ 49 - 0
Module/mod_sipphone/SIPPhone_client_g.h

@@ -910,6 +910,55 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum StartBothCameraRender(PhoneService_StartBothCameraRender_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(PhoneService_Method_StartBothCameraRender, PhoneService_MethodSignature_StartBothCameraRender, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum StartBothCameraRender(PhoneService_StartBothCameraRender_Req &Req, PhoneService_StartBothCameraRender_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartBothCameraRender(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum StartBothCameraRender(PhoneService_StartBothCameraRender_Req &Req, PhoneService_StartBothCameraRender_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartBothCameraRender(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 StartBothCameraRender(PhoneService_StartBothCameraRender_Req &Req, PhoneService_StartBothCameraRender_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartBothCameraRender(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;
+	}
+
 
 	bool SafeDelete()
 	{

+ 32 - 0
Module/mod_sipphone/SIPPhone_def_g.h

@@ -43,6 +43,7 @@ namespace SIPPhone {
 #define PhoneService_Method_StartCameraRender 21
 #define PhoneService_Method_StopCameraRender 22
 #define PhoneService_Method_IsCameraRender 23
+#define PhoneService_Method_StartBothCameraRender 24
 
 #define PhoneService_MethodSignature_MakeCall -1045574280
 #define PhoneService_MethodSignature_HangupCall 507892508
@@ -68,6 +69,7 @@ namespace SIPPhone {
 #define PhoneService_MethodSignature_StartCameraRender -1962833445
 #define PhoneService_MethodSignature_StopCameraRender 6416978
 #define PhoneService_MethodSignature_IsCameraRender 325255993
+#define PhoneService_MethodSignature_StartBothCameraRender -1631336261
 
 #define PhoneService_LogCode_MakeCall "QLR040230100"
 #define PhoneService_LogCode_HangupCall "QLR040230101"
@@ -90,6 +92,7 @@ namespace SIPPhone {
 #define PhoneService_LogCode_StartCameraRender "QLR040230121"
 #define PhoneService_LogCode_StopCameraRender "QLR040230122"
 #define PhoneService_LogCode_IsCameraRender "QLR040230123"
+#define PhoneService_LogCode_StartBothCameraRender "QLR040230124"
 
 struct PhoneService_MakeCall_Req
 {
@@ -522,6 +525,35 @@ struct PhoneService_IsCameraRender_Ans
 
 };
 
+struct PhoneService_StartBothCameraRender_Req
+{
+	int env_view_x;
+	int env_view_y;
+	int env_view_cx;
+	int env_view_cy;
+	int opt_view_x;
+	int opt_view_y;
+	int opt_view_cx;
+	int opt_view_cy;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & env_view_x & env_view_y & env_view_cx & env_view_cy & opt_view_x & opt_view_y & opt_view_cx & opt_view_cy;
+	}
+
+};
+
+struct PhoneService_StartBothCameraRender_Ans
+{
+	int result;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & result;
+	}
+
+};
+
 
 ///////////////////////////
 

+ 27 - 0
Module/mod_sipphone/SIPPhone_server_g.h

@@ -191,6 +191,13 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case PhoneService_Method_StartBothCameraRender:
+			if (dwSignature == PhoneService_MethodSignature_StartBothCameraRender) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -317,6 +324,11 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case PhoneService_Method_StartBothCameraRender:
+			if (dwSignature != PhoneService_MethodSignature_StartBothCameraRender) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -439,6 +451,11 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_StartBothCameraRender(SpReqAnsContext<PhoneService_StartBothCameraRender_Req, PhoneService_StartBothCameraRender_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -681,6 +698,16 @@ public:
 						Handle_IsCameraRender(ctx);
 					}
 					break;
+				case PhoneService_Method_StartBothCameraRender:
+					{
+						SpReqAnsContext<PhoneService_StartBothCameraRender_Req,PhoneService_StartBothCameraRender_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<PhoneService_StartBothCameraRender_Req,PhoneService_StartBothCameraRender_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_StartBothCameraRender(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 15 - 0
Module/mod_sipphone/SipService.xml

@@ -172,6 +172,21 @@
         <param name="result" type="bool"/>
       </res>
     </twoway>
+    <twoway name="StartBothCameraRender" overlap="true" method_id="24">
+      <req>
+        <param name="env_view_x" type="int"/>
+        <param name="env_view_y" type="int"/>
+        <param name="env_view_cx" type="int"/>
+        <param name="env_view_cy" type="int"/>
+        <param name="opt_view_x" type="int"/>
+        <param name="opt_view_y" type="int"/>
+        <param name="opt_view_cx" type="int"/>
+        <param name="opt_view_cy" type="int"/>
+      </req>
+      <res>
+        <param name="result" type="int"/>
+      </res>
+    </twoway>
   </class>
 	<!-- ÊÓÆµ¿ò¿ªÊ¼Òƶ¯ÏûÏ¢ -->
 	<message name="VideoBoxStartMove">

+ 92 - 33
Module/mod_sipphone/mod_sipphone.cpp

@@ -115,22 +115,19 @@ static void __audiomgrlog(void* user_data, const char* fmt, va_list arg)
 }
 
 
-
 static void __video_render_log(render_loglevel elevel, void* user_data, const char* fmt, va_list arg)
 {
 	int n = rvc_vsnprintf(NULL, 0, fmt, arg);
-	if (elevel >= RENDER_LOG_INFO) {
-		if (n >= MAX_PATH) {
-			char* buf = (char*)malloc((size_t)(n + 1));
-			rvc_vsnprintf(buf, n + 1, fmt, arg);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", buf);
-			free(buf);
-		}
-		else {
-			char strlog[MAX_PATH] = { 0 };
-			rvc_vsnprintf(strlog, MAX_PATH, fmt, arg);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", strlog);
-		}
+	if (n >= MAX_PATH) {
+		char* buf = (char*)malloc((size_t)(n + 1));
+		rvc_vsnprintf(buf, n + 1, fmt, arg);
+		DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", buf);
+		free(buf);
+	}
+	else {
+		char strlog[MAX_PATH] = { 0 };
+		rvc_vsnprintf(strlog, MAX_PATH, fmt, arg);
+		DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", strlog);
 	}
 }
 
@@ -2451,7 +2448,7 @@ int CSIPEntity::StartCameraRender(int icamid, int ivideoview_x, int ivideoview_y
 	memcpy(&m_render->cb, &t_window_type_callback, sizeof(rvc_video_render_window_type_callback_t));
 	m_stVideoParam.bShowPersonArea = 0;
 
-	if (Error_Succeed == rvc_start_video_render(m_render, false, &t_render_callback)) {
+	if (Error_Succeed == rvc_start_video_render(m_render, eRender_Local_Single, &t_render_callback)) {
 		m_bIsCameraRender = true;
 	}
 
@@ -2475,16 +2472,9 @@ int CSIPEntity::StopCameraRender()
 		DestroyVideoRenderObj(m_render->plocal_render);
 	}
 
-#ifdef RVC_OS_WIN
-	if (NULL != m_render->local_render_stop_event) {
-		CloseHandle(m_render->local_render_stop_event);
-		m_render->local_render_stop_event = NULL;
-	}
-#else
-	if (NULL != &m_render->local_render_stop_sem) {
-		sem_destroy(&m_render->local_render_stop_sem);
+	if (NULL != m_render->premote_render) {
+		DestroyVideoRenderObj(m_render->premote_render);
 	}
-#endif // RVC_OS_WIN
 
 	if (NULL != m_render) {
 		delete(m_render);
@@ -2498,6 +2488,65 @@ int CSIPEntity::StopCameraRender()
 	return iRet;
 }
 
+int CSIPEntity::StartBothCameraRender(SpReqAnsContext<PhoneService_StartBothCameraRender_Req, PhoneService_StartBothCameraRender_Ans>::Pointer ctx)
+{
+	int iRet = -1;
+
+	if (m_bIsCameraRender) {
+		return iRet;
+	}
+
+	m_render = new rvc_video_render_t();
+	videorender_callback_t t_callback = { 0 };
+	t_callback.debug = &__video_render_log;
+	rvc_video_render_params_t render_param = { 0 };
+	render_param.ilocal_view_cx = ctx->Req.env_view_cx;
+	render_param.ilocal_view_cy = ctx->Req.env_view_cy;
+	render_param.ilocal_view_x = ctx->Req.env_view_x;
+	render_param.ilocal_view_y = ctx->Req.env_view_y;
+	render_param.iremote_view_cx = ctx->Req.opt_view_cx;
+	render_param.iremote_view_cy = ctx->Req.opt_view_cy;
+	render_param.iremote_view_x = ctx->Req.opt_view_x;
+	render_param.iremote_view_y = ctx->Req.opt_view_y;
+	render_param.erender_queue = eSnapshot_Queue;
+
+	m_render->plocal_render = CreateVideoRenderObj(&t_callback);
+	LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_LOCAL_VIDEO_RENDER_CREATE, "local video render create.");
+
+	m_render->premote_render = CreateVideoRenderObj(&t_callback);
+	LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_REMOTE_VIDEO_RENDER_CREATE, "remote video render create.");
+
+	memcpy(&m_render->render_param, &render_param, sizeof(rvc_video_render_params_t));
+
+#ifdef RVC_OS_WIN
+	m_render->local_render_stop_event = NULL;
+	m_render->remote_render_stop_event = NULL;
+	m_render->local_render_thread = NULL;
+	m_render->remote_render_thread = NULL;
+#else
+	m_render->local_render_threadid = 0;
+	m_render->remote_render_threadid = 0;
+#endif // RVC_OS_WIN
+
+	rvc_video_box_move_callback_t t_render_callback = { 0 };
+	t_render_callback.on_video_box_move = &__on_video_box_move;
+	t_render_callback.user_data = this;
+
+	rvc_video_render_window_type_callback_t t_window_type_callback = { 0 };
+	t_window_type_callback.on_window_type = &__on_window_type_callback;
+	t_window_type_callback.user_data = this;
+	memcpy(&m_render->cb, &t_window_type_callback, sizeof(rvc_video_render_window_type_callback_t));
+	m_stVideoParam.bShowPersonArea = 0;
+
+	if (Error_Succeed == rvc_start_video_render(m_render, eRender_Local_Both, &t_render_callback)) {
+		m_bIsCameraRender = true;
+	}
+
+	iRet = 0;
+
+	return iRet;
+}
+
 //
 // CSIPPhoneSession
 //
@@ -2848,6 +2897,18 @@ void CSIPPhoneSession::Handle_IsCameraRender(SpReqAnsContext<PhoneService_IsCame
 	ctx->Answer(Error_Succeed);
 }
 
+
+void CSIPPhoneSession::Handle_StartBothCameraRender(SpReqAnsContext<PhoneService_StartBothCameraRender_Req, PhoneService_StartBothCameraRender_Ans>::Pointer ctx)
+{
+#ifdef DEVOPS_ON_PRD
+#else
+	int iRet = m_pEntity->StartBothCameraRender(ctx);
+	ctx->Ans.result = iRet;
+#endif
+	ctx->Answer(Error_Succeed);
+}
+
+
 void CSIPPhoneSession::Handle_BeginState( SpSubscribeContext<PhoneService_BeginState_Sub, PhoneService_PhoneState_Info>::Pointer ctx )
 {
 	m_spCallbackContext = ctx;
@@ -3097,7 +3158,7 @@ void CSIPPhoneSession::control_video( ControlVideoCommand_t *pCmd)
 				render_param.iremote_fresh_time = pCmd->remote_fresh_time;
 				render_param.erender_queue = ePreview_Queue;
 
-				start_video_render(&render_param, false);
+				start_video_render(&render_param, eRender_Local_Single);
 			}
 		} 
 		else {
@@ -3149,7 +3210,7 @@ void CSIPPhoneSession::video_render(VideoRenderCommand_t* pCmd)
 		render_param.iremote_fresh_time = pCmd->remote_fresh_time;
 		render_param.erender_queue = ePreview_Queue;
 
-		start_video_render(&render_param, true);
+		start_video_render(&render_param, eRender_LocalRemote);
 	}
 	else {
 		stop_video_render();
@@ -3157,7 +3218,7 @@ void CSIPPhoneSession::video_render(VideoRenderCommand_t* pCmd)
 }
 
 
-int CSIPPhoneSession::start_video_render(rvc_video_render_params_t* render_param, bool bremote)
+int CSIPPhoneSession::start_video_render(rvc_video_render_params_t* render_param, eVideoRenderMode eMode)
 {
 	m_pEntity->m_render = new rvc_video_render_t();
 	videorender_callback_t t_callback = { 0 };
@@ -3183,7 +3244,7 @@ int CSIPPhoneSession::start_video_render(rvc_video_render_params_t* render_param
 	memcpy(&m_pEntity->m_render->cb, &t_window_type_callback, sizeof(rvc_video_render_window_type_callback_t));
 	m_pEntity->m_stVideoParam.bShowPersonArea = 0;
 
-	if (Error_Succeed != rvc_start_video_render(m_pEntity->m_render, bremote, &t_render_callback)) {
+	if (Error_Succeed != rvc_start_video_render(m_pEntity->m_render, eMode, &t_render_callback)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start video render failed!");
 	}
 
@@ -3195,15 +3256,13 @@ int CSIPPhoneSession::stop_video_render()
 	if (Error_Succeed != rvc_stop_video_render(m_pEntity->m_render)) {
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("stop video render failed.");
 	}
-	DestroyVideoRenderObj(m_pEntity->m_render->plocal_render);
-	DestroyVideoRenderObj(m_pEntity->m_render->premote_render);
 
-	if (NULL != &m_pEntity->m_render->local_render_stop_sem) {
-		sem_destroy(&m_pEntity->m_render->local_render_stop_sem);
+	if (NULL != m_pEntity->m_render->plocal_render) {
+		DestroyVideoRenderObj(m_pEntity->m_render->plocal_render);
 	}
 
-	if (NULL != &m_pEntity->m_render->remote_render_stop_sem) {
-		sem_destroy(&m_pEntity->m_render->remote_render_stop_sem);
+	if (NULL != m_pEntity->m_render->premote_render) {
+		DestroyVideoRenderObj(m_pEntity->m_render->premote_render);
 	}
 
 	delete(m_pEntity->m_render);

+ 3 - 1
Module/mod_sipphone/mod_sipphone.h

@@ -240,6 +240,7 @@ public:
 	virtual void Handle_StartCameraRender(SpReqAnsContext<PhoneService_StartCameraRender_Req, PhoneService_StartCameraRender_Ans>::Pointer ctx);
 	virtual void Handle_StopCameraRender(SpReqAnsContext<PhoneService_StopCameraRender_Req, PhoneService_StopCameraRender_Ans>::Pointer ctx);
 	virtual void Handle_IsCameraRender(SpReqAnsContext<PhoneService_IsCameraRender_Req, PhoneService_IsCameraRender_Ans>::Pointer ctx);
+	virtual void Handle_StartBothCameraRender(SpReqAnsContext<PhoneService_StartBothCameraRender_Req, PhoneService_StartBothCameraRender_Ans>::Pointer ctx);
 
 public:
 	void on_call_state(int state, const char *state_desc, const char *phrase);
@@ -253,7 +254,7 @@ public:
 
 #else
 	void video_render(VideoRenderCommand_t* pCmd);
-	int start_video_render(rvc_video_render_params_t* render_param, bool bremote);
+	int start_video_render(rvc_video_render_params_t* render_param, eVideoRenderMode eMode);
 	int stop_video_render();
 #endif //RVC_OS_WIN
 
@@ -325,6 +326,7 @@ public:
 	void HandleSendBroadcastMsg(bool bHandfreeError);
 	int StartCameraRender(int icamid, int ivideoview_x, int ivideoview_y, int ivideoview_cx, int ivideoview_cy);
 	int StopCameraRender();
+	int StartBothCameraRender(SpReqAnsContext<PhoneService_StartBothCameraRender_Req, PhoneService_StartBothCameraRender_Ans>::Pointer ctx);
 
 private:
 	ErrorCodeEnum LoadConfig(endpoint_conf_t *conf);

+ 2 - 2
Module/mod_sipphone/unix/video_session.cpp

@@ -1656,13 +1656,13 @@ static void __video_render_log(render_loglevel elevel, void* user_data, const ch
 	if (n >= MAX_PATH) {
 		char* buf = (char*)malloc((size_t)(n + 1));
 		vsnprintf(buf, n + 1, fmt, arg);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", buf);
+		DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", buf);
 		free(buf);
 	}
 	else {
 		char strlog[MAX_PATH] = { 0 };
 		vsnprintf(strlog, MAX_PATH, fmt, arg);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s", strlog);
+		DbgWithLink((LOG_LEVEL_E)elevel, LOG_TYPE_SYSTEM)("%s", strlog);
 	}
 }
 

+ 136 - 18
Module/mod_sipphone/video_render.cpp

@@ -75,13 +75,13 @@ static bool get_local_video_frame(video_frame** frame, int itype, Clibvideoqueue
 	videoq_frame frm;
 	frm.data = tmp_frame_preview->data[0];
 
-	static bool blog = true;
-	if (blog) {
-		int ivideo_width = 0;
-		int ivideo_height = 0;
-		int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
-		blog = false;
-	}
+	//static bool blog = true;
+	//if (blog) {
+	//	int ivideo_width = 0;
+	//	int ivideo_height = 0;
+	//	int isize = local_video_queue->GetFrameSize(ivideo_width, ivideo_height);
+	//	blog = false;
+	//}
 
 	result = local_video_queue->GetVideo(&frm, VIDEOQUEUE_FLAG_HORIZONTAL_FLIP);
 	if (result){
@@ -155,7 +155,6 @@ static int rvc_getrender_videoqueue(Clibvideoqueue** render_video_queue, int* re
 			*render_video_queue = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE);
 			*render_width = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
 			*render_height = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use sanpshot queue.");
 		}
 #ifdef RVC_OS_WIN
 		*renderflip = RVC_FLIP_HORIZONTAL;
@@ -171,9 +170,12 @@ static int rvc_getrender_videoqueue(Clibvideoqueue** render_video_queue, int* re
 			*render_video_queue = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE);
 			*render_width = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
 			*render_height = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use sanpshot queue.");
 		}
+#ifdef RVC_OS_WIN
 		*renderflip = RVC_FLIP_NONE;
+#else
+		*renderflip = RVC_FLIP_HORIZONTAL;
+#endif
 	}
 
 	iret = 0;
@@ -199,6 +201,36 @@ static int rvc_getrxkimage(IplImage** personimage, IplImage** personmask)
 }
 
 
+static int rvc_setrender_property(IVideoRender* pRender, rvc_video_render_params_t* param, bool blocal)
+{
+	int iret = -1;
+	if (NULL == pRender || NULL == param) {
+		return iret;
+	}
+
+	videorender_param_t tparam = { 0 };
+	if (blocal) {
+		tparam.icx = param->ilocal_view_x;
+		tparam.icy = param->ilocal_view_y;
+		tparam.uwidth = param->ilocal_view_cx;
+		tparam.uheight = param->ilocal_view_cy;
+	}
+	else {
+		tparam.icx = param->iremote_view_x;
+		tparam.icy = param->iremote_view_y;
+		tparam.uwidth = param->iremote_view_cx;
+		tparam.uheight = param->iremote_view_cy;
+	}
+
+	tparam.ivideoformat = VIDEO_FORMAT_RGB24;
+	if (0 == pRender->VideoRenderSetParam(&tparam)) {
+		pRender->HideVideoWindow();
+		iret = 0;
+	}
+
+	return iret;
+}
+
 #ifdef RVC_OS_WIN
 static unsigned int __stdcall rvc_videorender_func(void* arg)
 #else
@@ -333,7 +365,7 @@ static void* rvc_videorender_func(void* arg)
 }
 
 
-static int rvc_get_remote_videoframe(video_frame** remote_frame)
+static int rvc_get_agent_videoframe(video_frame** remote_frame)
 {
 	int iret = -1;
 
@@ -397,7 +429,7 @@ static void* rvc_remote_videorender_func(void* arg)
 	Clibvideoqueue* video_shm_q_remote = new Clibvideoqueue(REC_COMMON_VIDEO_REMOTE_SHM_RTP_QUEUE);
 
 	video_frame* remote_frame = NULL;
-	rvc_get_remote_videoframe(&remote_frame);
+	rvc_get_agent_videoframe(&remote_frame);
 
 	video_frame* showframe = NULL;
 	if (-1 == translate_image_resolution(&showframe, param->render_param.iremote_view_cx, param->render_param.iremote_view_cy, remote_frame)) {
@@ -447,7 +479,64 @@ static void* rvc_remote_videorender_func(void* arg)
 }
 
 
-int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_box_move_callback_t* cb)
+#ifdef RVC_OS_WIN
+static unsigned int __stdcall rvc_optcam_videorender_func(void* arg)
+#else
+static void* rvc_optcam_videorender_func(void* arg)
+#endif
+{	
+	rvc_video_render_t* param = (rvc_video_render_t*)arg;
+	int iremote_video_fresh_time = param->render_param.iremote_fresh_time;
+
+	Clibvideoqueue* local_optvideo_queue = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE);
+	int iwidth = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
+	int iheight = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
+	RVC_RendererFlip renderflip = RVC_FLIP_NONE;
+
+#ifdef RVC_OS_WIN
+#else
+	renderflip = RVC_FLIP_HORIZONTAL;
+#endif
+
+	for (; ; ) {
+#ifdef RVC_OS_WIN
+		DWORD dwRet = WaitForSingleObject(param->remote_render_stop_event, iremote_video_fresh_time);
+		if (WAIT_TIMEOUT == dwRet) {
+#else
+		struct timespec ts;
+		clock_gettime(CLOCK_REALTIME, &ts);
+		long unsec = ts.tv_nsec + (1000 * 1000 * iremote_video_fresh_time);
+		ts.tv_sec += (unsec / 1000000000);
+		ts.tv_nsec = (unsec % 1000000000);
+		if (0 != sem_timedwait(&param->remote_render_stop_sem, &ts) && (ETIMEDOUT == errno)) {
+#endif // RVC_OS_WIN
+			video_frame* local_video_frame = NULL;
+			get_local_video_frame(&local_video_frame, 0, local_optvideo_queue, iwidth, iheight, NULL, NULL);
+
+			if (NULL != local_video_frame) {
+				video_frame* localframe = NULL;
+				if (0 == translate_image_resolution(&localframe, param->render_param.iremote_view_cx, param->render_param.iremote_view_cy, local_video_frame)) {
+					param->premote_render->RenderVideoFrame(localframe, renderflip);
+					video_frame_delete(localframe);
+					localframe = NULL;
+				}
+				else {
+					param->premote_render->RenderVideoFrame(local_video_frame, renderflip);
+				}
+
+				video_frame_delete(local_video_frame);
+				local_video_frame = NULL;
+			}
+		}
+		else {
+			break;
+		}
+	}
+
+	return 0;
+}
+
+int rvc_start_video_render(rvc_video_render_t* prender, eVideoRenderMode eMode, rvc_video_box_move_callback_t* cb)
 {
 	int errcode = -1;
 	if (NULL == prender) {
@@ -467,14 +556,20 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
 		return Error_Resource;
 	}
 
-	if (bremote) {
+	if (eRender_LocalRemote == eMode || eRender_Local_Both == eMode) {
 		prender->remote_render_stop_event = CreateEventA(NULL, false, false, NULL);
-		if (NULL == prender->local_render_stop_event) {
+		if (NULL == prender->remote_render_stop_event) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote stop event failed!");
 			return Error_Resource;
 		}
 
-		prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_remote_videorender_func, prender, 0, NULL);
+		if (eRender_LocalRemote == eMode) {
+			prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_remote_videorender_func, prender, 0, NULL);
+		}
+		else {
+			prender->remote_render_thread = (HANDLE)_beginthreadex(NULL, 0, rvc_optcam_videorender_func, prender, 0, NULL);
+		}
+
 		if (NULL == prender->remote_render_thread) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
 			return Error_Resource;
@@ -493,13 +588,19 @@ int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_
 		return Error_Resource;
 	}
 
-	if (bremote) {
+	if (eRender_LocalRemote == eMode || eRender_Local_Both == eMode) {
 		if (0 != sem_init(&prender->remote_render_stop_sem, 0, 0)) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote stop sem failed!");
 			return Error_Resource;
 		}
 
-		errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
+		if (eRender_LocalRemote == eMode) {
+			errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_remote_videorender_func, prender);
+		}
+		else {
+			errcode = pthread_create(&prender->remote_render_threadid, NULL, rvc_optcam_videorender_func, prender);
+		}
+
 		if (Error_Succeed != errcode) {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create remote video render thread failed.");
 			return Error_Resource;
@@ -527,6 +628,11 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
 		CloseHandle(prender->local_render_thread);
 		prender->local_render_thread = NULL;
 	}
+
+	if (NULL != prender->local_render_stop_event) {
+		CloseHandle(prender->local_render_stop_event);
+		prender->local_render_stop_event = NULL;
+	}
 #else
 	sem_post(&prender->local_render_stop_sem);
 	rvc_stop_remote_video_render(prender);
@@ -538,6 +644,10 @@ int rvc_stop_video_render(rvc_video_render_t* prender)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render thread pthread join error for %s.", strerror(errno));
 		}
 	}
+
+	if (NULL != &prender->local_render_stop_sem) {
+		sem_destroy(&prender->local_render_stop_sem);
+	}
 #endif // RVC_OS_WIN
 
 	return Error_Succeed;
@@ -552,6 +662,10 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
 		CloseHandle(prender->remote_render_thread);
 		prender->remote_render_thread = NULL;
 	}
+	if (NULL != prender->remote_render_stop_event) {
+		CloseHandle(prender->remote_render_stop_event);
+		prender->remote_render_stop_event = NULL;
+	}
 #else
 	if (prender->remote_render_threadid > 0) {
 		sem_post(&prender->remote_render_stop_sem);
@@ -562,7 +676,11 @@ int rvc_stop_remote_video_render(rvc_video_render_t* prender)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render thread pthread join error for %s.", strerror(errno));
 		}
 	}
-#endif
 
+	if (NULL != &prender->remote_render_stop_sem) {
+		sem_destroy(&prender->remote_render_stop_sem);
+	}
+
+#endif
 	return Error_Succeed;
 }

+ 8 - 1
Module/mod_sipphone/video_render.h

@@ -26,6 +26,13 @@ enum eVideoRenderQueue {
 	eSnapshot_Queue
 };
 
+
+enum eVideoRenderMode {
+	eRender_Local_Single,
+	eRender_LocalRemote,
+	eRender_Local_Both
+};
+
 typedef struct rvc_video_box_move_callback_s {
 	void (*on_video_box_move)(int imessagetype, int ivideotype, int ileft, int ibottom, void* user_data);
 	void* user_data;
@@ -80,7 +87,7 @@ typedef struct rvc_video_render_s {
 }rvc_video_render_t;
 
 
-int rvc_start_video_render(rvc_video_render_t* prender, bool bremote, rvc_video_box_move_callback_t* cb);
+int rvc_start_video_render(rvc_video_render_t* prender, eVideoRenderMode eMode, rvc_video_box_move_callback_t* cb);
 int rvc_stop_video_render(rvc_video_render_t* prender);
 int rvc_remote_video_render(rvc_video_render_t* prender, void* videoframe);
 int rvc_stop_remote_video_render(rvc_video_render_t* prender);

+ 10 - 12
Module/mod_sipphone/win/video_session.cpp

@@ -1675,18 +1675,16 @@ static unsigned int __stdcall ui_proc(void *arg)
 static void __video_render_log(render_loglevel elevel, void* user_data, const char* fmt, va_list arg)
 {
 	int n = _vsnprintf(NULL, 0, fmt, arg);
-	if (elevel >= RENDER_LOG_INFO) {
-		if (n >= MAX_LOG_LEN) {
-			char* buf = (char*)malloc((size_t)(n + 1));
-			_vsnprintf(buf, n + 1, fmt, arg);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", buf);
-			free(buf);
-		}
-		else {
-			char strlog[MAX_LOG_LEN] = { 0 };
-			_vsnprintf(strlog, MAX_LOG_LEN, fmt, arg);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", strlog);
-		}
+	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_DEBUG, LOG_TYPE_SYSTEM)("%s", strlog);
 	}
 }
 

+ 1 - 1
Module/mod_snapshot/CMakeLists.txt

@@ -17,7 +17,7 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${CONAN_INCLUDE_DIRS_OPENCV}
     ${CONAN_INCLUDE_DIRS_OPENCV}/opencv
 	${OTHER_LIB_BASE_DIR}/libvideoqueue
-	${OTHER_LIB_PLATFORM_BASE_DIR}/libfacecapture
+	${OTHER_LIB_BASE_DIR}/libfacecapture
 	${OTHER_LIB_PLATFORM_BASE_DIR}/libbizchan
 	${OTHER_LIB_PLATFORM_BASE_DIR}/libvideoframework
 	${OTHER_LIB_BASE_DIR}/rvcmediacommon

+ 10 - 5
Module/mod_upload/UploadFSM.cpp

@@ -345,7 +345,8 @@ namespace Task
 			if (m_fsm->m_currUploadFile->lastMD5Str.length() != 0) {
 				LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_UPLOAD_FILE_INFO, CSimpleStringA::Format("upload %s file size is %s byte,sm3 digest is %s.", m_fsm->m_currUploadFile->fileName.c_str(), lastFileLength.c_str(), m_fsm->m_currUploadFile->lastMD5Str.c_str()).GetData());
 			}
-			if (!client->UploadFileBlock(qTempReq, qTempRet)) {
+			PROCESS_LINK_CONTEXT("LR0402104UploadFile")
+			if (!client->UploadFileBlock(qTempReq, qTempRet, &nextLink)) {
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uploadFile http req fail ,url =%s ,fileName = %s",httpUrl.c_str(), m_fsm->m_currUploadFile->fileName.c_str());
 				return false;
 			}
@@ -404,7 +405,8 @@ namespace Task
 			//qTempReq.m_printDbg = true;
 			qTempReq.m_url=m_fsm->m_centerUrl.queryTempFileUrl;//访问地址
 
-			if(!client->Post(qTempReq, qTempRet)){
+			PROCESS_LINK_CONTEXT("LR0402104QueryTempFile")
+			if(!client->Post(qTempReq, qTempRet, &nextLink)){
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("queryTempFile http req fail ,fileName = %s, err=%s",m_fsm->m_currUploadFile->filePath.c_str(),qTempRet.m_errMsg.c_str());
 				return false;
 			}
@@ -472,7 +474,8 @@ namespace Task
 			updateStateReq.m_reqStr = jsonReq;//请求参数
 			updateStateReq.m_url=m_fsm->m_centerUrl.updateStateUrl;//访问地址
 
-			if(!client->Post(updateStateReq, updateStateRet)){
+			PROCESS_LINK_CONTEXT("LR0402104UpdateState")
+			if(!client->Post(updateStateReq, updateStateRet, &nextLink)){
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("updateState is fail, userCode = %s, errmsg = %s",updateStateRet.m_userCode.c_str(), updateStateRet.m_errMsg.c_str());
 				errmsg = CSimpleStringA::Format("updateState is fail, userCode = %s, errmsg = %s",updateStateRet.m_userCode.c_str(), updateStateRet.m_errMsg.c_str());
 				return false;
@@ -534,7 +537,8 @@ namespace Task
 			updateFailReq.m_reqStr = jsonReq;//请求参数
 			updateFailReq.m_url = m_fsm->m_centerUrl.addUploadFailUrl;//访问地址
 
-			if(!client->Post(updateFailReq, updateFailRet)){
+			PROCESS_LINK_CONTEXT("LR0402104UpdateFail")
+			if(!client->Post(updateFailReq, updateFailRet, &nextLink)){
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("addUploadFail is fail,userCode = %s",updateFailRet.m_userCode.c_str());
 				return false;
 			}
@@ -1272,7 +1276,8 @@ bool UploadFSM::queryPlan()
 	//planReq.m_printDbg = true;
 	planReq.m_url = m_centerUrl.queryPlanUrl.c_str();
 
-	if(!client->Post(planReq, planRet)){
+	PROCESS_LINK_CONTEXT("LR0402104QueryPlan")
+	if(!client->Post(planReq, planRet, &nextLink)){
 		LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_UPLOAD_QUERY_PLAN_ERROR, CSimpleStringA::Format("queryPlan http req fail,url is %s, err=%s",m_centerUrl.queryPlanUrl.c_str(),planRet.m_errMsg.c_str()).GetData());
 		client->Destory();
 		return false;//http错误,走旧模式

+ 1 - 0
Other/CMakeLists.txt

@@ -42,6 +42,7 @@ add_subdirectory(libaudions)
 add_subdirectory(libvideorender)
 add_subdirectory(libvideorecord)
 add_subdirectory(libsharememory)
+add_subdirectory(libfacecapture)
 
 if(MSVC)
    add_subdirectory(win)

+ 2 - 1
Other/libRestfulFunc/RestfulFunc.h

@@ -25,6 +25,7 @@
 #include <map>
 #include <vector>
 #include <sstream>
+#include "httpTrace_define.hpp"
 
 /*
 * > 0 : 网站返回的错误码,比如 200,404 等
@@ -291,7 +292,7 @@ public:
     static RestfulClient& getInstance(); // Singleton
     ~RestfulClient();
 
-    void Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse) const;
+    void Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse, HttpClientTraceLink* pTrace) const;
 
 private:
     RestfulClient();

+ 15 - 1
Other/libRestfulFunc/RestfulFuncImpl.cpp

@@ -159,7 +159,7 @@ namespace
     }
 }
 
-void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse) const
+void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, HttpClientResponseResult* pResponse, HttpClientTraceLink* pTrace) const
 {
 	http_client_config config;
 	config.set_validate_certificates(pRequestConfig->NeedValidCert());
@@ -189,6 +189,20 @@ void RestfulClient::Do(const HttpClientRequestConfig* const pRequestConfig, Http
 		request.headers().add(STRW("terminalno"), STRW(terminalno));
 	}
 
+	if (pTrace != NULL
+		&& strlen(pTrace->X_B3_BusinessId) > 0
+		&& strlen(pTrace->X_B3_TraceId) > 0
+		&& strlen(pTrace->X_B3_SpanId) > 0
+		&& strlen(pTrace->X_B3_ParentSpanId) > 0
+		&& strlen(pTrace->X_B3_Timestamp) > 0)
+	{
+		request.headers().add(STRW("X_B3_BusinessId"), STRW(pTrace->X_B3_BusinessId));
+		request.headers().add(STRW("X_B3_TraceId"), STRW(pTrace->X_B3_BusinessId));
+		request.headers().add(STRW("X_B3_SpanId"), STRW(pTrace->X_B3_BusinessId));
+		request.headers().add(STRW("X_B3_ParentSpanId"), STRW(pTrace->X_B3_BusinessId));
+		request.headers().add(STRW("X_B3_Timestamp"), STRW(pTrace->X_B3_BusinessId));
+	}
+
 	if (pRequestConfig->GetRequestType() != HttpRequestMethod::GET) {
 		request.set_body(STRW(pRequestConfig->GetBodyContent()), STRW(pRequestConfig->GetContentType()));
 	}

+ 4 - 4
Other/libRestfulFunc/test/testNormlReqAns.cpp

@@ -8,7 +8,7 @@ TEST_CASE("test api manage", "[restful]")
     HttpClientResponseResult result;
     config.SetChildUri("/api/manage/regist/7555980103");
     RestfulClient client = RestfulClient::getInstance();
-    client.Do(&config, &result);
+    client.Do(&config, &result,NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }
@@ -20,7 +20,7 @@ TEST_CASE("test  api stage get api", "[restful]")
     config.SetChildUri("/api/stage");
     config.AppendQuery("terminalNo", "7555980001");
     RestfulClient client = RestfulClient::getInstance();
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }
@@ -33,7 +33,7 @@ TEST_CASE("test  api stage post api", "[restful]")
     config.SetJsonBody("{\"terminalNo\":\"7555980001\", \"errEntityList\":\"566666\"}");
     RestfulClient client = RestfulClient::getInstance();
     HttpClientResponseResult result;
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }
@@ -47,7 +47,7 @@ TEST_CASE("test  api stage upload api", "[restful]")
     RestfulClient client = RestfulClient::getInstance();
     HttpClientResponseResult result;
     config.PreDo();
-    client.Do(&config, &result);
+    client.Do(&config, &result, NULL);
     std::cout << result.content << std::endl;
     REQUIRE(!result.content.empty());
 }

+ 26 - 21
Other/unix/libfacecapture/CMakeLists.txt → Other/libfacecapture/CMakeLists.txt

@@ -1,7 +1,11 @@
 set(MODULE_NAME "libfacecapture")
 set(MODULE_PREFIX "LIB_FACECAPTURE_FUNC")
 
-
+if(MSVC)
+set(CUSTOM_OPENCV_INCLUDES_DIR ${CONAN_INCLUDE_DIRS_OPENCV})
+set(CUSTOM_OPENCV_LIBS_DIR ${CONAN_LIB_DIRS_OPENCV})
+set(CUSTOM_OPENCV_LIBS ${CONAN_LIBS_OPENCV})
+else(MSVC)
 if(RVC_DEBUG_MODE)
     set(OPENCV_DYNAMIC_LIBS 
 	opencv_calib3d 
@@ -35,6 +39,7 @@ else()
 	opencv_videostab
 	)
 endif(RVC_DEBUG_MODE)
+endif(MSVC)
 
 set(${MODULE_PREFIX}_SRCS
 	libfacecapture.cpp
@@ -43,22 +48,28 @@ set(${MODULE_PREFIX}_SRCS
 
 add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
 
-
-
+if(MSVC)
+target_include_directories(${MODULE_NAME} PRIVATE
+    ${RVC_COMMON_INCLUDE_DIR}
+    ${OTHER_LIB_BASE_DIR}/libvideoqueue
+    ${CUSTOM_OPENCV_INCLUDES_DIR}
+    ${CUSTOM_OPENCV_INCLUDES_DIR}/opencv
+    )
+else(MSVC)
 target_include_directories(${MODULE_NAME} PRIVATE
-	${RVC_COMMON_INCLUDE_DIR}
-	${RVC_WINPR_INCLUDE_DIR}
+    ${RVC_COMMON_INCLUDE_DIR}
     ${OTHER_LIB_BASE_DIR}/libvideoqueue
     ${CONAN_INCLUDE_DIRS_OPENCV}
     ${CONAN_INCLUDE_DIRS_OPENCV}/opencv
     )
+endif(MSVC)
 
 target_compile_definitions(${MODULE_NAME} PUBLIC "LIBFACECAPTURE_EXPORTS")
 
 # 添加需要依赖的其他共享库(包括系统库)
 if(MSVC)
 target_link_directories(${MODULE_NAME} PRIVATE
-	${CONAN_LIB_DIRS_OPENCV}
+	${CUSTOM_OPENCV_LIBS_DIR}
 	)
 else(MSVC)
 target_link_directories(${MODULE_NAME} PRIVATE
@@ -66,26 +77,20 @@ target_link_directories(${MODULE_NAME} PRIVATE
 	)
 endif(MSVC)	
 
-
+if(MSVC)
 target_link_libraries(${MODULE_NAME} PRIVATE ${${MODULE_PREFIX}_LIBS}
     videoqueue
-	${OPENCV_DYNAMIC_LIBS}
+	${CUSTOM_OPENCV_LIBS}
+	)
+else(MSVC)
+target_link_libraries(${MODULE_NAME} PRIVATE ${${MODULE_PREFIX}_LIBS}
+	videoqueue
+    ${OPENCV_DYNAMIC_LIBS}
 	)
-
-if(MSVC)
-	install(TARGETS ${MODULE_NAME} 
-    RUNTIME DESTINATION "${RVC_RUNTIME_PATH}" COMPONENT libraries
-    ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT develops EXCLUDE_FROM_ALL
-    LIBRARY DESTINATION "${RVC_LIBRARY_PATH}" COMPONENT libraries
-    )
-else()
-install(TARGETS ${MODULE_NAME} 
-    RUNTIME DESTINATION "${RVC_RUNTIME_PATH}"
-    ARCHIVE DESTINATION "${RVC_LIBRARY_PATH}"
-    LIBRARY DESTINATION "${RVC_RUNTIME_PATH}"
-    COMPONENT libraries)
 endif(MSVC)
 
+deploy_others(${MODULE_PREFIX} ${MODULE_NAME})
+
 
 # 设置要依赖拷贝的第三方库
 if(MSVC)

+ 0 - 0
Other/unix/libfacecapture/ReadMe.txt → Other/libfacecapture/ReadMe.txt


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 335 - 409
Other/libfacecapture/libfacecapture.cpp


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.