Browse Source

!10552 st2分支合并到hash分支
Merge pull request !10552 from 80174520/ST2

刘文涛80174520 11 months ago
parent
commit
cb3bc66db7
63 changed files with 2351 additions and 834 deletions
  1. 3 0
      DevAdapter/CMakeLists.txt
  2. 20 5
      Framework/spbase/sp_httpDefine.cpp
  3. 1 1
      Module/mod_HSPScanner/HSPScannerFSM.h
  4. 160 113
      Module/mod_IDCertificate/IDCertFSM.cpp
  5. 2 0
      Module/mod_IDCertificate/IDCertFSM.h
  6. 6 0
      Module/mod_IDCertificate/IDCertificate_UserErrorCode.h
  7. 178 64
      Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp
  8. 0 1
      Module/mod_SalesRecorder/Event.h
  9. 2 1
      Module/mod_SalesRecorder/mod_SalesRecorder.cpp
  10. 2 2
      Module/mod_assistantchannel/VideoDesc.h
  11. 4 4
      Module/mod_chromium/baseEx.cpp
  12. 10 2
      Module/mod_chromium/baseEx.h
  13. 43 6
      Module/mod_chromium/mod_chromium.cpp
  14. 29 28
      Module/mod_counterconnector/ConnectorFSM.cpp
  15. 6 43
      Module/mod_counterconnector/Event.h
  16. 15 66
      Module/mod_counterconnector/mod_counterconnector.cpp
  17. 0 2
      Module/mod_counterconnector/mod_counterconnector.h
  18. 0 3
      Module/mod_customeraware/Event.h
  19. 1 0
      Module/mod_customeraware/mod_customeraware.cpp
  20. 21 0
      Module/mod_evtconverter/Event.h
  21. 1 104
      Module/mod_healthmanager/HealthManagerFSM.cpp
  22. 3 34
      Module/mod_healthmanager/HealthManagerFSM.h
  23. 2 1
      Module/mod_initiativetransfer/CMakeLists.txt
  24. 3 0
      Module/mod_initiativetransfer/Event.h
  25. 3 5
      Module/mod_initiativetransfer/mod_initiativetransfer.cpp
  26. 5 8
      Module/mod_interactivecontrol/Event.h
  27. 17 0
      Module/mod_interactivecontrol/InteractiveControl.xml
  28. 98 0
      Module/mod_interactivecontrol/InteractiveControl_client_g.h
  29. 46 0
      Module/mod_interactivecontrol/InteractiveControl_def_g.h
  30. 15 0
      Module/mod_interactivecontrol/InteractiveControl_msg_g.h
  31. 54 0
      Module/mod_interactivecontrol/InteractiveControl_server_g.h
  32. 94 5
      Module/mod_interactivecontrol/mod_interactivecontrol.cpp
  33. 31 1
      Module/mod_interactivecontrol/mod_interactivecontrol.h
  34. 4 7
      Module/mod_mediacontroller/Event.h
  35. 245 0
      Module/mod_mediacontroller/MediaController_client_g.h
  36. 121 2
      Module/mod_mediacontroller/MediaController_def_g.h
  37. 15 0
      Module/mod_mediacontroller/MediaController_msg_g.h
  38. 135 0
      Module/mod_mediacontroller/MediaController_server_g.h
  39. 76 33
      Module/mod_mediacontroller/MediaService.xml
  40. 89 13
      Module/mod_mediacontroller/capture.cpp
  41. 21 4
      Module/mod_mediacontroller/capture.h
  42. 379 25
      Module/mod_mediacontroller/mod_mediacontroller.cpp
  43. 30 2
      Module/mod_mediacontroller/mod_mediacontroller.h
  44. 31 1
      Module/mod_recorder/mod_recorder.cpp
  45. 1 34
      Module/mod_sipphone/Event.h
  46. 14 14
      Module/mod_sipphone/audio_session.cpp
  47. 11 19
      Module/mod_sipphone/endpoint.cpp
  48. 117 34
      Module/mod_sipphone/mod_sipphone.cpp
  49. 4 2
      Module/mod_sipphone/mod_sipphone.h
  50. 0 4
      Module/mod_sipphone/unix/video_session.cpp
  51. 0 4
      Module/mod_sipphone/uuid.cpp
  52. 16 4
      Module/mod_sipphone/video_render.cpp
  53. 1 0
      Module/mod_sipphone/video_render.h
  54. 49 51
      Module/mod_snapshot/mod_snapshot.cpp
  55. 7 1
      Module/mod_vtmloader/VtmLoaderFSM.cpp
  56. 2 1
      Module/mod_vtmloader/VtmLoader_UserCode.h
  57. 1 1
      Other/libaudiomgr/linux/libaudiomgr_linux.cpp
  58. 58 57
      Other/libsharememory/libsharememory.cpp
  59. 2 2
      Other/libvideorecord/libvideorecord_impl.cpp
  60. 1 1
      Other/libvideorecord/libvideorecord_impl.h
  61. 4 3
      Other/unix/libvideocapture/ivideocaptureinterface.h
  62. 39 14
      Other/unix/libvideocapture/linux/videocapture_linux.cpp
  63. 3 2
      Other/unix/libvideocapture/linux/videocapture_linux.h

+ 3 - 0
DevAdapter/CMakeLists.txt

@@ -281,12 +281,15 @@ if(DEVADAPTER_USING_CONAN)
             set(NANTIAN_CONAN_ALL_LIB_NAME nantian/2024.0802.2@LR04.02_VendorLib/stable)
             #Fw: 单屏VTM最新版本链接
             set(GRG_CONAN_ALL_LIB_NAME grg/2024.0913.45@LR04.02_VendorLib/stable)
+            #根据开发规范适配器与依赖库简称由【CBPM】变更为【cbpm】案例自测完成
+            set(CBPM_CONAN_ALL_LIB_NAME cbpm/2024.1101.10@LR04.02_VendorLib/stable)
             rvc_aggerate_vendor_libs(keba)
             rvc_aggerate_vendor_libs(cw)
             rvc_aggerate_vendor_libs(szzt)
             rvc_aggerate_vendor_libs(gwi)
             rvc_aggerate_vendor_libs(nantian)
             rvc_aggerate_vendor_libs(grg)
+            rvc_aggerate_vendor_libs(cbpm)
         endif(RVC_INTEGRATE_BUILDV2)
     endif(MSVC)
 

+ 20 - 5
Framework/spbase/sp_httpDefine.cpp

@@ -15,6 +15,18 @@
 #define QUERY_TERMINAL_MAX_WAIT_TIME 10000
 
 
+std::string trim(const std::string& str) {
+	size_t first = str.find_first_not_of(' ');
+	size_t last = str.find_last_not_of(' ');
+
+	// 如果字符串全是空白字符或为空,则返回空字符串
+	if (first == std::string::npos || last == std::string::npos || first > last) {
+		return "";
+	}
+
+	return str.substr(first, (last - first + 1));
+}
+
 CAutoArray<CSimpleString> generateUrlArr(CSimpleString url, CSimpleString appendStr)
 {
 	auto urlArr = url.Split('|');
@@ -599,7 +611,7 @@ std::pair<bool, std::string> refreshToken(std::string terminalNo, std::string in
 	return std::make_pair(false, "");
 }
 
-std::pair<bool, VTMErrMsgCfgRet> GetVTMErrMsgCfgFromUrl(CSimpleString url, const std::string& terminalNo)
+std::pair<bool, VTMErrMsgCfgRet> GetVTMErrMsgCfgFromUrl(CSimpleString url, const std::string& t_terminalNo)
 {
 	bool ret = false;
 	VTMErrMsgCfgRet dst;
@@ -614,10 +626,11 @@ std::pair<bool, VTMErrMsgCfgRet> GetVTMErrMsgCfgFromUrl(CSimpleString url, const
 	static std::vector<VTMErrMsgCfgReq> reqArr;
 	reqArr.clear();	//每次需清理,避免多次范文
 
+	std::string terminalNo = trim(t_terminalNo);
 	for (int i = 0; i < urlArr.GetCount(); i++)
 	{
 		auto curUrl = urlArr[i];
-		if (curUrl.GetLength() == 0)
+		if (curUrl.GetLength() == 0 || terminalNo.length() == 0)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetVTMErrMsgCfgFromUrl::urlArr may be wrong, pos:%d, %s", i, url.GetData());
 			continue;
@@ -681,7 +694,7 @@ std::pair<bool, VTMErrMsgCfgRet> GetVTMErrMsgCfgFromUrl(CSimpleString url, const
 
 
 
-std::pair<bool, TerminalCfgRet> GetTerminalCfgFromUrl(CSimpleString url, const std::string& terminalNo,
+std::pair<bool, TerminalCfgRet> GetTerminalCfgFromUrl(CSimpleString url, const std::string& t_terminalNo,
 	const std::string& center_version, const std::string& root_version, const std::string& shell_version,
 	const std::map<std::string, std::map<std::string, std::string>>& tmp_centerConfig,
 	const std::map<std::string, std::map<std::string, std::string>>& tmp_rootConfig,
@@ -698,6 +711,7 @@ std::pair<bool, TerminalCfgRet> GetTerminalCfgFromUrl(CSimpleString url, const s
 	static std::vector<TerminalCfgReq> reqArr;
 	reqArr.clear();	//每次需清理,避免多次范文
 
+	std::string terminalNo = trim(t_terminalNo);
 	for (int i = 0; i < urlArr.GetCount(); i++)
 	{
 		auto curUrl = urlArr[i];
@@ -765,7 +779,7 @@ DWORD uploadTerminalVersionThread(LPVOID param)
 }
 
 
-bool UploadTerminalVersionFromUrl(CSimpleString url, std::string terminalNo, std::string center_config_version, std::string root_config_version,
+bool UploadTerminalVersionFromUrl(CSimpleString url, std::string t_terminalNo, std::string center_config_version, std::string root_config_version,
 	std::string shell_config_version)
 {
 	bool ret = false;
@@ -789,10 +803,11 @@ bool UploadTerminalVersionFromUrl(CSimpleString url, std::string terminalNo, std
 		return local_time_str;
 	};
 
+	std::string terminalNo = trim(t_terminalNo);
 	for (int i = 0; i < urlArr.GetCount(); i++)
 	{
 		auto curUrl = urlArr[i];
-		if (curUrl.GetLength() == 0)
+		if (curUrl.GetLength() == 0 || terminalNo.length() == 0)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("UploadTerminalVersionFromUrl::urlArr may be wrong, pos:%d, %s", i, url.GetData());
 			continue;

+ 1 - 1
Module/mod_HSPScanner/HSPScannerFSM.h

@@ -503,7 +503,7 @@ struct SetPropertyInPreviewTask : public ITaskSp
 			m_ctx->Answer(eRet);
 		}
 		else {
-			m_ctx->Answer(eRet, m_fsm->GetCustLastErrorCode());
+			m_ctx->Answer(eRet, m_fsm->GetLastUserCode());
 			pEvt->param1 = 1;
 		}
 		m_fsm->PostEventFIFO(pEvt);

+ 160 - 113
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -810,59 +810,61 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 					memcpy(ctx->Ans.reserved_utf8.m_pData, reserved, strlen((char*)reserved)); //新外国人永居证关联字段
 					memcpy(ctx->Ans.othercode_utf8.m_pData, englishNameEx, strlen((char*)englishNameEx)); //英文名备用字段
 
-					m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
-					eErr = m_hDevHelper->ScanIDAndSaveImage();
-					m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-					if (eErr == Error_Succeed)
-					{
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)
-							("ReadAndScanUTF8 ScanIDAndSaveImage succeed.");
-					}
-					else
-					{
-						if(eErr != Error_NotImpl)
-						SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
-							false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
-					}
-					ctx->Ans.hasscan = 0;
+					GetPngBlobEx(ctx->Ans.headphoto, "zp"); //转换头像图片
 
-					if (eErr == Error_Succeed)
+					ctx->Ans.hasscan = 0;
+					if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能
 					{
-						transImgMsg.Clear();
-
-						//idfront.bmp" and "idback.bmp
-						ErrorCodeEnum eErrFront, eErrBack;
-						eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
-						eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback", true);
-						if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
+						m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
+						eErr = m_hDevHelper->ScanIDAndSaveImage();
+						m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
+						if (eErr == Error_Succeed)
 						{
-							ctx->Ans.hasscan = 1;
-#ifdef RVC_OS_WIN
-							if (!closeImgCheck)
-							{
-								ImgChekTask* frontImgCheck = new ImgChekTask(this);
-								frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
-								frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
-								frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
-								frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
-								frontImgCheck->imgInput = ctx->Ans.frontphoto;
-								frontImgCheck->imgType = "正面";
-								GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck);
-
-								ImgChekTask* backImgCheck = new ImgChekTask(this);
-								backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
-								backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
-								backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
-								backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
-								backImgCheck->imgInput = ctx->Ans.backphoto;
-								frontImgCheck->imgType = "背面";
-								GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck);
-							}
-#endif
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)
+								("ReadAndScanUTF8 ScanIDAndSaveImage succeed.");
 						}
 						else
 						{
-							if (igestionVer == TRUE)
+							if (eErr != Error_NotImpl)
+								SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
+									false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
+						}
+
+						if (eErr == Error_Succeed)
+						{
+							transImgMsg.Clear();
+
+							//idfront.bmp" and "idback.bmp
+							ErrorCodeEnum eErrFront, eErrBack;
+							eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
+							eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback", true);
+							if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
+							{
+								ctx->Ans.hasscan = 1;
+#ifdef RVC_OS_WIN
+								if (!closeImgCheck)
+								{
+									ImgChekTask* frontImgCheck = new ImgChekTask(this);
+									frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
+									frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
+									frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
+									frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
+									frontImgCheck->imgInput = ctx->Ans.frontphoto;
+									frontImgCheck->imgType = "正面";
+									GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck);
+
+									ImgChekTask* backImgCheck = new ImgChekTask(this);
+									backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
+									backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
+									backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
+									backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
+									backImgCheck->imgInput = ctx->Ans.backphoto;
+									frontImgCheck->imgType = "背面";
+									GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck);
+								}
+#endif
+							}
+							else
 							{
 								CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed.";
 								if (transImgMsg.GetLength() != 0)
@@ -874,7 +876,6 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 							}
 						}
 					}
-					GetPngBlobEx(ctx->Ans.headphoto, "zp");
 
 #ifdef RVC_OS_WIN
 					CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s"
@@ -946,10 +947,12 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 						SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
 							false, m_ullEndTime - m_ullBeginTime);
 					}
+
+					CheckEjectCardRes(eErr1, errEject);
 				}
 				else
 				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ.");
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ.");
 				}
 				break;
 			case 0:
@@ -994,7 +997,7 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 		if (errRf != Error_Succeed)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
-			SetErrorAndLog(errRf, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
+			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();
@@ -1007,10 +1010,12 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 				SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
 					false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
 			}
+
+			CheckEjectCardRes(errRf, errEject);
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ.");
 		}
 	}
 
@@ -1037,7 +1042,7 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 		}
 		else if (!bOpenRF)
 		{
-			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
+			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));
 
@@ -1139,8 +1144,8 @@ 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::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)
-				("RreadAndScanUTF8JS DevAdapter::IDCerRFControl");
+			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.");
@@ -1359,63 +1364,61 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 					memcpy(ctx->Ans.reserved_utf8.m_pData, reserved, strlen((char*)reserved)); //新外国人永居证关联字段
 					memcpy(ctx->Ans.othercode_utf8.m_pData, englishNameEx, strlen((char*)englishNameEx)); //英文名备用字段
 
-					m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
-					eErr = m_hDevHelper->ScanIDAndSaveImage();
-					m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
-					if (eErr == Error_Succeed)
-					{
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)
-							("ReadAndScanUTF8JS ScanIDAndSaveImage succeed.");
-					}
-					else
-					{
-						SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
-							false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
-
-						DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage")
-							.setCostTime(m_ullEndTime - m_ullBeginTime)
-							.setResultCode("RTA210C")
-							("ReadAndScanUTF8JS::ScanIDAndSaveImage failed with errCode 0x%x", eErr);
-					}
 					ctx->Ans.hasscan = 0;
+					GetPngBlobEx(ctx->Ans.headphoto, "zp", true); //转换头像图片
 
-					if (eErr == Error_Succeed)
+					if (igestionVer == TRUE)//吸入式设备才调用正反扫描功能
 					{
-						transImgMsg.Clear();
-
-						//idfront.bmp" and "idback.bmp
-						ErrorCodeEnum eErrFront, eErrBack;
-						eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
-						eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback", true);
-						if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
+						m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
+						eErr = m_hDevHelper->ScanIDAndSaveImage();
+						m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
+						if (eErr == Error_Succeed)
 						{
-							ctx->Ans.hasscan = 1;
-#ifdef RVC_OS_WIN
-							if (!closeImgCheck)
-							{
-								ImgChekTask* frontImgCheck = new ImgChekTask(this);
-								frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
-								frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
-								frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
-								frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
-								frontImgCheck->imgInput = ctx->Ans.frontphoto;
-								frontImgCheck->imgType = "正面";
-								GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck);
-
-								ImgChekTask* backImgCheck = new ImgChekTask(this);
-								backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
-								backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
-								backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
-								backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
-								backImgCheck->imgInput = ctx->Ans.backphoto;
-								frontImgCheck->imgType = "背面";
-								GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck);
-							}
-#endif
+							DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)
+								("ReadAndScanUTF8JS ScanIDAndSaveImage succeed.");
 						}
 						else
 						{
-							if (igestionVer == TRUE)
+							if(eErr != Error_NotImpl)
+							SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
+								false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
+						}
+
+						if (eErr == Error_Succeed)
+						{
+							transImgMsg.Clear();
+
+							//idfront.bmp" and "idback.bmp
+							ErrorCodeEnum eErrFront, eErrBack;
+							eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
+							eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback", true);
+							if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
+							{
+								ctx->Ans.hasscan = 1;
+#ifdef RVC_OS_WIN
+								if (!closeImgCheck)
+								{
+									ImgChekTask* frontImgCheck = new ImgChekTask(this);
+									frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
+									frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
+									frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
+									frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
+									frontImgCheck->imgInput = ctx->Ans.frontphoto;
+									frontImgCheck->imgType = "正面";
+									GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck);
+
+									ImgChekTask* backImgCheck = new ImgChekTask(this);
+									backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
+									backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
+									backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
+									backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
+									backImgCheck->imgInput = ctx->Ans.backphoto;
+									frontImgCheck->imgType = "背面";
+									GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck);
+								}
+#endif
+							}
+							else
 							{
 								CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed.";
 								if (transImgMsg.GetLength() != 0)
@@ -1427,7 +1430,6 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 							}
 						}
 					}
-					GetPngBlobEx(ctx->Ans.headphoto, "zp", true);
 
 #ifdef RVC_OS_WIN
 					CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s"
@@ -1459,7 +1461,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 
 	if (!m_bExit && !bOpenRF && errRfOpen != Error_Succeed)
 	{
-		SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
+		SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__,
 			true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)
@@ -1496,7 +1498,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 				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__,
+					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();
@@ -1506,12 +1508,12 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 					if (errEject != Error_Succeed)
 					{
 						SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
-							true, m_ullEndTime - m_ullBeginTime);
+							false, m_ullEndTime - m_ullBeginTime);
 					}
 				}
 				else
 				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ.");
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ.");
 				}
 				break;
 			case 0:
@@ -1562,7 +1564,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		if (errRfClose != Error_Succeed)
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject...");
-			SetErrorAndLog(errRfClose, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
+			SetErrorAndLog(errRfClose, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__,
 				false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 
 			m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
@@ -1574,12 +1576,12 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 			if (errEject != Error_Succeed)
 			{
 				SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__,
-					true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
+					false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
 			}
 		}
 		else
 		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ.");
 		}
 	}
 
@@ -1605,7 +1607,7 @@ int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req,
 		}
 		else if (!bOpenRF)
 		{
-			SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
+			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));
 
@@ -2256,6 +2258,51 @@ void CIDCertFSM::CheckHanZi(UINT16* ucs2_code)
 	}
 }
 
+void CIDCertFSM::CheckEjectCardRes(ErrorCodeEnum errRf, ErrorCodeEnum errForceIDEject)
+{
+	int pos = 99;
+	m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
+	ErrorCodeEnum posErr = m_hDevHelper->QueryCardPos(pos);
+	m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
+
+	if (posErr == Error_Succeed)
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
+			.setCostTime(m_ullEndTime - m_ullBeginTime)
+			("执行吐卡后,获取卡片位置成功, pos : %d", pos);
+
+		CSimpleStringA warnMsg = CSimpleStringA::Format("RFControl返回:%s. ForceIDEject返回%s. 获取卡片位置 pos = %d.", 
+			SpStrError(errRf), SpStrError(errForceIDEject), pos);
+		switch (pos)
+		{
+		case 0:
+			LogWarn(Severity_Middle, Error_Succeed,
+				IDCertificate_UserErrorCode_EjectCardRes_Pos_0, warnMsg.GetData());
+			break;
+		case 1:
+			LogWarn(Severity_Middle, Error_Succeed,
+				IDCertificate_UserErrorCode_EjectCardRes_Pos_1, warnMsg.GetData());
+			break;
+		case 2:
+			LogWarn(Severity_Middle, Error_Succeed,
+				IDCertificate_UserErrorCode_EjectCardRes_Pos_2, warnMsg.GetData());
+			break;
+		default:
+			LogWarn(Severity_Middle, Error_Succeed,
+				IDCertificate_UserErrorCode_EjectCardRes_Pos_X, warnMsg.GetData());
+			break;
+		}
+
+	}
+	else
+	{
+		SetErrorAndLog(posErr, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__,
+			false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
+
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("执行吐卡后,获取卡片位置失败.", posErr);
+	}
+}
+
 #ifdef RVC_OS_WIN
 void CIDCertFSM::HttpsLogCallBack(const char* logtxt)
 {

+ 2 - 0
Module/mod_IDCertificate/IDCertFSM.h

@@ -277,6 +277,8 @@ private:
 	int GetUCS2ByteLength(UINT16* ucs2_code);
 	void CheckHanZi(UINT16* ucs2_code);
 
+	void CheckEjectCardRes(ErrorCodeEnum errRf, ErrorCodeEnum errForceIDEject); //退卡情况收集,cjl-2024.11.21
+
 public:
 		std::string checkImgURL;
 private:

+ 6 - 0
Module/mod_IDCertificate/IDCertificate_UserErrorCode.h

@@ -25,6 +25,12 @@
 #define IDCertificate_UserErrorCode_ReadAndScan_NotOnReading	0x2010021f //实体不在读证状态
 #define IDCertificate_UserErrorCode_FindFile_in_DepBak			0x20100220 //旧dep目录下获取到厂商文件
 
+#define IDCertificate_UserErrorCode_EjectCardRes_Pos_0		0x20100230 //退卡结果-位置0:被取走
+#define IDCertificate_UserErrorCode_EjectCardRes_Pos_1		0x20100231 //退卡结果-位置1:读卡器内
+#define IDCertificate_UserErrorCode_EjectCardRes_Pos_2		0x20100232 //退卡结果-位置2:读卡口,未被取走
+#define IDCertificate_UserErrorCode_EjectCardRes_Pos_X		0x20100233 //退卡结果-异常值
+
+
 
 //#define IDCertificate_UserErrorCode_Real_Root_Config		(IDCertificate_UserErrorCode_Start + 31) //加载实际的root配置
 

+ 178 - 64
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -44,6 +44,7 @@
 #include <psapi.h>  
 #include <tlhelp32.h>
 #include <WtsApi32.h>
+#include <sysinfoapi.h>
 #pragma comment(lib, "WtsApi32.lib")
 #include "Mmdeviceapi.h"
 #include "Propidl.h"
@@ -111,6 +112,25 @@ const char* STRATUP_FILENAME_FROM_SCRIPTS = "spexplorerauto.lnk";
 
 
 #if defined(RVC_OS_WIN)
+//https://blog.csdn.net/aflyeaglenku/article/details/51742820
+typedef struct _dmi_header
+{
+	BYTE type;
+	BYTE length;
+	WORD handle;
+}dmi_header;
+
+typedef struct _RawSMBIOSData
+{
+
+	BYTE    Used20CallingMethod;
+	BYTE    SMBIOSMajorVersion;
+	BYTE    SMBIOSMinorVersion;
+	BYTE    DmiRevision;
+	DWORD   Length;
+	BYTE    SMBIOSTableData[];
+}RawSMBIOSData;
+
 void ResourceWatcherFSM::GetAutoStartFile(std::string& userDirPath, std::vector<std::string>& userDirFiles, std::string& pubDirPath, std::vector<std::string>& pubDirFiles)
 {
 	CSimpleStringA startMenuPublicPath(STARTUP_DIR_FULL_PATH);
@@ -365,8 +385,8 @@ void ResourceWatcherFSM::TriggerAtStatusChanged(bool bMStatus)
         AutoDeleteFilesTask* autoDeleteTask = new AutoDeleteFilesTask(this);
         GetEntityBase()->GetFunction()->PostThreadPoolTask(autoDeleteTask);
 
-#if defined(RVC_OS_LINUX)
         if (m_bFirstRunAfterBoot) {
+#if defined(RVC_OS_LINUX)
             UINT sysVer = 0;
             UploadSysVersionInfo(sysVer);
             ConfirmWindowEffectHasBeenOpen();
@@ -381,8 +401,11 @@ void ResourceWatcherFSM::TriggerAtStatusChanged(bool bMStatus)
             GetEntityBase()->GetFunction()->PostThreadPoolTask(new DetectSoftwareInstallStatusTask(this));
             GetEntityBase()->GetFunction()->PostThreadPoolTask(new UploadMonitorInfoTask(this));
             AlarmSystemBasicInfo();
-        }
+#else
+			AlarmSystemBasicInfo();
 #endif //RVC_OS_LINUX
+        }
+
     }
 }
 
@@ -402,7 +425,6 @@ ErrorCodeEnum ResourceWatcherFSM::OnInit()
     if (m_bFirstRunAfterBoot) {
         DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("First time to run after system boot.");
     }
-
 #if defined(RVC_OS_WIN)
     if (m_bFirstRunAfterBoot) {
 		//GetSystemMetrics (SM_CMONITORS) 计数仅显示可见的显示器
@@ -3556,7 +3578,7 @@ ULONGLONG ResourceWatcherFSM::GetDiskUsedByte()
     return ulTotalBytes.QuadPart - ulTotalFree.QuadPart;
 }
 
-__int64 Filetime2Int64(const FILETIME& ftime)
+long long Filetime2Int64(const FILETIME& ftime)
 {
     LARGE_INTEGER li;
     li.LowPart = ftime.dwLowDateTime;
@@ -3564,7 +3586,7 @@ __int64 Filetime2Int64(const FILETIME& ftime)
     return li.QuadPart;
 }
 
-__int64 CompareFileTime2(const FILETIME& preTime, const FILETIME& nowTime)
+long long CompareFileTime2(const FILETIME& preTime, const FILETIME& nowTime)
 {
     return Filetime2Int64(nowTime) - Filetime2Int64(preTime);
 }
@@ -3653,85 +3675,94 @@ void ResourceWatcherFSM::GetSystemCPUStatus()
     }
     CloseHandle(hProcessSnapNew);
 
-    auto idle = CompareFileTime2(preIdleTime, idleTime);
-    auto kernel = CompareFileTime2(preKernelTime, kernelTime);
-    auto user = CompareFileTime2(preUserTime, userTime);
+    long long idle = CompareFileTime2(preIdleTime, idleTime);
+    long long kernel = CompareFileTime2(preKernelTime, kernelTime);
+    long long user = CompareFileTime2(preUserTime, userTime);
 
     if (kernel + user == 0)
         return;
 
-    CSystemRunInfo runInfo = { 0 };
-    GetEntityBase()->GetFunction()->GetSystemRunInfo(runInfo);
-    for (int i = 0; i < runInfo.strRunningEntityNames.GetCount(); i++) //实体进程的名称默认全为sphost,需转换为对应实体名
-    {
-        runInfo.strRunningEntityNames[i];
-        CEntityRunInfo entityInfo = { 0 };
-        GetEntityBase()->GetFunction()->GetEntityRunInfo(runInfo.strRunningEntityNames[i].GetData(), entityInfo);
-        processName[entityInfo.dwProcessID] = runInfo.strRunningEntityNames[i];
-    }
-
-    unordered_map<int, long long>::iterator it;
-    for (it = newProcessTime.begin(); it != newProcessTime.end(); ++it)
-    {
-        int tPid = it->first;
-        //进程的占用率 = 单位时间间隔里进程的CPU时间片占用 / 单位时间间隔里CPU的整体时间片
-        if (oldProcessTime.find(tPid) == oldProcessTime.end())
-        {
-            continue;
-        }
-
-        if (sysProcName.find(processName[tPid].GetData()) != std::string::npos)
-        {
-            continue;
-        }
-
-        // 转换为百分比
-        double tRatio = 100.0 * (newProcessTime[tPid] - oldProcessTime[tPid]) / (kernel + user);
-        if (tRatio > 0.0)
-        {
-            processCpu[tPid] = tRatio;
-        }
-    }
-
-    vector<pair<int, double>> vec(processCpu.begin(), processCpu.end());
-    sort(vec.begin(), vec.end(), cmp); //根据CPU使用率从大到小进行排序
-    int len = min(10, vec.size());
-    CSimpleStringA procWarn = "";
-    for (int i = 0; i < len; ++i) //构建进程的CPU使用告警信息
-    {
-        procWarn = procWarn + ",\"" + processName[vec[i].first] + "\":\"" + CSimpleStringA::Format("%.2f", vec[i].second) + "%\"";
-    }
-
+    //计算总CPU使用率
     double cpuRatio = 100.0 * (kernel + user - idle) / (kernel + user);
-
     if (m_cpuHighPercent <= 0)
     {
-        m_cpuHighPercent = 80; //默认告警百分比80%
+        m_cpuHighPercent = 80; //默认告警线:80%
     }
-
     if (cpuWarnThreshold <= 0)
     {
         cpuWarnThreshold = 10;  //默认满10次告一次警
     }
 
+    //超过设置的告警线时进行告警
     if (cpuRatio > (double)m_cpuHighPercent)
     {
-        cpuWarnTime = cpuWarnTime % cpuWarnThreshold;   
-        if (cpuWarnTime == 0) //每达到一次阈值告警一次
+        cpuWarnTime = cpuWarnTime % cpuWarnThreshold;
+        if (cpuWarnTime == 0) //CPU使用率过高达到一定次数告警一次
         {
+            //终端进程名称转换
+            CSystemRunInfo runInfo = { 0 };
+            GetEntityBase()->GetFunction()->GetSystemRunInfo(runInfo);
+            for (int i = 0; i < runInfo.strRunningEntityNames.GetCount(); i++) //实体进程的名称默认全为sphost,需转换为对应实体名
+            {
+                runInfo.strRunningEntityNames[i];
+                CEntityRunInfo entityInfo = { 0 };
+                GetEntityBase()->GetFunction()->GetEntityRunInfo(runInfo.strRunningEntityNames[i].GetData(), entityInfo);
+                processName[entityInfo.dwProcessID] = runInfo.strRunningEntityNames[i];
+            }
+
+            //进程占用率计算
+            unordered_map<int, long long>::iterator it;
+            for (it = newProcessTime.begin(); it != newProcessTime.end(); ++it)
+            {
+                int tPid = it->first;
+                //进程的占用率 = 单位时间间隔里进程的CPU时间片占用 / 单位时间间隔里CPU的整体时间片
+                if (oldProcessTime.find(tPid) == oldProcessTime.end())
+                {
+                    continue;
+                }
+
+                if (sysProcName.find(processName[tPid].GetData()) != std::string::npos)
+                {
+                    continue;
+                }
+
+                // 转换为百分比
+                if (newProcessTime[tPid] >= oldProcessTime[tPid]) //数据合法
+                {
+                    double tRatio = 100.0 * (newProcessTime[tPid] - oldProcessTime[tPid]) / (kernel + user);
+                    processCpu[tPid] = tRatio;
+                }
+            }
+
+            //根据CPU使用率对进程从大到小进行排序
+            vector<pair<int, double>> vec(processCpu.begin(), processCpu.end());
+            sort(vec.begin(), vec.end(), cmp); 
+            int len = min(10, vec.size());
+            CSimpleStringA procWarn = "";
+            for (int i = 0; i < len; ++i) //构建进程的CPU使用告警信息
+            {
+                procWarn = procWarn + ",\"" + processName[vec[i].first] + "\":\"" + CSimpleStringA::Format("%.2f", processCpu[vec[i].first]) + "%\"";
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM) //上传校验信息
+                    ("CPU use info. [vec[%d].second]:%.2f; [processCpu[%d]]:%.2f",
+                        i, vec[i].second, vec[i].first, processCpu[vec[i].first]);
+            }
+
+            //构建告警信息
             CSimpleStringA warn = CSimpleStringA::Format("{\"type\":\"cpu\", \"total_used\":\" %.2f", cpuRatio);
             warn = warn + "%\"" + procWarn + "}";
-            LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_TOO_HIGH, warn.GetData());
-            DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A03").setAPI("CpuUsedCheck")(warn.GetData());
             if (cpuRatio > 98) //cpu极端异常情况
             {
                 LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_ERROR, warn.GetData());
-                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A02")(warn.GetData());
+                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A02").setAPI("CpuUsedCheck")(warn.GetData());
+            }
+            else
+            {
+                LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_TOO_HIGH, warn.GetData());
+                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A03").setAPI("CpuUsedCheck")(warn.GetData());
             }
         }
         cpuWarnTime++;
     }
-
 }
 
 unsigned long long convert_time_format(const FILETIME* ftime)
@@ -4224,6 +4255,36 @@ bool ResourceWatcherFSM::IsStartupIconExist(CSimpleStringA& strPath)
 	return false;
 }
 
+const char* dmi_string(const dmi_header* dm, BYTE s)
+{
+
+	char* bp = (char*)dm;
+	size_t i, len;
+
+	if (s == 0)
+		return "Not Specified";
+
+	bp += dm->length;
+	while (s > 1 && *bp)
+	{
+
+		bp += strlen(bp);
+		bp++;
+		s--;
+	}
+
+	if (!*bp)
+		return "BAD_INDEX";
+
+	/* ASCII filtering */
+	len = strlen(bp);
+	for (i = 0; i < len; i++)
+		if (bp[i] < 32 || bp[i] == 127)
+			bp[i] = '.';
+
+	return bp;
+}
+
 #endif // _MSC_VER end硬件资源监控相关系统功能 CPU、内存、硬盘、网络wifi
 
 #ifdef RVC_OS_LINUX
@@ -4292,8 +4353,61 @@ void ResourceWatcherFSM::CheckDiskFileSpace()
 ErrorCodeEnum ResourceWatcherFSM::CatchSystemBasicInfo(SystemBasicInfo& info)
 {
 #if defined(RVC_OS_WIN)
-    ///**TODO(Gifur@10/10/2023): 待实现 */
-    return Error_NotImpl;
+    //通过输入 ‘Get-CimInstance -ClassName Win32_ComputerSystemProduct’ 指令获取)
+	int ret = 0;
+	RawSMBIOSData* Smbios;
+	dmi_header* h = NULL;
+	int flag = 1;
+
+	ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
+	if (!ret)
+	{
+
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Function failed!");
+		return Error_Unexpect;
+	}
+
+	DWORD bufsize = ret;
+	char* buf = new char[bufsize];
+	memset(buf, 0, bufsize);
+
+	ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);
+	if (!ret)
+	{
+
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Function failed!");
+		delete[]buf;
+		return Error_Unexpect;
+	}
+
+	Smbios = (RawSMBIOSData*)buf;
+
+	BYTE* p = Smbios->SMBIOSTableData;
+
+	if (Smbios->Length != bufsize - 8)
+	{
+
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Smbios length error");
+		delete[]buf;
+		return Error_Unexpect;
+	}
+
+	for (int i = 0; i < Smbios->Length; i++) {
+		h = (dmi_header*)p;
+
+		if (h->type == 1)
+		{
+            info.strManufacturer = dmi_string(h, p[0x4]);
+			info.strProductName = dmi_string(h, p[0x5]);
+			info.strSerialNumber = dmi_string(h, p[0x7]);
+			break;
+		}
+		p += h->length;
+		while ((*(WORD*)p) != 0) p++;
+		p += 2;
+	}
+	delete[]buf;
+    return Error_Succeed;
 #else
     CSimpleStringA runCfgPath;
     ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetPath("RunCfg", runCfgPath);
@@ -4899,7 +5013,7 @@ void ResourceWatcherFSM::GetSystemCPUStatus()
             stringstream tss;
             tss << std::setiosflags(std::ios::fixed) << std::setprecision(2) << cUsedRate * 100;
 
-            string warn = "{ \"total_used\":\"" + tss.str() + "%\"" + procWarn + "}";
+            string warn = "{\"type\":\"cpu\", \"total_used\":\"" + tss.str() + "%\"" + procWarn + "}";
             LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_CPU_TOO_HIGH, CSimpleStringA::Format("%s", warn.c_str()));
             DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A03").setAPI("CpuUsedCheck")(warn.c_str());
         }
@@ -4964,8 +5078,8 @@ void ResourceWatcherFSM::GetSystemMemoryStatus()
             stringstream ss1;
             ss1 << std::setiosflags(std::ios::fixed) << std::setprecision(2) << mUsedRate * 100;
 
-            string warn = "{ \"total\":\"" + string(szResult) + "\"," +
-                "\"used\":\"" + ss1.str() + "%\"," + MemoryProcessStatus();
+            string warn = "{\"type\":\"mem\", \"total\":\"" + string(szResult) + "\"," +
+                "\"total_used\":\"" + ss1.str() + "%\"," + MemoryProcessStatus();
             LogWarn(Severity_Middle, Error_Resource, LOG_EVT_RESOURCE_MEMORY_TOO_HIGH, CSimpleStringA::Format("%s", warn.c_str()));
             DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA5A04").setAPI("MemUsedCheck")(warn.c_str());
         }

+ 0 - 1
Module/mod_SalesRecorder/Event.h

@@ -8,7 +8,6 @@
 #define LOG_EVT_START_REMOTERECORD						0x31510001				//开始远程双录
 #define LOG_EVT_STOP_REMOTERECORD						0x31510002				//停止远程双录
 #define LOG_EVT_SALESRECORD_FAILED						0x31510003				//销售双录失败		
-#define LOG_EVT_RECORD_ENTITY_EXCEPTION					0x31510004				//销售双录实体异常	
 #define LOG_EVT_RECORD_FINISHED							0x31510005				//销售双录已完成
 #define LOG_EVT_RECORD_SAVED_SUCCESS					0x31510006				//双录文件保存成功
 #define LOG_EVT_RECORD_SAVED_FAILED						0x31510007				//双录文件保存失败

+ 2 - 1
Module/mod_SalesRecorder/mod_SalesRecorder.cpp

@@ -19,6 +19,7 @@
 #include "mod_customeraware/Event.h"
 #include "mod_facetracking/sysvar.h"
 #include "mod_mediacontroller/Event.h"
+#include "mod_interactivecontrol/Event.h"
 
 #include <assert.h>
 #include "EventCode.h"
@@ -658,7 +659,7 @@ void CSalesRecorderEntity::OnRecordFailed(eRvcRecordFailedCase eCase, const char
 void CSalesRecorderEntity::OnRecordEntityExcption()
 {
 	LogEvent(Severity_High,LOG_EVT_SALESRECORD_ENTITY_EXCEPTION,"现场销售双录出现异常,请稍候重录,系统正在恢复中,预计60秒!");
-	LogWarn(Severity_Low, Error_Debug, LOG_EVT_RECORD_ENTITY_EXCEPTION, "sales record entity exception!");
+	LogWarn(Severity_Low, Error_Debug, LOG_EVT_SALESRECORD_ENTITY_EXCEPTION, "sales record entity exception!");
 }
 
 void CSalesRecorderEntity::OnRecordFinished()

+ 2 - 2
Module/mod_assistantchannel/VideoDesc.h

@@ -137,9 +137,9 @@ static inline CSimpleStringA ConstructVideoRenderParam(CSimpleStringA strMsg, bo
 {
 	int lxPos, lyPos, lwidth, lheight;
 	CSimpleStringA strVideoParam;
-	CSimpleStringA str;
+	char str[256] = {0};
 	if (false == bDoubleVideo) {
-		sscanf(strMsg.GetData(), "%d@%d@%d@%d@%s", &lxPos, &lyPos, &lwidth, &lheight, &str);
+		sscanf(strMsg.GetData(), "%d@%d@%d@%d@%s", &lxPos, &lyPos, &lwidth, &lheight, str);
 		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local video param : (x=%d,y=%d,width=%d,height=%d).", lxPos, lyPos, lwidth, lheight);
 		strVideoParam = BuildVideoRenderDesc(lxPos, lyPos, lwidth, lheight);
 	}

+ 4 - 4
Module/mod_chromium/baseEx.cpp

@@ -356,7 +356,7 @@ void InitUserCodeToMsgTip(CAutoArray<CSimpleStringA>& strErrorCodeArr, CAutoArra
 		}
 		std::string curRemark = strRemarkArr[i].GetData();
 		std::transform(curRemark.begin(), curRemark.end(), curRemark.begin(), [](unsigned char c) { return std::tolower(c); });
-		g_UserCodeToMsgTip.insert(std::make_pair(curRemark, ErrMsgStruct(strErrorCodeArr[i].GetData(), dstDescribe)));
+		g_UserCodeToMsgTip.insert(std::make_pair(curRemark, ErrMsgStruct(strErrorCodeArr[i].GetData(), dstDescribe, strRemarkArr[i].GetData())));
 	}
 
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("InitUserCodeToMsgTip size:%d", g_UserCodeToMsgTip.size());
@@ -366,7 +366,7 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 {
 	const std::string headerStr = "UserError=";
 	if (srcMsg.find(headerStr) != 0)
-		return std::make_pair(0, ErrMsgStruct("", srcMsg, headerStr));
+		return std::make_pair(0, ErrMsgStruct("", srcMsg, ""));
 
 	unsigned long userCode = std::stoi(srcMsg.substr(headerStr.length()));
 	std::string userCodeStr = CSimpleString::Format("0x%X", userCode).GetData();
@@ -375,12 +375,12 @@ std::pair<unsigned long, ErrMsgStruct> getErrMsgByRemark(std::string srcMsg)
 	if (g_UserCodeToMsgTip.size() == 0)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA42F0").setAPI(__FUNCTION__)("RTA42F0|微服务异常|(%s)", srcMsg.c_str());
-		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str(), userCodeStr).GetData()));
+		return std::make_pair(0, ErrMsgStruct("RTA42F0", CSimpleString::Format("RTA42F0|微服务异常|(%s)", srcMsg.c_str()).GetData(), userCodeStr));
 	}
 
 	if (g_UserCodeToMsgTip.find(userCodeStr) != g_UserCodeToMsgTip.end())
 	{
-		auto curMsg = g_UserCodeToMsgTip[userCodeStr];
+		ErrMsgStruct curMsg(g_UserCodeToMsgTip[userCodeStr]);
 		return std::make_pair(userCode, curMsg);
 	}		
 	else

+ 10 - 2
Module/mod_chromium/baseEx.h

@@ -32,8 +32,16 @@ struct ErrMsgStruct {
 	std::string userCode;
 
 	// 带参数的构造函数,参数有默认值
-	ErrMsgStruct(const std::string& tmp_VTMCode = "", const std::string& tmp_errMsg = "", const std::string& tmp_userCode = "") 
+	ErrMsgStruct(const std::string& tmp_VTMCode = "", const std::string& tmp_errMsg = "", const std::string& tmp_userCode = "")
 		: VTMCode(tmp_VTMCode), errMsg(tmp_errMsg), userCode(tmp_userCode) {}
+
+	// 拷贝构造函数
+	ErrMsgStruct(const ErrMsgStruct& other)
+		: VTMCode(other.VTMCode), errMsg(other.errMsg), userCode(other.userCode) {}
+
+	// 移动构造函数
+	ErrMsgStruct(ErrMsgStruct&& other) noexcept
+		: VTMCode(std::move(other.VTMCode)), errMsg(std::move(other.errMsg)), userCode(std::move(other.userCode)) {}
 };
 
 
@@ -189,7 +197,7 @@ public:
 	bool m_withUnsafeAd/*Ad页面忽略安全选项*/;
 	bool m_withConsole;
 	bool m_withSpecialTest/*开启一些终端功能的测试*/, m_withLinkLog/*开启链路中的中间链路日志*/;
-	bool m_withMin, m_withClose, m_installMode;
+	bool m_withMin, m_withClose, m_installMode, m_existRootIni;
 	std::deque<SYS_EVENT_PARAM> m_eventArr;
 	bool m_noStartupPage;
 	std::map<std::string, std::vector<int>> m_commonPageArr;

+ 43 - 6
Module/mod_chromium/mod_chromium.cpp

@@ -4,6 +4,7 @@
 #include <Windows.h>
 #include <WinUser.h>
 #include <tchar.h>
+#include <corecrt_io.h>
 #define SPLIT_SLASH_STR "\\"
 #include "chromelink_export.h"
 #pragma comment(lib, "cefControl.lib")
@@ -36,6 +37,7 @@
 #include "CommEntityUtil.hpp"
 
 
+
 #define COMPKEY_TERMINATE ((UINT_PTR) 0)
 #define COMPKEY_STATUS ((UINT_PTR) 1)
 #define COMPKEY_JOBOBJECT ((UINT_PTR) 2)
@@ -639,7 +641,6 @@ namespace Chromium {
 	void CChromiumEntity::startWithCfg()
 	{
 		OnPreStart_Init(m_strArgs, m_pTransactionContext);//初始化部分, perf ,killchromium, signal, get custom url
-
 		
 		if (!IsConfigMode()) {
 			if (!OnPreStart_register(m_strArgs, m_pTransactionContext)) {
@@ -662,8 +663,11 @@ namespace Chromium {
 		}
 		else
 		{
-			openInstallPage();
-			LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_INSTALLPAGE, CSimpleStringA::Format("open install page"));
+			if (!ConfigManager::getInstance().m_existRootIni)
+			{
+				openInstallPage();
+				LogEvent(Severity_High, LOG_EVT_CHROMIUM_OPEN_INSTALLPAGE, CSimpleStringA::Format("open install page"));
+			}
 		}
 			
 	}
@@ -736,6 +740,36 @@ namespace Chromium {
 				return;
 			}
 
+			auto IsRootINIExist = [&](CSimpleStringA & path) ->bool{
+				CSimpleStringA csHardwareCfg(true);
+				ErrorCodeEnum eErr = GetFunction()->GetPath("HardwareCfg", csHardwareCfg);
+				if (eErr != Error_Succeed)
+				{
+					path = CSimpleStringA::Format("GetPath of HardwareCfg failed(%d)", eErr);
+					DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
+					return false;
+				}
+				path = csHardwareCfg + SPLIT_SLASH_STR + "root.ini";
+#if defined(RVC_OS_WIN)
+				if (_access(path.GetData(), 0) == 0) {
+#else
+				if (access(path.GetData(), F_OK) == 0) {
+#endif
+					return true;
+				}
+				else
+				{
+					DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("root.ini(%s) is not exist.", path.GetData());
+					return false;
+				}
+			};
+
+			//if root.ini not exist
+			CSimpleString rootIni_path;
+			ConfigManager::getInstance().m_existRootIni = IsRootINIExist(rootIni_path);
+			
+
+
 			//the system info may be not complete.If the device is not install ,it can't not read the terminalNo.
 			CSystemStaticInfo t_sysInfo;
 			GetFunction()->GetSystemStaticInfo(t_sysInfo);
@@ -796,6 +830,8 @@ namespace Chromium {
 				std::this_thread::sleep_for(std::chrono::seconds(3));
 				LogWarn(Severity_Low, Error_Debug, LOG_SLV_CHROMIUM_URLOPEN, "正在启动业务界面");
 
+				if (ConfigManager::getInstance().m_existRootIni && ConfigManager::getInstance().m_installMode)
+					return;//if root.ini exist and in install mode, do not close startup page
 #if defined(RVC_OS_LINUX)
 				for (auto it : srcPids)
 				{
@@ -881,10 +917,10 @@ namespace Chromium {
 				GUIConsole::GUIConsoleService_ClosePerformanceSender_Req req;
 				GUIConsole::GUIConsoleService_ClosePerformanceSender_Ans ans;
 				error = (*client)(EntityResource::getLink().upgradeLink())->ClosePerformanceSender(req, ans, 1000);
-		}
+			}
 
 			client->GetFunction()->CloseSession();
-	}
+		}
 	}
 
 	bool CChromiumEntity::CheckIsCardStore() {
@@ -973,7 +1009,8 @@ namespace Chromium {
 							auto srcPids = getUosBrowserPIDs(CModTools::get_mutable_instance().getUosBrowser());
 #endif // RVC_OS_UOS
 
-
+							if (ConfigManager::getInstance().m_existRootIni && ConfigManager::getInstance().m_installMode)
+								return;//if root.ini exist and in install mode, do not close startup page
 #if defined(RVC_OS_LINUX)
 							for (auto it : srcPids)
 							{

+ 29 - 28
Module/mod_counterconnector/ConnectorFSM.cpp

@@ -412,7 +412,7 @@ static int CStringSplit(char* str, char** result, size_t ucount, const char* del
 }
 
 
-static int GetCallInfoFromConfig(char* strcallurl, size_t ucalllen, char* strassist, size_t assitlen, size_t *uport, const char* psrc)
+static int GetCallInfoFromConfig(char* strcallurl, uint32_t ucalllen, char* strassist, uint32_t assitlen, int *iport, const char* psrc)
 {
 	int iRet = -1;
 	if (NULL == psrc || NULL == strcallurl || NULL == strassist){
@@ -427,7 +427,7 @@ static int GetCallInfoFromConfig(char* strcallurl, size_t ucalllen, char* strass
 		icount = CStringSplit(result[1], assitresult, MAX_VOIP_SERVER_NUM, " ");
 		if(2 == icount){
 			snprintf(strassist, assitlen, "%s", assitresult[0]);
-			*uport = atoi(assitresult[1]);
+			*iport = atoi(assitresult[1]);
 			iRet = 0;
 		}
 	}
@@ -636,7 +636,7 @@ void ACMCallFSM::OnStateTrans(int iSrcState, int iDstState)
 				} 
 				else{
 					LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_AUTO_RECONNECT,CSimpleString::Format("state from %d to %d, auto reconnect, not broadcast state to ui.", st1, st2).GetData());
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C5")("system auto reconnect.");
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C5")("system auto reconnect.");
 				}
 
 				if (eState_HandFree == st2 || eState_Pickup == st2){
@@ -800,6 +800,9 @@ void ACMCallFSM::s8_on_entry()
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get call route list failed.");
 	}
 
+	m_lConnectCostTime = SP::Module::Comm::RVCGetTickCount();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C1")("start remote video call");
+
 	int time = GetDelayTime();
 
 	if (time > 0){
@@ -867,8 +870,6 @@ void ACMCallFSM::s11_on_entry()
 	LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_MAKECALL,"begin make call");
 	m_uConnectTime = y2k_time_now();
 	m_bConnected = false;
-	m_lConnectCostTime = SP::Module::Comm::RVCGetTickCount();
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C1")("start remote video call");
 
 	if (m_nCurSipServer == CurServerNum::Error_Server){
 		m_LastSipError = Error_NetBroken;
@@ -900,16 +901,16 @@ void ACMCallFSM::s11_on_entry()
 				int index = SP::Module::Comm::RVCGetTickCount()%icount;
 				char strcallurl[MAX_PATH] = {0};
 				char strassistip[32] = {0};
-				std::size_t uport = 0;
+				int iport = 0;
 				char strserver[MAX_PATH] = { 0 };
 				snprintf(strserver, MAX_PATH, "%s", m_voipserver[index].c_str());
-				if (0 == GetCallInfoFromConfig(strcallurl, MAX_PATH, strassistip, 32, &uport, strserver)){
+				if (0 == GetCallInfoFromConfig(strcallurl, MAX_PATH, strassistip, 32, &iport, strserver)){
 					char strassitinter[32] = {0};
 					get_interger_netaddr(strassitinter, 32, strassistip);
 					m_LastSipError = MakeCall(strcallurl, CSimpleStringA::Format("sip:%s#%s@%s;transport=UDP", m_strTerminalId.GetData(), strassitinter, ipstr), 
 						callid_str, m_CallingParam);
-					m_iChanProxyPort[0] = uport;
-					m_iChanProxyPort[1] = uport;
+					m_iChanProxyPort[0] = iport;
+					m_iChanProxyPort[1] = iport;
 					m_strChanProxyIP[0] = strassistip;
 					m_strChanProxyIP[1] = strassistip;
 					LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALLROUTE_CONFIG, CSimpleStringA::Format("head office mode no more call router, use default config(call url is %s, assistip is %s).", strcallurl, strassistip).GetData());
@@ -934,7 +935,7 @@ void ACMCallFSM::s11_on_entry()
 	if (m_LastSipError != Error_Succeed) 
 	{
 		PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3421")("send sip failed!");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3421")("send sip failed!");
 	}
 	else
 	{
@@ -953,7 +954,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 	{
 		m_bHangup = true;
 		LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_HANGUP, CSimpleStringA::Format("sip connecting, customer active hangup after %ds.", y2k_time_now()- m_nStarttime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C6")("connect failed for user hangup");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C6")("connect failed for user hangup");
 	}
 	else if (event->iEvt == USER_EVT_SIP_STATE_IDLE) 
 	{
@@ -968,7 +969,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 		}
 		(bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
 		m_nSipErrorNum++;
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3432")("sip connect failed for server error.");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3432")("sip connect failed for server error.");
 	} 
 	else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
 	{
@@ -999,7 +1000,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 		if (ReConnectionSipphone()) {
 			m_bConSipphone = true;
 		}
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3434")("sip connect failed for entity error");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3434")("sip connect failed for entity error");
 	}
 	else if (event->iEvt == EVT_TIMER)
 	{
@@ -1014,7 +1015,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 		}
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sip call timeout,release call");
 		m_nSipErrorNum++;
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3435")("sip connect failed for timeout");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3435")("sip connect failed for timeout");
 	}
 	else if (event->iEvt == USER_EVT_JMP_FAIL)
 	{
@@ -1028,7 +1029,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 			LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, error server");
 		}
 		m_nSipErrorNum++;
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2").setResultCode("RTA3436")("sip connect failed for entity error");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3436")("sip connect failed for entity error");
 	}
 	else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO) 
 	{
@@ -1041,7 +1042,7 @@ unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
 
 void ACMCallFSM::s12_on_entry() 
 {
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C2")("sip channel connect success!");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C2")("sip channel connect success!");
 	m_LastAssistError = Error_Succeed;
 	if (m_nCurChanServer == CurServerNum::Error_Server)
 	{
@@ -1070,13 +1071,13 @@ void ACMCallFSM::s12_on_entry()
 	if (m_LastAssistError != Error_Succeed) {
 		PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
 		if (Error_NetBroken == m_LastAssistError) {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3441")("assistant channel connect failed for net broken");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3441")("assistant channel connect failed for net broken");
 		}
 		else if (Error_Param == m_LastAssistError) {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3442")("assistant channel connect failed error param");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3442")("assistant channel connect failed error param");
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3443")("assistant channel connect failed");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3443")("assistant channel connect failed");
 		}
 	}
 }
@@ -1089,7 +1090,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 	{
 		m_bHangup = true;
 		LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_HANGUP, CSimpleStringA::Format("chan connecting, customer active hangup after %ds.", y2k_time_now() - m_nStarttime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C6")("connect failed for user hangup");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C6")("connect failed for user hangup");
 	}
 	else if (event->iEvt == USER_EVT_SIP_STATE_IDLE) 
 	{
@@ -1105,7 +1106,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		(bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
 		StopChannel();
 		if (!m_bHangup) {
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3455")("assistant channel bridge failed for timeout");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3455")("assistant channel bridge failed for timeout");
 		}
 	} 
 	else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) 
@@ -1122,7 +1123,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 				LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, error server");
 			}
 			(bool)m_nCurChanServer?(m_nCurChanServer= CurServerNum::Error_Server):(m_nCurChanServer= CurServerNum::BACK_SERVER);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3452")("assistant channel bridge failed for server error");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3452")("assistant channel bridge failed for server error");
 		}
 		HangupCall();
 		//StopVideo();
@@ -1132,7 +1133,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		ChanStateConnectedEvent *e = static_cast<ChanStateConnectedEvent *>(event);
 		StartVideo(e->m_param.GetData());
 		long lnowtime = SP::Module::Comm::RVCGetTickCount();
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(lnowtime - m_lConnectCostTime).setLogCode("QLR0402304C3")("assistant channel bridge success!");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(lnowtime - m_lConnectCostTime).setLogCode("QLR0402304C3")("assistant channel bridge success!");
 		m_lConnectCostTime = lnowtime;
 	}
 	else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
@@ -1150,7 +1151,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		if (ReConnectionAssistchan()) {
 			m_bConAssist = true;
 		}
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3453")("assistant channel bridge failed for entity restart");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3453")("assistant channel bridge failed for entity restart");
 	}
 	else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
 	{
@@ -1185,7 +1186,7 @@ unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
 		else{
 			LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_FUNC_FAILED,"chan connect func failed, error server");
 		}
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402304C3").setResultCode("RTA3454")("assistant channel bridge failed for entity error");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3454")("assistant channel bridge failed for entity error");
 	}
 	
 	return 0;
@@ -1553,7 +1554,7 @@ void ACMCallFSM::s51_on_entry()
 	if (m_bConnected) {
 		m_bConnected = false;
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECT_TIME, CSimpleStringA::Format("call connected time is %us.", y2k_time_now() - m_uConnectTime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection[s51].");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection.");
 	}
 }
 
@@ -1573,7 +1574,7 @@ void ACMCallFSM::s52_on_entry()
 	if (m_bConnected) {
 		m_bConnected = false;
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECT_TIME, CSimpleStringA::Format("call connected time is %us.", y2k_time_now() - m_uConnectTime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection[s52].");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection.");
 	}
 }
 
@@ -1660,7 +1661,7 @@ void ACMCallFSM::s60_on_entry()
 	if (m_bConnected) {
 		m_bConnected = false;
 		LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_CONNECT_TIME, CSimpleStringA::Format("call connected time is %us.", y2k_time_now() - m_uConnectTime).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection[s60].");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection.");
 	}
 }
 

+ 6 - 43
Module/mod_counterconnector/Event.h

@@ -1,22 +1,13 @@
 #pragma once
 //交互日志事件
-#define EVENT_MOD_CONNECT_CONNECT_SUCCESS		0x30400001		//连线成功,级别1
-#define EVENT_MOD_CONNECT_GOTO_DISCONNECT		0x30400002		//进入离线,级别1	
-#define LOG_EVT_RELEASELIVEDETECTION			0x30400003      //通知sipphone释放主动活体
-#define LOG_EVT_HANDFREE_MODE_REMOTE_CALL		0x30400006      //以免提模式开始远程连线
-#define LOG_EVT_PICKUP_MODE_REMOTE_CALL			0x30400007      //以话筒模式开始远程连线
-#define LOG_EVT_STOPLIVEDETECTNOTICEDISPLAY		0x30400008	    //停止主动活体文字显示
+#define EVENT_MOD_CONNECT_CONNECT_SUCCESS							0x30400001		//连线成功,级别1
+#define EVENT_MOD_CONNECT_GOTO_DISCONNECT							0x30400002		//进入离线,级别1	
+#define LOG_EVT_HANDFREE_MODE_REMOTE_CALL							0x30400006      //以免提模式开始远程连线
+#define LOG_EVT_PICKUP_MODE_REMOTE_CALL								0x30400007      //以话筒模式开始远程连线
 
 //错误日志事件
-#define EVENT_MOD_CONNECT_CONNECT_TIMEOUT		0x30480001		//尝试连线超时,级别1	
-#define EVENT_MOD_RELEASESIP_TIMEOUT			0x30470001		//SIP释放超时,重启SIPPHONE模块	
-
-
-#define EVENT_MOD_CONNECT_CONNECT_SUCCESS			 0x30400001	 //连线成功,级别1
-#define EVENT_MOD_CONNECT_GOTO_DISCONNECT			 0x30400002	 //进入离线,级别1	
-#define LOG_EVT_RELEASELIVEDETECTION				 0x30400003  //通知sipphone释放主动活体
-#define LOG_EVT_HANDFREE_MODE_REMOTE_CALL			 0x30400006  //以免提模式开始远程连线
-#define LOG_EVT_PICKUP_MODE_REMOTE_CALL				 0x30400007  //以话筒模式开始远程连线
+#define EVENT_MOD_CONNECT_CONNECT_TIMEOUT							0x30480001		//尝试连线超时,级别1	
+#define EVENT_MOD_RELEASESIP_TIMEOUT								0x30470001		//SIP释放超时,重启SIPPHONE模块	
 
 #define LOG_WARN_COUNTERCONNECT_SIPCONNECT_HANGUP					0x30480001	 
 #define LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPSTATE_IDLE		0x30480002	 
@@ -52,12 +43,9 @@
 #define LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_FUNC_FAILED			0x3048001f	 
 #define LOG_WARN_COUNTERCONNECT_CHANCONNECT_FUNC_FAILED				0x30480020
 
-#define LOG_WARN_COUNTERCONNECT_GRAY_FAILED	             			0x30480021  //灰度失败调用失败,级别3
 #define LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE				    0x30480022
 #define LOG_WARN_COUNTERCONNECT_CALLROUTE_TIMES						0x30480023
 #define LOG_WARN_COUNTERCONNECT_CALLROUTE_CONFIG					0x30480024
-#define LOG_WARN_COUNTERCONNECT_CALLROUTE_FAILED					0x30480025	//获取呼叫路由失败
-#define LOG_WARN_COUNTERCONNECT_CALLROUTE_TYPE						0x30480026	//呼叫路由信息
 #define LOG_WARN_COUNTERCONNECT_CALLROUTE_INTERACTIVE_FAILED		0x30480027
 
 #define EVENT_MOD_RELEASESIP_TIMEOUT								0x30470001	 //SIP释放超时,重启SIPPHONE模块	
@@ -104,31 +92,6 @@
 
 #define LOG_WARN_COUNTERCONNECT_GET_VIDEO_FAILED_INFO				0x30460701	 
 
-#define EVENT_MOD_CONNECT_GPIO_PICKUP			0x20900005		//PICKUP		
-#define EVENT_MOD_CONNECT_GPIO_HANDFREE			0x20900006		//HANDFREE
-
-//事件转换发出事件
-#define EVENT_MOD_CONNECT_PICKUP_CALL			0x10303041		//提机呼叫  
-#define EVENT_MOD_CONNECT_HANDFREE_CALL			0x10303042		//免提呼叫
-
-#define EVENT_MOD_CONNECT_HANDFREE_TO_PICKUP	0x10303046		//免提->提机
-#define EVENT_MOD_CONNECT_PICKUP_TO_HANDFREE	0x10303047		//提机->免提
-#define EVENT_MOD_CONNECT_HANNUP				0x10303048		//挂机
-#define EVENT_MOD_CONNECT_HANNUP_BY_CONNECTING	0x10303049		//话筒未接通时挂机
-#define EVENT_MOD_CONNECT_HANNUP_BY_AGENT		0x10313086		//授权操作
-
-#define EVENT_MOD_CONNECT_SLV_HANDFREECALL		0x10303050		//界面拨号,免提呼叫发送给SIPPHONE
-#define EVENT_MOD_CONNECT_SLV_PICKUPCALL		0x10303051		//界面拨号,话筒呼叫发送给SIPPHONE
-
-#define EVENT_MOD_CONNECT_AGENT_HANDFREE_PICKUP		0x10303052	//坐席控制免提转话筒
-#define EVENT_MOD_CONNECT_AGENT_PICKUP_HANDFREE		0x10303053	//坐席控制话筒转免提
-#define EVENT_MOD_CONNECT_SLV_PICKUPCALL_HAS_CMD	0x10303054	//界面拨号,带有指令信息
-
-#define EVENT_MOD_CONNECT_STOP_RECORD_BROADCAST		0x10303060	//结束双录语音播报
-#define EVENT_MOD_CONNECT_BEGAIN_RECORD_CALL		0x10303061	//开始双录呼叫
-#define EVENT_MOD_SIP_GET_VIDEO_FAILED								0x30190806	 //连线时获取视频失败
-
-
 #define LOG_WARN_COUNTERCONNECT_FAILED_SIPPHONE_LOST				0x30460601	 //sip phone lost
 #define LOG_WARN_COUNTERCONNECT_FAILED_ASSISTCHANNEL_LOST			0x30460602	 //assistant channel lost
 #define LOG_WARN_COUNTERCONNECT_FAILED_USER_HANGUP					0x30460603	 //user hangup

+ 15 - 66
Module/mod_counterconnector/mod_counterconnector.cpp

@@ -10,6 +10,7 @@
 #include "../mod_interactivecontrol/Event.h"
 #include "../mod_mediacontroller/Event.h"
 #include "../mod_sipphone/Event.h"
+#include "../mod_evtconverter/Event.h"
 
 using namespace CounterConnector;
 
@@ -57,22 +58,20 @@ ErrorCodeEnum CCounterConnectorEntity ::__OnStart(ErrorCodeEnum preOperationErro
 
 	int i = 0;
 
-	m_arrListener.Init(22);
+	m_arrListener.Init(20);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_PICKUP_CALL,NULL,false);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANDFREE_CALL,NULL,false);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANDFREE_TO_PICKUP);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_PICKUP_TO_HANDFREE);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANNUP);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANNUP_BY_CONNECTING);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANNUP_BY_AGENT);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_GPIO_PICKUP);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_GPIO_HANDFREE);
+	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANGUP);
+	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANGUP_BY_CONNECTING);
+	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANGUP_BY_AGENT);
+	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_PICKUP);
+	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_ONHOOK);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_AGENT_HANDFREE_PICKUP);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_AGENT_PICKUP_HANDFREE);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_SIPPHONE_STARTED_SUCCESS);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD,NULL,false);
-	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD,NULL,false);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU,NULL,false);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTPHOTOGRAPH,NULL,false);
 	spFunction->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_STOP_RECORD_BROADCAST,NULL,false);
@@ -307,7 +306,7 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 {
 	switch (dwUserCode) 
 	{
-	case EVENT_MOD_CONNECT_GPIO_PICKUP:
+	case LOG_EVT_PICKUP:
 		{
 			m_fsm.m_bHandFree = false;
 			if (!m_fsm.m_bIsAgentControl)
@@ -320,7 +319,7 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 			HandlePickUpMicroPhoneEvent(1, "pick up microphone.");
 		}
 		break;
-	case EVENT_MOD_CONNECT_GPIO_HANDFREE:
+	case LOG_EVT_ONHOOK:
 		{
 			m_fsm.m_bHandFree = true;
 			if (!m_fsm.m_bIsAgentControl)
@@ -439,20 +438,20 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("双录播报完结束,重置电话状态");
 		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_STOP_RECORD_BROADCAST));
 		break;
-	case EVENT_MOD_CONNECT_HANNUP: // 挂机
+	case EVENT_MOD_CONNECT_HANGUP: // 挂机
 		{	
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("断开呼叫");
 			m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
 			m_fsm.m_bHangup=true;
 		}
 		break;
-	case EVENT_MOD_CONNECT_HANNUP_BY_CONNECTING: // 话筒未接通时挂机
+	case EVENT_MOD_CONNECT_HANGUP_BY_CONNECTING: // 话筒未接通时挂机
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("话筒未接通时断开呼叫");
 		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
 		//m_fsm.m_bHandFree = TRUE;
 		m_fsm.m_bHangup=true;
 		break;
-	case EVENT_MOD_CONNECT_HANNUP_BY_AGENT: // 授权操作
+	case EVENT_MOD_CONNECT_HANGUP_BY_AGENT: // 授权操作
 		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_AGENT_WRITABLE));
 
 	case LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS:		
@@ -489,11 +488,6 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 		GetFunction()->SetTimer(3, this, 3700);
 		break;
 
-	case LOG_EVT_UI_STARTRECORD:
-		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start sales record video,get pos = %s",pszMessage);
-		Handle_StartRecord(pszMessage);
-		break;
-
 	case LOG_EVT_UI_STARTREMOTERECORD:
 		{
 			//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start sales remote record video,get pos = %s",pszMessage);
@@ -501,12 +495,6 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 		}
 		break;
 
-	case LOG_EVT_UI_STOPRECORD:
-		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin stop sales record video.");
-		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_STOPLOCALVIDEO));
-		m_bIsSalesRecord = false;
-		break;
-
 	case  LOG_EVT_UI_STOPREMOTERECORD:
 		//DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin stop double record video,and cur state name is %s.",m_fsm.GetCurrStateName());
 		m_fsm.PostEventFIFO(new FSMEvent(USER_EVT_STOPLOACALREMOTEVIDEO));
@@ -536,7 +524,7 @@ void CCounterConnectorEntity ::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUI
 		break;
 	case LOG_EVT_UI_STARTPHOTOGRAPH:
 		if (_stricmp(m_fsm.GetCurrStateName(),"Offline")!=0){
-			LogEvent(Severity_Middle,EVENT_MOD_CONNECT_HANNUP,"UI start photograph, hangup!");
+			LogEvent(Severity_Middle,EVENT_MOD_CONNECT_HANGUP,"UI start photograph, hangup!");
 		}
 		//else{
 		//	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offline state,ignore UI_STARTPHOTOGRAPH hangup event");
@@ -728,9 +716,9 @@ CSimpleStringA CCounterConnectorEntity ::ConstructVideoParam(CSimpleStringA strM
 {
 	int lxPos,lyPos,lwidth,lheight;
 	CSimpleStringA strVideoParam;
-	CSimpleStringA str;
+	char str[256] = {0};
 	if (false == bDoubleVideo){
-		sscanf(strMsg.GetData(), "%d@%d@%d@%d@%d@%s", &lxPos, &lyPos, &lwidth, &lheight, &str);
+		sscanf(strMsg.GetData(), "%d@%d@%d@%d@%d@%s", &lxPos, &lyPos, &lwidth, &lheight, str);
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("local video param : (x=%d,y=%d,width=%d,height=%d).",lxPos,lyPos,lwidth,lheight);
 		strVideoParam = BuildVideoDesc(lxPos,lyPos,lwidth,lheight);
 	}
@@ -755,19 +743,6 @@ CSimpleStringA CCounterConnectorEntity ::ConstructVideoParam(CSimpleStringA strM
 	return strVideoParam;
 }
 
-void CCounterConnectorEntity::Handle_StartRecord(const char* pszMessage)
-{
-	CSimpleStringA strMsg = pszMessage;
-
-	CSimpleStringA strVideo;
-#ifdef RVC_OS_WIN
-	strVideo = ConstructVideoParam(strMsg, false);	
-#else
-	strVideo = ConstructVideoRenderParam(strMsg, false);
-#endif					
-	m_fsm.PostEventFIFO(new ShowLocalVideoEvent(strVideo));									// 非连坐席双录
-	m_bIsSalesRecord = true;
-}
 
 void CCounterConnectorEntity::Handle_StartRemoteRecord(const char* pszMessage)
 {
@@ -782,32 +757,6 @@ void CCounterConnectorEntity::Handle_StartRemoteRecord(const char* pszMessage)
 	m_bIsRemoteRecordStopSpeakerCapture = false;
 }
 
-//void CCounterConnectorEntity::StopRemoteRecordSpeakerAudioCapture()
-//{
-//	if(DOUBLERECORD_CALLTYPE == m_fsm.m_CallingParam.nCallType){
-//		if (m_IsStandType){
-//			if (false == m_bIsRemoteRecordStopSpeakerCapture){
-//				if (Error_Succeed == m_fsm.StopSpeakerAudioCapture()){
-//					m_bIsRemoteRecordStopSpeakerCapture = true;
-//				}
-//			}
-//		}
-//	}
-//}
-
-void CCounterConnectorEntity::Handle_StartRecordPreview(const char* pszMessage)
-{
-	CSimpleStringA strMsg = pszMessage;
-
-	CSimpleStringA strVideo;
-#ifdef RVC_OS_WIN
-	strVideo = ConstructVideoParam(strMsg, false);
-#else
-	strVideo = ConstructVideoRenderParam(strMsg, false);
-#endif						
-	m_fsm.PostEventFIFO(new ShowLocalVideoEvent(strVideo));									// 非连坐席双录
-	m_bIsSalesRecord = true;
-}
 
 //send cur audio device to agent 
 void CCounterConnectorEntity ::SendCurAudioDevice()

+ 0 - 2
Module/mod_counterconnector/mod_counterconnector.h

@@ -81,9 +81,7 @@ public:
 	CSimpleStringA BuildDoubleVideoDesc(int local_view_x, int local_view_y, int local_view_cx, int local_view_cy, int remote_view_x, int remote_view_y, int remote_view_cx, int remote_view_cy);
 	CSimpleStringA ConstructVideoParam(CSimpleStringA strMsg, bool bDoubleVideo);
 
-	void Handle_StartRecord(const char* pszMessage);
 	void Handle_StartRemoteRecord(const char* pszMessage);
-	void Handle_StartRecordPreview(const char* pszMessage);
 	DeviceTypeEnum RvcGetDeviceType();
 	ErrorCodeEnum SetCallRouteParams(CSimpleStringA strQueueName, CSimpleStringA strClientLevel);
 	void HandlePickUpCallEvent();

+ 0 - 3
Module/mod_customeraware/Event.h

@@ -2,11 +2,8 @@
 #define EVENT_MOD_CUSTOMERAWARE_BEGIN				0x30830001
 #define EVENT_MOD_CUSTOMERAWARE_END					0x30830002
 
-#define LOG_EVT_UI_RETURNMENU						0x30B00006				//退出到主菜单
 #define LOG_EVT_UI_EXITSALESRECORD					0x40100004				//退出录像事件
 
-#define LOG_EVT_UI_STARTREMOTERECORD				0x30B0000F				//开始远程双录
-
 #define SYSVAR_DESKTOPTYPE	"DesktopType"		//桌面类型
 #define DESKTOPTYPE_BUS			'B'				//业务屏
 #define DESKTOPTYPE_INFO		'I'				//信息屏

+ 1 - 0
Module/mod_customeraware/mod_customeraware.cpp

@@ -5,6 +5,7 @@
 #include "CustomerHandleFSM.h"
 #include "Event.h"
 #include "EventCode.h"
+#include "../mod_interactivecontrol/Event.h"
 
 #define EVT_CONVERTER	"EventConverter"
 

+ 21 - 0
Module/mod_evtconverter/Event.h

@@ -0,0 +1,21 @@
+#pragma once
+
+//事件转换发出事件
+#define EVENT_MOD_CONNECT_PICKUP_CALL				0x10303041
+#define EVENT_MOD_CONNECT_HANDFREE_CALL				0x10303042		//免提呼叫
+
+#define EVENT_MOD_CONNECT_HANDFREE_TO_PICKUP		0x10303046		//免提->提机
+#define EVENT_MOD_CONNECT_PICKUP_TO_HANDFREE		0x10303047		//提机->免提
+#define EVENT_MOD_CONNECT_HANGUP					0x10303048		//挂机
+#define EVENT_MOD_CONNECT_HANGUP_BY_CONNECTING		0x10303049		//话筒未接通时挂机
+#define EVENT_MOD_CONNECT_HANGUP_BY_AGENT			0x10313086		//授权操作
+
+#define EVENT_MOD_CONNECT_SLV_HANDFREECALL			0x10303050		//界面拨号,免提呼叫发送给SIPPHONE
+#define EVENT_MOD_CONNECT_SLV_PICKUPCALL			0x10303051		//界面拨号,话筒呼叫发送给SIPPHONE
+
+#define EVENT_MOD_CONNECT_AGENT_HANDFREE_PICKUP		0x10303052		//坐席控制免提转话筒
+#define EVENT_MOD_CONNECT_AGENT_PICKUP_HANDFREE		0x10303053		//坐席控制话筒转免提
+#define EVENT_MOD_CONNECT_SLV_PICKUPCALL_HAS_CMD	0x10303054		//界面拨号,带有指令信息
+
+#define EVENT_MOD_CONNECT_STOP_RECORD_BROADCAST		0x10303060		//结束双录语音播报
+#define EVENT_MOD_CONNECT_BEGAIN_RECORD_CALL		0x10303061		//开始双录呼叫

+ 1 - 104
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -48,18 +48,6 @@ enum EntityOP
 	OP_CONTINUE_ENTITY,
 };
 
-bool StrEqualNoCase(const char *s1, const char *s2,int len)
-{
-	if (strlen(s1) != strlen(s2))
-		return false;
-	for (int i = 0; i < len; ++i)
-	{
-		if (toupper(s1[i]) != toupper(s2[i]))
-			return false;
-	}
-	return true;
-}
-
 ErrorCodeEnum CHealthManagerFSM::Initial()
 {
 #if defined(RVC_OS_WIN)
@@ -753,97 +741,6 @@ CSimpleStringA CHealthManagerFSM::GetOsVersion()
 #endif
 }
 
-#if defined(RVC_OS_WIN)
-const char* dmi_string(const dmi_header* dm, BYTE s)
-{
-
-	char* bp = (char*)dm;
-	size_t i, len;
-
-	if (s == 0)
-		return "Not Specified";
-
-	bp += dm->length;
-	while (s > 1 && *bp)
-	{
-
-		bp += strlen(bp);
-		bp++;
-		s--;
-	}
-
-	if (!*bp)
-		return "BAD_INDEX";
-
-	/* ASCII filtering */
-	len = strlen(bp);
-	for (i = 0; i < len; i++)
-		if (bp[i] < 32 || bp[i] == 127)
-			bp[i] = '.';
-
-	return bp;
-}
-
-void CHealthManagerFSM::QueryComputerInfo()
-{
-	int ret = 0;
-	RawSMBIOSData* Smbios;
-	dmi_header* h = NULL;
-	int flag = 1;
-
-	ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
-	if (!ret)
-	{
-
-		Dbg("Function failed!");
-		return;
-	}
-
-	DWORD bufsize = ret;
-	char* buf = new char[bufsize];
-	memset(buf, 0, bufsize);
-
-	ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);
-	if (!ret)
-	{
-
-		Dbg("Function failed!");
-		delete[]buf;
-		return;
-	}
-
-	Smbios = (RawSMBIOSData*)buf;
-
-	BYTE* p = Smbios->SMBIOSTableData;
-
-	if (Smbios->Length != bufsize - 8)
-	{
-
-		Dbg("Smbios length error");
-		delete[]buf;
-		return;
-	}
-
-	for (int i = 0; i < Smbios->Length; i++) {
-		h = (dmi_header*)p;
-
-		if (h->type == 1)
-		{
-			m_computerInfo["Manufacturer"] = dmi_string(h, p[0x4]);
-			m_computerInfo["ComputerName"] = dmi_string(h, p[0x5]);
-			m_computerInfo["ComputerVersion"] = dmi_string(h, p[0x6]);
-			m_computerInfo["SerialNumber"] = dmi_string(h, p[0x7]);
-
-			break;
-		}
-		p += h->length;
-		while ((*(WORD*)p) != 0) p++;
-		p += 2;
-	}
-	delete[]buf;
-}
-#endif //RVC_OS_WIN
-
 DWORD GetDualTime(SYSTEMTIME& t1, SYSTEMTIME& t2)
 {
 	//assume t2 > t1...
@@ -1165,7 +1062,7 @@ void CHealthManagerFSM::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_Q
 #if defined(RVC_OS_WIN)
 	//oiltmp 备注reserved3、reserved4这是什么情况下用的?看得莫名其妙,在一个常用调用接口里面每次都取,这是不怕亚信?
 	//reserved3, 获取windows系统版本
-	DWORD dwMajorVer, dwMinorVer, dwBuildNumber;
+	DWORD dwMajorVer(0), dwMinorVer(0), dwBuildNumber(0);
 	BOOL bRet = FALSE;
 	HMODULE hModNtdll = NULL;
 	if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))

+ 3 - 34
Module/mod_healthmanager/HealthManagerFSM.h

@@ -12,11 +12,9 @@ using namespace std;
 #include "HealthManager_msg_g.h"
 #include "HealthManager_def_g.h"
 #include "AccessAuthorization_client_g.h"
-#include "DeviceControl_client_g.h"
 #include "PinPad_client_g.h"
 using namespace HealthManager;
 using namespace AccessAuthorization;
-using namespace DeviceControl;
 
 #include "ResourceWatcher_client_g.h"
 using namespace ResourceWatcher;
@@ -68,12 +66,6 @@ enum EvtType
 	USER_EVT_VTMLOADER_FINISHED,
 };
 
-enum CustomerManagerState
-{
-	CM_INIT,
-	CM_ENTER,
-	CM_NOT_ENTER,
-};
 enum HealthManagerFSMState
 {
 	HM_FSM_INIT,
@@ -82,6 +74,7 @@ enum HealthManagerFSMState
 	HM_FSM_STATE_MAINTAINING,
 	HM_FSM_STATE_CMS,
 };
+
 enum VtmLoadResult
 {
 	VtmLoad_AccessAuth_Init = 0,
@@ -104,25 +97,6 @@ struct callback_entry : public IReleasable
 	ErrorCodeEnum ErrorResult;
 };
 
-typedef struct _dmi_header
-{
-	BYTE type;
-	BYTE length;
-	WORD handle;
-}dmi_header;
-
-typedef struct _RawSMBIOSData
-{
-
-	BYTE    Used20CallingMethod;
-	BYTE    SMBIOSMajorVersion;
-	BYTE    SMBIOSMinorVersion;
-	BYTE    DmiRevision;
-	DWORD   Length;
-	BYTE    SMBIOSTableData[];
-}RawSMBIOSData;
-extern unsigned long long GetTickCountRVC();
-
 class	CHealthManagerEntity;
 
 class CHealthManagerFSM : public FSMImpl<CHealthManagerFSM>, public ICallbackListener
@@ -156,8 +130,7 @@ public:
 	END_FSM_RULE()
 
 		CHealthManagerFSM() :m_SysState("I"), m_pACClient(NULL)
-		, m_iAccessAuth(VtmLoad_AccessAuth_Init)
-		, m_custMngerState(0), m_pDevCtrlClient(NULL), m_bHasAuthEver(false)
+		, m_iAccessAuth(VtmLoad_AccessAuth_Init), m_bHasAuthEver(false)
 		, m_checkCode(""), m_bFirstAccessAuth(true)
 		, m_bIEBeforeHealth(false), m_bInAccessAuthDoWork(false)
 		, m_bEntityNewStart(true), m_iDoNotUpdateWKDaily(0)
@@ -193,8 +166,6 @@ public:
 	bool GetAccessAuthFlag(){return m_iAccessAuth == VtmLoad_AccessAuth_Suc;}
 	int GetFSMState(){return m_fsmState;}
 	void ToReAccessAuth(bool bEver=false);
-	void SetCustomerMngerState(int iValue){m_custMngerState = iValue;}
-	int GetCustomerMngerState(){return m_custMngerState;}
 	int QueryAccessAuthStatus()
 	{
 		if (m_iAccessAuth == VtmLoad_AccessAuth_Suc)
@@ -235,7 +206,6 @@ private:
 	virtual void OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp);
 	void SaveOsVersion();
 	CSimpleStringA GetOsVersion();
-	void QueryComputerInfo();
 	int sumday(int year,int month,int day);//计算天数
 	bool CheckProcessExistByName(CSimpleStringA procName);
 	void QueryAndSaveDNS();
@@ -245,7 +215,7 @@ private:
 
 private:
 	CSimpleStringA m_SysState, m_checkCode, m_LoadEntityList, m_cpuInfo;
-	int m_fsmState, m_stateBeforeMaintain, m_custMngerState, m_preFsmState
+	int m_fsmState, m_stateBeforeMaintain, m_preFsmState
 		,m_iAccessAuth/*-1 未准入; 0 准入失败;1 准入成功*/, m_iDoNotUpdateWKDaily, m_wkUpdatePeriod/*if exceed the period time,we should update key*/
 		,m_maxWaitForPinPad/*ms*/;
 	AccessAuthService_ClientBase *m_pACClient;
@@ -253,7 +223,6 @@ private:
 		, m_bIEBeforeHealth, m_bInAccessAuthDoWork, m_bEntityNewStart, m_bPinPadOpenSuc;
 	DWORD m_elapseTimeFromOSStart;
 	ULONGLONG m_ullElapseFromOSStart, m_ullAuthStart, m_ullAccessAuthCost, m_ullTotalCost, m_ullSIPPhoneCost, m_ullTokenKeeperCost, m_ullWaitForPinPad;
-	DeviceControlService_ClientBase *m_pDevCtrlClient;
 	CSystemStaticInfo m_sysInfo;
 	std::map<string, string> m_computerInfo;
 	CAutoArray<string> m_dns;

+ 2 - 1
Module/mod_initiativetransfer/CMakeLists.txt

@@ -2,7 +2,8 @@
 define_module("initiativetransfer")
 
 
-set(${MODULE_PREFIX}_SRCS
+set(${MODULE_PREFIX}_SRCS 
+	Event.h
 	mod_initiativetransfer.cpp
 	InitiativeTransfer_server_g.h
 	InitiativeTransfer_msg_g.h

+ 3 - 0
Module/mod_initiativetransfer/Event.h

@@ -0,0 +1,3 @@
+#pragma once
+
+#define LOG_EVT_ENTER_ACM_FLOW	 0x30500001				//进入坐席控制流程

+ 3 - 5
Module/mod_initiativetransfer/mod_initiativetransfer.cpp

@@ -1,10 +1,13 @@
 #include "stdafx.h"
 #include "SpBase.h"
 #include "FlowControlFSM.h"
+#include "Event.h"
 
 #include "InitiativeTransfer_server_g.h"
 #include "InitiativeTransfer_msg_g.h"
 #include "EventCode.h"
+#include "../mod_interactivecontrol/Event.h"
+
 
 using namespace InitiativeTransfer;
 
@@ -12,11 +15,6 @@ using namespace InitiativeTransfer;
 #define RVC_CONNECT_ASSIST_ID 1
 #endif
 
-#define LOG_EVT_ENTER_ACM_FLOW	 0x30500001				//进入坐席控制流程
-
-#define LOG_EVT_UI_RETURNMENU		0x30B00006				//退出到主菜单
-#define LOG_EVT_UI_EXIT_BACKRUN		0x30B00016				//前端主动退出后端模式
-
 class CFlowControlEntity;
 
 class FlowControlServiceSession : public FlowService_ServerSessionBase

+ 5 - 8
Module/mod_interactivecontrol/Event.h

@@ -1,16 +1,10 @@
 #pragma once
 
 /*----InteractiveControl----*/
-#define LOG_EVT_UI_STARTRECORD						0x30B00001				//开始录像
-#define LOG_EVT_UI_STOPRECORD						0x30B00002				//停止录像
 #define LOG_EVT_UI_RETURNMENU						0x30B00006				//退出到主菜单
 #define LOG_EVT_UI_STARTPHOTOGRAPH					0x30B00007				//开始复杂产品合同拍照
 #define LOG_EVT_UI_STOPPHOTOGRAPH					0x30B00008				//停止复杂产品合同拍照
 #define LOG_EVT_UI_SENDOPERATESTATE					0x30B00009				//UI发送操作状态,用于业务层锁定交易页面
-#define LOG_EVT_UI_START_CONTINURECORD				0x30B0000A				//开始全程录像
-#define LOG_EVT_UI_STOP_CONTINURECORD				0x30B0000B				//停止全程录像
-#define LOG_EVT_UI_START_ECHO_CONTINURECORD			0x30B0000C				//开始回显全程录像
-#define LOG_EVT_UI_STOP_ECHO_CONTINURECORD			0x30B0000D				//停止回显全程录像
 #define LOG_EVT_UI_VIDEOAPPENDWATERMARK				0x30B0000E				//双录视频追加水印
 #define LOG_EVT_UI_STARTREMOTERECORD				0x30B0000F				//开始远程双录
 #define LOG_EVT_UI_STOPREMOTERECORD					0x30B00018				//停止远程录像
@@ -20,11 +14,11 @@
 #define LOG_EVT_UI_SHOWLOCALVIDEO					0x30B00013				//显示本地视频窗口
 #define LOG_EVT_UI_HIDEPERSONAREA					0x30B00014				//隐藏人形框
 #define LOG_EVT_UI_SHOWPERSONAREA					0x30B00015				//显示隐藏人形框
+#define LOG_EVT_UI_EXIT_BACKRUN						0x30B00016				//前端主动退出后端模式
+
 
 #define LOG_EVT_LOCALMEDIAPLAYER_LOST				0x30B00B01				//本地媒体播放lost
 #define LOG_EVT_PLAYER_CANNTFIND_FILE				0x30B00B02				//找不到要播放的文件
-#define LOG_EVT_OPEN_ADV_FROM_LOCAL_CONFIG			0x30B00B03		     	//通过本地配置要求打开广告播放
-#define LOG_EVT_FORBIDDIEN_ADV_FROM_LOCAL_CONFIG	0x30B00B04 				//通过本地配置要求关闭广告播放
 #define LOG_EVT_STOP_NOTICEPLAY_FAILED				0x30B00B05				//停止业务视频播放失败
 
 #define LOG_EVT_START_REMOTERECORD_SUCCESS			0x30B10001				//启动远程双录成功
@@ -64,4 +58,7 @@
 #define LOG_EVT_SET_REMOTERECORDCAMERA_SUCCESS		0x30B1001E				//设置摄像头成功
 #define LOG_EVT_SET_REMOTERECORDCAMERA_FAILED		0x30B1001F				//设置摄像头失败
 
+#define LOG_EVT_UI_STARTCAMERACAPTURE				0x30B10020				//开始摄像头图像采集
+#define LOG_EVT_UI_STOPCAMERACAPTURE				0x30B10021				//停止摄像头图像采集
+
 /*----End--InteractiveControl------------------------------*/

+ 17 - 0
Module/mod_interactivecontrol/InteractiveControl.xml

@@ -525,6 +525,19 @@
 			<res>
 			</res>
 		</twoway>
+    <twoway name="StartCameraCapture" overlap="true">
+      <req>
+        <param name="strParam" type="string"/>
+      </req>
+      <res>
+      </res>
+    </twoway>
+    <twoway name="StopCameraCapture" overlap="true">
+      <req>
+      </req>
+      <res>
+      </res>
+    </twoway>
 	</class>
 	
 
@@ -639,4 +652,8 @@
 		<!-- 失败提示 -->
 		<param name="failedmsg" type="wstring"/>
 	</message>
+  <!-- 上摄像头稳定性数据 -->
+  <message name="EnvCameraCapProcess">
+    <param name="envcapmsg" type="wstring"/>
+  </message>
 </entity>

+ 98 - 0
Module/mod_interactivecontrol/InteractiveControl_client_g.h

@@ -2919,6 +2919,104 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum StartCameraCapture(UIService_StartCameraCapture_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_StartCameraCapture, UIService_MethodSignature_StartCameraCapture, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum StartCameraCapture(UIService_StartCameraCapture_Req &Req, UIService_StartCameraCapture_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartCameraCapture(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum StartCameraCapture(UIService_StartCameraCapture_Req &Req, UIService_StartCameraCapture_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartCameraCapture(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 StartCameraCapture(UIService_StartCameraCapture_Req &Req, UIService_StartCameraCapture_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StartCameraCapture(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 StopCameraCapture(UIService_StopCameraCapture_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_StopCameraCapture, UIService_MethodSignature_StopCameraCapture, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum StopCameraCapture(UIService_StopCameraCapture_Req &Req, UIService_StopCameraCapture_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StopCameraCapture(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum StopCameraCapture(UIService_StopCameraCapture_Req &Req, UIService_StopCameraCapture_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StopCameraCapture(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 StopCameraCapture(UIService_StopCameraCapture_Req &Req, UIService_StopCameraCapture_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = StopCameraCapture(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()
 	{

+ 46 - 0
Module/mod_interactivecontrol/InteractiveControl_def_g.h

@@ -88,6 +88,8 @@ namespace InteractiveControl {
 #define UIService_Method_GetPickUpStatus 66
 #define UIService_Method_GetCameraState 67
 #define UIService_Method_SetRemoteRecordCamera 68
+#define UIService_Method_StartCameraCapture 69
+#define UIService_Method_StopCameraCapture 70
 
 #define UIService_MethodSignature_SetUIState -649355360
 #define UIService_MethodSignature_SendAgentText -389826246
@@ -158,6 +160,8 @@ namespace InteractiveControl {
 #define UIService_MethodSignature_GetPickUpStatus -1057807018
 #define UIService_MethodSignature_GetCameraState 1106777089
 #define UIService_MethodSignature_SetRemoteRecordCamera 644742714
+#define UIService_MethodSignature_StartCameraCapture -1747552500
+#define UIService_MethodSignature_StopCameraCapture -1434897600
 
 #define UIService_LogCode_SetUIState "QLR040230B00"
 #define UIService_LogCode_SendAgentText "QLR040230B01"
@@ -226,6 +230,10 @@ namespace InteractiveControl {
 #define UIService_LogCode_GetCameraInfo "QLR040230B64"
 #define UIService_LogCode_GetMediaDeviceInfo "QLR040230B65"
 #define UIService_LogCode_GetPickUpStatus "QLR040230B66"
+#define UIService_LogCode_GetCameraState "QLR040230B67"
+#define UIService_LogCode_SetRemoteRecordCamera "QLR040230B68"
+#define UIService_LogCode_StartCameraCapture "QLR040230B69"
+#define UIService_LogCode_StopCameraCapture "QLR040230B70"
 
 struct UIService_SetUIState_Info
 {
@@ -1530,6 +1538,44 @@ struct UIService_SetRemoteRecordCamera_Ans
 
 };
 
+struct UIService_StartCameraCapture_Req
+{
+	CSimpleStringA strParam;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & strParam;
+	}
+
+};
+
+struct UIService_StartCameraCapture_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_StopCameraCapture_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct UIService_StopCameraCapture_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 
 ///////////////////////////
 

+ 15 - 0
Module/mod_interactivecontrol/InteractiveControl_msg_g.h

@@ -30,6 +30,7 @@ namespace InteractiveControl {
 #define eMsg_CommonWebMsg 18
 #define eMsg_H5BackSyncData 19
 #define eMsg_SalesRecordingFailed 20
+#define eMsg_EnvCameraCapProcess 21
 
 #define eMsgSig_CustomerState 175614460
 #define eMsgSig_Stop -150723185
@@ -52,6 +53,7 @@ namespace InteractiveControl {
 #define eMsgSig_CommonWebMsg -1026578513
 #define eMsgSig_H5BackSyncData -1217690931
 #define eMsgSig_SalesRecordingFailed -1402924427
+#define eMsgSig_EnvCameraCapProcess -1158933893
 
 struct CustomerState
 {
@@ -332,5 +334,18 @@ struct SalesRecordingFailed
 
 ///////////////////////////
 
+struct EnvCameraCapProcess
+{
+	CSimpleStringW envcapmsg;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & envcapmsg;
+	}
+
+};
+
+///////////////////////////
+
 } // namespace InteractiveControl
 #endif // __INTERACTIVECONTROL_MSG_G_H

+ 54 - 0
Module/mod_interactivecontrol/InteractiveControl_server_g.h

@@ -513,6 +513,20 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case UIService_Method_StartCameraCapture:
+			if (dwSignature == UIService_MethodSignature_StartCameraCapture) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_StopCameraCapture:
+			if (dwSignature == UIService_MethodSignature_StopCameraCapture) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -869,6 +883,16 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case UIService_Method_StartCameraCapture:
+			if (dwSignature != UIService_MethodSignature_StartCameraCapture) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case UIService_Method_StopCameraCapture:
+			if (dwSignature != UIService_MethodSignature_StopCameraCapture) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -1221,6 +1245,16 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_StartCameraCapture(SpReqAnsContext<UIService_StartCameraCapture_Req, UIService_StartCameraCapture_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_StopCameraCapture(SpReqAnsContext<UIService_StopCameraCapture_Req, UIService_StopCameraCapture_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -1927,6 +1961,26 @@ public:
 						Handle_SetRemoteRecordCamera(ctx);
 					}
 					break;
+				case UIService_Method_StartCameraCapture:
+					{
+						SpReqAnsContext<UIService_StartCameraCapture_Req,UIService_StartCameraCapture_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_StartCameraCapture_Req,UIService_StartCameraCapture_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_StartCameraCapture(ctx);
+					}
+					break;
+				case UIService_Method_StopCameraCapture:
+					{
+						SpReqAnsContext<UIService_StopCameraCapture_Req,UIService_StopCameraCapture_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<UIService_StopCameraCapture_Req,UIService_StopCameraCapture_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_StopCameraCapture(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 94 - 5
Module/mod_interactivecontrol/mod_interactivecontrol.cpp

@@ -65,6 +65,14 @@ void CITCtrlEntity::OnAudioPlayRet(const char *pszEntityName, DWORD dwMessageId,
 }
 	
 
+void CITCtrlEntity::OnEnvCameraCapInfo(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, MediaController::EnvCameraCapInfo& evt)
+{
+	EnvCameraCapProcess ret;
+	ret.envcapmsg = evt.cameracapmsg;
+	SpSendBroadcast(GetFunction(), eMsg_EnvCameraCapProcess, eMsgSig_EnvCameraCapProcess, ret);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SpSendBroadcast EnvCameraCapProcess info is %s.", CSimpleStringW2A(ret.envcapmsg).GetData());
+}
+
 CServerSessionBase* CITCtrlEntity::OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/)
 {
 	return new UIServiceSession(this);
@@ -77,6 +85,11 @@ void CITCtrlEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe LocalMediaPlay evt failed!");
 	}
 
+	Error = GetFunction()->SubscribeBroadcast("MediaController", NULL, this, m_uidMediaControllerListenser);
+	if (Error != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe MediaController evt failed!");
+	}
+
 	Error = __OnStart(Error_Succeed);
 	pTransactionContext->SendAnswer(Error);
 }
@@ -1710,7 +1723,7 @@ ErrorCodeEnum CITCtrlEntity::StartTransactionRecord(CSimpleStringA strVideoName)
 		LogWarn(Severity_Low, Error_Debug, LOG_EVT_START_TRANSACTIONRECORD_SUCCESS, CSimpleStringA::Format("start transaction record %s success.", strVideoName.GetData()).GetData());
 	}
 	else {
-		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_START_TRANSACTIONRECORD_FAILED, CSimpleStringA::Format("start transaction record %s failed for 0x%08x", strVideoName.GetData(), rc).GetData());
+		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_START_TRANSACTIONRECORD_FAILED, CSimpleStringA::Format("start transaction record %s failed for 0x%08x.", strVideoName.GetData(), rc).GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040230BZ90101").setResultCode("RTA3B07")("启动交易录像超时");
 	}
 
@@ -1732,7 +1745,7 @@ ErrorCodeEnum CITCtrlEntity::StopTransactionRecord(CSimpleStringA strVideoName)
 	ErrorCodeEnum rc = (*m_pRecordClient)(EntityResource::getLink().upgradeLink())->StopTransactionRecord(req, ans, 5000);
 	if (Error_Succeed == rc) {
 		LogWarn(Severity_Low, Error_Debug, LOG_EVT_STOP_TRANSACTIONRECORD_SUCCESS, CSimpleStringA::Format("stop transaction record %s success.", strVideoName.GetData()).GetData());
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040230BZ90201")("stop transaction record success");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040230BZ90201")("stop transaction record success.");
 	}
 	else {
 		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_STOP_TRANSACTIONRECORD_FAILED, CSimpleStringA::Format("stop transaction record %s failed for 0x%08x.", strVideoName.GetData(), rc).GetData());
@@ -1944,12 +1957,57 @@ ErrorCodeEnum CITCtrlEntity::SetRemoteRecordCamera(int iCamera)
 	req.iCamera = iCamera;
 	ErrorCodeEnum rc = (*m_pSalesRecordClient)(EntityResource::getLink().upgradeLink())->SetRecordCamera(req, ans, 5000);
 	if (Error_Succeed != rc) {
-		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SET_REMOTERECORDCAMERA_FAILED, CSimpleStringA::Format("set remote record camera failed for 0x%08x", rc).GetData());
+		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SET_REMOTERECORDCAMERA_FAILED, CSimpleStringA::Format("set remote record camera failed for 0x%08x.", rc).GetData());
 	}
 
 	return rc;
 }
 
+
+ErrorCodeEnum CITCtrlEntity::StartCameraCaptrue()
+{
+	if (!IsRecordEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("start camera capture failed for connect Recordr failed!");
+		return Error_DevConnFailed;
+	}
+
+	if (!IsSipPhoneEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("start camera capture failed for connect SipphoneClient failed!");
+		return Error_DevConnFailed;
+	}
+
+	if (!IsMediaCtrEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("start camera capture failed for connect MediaCtrClient failed!");
+		return Error_DevConnFailed;
+	}
+
+	MediaService_TurnOnCamera_Req req;
+	MediaService_TurnOnCamera_Ans ans;
+	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());
+
+	return rc;
+}
+
+ErrorCodeEnum CITCtrlEntity::StopCameraCaptrue()
+{
+	if (!IsMediaCtrEntityAvailable()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("stop camera capture failed for connect MediaCtrClient 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());
+	}
+
+	return rc;
+}
+
+
+
 void UIServiceSession::Handle_SetUIState(SpOnewayCallContext<UIService_SetUIState_Info>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
@@ -2443,6 +2501,7 @@ void UIServiceSession::Handle_StopPlayNotice(SpReqAnsContext<UIService_StopPlayN
 	}
 }
 
+
 void UIServiceSession::Handle_GetRecordMode(SpReqAnsContext<UIService_GetRecordMode_Req, UIService_GetRecordMode_Ans>::Pointer ctx)
 {
 	DbgToBeidou(ctx->link, __FUNCTION__)();
@@ -2630,6 +2689,38 @@ void UIServiceSession::Handle_SetRemoteRecordCamera(SpReqAnsContext<UIService_Se
 	ctx->Answer(Error);
 }
 
+void UIServiceSession::Handle_StartCameraCapture(SpReqAnsContext<UIService_StartCameraCapture_Req, UIService_StartCameraCapture_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	ErrorCodeEnum Error = m_pEntity->StartCameraCaptrue();
+	if ((Error_EnvCamera != Error) && (Error_AllCamera != Error)) {
+		LogEvent(Severity_Middle, LOG_EVT_UI_STARTCAMERACAPTURE, ctx->Req.strParam.GetData());
+		Error = Error_Succeed;
+	}
+	else {
+		Error = Error_InvalidState;
+	}
+
+	ctx->Answer(Error);
+}
+
+void UIServiceSession::Handle_StopCameraCapture(SpReqAnsContext<UIService_StopCameraCapture_Req, UIService_StopCameraCapture_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	ErrorCodeEnum Error = m_pEntity->StopCameraCaptrue();
+	if (Error_Succeed == Error) {
+		LogEvent(Severity_Middle, LOG_EVT_UI_STOPCAMERACAPTURE, "");
+	}
+	else {
+		Error = Error_InvalidState;
+	}
+
+	ctx->Answer(Error);
+}
+
+
 ChannelClient::ChannelClient( CITCtrlEntity *pEntity ) : ChannelService_ClientBase(pEntity)
 {
 
@@ -2656,13 +2747,11 @@ void ChannelClient::OnMessage( ErrorCodeEnum Error, ChannelService_State_Info &M
 	}
 }
 
-
 LocalPlayClient::LocalPlayClient(CITCtrlEntity *pEntity) : PlayService_ClientBase(pEntity)
 {
 	
 }
 
-
 SalesRecordClient::SalesRecordClient(CITCtrlEntity* pEntity): SalesRecorderSerVice_ClientBase(pEntity)
 {
 

+ 31 - 1
Module/mod_interactivecontrol/mod_interactivecontrol.h

@@ -24,6 +24,7 @@ using namespace SalesRecorder;
 using namespace SIPPhone;
 
 #include "../mod_mediacontroller/MediaController_client_g.h"
+#include "../mod_mediacontroller/MediaController_msg_g.h"
 using namespace MediaController;
 
 #include "../mod_recorder/Recorder_client_g.h"
@@ -115,6 +116,8 @@ public:
 
 	void OnAudioPlayRet(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, LocalMediaPlay::AudioPlayRet &evt);
 
+	void OnEnvCameraCapInfo(const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, MediaController::EnvCameraCapInfo& evt);
+
 	virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/);
 
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext);
@@ -229,6 +232,10 @@ public:
 
 	ErrorCodeEnum SetRemoteRecordCamera(int iCamera);
 
+	ErrorCodeEnum StartCameraCaptrue();
+
+	ErrorCodeEnum StopCameraCaptrue();
+
 private:
 	ErrorCodeEnum ConnectAssistChannel();
 
@@ -284,7 +291,6 @@ private:
 
 	void FreeCounterClient();
 
-
 	SP_BEGIN_MSG_DISPATCH_MAP(CITCtrlEntity)
 		SP_BEGIN_ENTITY_MSG("LocalMediaPlay")
 #ifdef RVC_OS_WIN
@@ -303,6 +309,25 @@ private:
 				LOG_TRACE("%s signature mismatched!", "AudioPlayRet"); \
 		}\
 			break;
+#endif
+		SP_END_ENTITY_MSG()
+		SP_BEGIN_ENTITY_MSG("MediaController")
+#ifdef RVC_OS_WIN
+			SP_MSG_HANDLE_NS(MediaController, EnvCameraCapInfo, OnEnvCameraCapInfo)
+#else
+		case eMsg_EnvCameraCapInfo:\
+			if (eMsgSig_EnvCameraCapInfo == dwMessageSignature) {
+				\
+					MediaController::EnvCameraCapInfo t; \
+					ErrorCodeEnum Error = SpBuffer2Object(Buffer, t); \
+					if (Error == Error_Succeed)\
+						OnEnvCameraCapInfo(pszEntityName, dwMessageId, dwMessageSignature, t); \
+			}
+			else {
+				\
+					LOG_TRACE("%s signature mismatched!", "EnvCameraCapInfo"); \
+			}\
+				break;
 #endif
 		SP_END_ENTITY_MSG()
 	SP_END_MSG_DISPATCH_MAP()
@@ -321,6 +346,7 @@ private:
 	ConnectClient* m_pConnectClient;
 	CAutoArray<CUUID> m_arrListener;
 	CUUID m_uidLocalMediaListenser;
+	CUUID m_uidMediaControllerListenser;
 	bool m_bConnectAssist;
 	bool m_bConnectPlayer;
 	int m_iRecordMode;
@@ -467,6 +493,10 @@ public:
 
 	virtual void Handle_SetRemoteRecordCamera(SpReqAnsContext<UIService_SetRemoteRecordCamera_Req, UIService_SetRemoteRecordCamera_Ans>::Pointer ctx);
 
+	virtual void Handle_StartCameraCapture(SpReqAnsContext<UIService_StartCameraCapture_Req, UIService_StartCameraCapture_Ans>::Pointer ctx);
+
+	virtual void Handle_StopCameraCapture(SpReqAnsContext<UIService_StopCameraCapture_Req, UIService_StopCameraCapture_Ans>::Pointer ctx);
+
 private:
 	CITCtrlEntity *m_pEntity;
 };

+ 4 - 7
Module/mod_mediacontroller/Event.h

@@ -80,6 +80,9 @@
 
 #define LOG_EVT_MEDIACONTROLLER_RESET_ACTIVECAMERA			0x20890005  //重置active camera变量
 
+#define LOG_EVT_SET_CAMERA_BRIGHTNESS_INFO					0x20890006  //设置摄像头亮度信息
+#define LOG_EVT_SET_CAMERA_BRIGHTNESS_FAILED				0x20890007  //设置摄像头亮度失败
+
 //sysvar
 #define SYSVAR_CAMERASTATE	"CameraState"
 #define CAMERA_STATE_INIT	"X"
@@ -88,19 +91,13 @@
 #define CAMERA_OPT_ERROR	"O"
 #define CAMERA_BOTH_ERROR	"B"
 
-
-#define EVENT_MOD_CUSTOMERAWARE_BEGIN						0x30830001	//客户感知进入
-#define EVENT_MOD_CUSTOMERAWARE_END							0x30830002	//客户感知退出
-
 #define EVENT_MOD_BEGIN_RECORD								0x20830061
 #define EVENT_MOD_END_RECORD								0x20830062
 
 #define EVENT_MOD_PAUSE_RECORD								0x20830063
 #define EVENT_MOD_CONTINUE_RECORD							0x20830064
 
-#define LOG_EVT_RECORDFAILED								0x31200001	//本地录像失败
-#define LOG_EVT_UI_STOPRECORD								0x30B00002	//停止客户经理录像
-#define LOG_EVT_UI_RECORDFAILED								0x31500001	//双录失败
+#define LOG_EVT_JSOCCUPYCAMERA_REQUEST						0x20830071
 
 #define AlLCAMERA_NOACTIVE -1
 #define ENVCAMERA 0

+ 245 - 0
Module/mod_mediacontroller/MediaController_client_g.h

@@ -471,6 +471,251 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum GetEnvCameraVideoCaptureInfo(MediaService_GetEnvCameraVideoCaptureInfo_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(MediaService_Method_GetEnvCameraVideoCaptureInfo, MediaService_MethodSignature_GetEnvCameraVideoCaptureInfo, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetEnvCameraVideoCaptureInfo(MediaService_GetEnvCameraVideoCaptureInfo_Req &Req, MediaService_GetEnvCameraVideoCaptureInfo_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetEnvCameraVideoCaptureInfo(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetEnvCameraVideoCaptureInfo(MediaService_GetEnvCameraVideoCaptureInfo_Req &Req, MediaService_GetEnvCameraVideoCaptureInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetEnvCameraVideoCaptureInfo(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 GetEnvCameraVideoCaptureInfo(MediaService_GetEnvCameraVideoCaptureInfo_Req &Req, MediaService_GetEnvCameraVideoCaptureInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetEnvCameraVideoCaptureInfo(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 GetEnvCamRawBrightnessInfo(MediaService_GetEnvCamRawBrightnessInfo_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(MediaService_Method_GetEnvCamRawBrightnessInfo, MediaService_MethodSignature_GetEnvCamRawBrightnessInfo, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetEnvCamRawBrightnessInfo(MediaService_GetEnvCamRawBrightnessInfo_Req &Req, MediaService_GetEnvCamRawBrightnessInfo_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetEnvCamRawBrightnessInfo(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetEnvCamRawBrightnessInfo(MediaService_GetEnvCamRawBrightnessInfo_Req &Req, MediaService_GetEnvCamRawBrightnessInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetEnvCamRawBrightnessInfo(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 GetEnvCamRawBrightnessInfo(MediaService_GetEnvCamRawBrightnessInfo_Req &Req, MediaService_GetEnvCamRawBrightnessInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetEnvCamRawBrightnessInfo(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 SetEnvCamRawBrightness(MediaService_SetEnvCamRawBrightness_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(MediaService_Method_SetEnvCamRawBrightness, MediaService_MethodSignature_SetEnvCamRawBrightness, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum SetEnvCamRawBrightness(MediaService_SetEnvCamRawBrightness_Req &Req, MediaService_SetEnvCamRawBrightness_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetEnvCamRawBrightness(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum SetEnvCamRawBrightness(MediaService_SetEnvCamRawBrightness_Req &Req, MediaService_SetEnvCamRawBrightness_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetEnvCamRawBrightness(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 SetEnvCamRawBrightness(MediaService_SetEnvCamRawBrightness_Req &Req, MediaService_SetEnvCamRawBrightness_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = SetEnvCamRawBrightness(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 TurnOnCamera(MediaService_TurnOnCamera_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(MediaService_Method_TurnOnCamera, MediaService_MethodSignature_TurnOnCamera, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum TurnOnCamera(MediaService_TurnOnCamera_Req &Req, MediaService_TurnOnCamera_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = TurnOnCamera(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum TurnOnCamera(MediaService_TurnOnCamera_Req &Req, MediaService_TurnOnCamera_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = TurnOnCamera(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 TurnOnCamera(MediaService_TurnOnCamera_Req &Req, MediaService_TurnOnCamera_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = TurnOnCamera(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 TurnOffCamera(MediaService_TurnOffCamera_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(MediaService_Method_TurnOffCamera, MediaService_MethodSignature_TurnOffCamera, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum TurnOffCamera(MediaService_TurnOffCamera_Req &Req, MediaService_TurnOffCamera_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = TurnOffCamera(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum TurnOffCamera(MediaService_TurnOffCamera_Req &Req, MediaService_TurnOffCamera_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = TurnOffCamera(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 TurnOffCamera(MediaService_TurnOffCamera_Req &Req, MediaService_TurnOffCamera_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = TurnOffCamera(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 IsCameraOnStatus(MediaService_IsCameraOnStatus_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
 	{
 		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();

+ 121 - 2
Module/mod_mediacontroller/MediaController_def_g.h

@@ -24,7 +24,12 @@ namespace MediaController {
 #define MediaService_Method_GetVideoDevices 9
 #define MediaService_Method_GetCameraInfos 10
 #define MediaService_Method_ManipulateCameras 11
-#define MediaService_Method_IsCameraOnStatus 12
+#define MediaService_Method_GetEnvCameraVideoCaptureInfo 12
+#define MediaService_Method_GetEnvCamRawBrightnessInfo 13
+#define MediaService_Method_SetEnvCamRawBrightness 14
+#define MediaService_Method_TurnOnCamera 15
+#define MediaService_Method_TurnOffCamera 16
+#define MediaService_Method_IsCameraOnStatus 17
 
 #define MediaService_MethodSignature_GetVideoDeviceName -496217232
 #define MediaService_MethodSignature_StartCamera 749460891
@@ -38,6 +43,11 @@ namespace MediaController {
 #define MediaService_MethodSignature_GetVideoDevices 616397805
 #define MediaService_MethodSignature_GetCameraInfos -2116637958
 #define MediaService_MethodSignature_ManipulateCameras 755873072
+#define MediaService_MethodSignature_GetEnvCameraVideoCaptureInfo -1001722899
+#define MediaService_MethodSignature_GetEnvCamRawBrightnessInfo -238932083
+#define MediaService_MethodSignature_SetEnvCamRawBrightness -2113841351
+#define MediaService_MethodSignature_TurnOnCamera -1801492539
+#define MediaService_MethodSignature_TurnOffCamera -1380301309
 #define MediaService_MethodSignature_IsCameraOnStatus -491616205
 
 #define MediaService_LogCode_GetVideoDeviceName "QLR040220800"
@@ -52,7 +62,12 @@ namespace MediaController {
 #define MediaService_LogCode_GetVideoDevices "QLR040220809"
 #define MediaService_LogCode_GetCameraInfos "QLR040220810"
 #define MediaService_LogCode_ManipulateCameras "QLR040220811"
-#define MediaService_LogCode_IsCameraOnStatus "QLR040220812"
+#define MediaService_LogCode_GetEnvCameraVideoCaptureInfo "QLR040220812"
+#define MediaService_LogCode_GetEnvCamRawBrightnessInfo "QLR040220813"
+#define MediaService_LogCode_SetEnvCamRawBrightness "QLR040220814"
+#define MediaService_LogCode_TurnOnCamera "QLR040220815"
+#define MediaService_LogCode_TurnOffCamera "QLR040220816"
+#define MediaService_LogCode_IsCameraOnStatus "QLR040220817"
 
 struct MediaService_GetVideoDeviceName_Req
 {
@@ -265,6 +280,110 @@ struct MediaService_ManipulateCameras_Ans
 
 };
 
+struct MediaService_GetEnvCameraVideoCaptureInfo_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct MediaService_GetEnvCameraVideoCaptureInfo_Ans
+{
+	CSimpleStringA strnotice;
+	CSimpleStringA strcmd;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & strnotice & strcmd;
+	}
+
+};
+
+struct MediaService_GetEnvCamRawBrightnessInfo_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct MediaService_GetEnvCamRawBrightnessInfo_Ans
+{
+	int iMinBrightness;
+	int iMaxBrightness;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & iMinBrightness & iMaxBrightness;
+	}
+
+};
+
+struct MediaService_SetEnvCamRawBrightness_Req
+{
+	int iBrightness;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & iBrightness;
+	}
+
+};
+
+struct MediaService_SetEnvCamRawBrightness_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct MediaService_TurnOnCamera_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct MediaService_TurnOnCamera_Ans
+{
+	unsigned int ErrorCode;
+	CSimpleStringW ErrorMsg;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & ErrorCode & ErrorMsg;
+	}
+
+};
+
+struct MediaService_TurnOffCamera_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct MediaService_TurnOffCamera_Ans
+{
+	unsigned int ErrorCode;
+	CSimpleStringW ErrorMsg;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & ErrorCode & ErrorMsg;
+	}
+
+};
+
 struct MediaService_IsCameraOnStatus_Req
 {
 

+ 15 - 0
Module/mod_mediacontroller/MediaController_msg_g.h

@@ -13,11 +13,13 @@ namespace MediaController {
 #define eMsg_ExternalCameraInserted 1
 #define eMsg_ExternalCameraRemoved 2
 #define eMsg_ExternalCameraStateChanged 3
+#define eMsg_EnvCameraCapInfo 4
 
 #define eMsgSig_ExternalCameraSwitchFailed 637170259
 #define eMsgSig_ExternalCameraInserted 1355033794
 #define eMsgSig_ExternalCameraRemoved -2086712549
 #define eMsgSig_ExternalCameraStateChanged -181183885
+#define eMsgSig_EnvCameraCapInfo -1158933893
 
 struct ExternalCameraSwitchFailed
 {
@@ -72,5 +74,18 @@ struct ExternalCameraStateChanged
 
 ///////////////////////////
 
+struct EnvCameraCapInfo
+{
+	CSimpleStringW cameracapmsg;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & cameracapmsg;
+	}
+
+};
+
+///////////////////////////
+
 } // namespace MediaController
 #endif // __MEDIACONTROLLER_MSG_G_H

+ 135 - 0
Module/mod_mediacontroller/MediaController_server_g.h

@@ -114,6 +114,41 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case MediaService_Method_GetEnvCameraVideoCaptureInfo:
+			if (dwSignature == MediaService_MethodSignature_GetEnvCameraVideoCaptureInfo) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_GetEnvCamRawBrightnessInfo:
+			if (dwSignature == MediaService_MethodSignature_GetEnvCamRawBrightnessInfo) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_SetEnvCamRawBrightness:
+			if (dwSignature == MediaService_MethodSignature_SetEnvCamRawBrightness) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_TurnOnCamera:
+			if (dwSignature == MediaService_MethodSignature_TurnOnCamera) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_TurnOffCamera:
+			if (dwSignature == MediaService_MethodSignature_TurnOffCamera) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		case MediaService_Method_IsCameraOnStatus:
 			if (dwSignature == MediaService_MethodSignature_IsCameraOnStatus) {
 				bOverlap = true;
@@ -192,6 +227,31 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case MediaService_Method_GetEnvCameraVideoCaptureInfo:
+			if (dwSignature != MediaService_MethodSignature_GetEnvCameraVideoCaptureInfo) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_GetEnvCamRawBrightnessInfo:
+			if (dwSignature != MediaService_MethodSignature_GetEnvCamRawBrightnessInfo) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_SetEnvCamRawBrightness:
+			if (dwSignature != MediaService_MethodSignature_SetEnvCamRawBrightness) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_TurnOnCamera:
+			if (dwSignature != MediaService_MethodSignature_TurnOnCamera) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case MediaService_Method_TurnOffCamera:
+			if (dwSignature != MediaService_MethodSignature_TurnOffCamera) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		case MediaService_Method_IsCameraOnStatus:
 			if (dwSignature != MediaService_MethodSignature_IsCameraOnStatus) {
 				Error = Error_MethodSignatureFailed;
@@ -264,6 +324,31 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_GetEnvCameraVideoCaptureInfo(SpReqAnsContext<MediaService_GetEnvCameraVideoCaptureInfo_Req, MediaService_GetEnvCameraVideoCaptureInfo_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_GetEnvCamRawBrightnessInfo(SpReqAnsContext<MediaService_GetEnvCamRawBrightnessInfo_Req, MediaService_GetEnvCamRawBrightnessInfo_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_SetEnvCamRawBrightness(SpReqAnsContext<MediaService_SetEnvCamRawBrightness_Req, MediaService_SetEnvCamRawBrightness_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_TurnOnCamera(SpReqAnsContext<MediaService_TurnOnCamera_Req, MediaService_TurnOnCamera_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_TurnOffCamera(SpReqAnsContext<MediaService_TurnOffCamera_Req, MediaService_TurnOffCamera_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void Handle_IsCameraOnStatus(SpReqAnsContext<MediaService_IsCameraOnStatus_Req, MediaService_IsCameraOnStatus_Ans>::Pointer ctx)
 	{
 	/// override by user
@@ -405,6 +490,56 @@ public:
 						Handle_ManipulateCameras(ctx);
 					}
 					break;
+				case MediaService_Method_GetEnvCameraVideoCaptureInfo:
+					{
+						SpReqAnsContext<MediaService_GetEnvCameraVideoCaptureInfo_Req,MediaService_GetEnvCameraVideoCaptureInfo_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<MediaService_GetEnvCameraVideoCaptureInfo_Req,MediaService_GetEnvCameraVideoCaptureInfo_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetEnvCameraVideoCaptureInfo(ctx);
+					}
+					break;
+				case MediaService_Method_GetEnvCamRawBrightnessInfo:
+					{
+						SpReqAnsContext<MediaService_GetEnvCamRawBrightnessInfo_Req,MediaService_GetEnvCamRawBrightnessInfo_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<MediaService_GetEnvCamRawBrightnessInfo_Req,MediaService_GetEnvCamRawBrightnessInfo_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetEnvCamRawBrightnessInfo(ctx);
+					}
+					break;
+				case MediaService_Method_SetEnvCamRawBrightness:
+					{
+						SpReqAnsContext<MediaService_SetEnvCamRawBrightness_Req,MediaService_SetEnvCamRawBrightness_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<MediaService_SetEnvCamRawBrightness_Req,MediaService_SetEnvCamRawBrightness_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_SetEnvCamRawBrightness(ctx);
+					}
+					break;
+				case MediaService_Method_TurnOnCamera:
+					{
+						SpReqAnsContext<MediaService_TurnOnCamera_Req,MediaService_TurnOnCamera_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<MediaService_TurnOnCamera_Req,MediaService_TurnOnCamera_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_TurnOnCamera(ctx);
+					}
+					break;
+				case MediaService_Method_TurnOffCamera:
+					{
+						SpReqAnsContext<MediaService_TurnOffCamera_Req,MediaService_TurnOffCamera_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<MediaService_TurnOffCamera_Req,MediaService_TurnOffCamera_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_TurnOffCamera(ctx);
+					}
+					break;
 				case MediaService_Method_IsCameraOnStatus:
 					{
 						SpReqAnsContext<MediaService_IsCameraOnStatus_Req,MediaService_IsCameraOnStatus_Ans>::Pointer ctx;

+ 76 - 33
Module/mod_mediacontroller/MediaService.xml

@@ -45,43 +45,82 @@
             </req>
             <res>
             	<param name="retCode" type="int"/>
-							<param name="deviceCount" type="int"/>
+		<param name="deviceCount" type="int"/>
               <param name="strNames" type="string"/>
             </res>
-        </twoway>
-	 <twoway name="GetVideoDevices" overlap="true">
+    </twoway>
+    <twoway name="GetVideoDevices" overlap="true">
             <res>
-               	<param name="retCode" type="int"/>
-								<param name="deviceCount" type="int"/>
-               	<param name="strNames" type="string"/>
+              <param name="retCode" type="int"/>
+	      <param name="deviceCount" type="int"/>
+              <param name="strNames" type="string"/>
            </res>
-   </twoway>
-	 <twoway name="GetCameraInfos" overlap="true">
-            <res>
-							<param name="retCode" type="int"/>
-							<param name="EnvCamera" type="string"/>
-							<param name="EnvUsbPort" type="string"/>
-							<param name="EnvReserved" type="string"/>
-							<param name="OptCamera" type="string"/>
-							<param name="OptUsbPort" type="string"/>
-							<param name="OptReserved" type="string"/>
-            </res>
-   </twoway>
-	 <twoway name="ManipulateCameras" overlap="true">
-            <req>
-            	<!--操作意图指令: 0:获取并接管设备权限;1:归还设备权限,不再占用-->
-            	<param name="cmdType" type="int"/>
-            	<param name="reserved1" type="int"/>
-            	<param name="reserved2" type="string"/>
-            </req>
-            <!--实体收到接口请求时无论操作成功与否返回Answer(Error_Succeed),具体操作成功与否通过retCode标识-->
-            <res>
-            	<!--retCode:0:表示成功,非0:表示失败 -->
-            	<param name="retCode" type="int"/>
-            	<param name="reserved1" type="int"/>
-            	<param name="reserved2" type="string"/>
-            </res>
-		</twoway>
+     </twoway>
+     <twoway name="GetCameraInfos" overlap="true">
+             <res>
+		<param name="retCode" type="int"/>
+		<param name="EnvCamera" type="string"/>
+		<param name="EnvUsbPort" type="string"/>
+		<param name="EnvReserved" type="string"/>
+		<param name="OptCamera" type="string"/>
+		<param name="OptUsbPort" type="string"/>
+		<param name="OptReserved" type="string"/>
+             </res>
+     </twoway>
+     <twoway name="ManipulateCameras" overlap="true">
+     	<req>
+         	<!--操作意图指令: 0:获取并接管设备权限;1:归还设备权限,不再占用-->
+                <param name="cmdType" type="int"/>
+        	<param name="reserved1" type="int"/>
+         	<param name="reserved2" type="string"/>
+        </req>
+        <!--实体收到接口请求时无论操作成功与否返回Answer(Error_Succeed),具体操作成功与否通过retCode标识-->
+        <res>
+        <!--retCode:0:表示成功,非0:表示失败 -->
+         	<param name="retCode" type="int"/>
+         	<param name="reserved1" type="int"/>
+         	<param name="reserved2" type="string"/>
+        </res>
+    </twoway>
+    <twoway name="GetEnvCameraVideoCaptureInfo" overlap="true">
+      <req>
+      </req>
+      <res>
+        <param name="strnotice" type="string"/>
+        <param name="strcmd" type="string"/>
+      </res>
+    </twoway>
+    <twoway name="GetEnvCamRawBrightnessInfo" overlap="true">
+      <req>
+      </req>
+      <res>
+        <param name="iMinBrightness" type="int"/>
+        <param name="iMaxBrightness" type="int"/>
+      </res>
+    </twoway>
+    <twoway name="SetEnvCamRawBrightness" overlap="true">
+      <req>
+        <param name="iBrightness" type="int"/>
+      </req>
+      <res>
+      </res>
+    </twoway>
+    <twoway name="TurnOnCamera" overlap="true">
+      <req>
+      </req>
+      <res>
+        <param name="ErrorCode" type="uint"/>
+        <param name="ErrorMsg" type="wstring"/>
+      </res>
+    </twoway>
+    <twoway name="TurnOffCamera" overlap="true">
+      <req>
+      </req>
+      <res>
+        <param name="ErrorCode" type="uint"/>
+        <param name="ErrorMsg" type="wstring"/>
+      </res>
+    </twoway>
     <twoway name="IsCameraOnStatus" overlap="true">
       <req>
       </req>
@@ -112,4 +151,8 @@
 		<!-- 摄像头名称 -->
 		<param name="camname" type="wstring"/>
 	</message>
+  	<!-- 上摄像头稳定性数据 -->
+  	<message name="EnvCameraCapInfo">
+    		<param name="cameracapmsg" type="wstring"/>
+  	</message>
 </entity>

+ 89 - 13
Module/mod_mediacontroller/capture.cpp

@@ -802,6 +802,7 @@ static int video_shm_enqueue(Clibvideoqueue *shm_queue, video_frame *frame, unsi
 	}
 }
 
+
 static void env_cap_on_frame(void *user_data, video_frame *frame)
 {
 	video_capture_t *video_cap = (video_capture_t *)user_data;
@@ -826,6 +827,25 @@ static void env_cap_on_frame(void *user_data, video_frame *frame)
 	//	isnapshot_shm_queue++;
 	//}
 
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	static int isnapshot_count = 0;
+	if (video_cap->bsavephoto) {
+		if ((video_cap->isaveinterval > 0) && (0 == video_cap->frame_id % (video_cap->isaveinterval * cap->config.video_env_fps)))
+		{
+			char strFileName[2 * MAX_PATH] = { 0 };
+			snprintf(strFileName, 2 * MAX_PATH, "%s%s_%d.bmp", video_cap->strsavedir, video_cap->strphotoname, isnapshot_count++);
+			video_frame_save_bmpfile(strFileName, frame);
+		}
+	}
+	else {
+		isnapshot_count = 0;
+	}
+#endif
+#endif
+
 	if (rc != Error_Succeed) 
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("env snapshot queue enqueue failed! Error = %d, camera_type=%d.", rc, video_cap->camera_type);
@@ -1089,6 +1109,16 @@ static video_capture_t *video_capture_create(capture_t *cap, int camera_type)
 		video_cap->parent = cap;
 		video_cap->camera_type = camera_type;
 		video_cap->frame_id = 0;
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+		video_cap->bsavephoto = false;
+		memset(video_cap->strsavedir, 0, MAX_PATH);
+		memset(video_cap->strphotoname, 0, MAX_PATH);
+		video_cap->isaveinterval = 0;
+#endif
+#endif
 		if (camera_type == CAMERA_TYPE_ENV) {
 			video_cap->snapshot_shm_queue = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE);
 			video_cap->rtp_shm_queue = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_RTP_QUEUE);
@@ -1311,19 +1341,19 @@ static int video_capture_start_linux(video_capture_t* video_cap)
 				iret = 0;
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VideoCap StartVideoCapture failed!");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VideoCap Start Video Capture failed!");
 				DestroyVideoCaptureObj(video_cap->pVideoCap);
 				video_cap->pVideoCap = NULL;
 			}
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VideoCap SetVideoCaptureParam failed!");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("VideoCap Set Video Capture Param failed!");
 			DestroyVideoCaptureObj(video_cap->pVideoCap);
 			video_cap->pVideoCap = NULL;
 		}
 	}
 	else{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(" CreateVideoCaptureObj failed!");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(" Create Video Capture Obj failed!");
 	}
 
 	return iret;
@@ -1407,7 +1437,7 @@ namespace MediaController {
 		}
 	}
 
-	ErrorCodeEnum capture_create(const capture_config_t *config,capture_t *cap,int nCamera)
+	ErrorCodeEnum capture_create(const capture_config_t *config, capture_t *cap, int nCamera)
 	{
 		int dev_id1 = capture_get_video_device_id(config->strVideoEnv);
 		int dev_id2 = capture_get_video_device_id(config->strVideoOpt);
@@ -1749,7 +1779,10 @@ namespace MediaController {
 			if (0 != cap->env_video->ustarttime) {
 				int ienvtime = y2k_time_now() - cap->env_video->ustarttime;
 				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_CLOSE, CSimpleStringA::Format("stop envcam, and camera open time is %us.", ienvtime).GetData());
-				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_FRAME_INFO, CSimpleStringA::Format("env camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d.", ienvtime*cap->config.video_env_fps, ienvtime, cap->env_video->frame_id, ienvtime * cap->config.video_env_fps - cap->env_video->frame_id).GetData());
+				if (ienvtime >= 1) {
+					float fenvframerate = (float)((float)cap->env_video->frame_id / (float)ienvtime);
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_ENVCAM_FRAME_INFO, CSimpleStringA::Format("env camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d, real frmerate is %.2ffps.", ienvtime * cap->config.video_env_fps, ienvtime, cap->env_video->frame_id, ienvtime * cap->config.video_env_fps - cap->env_video->frame_id, fenvframerate).GetData());
+				}
 			}
 			video_capture_stop(cap->env_video);
 		}
@@ -1757,7 +1790,10 @@ namespace MediaController {
 			if (0 != cap->opt_video->ustarttime) {
 				int iopttime = y2k_time_now() - cap->opt_video->ustarttime;
 				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_CLOSE, CSimpleStringA::Format("stop optcam, and camera open time is %us.", iopttime).GetData());
-				LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_FRAME_INFO, CSimpleStringA::Format("opt camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d.", iopttime * cap->config.video_opt_fps, iopttime, cap->opt_video->frame_id, iopttime * cap->config.video_opt_fps - cap->opt_video->frame_id).GetData());
+				if (iopttime >= 1) {	
+					float foptframerate = (float)((float)cap->opt_video->frame_id / (float)iopttime);
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_MEDIACONTROLLER_OPTCAM_FRAME_INFO, CSimpleStringA::Format("opt camera frame info is dest frame number is %d(%us), real frame number is %d, difference is %d, real frmerate is %.2ffps.", iopttime * cap->config.video_opt_fps, iopttime, cap->opt_video->frame_id, iopttime * cap->config.video_opt_fps - cap->opt_video->frame_id, foptframerate).GetData());
+				}
 			}
 			video_capture_stop(cap->opt_video);
 		}
@@ -2014,11 +2050,11 @@ namespace MediaController {
 			char* pjsonstr = cJSON_Print(root);
 			strCamListInfoJson = pjsonstr;
 			cJSON_free(pjsonstr);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V1").setAPI("RvcMedia_GetCameraDevInfo")(CSimpleStringA::Format("%s", strCamListInfoJson.GetData()).GetData());
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402208V1").setAPI("RvcMedia_GetCameraDevInfo")(CSimpleStringA::Format("%s", strCamListInfoJson.GetData()).GetData());
 		}
 		else {
 			cJSON_Delete(array);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V1").setResultCode("RTA280A")("获取摄像头列表失败,找不到摄像头");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V1").setResultCode("RTA280A")("获取摄像头列表失败,找不到摄像头");
 		}
 
 		*ivideonum = icamnum;
@@ -2061,11 +2097,11 @@ namespace MediaController {
 #else
 		int ienv = -1;
 		if (cap && cap->env_video && cap->env_video->pVideoCap && (nCode != Error_EnvCamera) && (nCode != Error_AllCamera)){
-			ienv = cap->env_video->pVideoCap->SetCamBrightness(nvalue);
+			ienv = cap->env_video->pVideoCap->SetCamBrightness(nvalue, false);
 		}
 		int iopt = -1;
 		if (cap && cap->opt_video && cap->opt_video->pVideoCap && (nCode != Error_OptCamera) && (nCode != Error_AllCamera)){
-			iopt = cap->opt_video->pVideoCap->SetCamBrightness(nvalue);
+			iopt = cap->opt_video->pVideoCap->SetCamBrightness(nvalue, false);
 		}
 
 		if (0 == ienv && 0 == iopt){
@@ -2161,12 +2197,12 @@ namespace MediaController {
 		int nValue2 = 0;
 		int ienv = -1;
 		if (cap && cap->env_video && cap->env_video->pVideoCap && (nCode != Error_EnvCamera) && (nCode != Error_AllCamera)){
-			ienv = cap->env_video->pVideoCap->GetCamBrightness(&nValue1);
+			ienv = cap->env_video->pVideoCap->GetCamBrightness(&nValue1, false);
 		}
 
 		int iopt = -1;
 		if (cap && cap->opt_video && cap->opt_video->pVideoCap && (nCode != Error_OptCamera) && (nCode != Error_AllCamera)){
-			iopt = cap->opt_video->pVideoCap->GetCamBrightness(&nValue2);
+			iopt = cap->opt_video->pVideoCap->GetCamBrightness(&nValue2, false);
 		}
 		else{
 			return -1;
@@ -2193,7 +2229,45 @@ namespace MediaController {
 #endif // RVC_OS_WIN
 	}
 
-	int StopCamera(capture_t *cap,int nCamera)
+
+	int capture_get_env_rawbrightnessinfo(capture_t* cap, ErrorCodeEnum nCode, int* imin, int* imax)
+	{
+		int iret = -1;
+#ifdef RVC_OS_WIN
+
+#else
+		if (cap && cap->env_video && cap->env_video->pVideoCap && (nCode != Error_EnvCamera) && (nCode != Error_AllCamera)) {
+			if (cap->env_video->pVideoCap->GetCamRawBrightnessRange(imin, imax)) {
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("min brightness is %d, max brightness is %d.", *imin, *imax);
+				iret = 0;
+			}
+		}
+
+#endif // RVC_OS_WIN
+
+		return iret;
+	}
+	
+
+	int capture_set_env_rawbrightness(capture_t* cap, ErrorCodeEnum nCode, int ibrightness)
+	{
+		int iret = -1;
+#ifdef RVC_OS_WIN
+
+#else
+		if (cap && cap->env_video && cap->env_video->pVideoCap && (nCode != Error_EnvCamera) && (nCode != Error_AllCamera)) {
+			if (0 == cap->env_video->pVideoCap->SetCamBrightness(ibrightness, true)) {
+				iret = 0;
+			}
+		}
+
+#endif // RVC_OS_WIN
+
+		return iret;
+	}
+
+
+	int stopcamera(capture_t *cap,int nCamera)
 	{
 		if((nCamera == ENVCAMERA)&&cap->env_video)
 		{
@@ -2218,7 +2292,9 @@ namespace MediaController {
 			}
 
 			video_capture_destroy(cap->opt_video);
+
 			cap->opt_video = NULL;
+
 			return 0;
 		}
 		else

+ 21 - 4
Module/mod_mediacontroller/capture.h

@@ -29,6 +29,10 @@ extern "C"{
 	#include <libswscale/swscale.h>
 }
 
+#ifndef MAX_PATH
+#define MAX_PATH 260
+#endif
+
 #ifndef CAPTURE_FRAME_TIME
 #define CAPTURE_FRAME_TIME	20 // 20ms per frame
 #endif
@@ -141,6 +145,17 @@ namespace MediaController {
 		struct SwsContext *preview_sws_ctx;
 		struct SwsContext *rtp_sws_ctx;
 		unsigned int ustarttime;
+
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+		bool bsavephoto;
+		char strsavedir[MAX_PATH];
+		char strphotoname[MAX_PATH];
+		int isaveinterval;
+#endif
+#endif
 	}video_capture_t;
 
 
@@ -176,14 +191,16 @@ namespace MediaController {
 	void capture_lib_term();
 
 	int capture_get_video_device_id(const char *dev_name);
-	bool capture_adj_brightness(capture_t *cap,int nvalue,ErrorCodeEnum nCode);
-	bool capture_set_autobrightness(capture_t *cap,ErrorCodeEnum nCode);
-	int capture_get_brightness(capture_t *cap,ErrorCodeEnum nCode);
-	int StopCamera(capture_t *cap,int nCamera);
+	bool capture_adj_brightness(capture_t *cap,int nvalue, ErrorCodeEnum nCode);
+	bool capture_set_autobrightness(capture_t *cap, ErrorCodeEnum nCode);
+	int capture_get_brightness(capture_t *cap, ErrorCodeEnum nCode);
+	int stopcamera(capture_t *cap,int nCamera);
 	void capture_destroy(capture_t *cap,int nCamera);
 	//清空抓拍队列里的照片,摄像头故障时调用
 	void capture_clearsnapshotvideo(capture_t *cap,int nCamera);
 	int get_camera_exception_message(char* pBuffer, size_t uLen, CSimpleStringA strDeviceName, const char* strErrorMessage);
 	int capture_get_audio_device_list(bool in_direction, CSimpleStringA& strdevicelist);
 	int capture_get_video_device_list(CSimpleStringA& strdevicelist);
+	int capture_get_env_rawbrightnessinfo(capture_t* cap, ErrorCodeEnum nCode, int* imin, int* imax);
+	int capture_set_env_rawbrightness(capture_t* cap, ErrorCodeEnum nCode, int ibrightness);
 }

+ 379 - 25
Module/mod_mediacontroller/mod_mediacontroller.cpp

@@ -2,6 +2,9 @@
 #include "y2k_time.h"
 #include "capture.h"
 #include "Event.h"
+#include "CommEntityUtil.hpp"
+#include "fileutil.h"
+
 #ifdef RVC_OS_WIN
 #include "iaudiorenderinterface.h"
 #endif
@@ -12,6 +15,9 @@
 #include "../mod_recorder/Event.h"
 #include "../mod_counterconnector/Event.h"
 #include "../mod_sipphone/Event.h"
+#include "../mod_SalesRecorder/Event.h"
+#include "../mod_evtconverter/Event.h"
+
 
 #ifndef AUTOMATCH_CAMERA_ENV
 #define AUTOMATCH_CAMERA_ENV	"ENV_"
@@ -30,6 +36,9 @@
 #define RVC_CAMERA_OFF_TIMER 3
 #endif // !RVC_CAMERA_OFF_TIMER
 
+#ifndef RVC_CAMERA_CAP_PROCESS
+#define RVC_CAMERA_CAP_PROCESS 4
+#endif // !RVC_CAMERA_CAP_PROCESS
 
 #ifdef RVC_OS_WIN
 static void __audio_render_log(void* user_data, const char* fmt, va_list arg)
@@ -89,6 +98,15 @@ static int GetFormatString(char* strVala, size_t uValaLen, char* strValb, size_t
 }
 
 
+static void LogTransToCMSEvt()
+{
+	static bool blogevt = false;
+	if (false == blogevt) {
+		LogWarn(Severity_Low, Error_Debug, LOG_EVT_JSOCCUPYCAMERA_REQUEST, "js occupy camera request evt.");
+		blogevt = true;
+	}
+}
+
 CMediaControllerEntity::CMediaControllerEntity(): m_capture(NULL), m_salesaudio_capture(NULL), m_lCaptureEnvCount(0), m_lCaptureEnvOptCount(0), m_lCaptureOptCount(0),
 	m_pHMClient(NULL),m_pMediaControllerChannel(NULL),m_bIsRemoteRecord(false), m_bHasStartSpeakerRender(false), m_bConnectedAssist(false)
 {
@@ -112,6 +130,14 @@ CMediaControllerEntity::CMediaControllerEntity(): m_capture(NULL), m_salesaudio_
 	m_nCameraErrorCode = Error_Succeed;
 	memset(&conf, 0, sizeof(capture_config_t));
 	memset(&m_sales_audio_conf, 0, sizeof(rvc_audio_capture_config_t));
+
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	m_PhotoSaveDir = "";
+#endif
+#endif
 }
 
 void CMediaControllerEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
@@ -199,14 +225,14 @@ void CMediaControllerEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmar
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RECORDFAILED,NULL,false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD,NULL,false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPREMOTERECORD,NULL,false);
-	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD,NULL,false);
-	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD,NULL,false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_SALESRECORDER_STARTED_SUCCESS, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_BEGIN_HANDLE_BUSINESS, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_END_HANDLE_BUSINESS, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_MOD_FACETRACKING_STARTED_SUCCESS, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CONNECT_BEGAIN_RECORD_CALL, NULL, false);
-	
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTCAMERACAPTURE, NULL, false);
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPCAMERACAPTURE, NULL, false);
+
 	pTransactionContext->SendAnswer(Error_Succeed);
 }
 
@@ -309,6 +335,25 @@ void CMediaControllerEntity::OnStarted()
 			}
 		}
 	}
+
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	Error = GetFunction()->GetPath("Temp", m_PhotoSaveDir);
+	if (Error != Error_Succeed) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get global record save path failed!");
+	}
+
+	if (m_PhotoSaveDir.GetLength() > 0 && m_PhotoSaveDir[m_PhotoSaveDir.GetLength() - 1] != SPLIT_SLASH) {
+		m_PhotoSaveDir += SPLIT_SLASH_STR;
+	}
+	m_PhotoSaveDir += "CameraPhoto";
+	m_PhotoSaveDir += SPLIT_SLASH_STR;
+
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("photo save dir is %s.", m_PhotoSaveDir.GetData());
+#endif
+#endif
 }
 
 
@@ -433,7 +478,7 @@ ErrorCodeEnum CMediaControllerEntity::GetMediaConfig()
 		table.AddEntryUInt("MediaController", "InterValTime", intervaltime, RVC_CAM_INTERVAL_TIME);
 		Error= table.Load(spConfig);
 	}
-
+	 
 	if (Error_Succeed != Error){
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get entity config from config failed!");
 	}
@@ -539,7 +584,7 @@ void CMediaControllerEntity::OnTimeout(DWORD dwTimerID)
 					if (m_capture) {
 						GetFunction()->KillTimer(1);
 						capture_stop(m_capture);
-						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V5")("关闭摄像头");
+						DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402208V5")("关闭摄像头");
 						capture_destroy(m_capture);
 						m_capture = NULL;
 					}
@@ -557,6 +602,15 @@ void CMediaControllerEntity::OnTimeout(DWORD dwTimerID)
 			}
 		}
 	}
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	else if (RVC_CAMERA_CAP_PROCESS == dwTimerID) {
+		GetEnvCamCaptureProcess();
+	}
+#endif
+#endif
 }
 
 
@@ -824,20 +878,22 @@ void CMediaControllerEntity::OnReceivePkt(int sub_type, const char *buffer, int
 	{
 		if (m_bStartCamera)
 		{
-			if (eStand2sType == m_eDeviceType)
+			if (eStand2sType == m_eDeviceType || eStand1SPlusType == m_eDeviceType)
 			{
 				//vamera bright adj
 				CCameraBrightValue num;
 				SpBuffer buf;
-				buf.OpenRead(buffer,size);
+				buf.OpenRead(buffer, size);
 				num.Serialize(buf);
-				if (capture_adj_brightness(m_capture,num.nValue,m_nCameraErrorCode) == true)
+				if (capture_adj_brightness(m_capture, num.nValue, m_nCameraErrorCode) == true)
 				{
 					SendCameraBright();
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_SET_CAMERA_BRIGHTNESS_INFO, CSimpleStringA::Format("set camera brightness to %d success.", num.nValue).GetData());
 				} 
 				else
 				{
 					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ACM_SET_CAMERABRIGHT fail!");
+					LogWarn(Severity_Low, Error_Debug, LOG_EVT_SET_CAMERA_BRIGHTNESS_FAILED, CSimpleStringA::Format("set camera brightness to %d failed.", num.nValue).GetData());
 				}	
 			}
 			else
@@ -875,6 +931,40 @@ ErrorCodeEnum CMediaControllerEntity::RealSelfCheck()
 }
 
 
+ErrorCodeEnum CMediaControllerEntity::GetEnvCamRawBrightnessInfo(int* iMin, int* iMax)
+{
+	ErrorCodeEnum Error = Error_Failed;
+
+#ifdef DEVOPS_ON_PRD
+
+#else
+	if (m_bStartCamera) {
+		if (0 == capture_get_env_rawbrightnessinfo(m_capture, m_nCameraErrorCode, iMin, iMax)) {
+			Error = Error_Succeed;
+		}
+	}
+#endif
+	return Error;
+}
+
+
+ErrorCodeEnum CMediaControllerEntity::SetEnvCamRawBrightness(int iBrightness)
+{
+	ErrorCodeEnum Error = Error_Failed;
+
+#ifdef DEVOPS_ON_PRD
+
+#else
+	if (m_bStartCamera) {
+		if (0 == capture_set_env_rawbrightness(m_capture, m_nCameraErrorCode, iBrightness)) {
+			Error = Error_Succeed;
+		}
+	}
+#endif
+	return Error;
+}
+
+
 void CMediaControllerEntity::SendCameraBright()
 {
 	ChannelService_Send_Info Info;
@@ -893,7 +983,7 @@ void CMediaControllerEntity::SendCameraBright()
 		buf & nValue;
 		Info.data = buf.ToBlob();
 		m_pMediaControllerChannel->Send(Info);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("send cur camera bright value is %d.", nValue);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send cur camera bright value is %d.", nValue);
 	}
 	else
 	{
@@ -902,6 +992,32 @@ void CMediaControllerEntity::SendCameraBright()
 }
 
 
+ErrorCodeEnum CMediaControllerEntity::GetEnvCameraVideoCaptureInfo(CSimpleStringA& strnotice, CSimpleStringA& strcmd)
+{
+	ErrorCodeEnum Error = Error_Failed;
+
+#ifdef DEVOPS_ON_PRD
+
+#else
+	int ienvid = capture_get_video_device_id(conf.strVideoEnv.GetData());
+
+	if (-1 != ienvid) {
+	#ifdef RVC_OS_WIN
+
+	#else
+		char strCmd[256] = { 0 };
+		snprintf(strCmd, 256, "v4l2-ctl -d%d --list-formats-ext", ienvid);
+		strnotice = "在终端输入以下命令获取摄像头支持的图像格式信息,检查输出图像格式是否包含YUYV,图像分辨率是否包含640*360,该分辨率对应的帧率是否包含15fps.";
+		strcmd = strCmd;
+	#endif
+#endif
+		Error = Error_Succeed;
+	}
+
+	return Error;
+}
+
+
 ErrorCodeEnum CMediaControllerEntity::StartAllCameras()
 {
 	ErrorCodeEnum Error = Error_Succeed;
@@ -926,7 +1042,7 @@ ErrorCodeEnum CMediaControllerEntity::StopAllCameras()
 	if (m_capture){
 		GetFunction()->KillTimer(1);
 		capture_stop(m_capture);
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V5")("关闭摄像头");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402208V5")("关闭摄像头");
 		capture_destroy(m_capture);
 		m_capture = NULL;
 	}
@@ -1175,7 +1291,7 @@ ErrorCodeEnum CMediaControllerEntity::LoadConfig(capture_config_t *conf)
 			}
 			else {
 				LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_MEDIACONTROLLER_VIDEO_AUTO_MATHED_FAILED, strInfo.GetData());
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA2807")("摄像头名称不符合硬件要求,请联系厂商处理");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V2").setResultCode("RTA2807")("摄像头名称不符合硬件要求,请联系厂商处理");
 			}
 #endif // RVC_OS_WIN
 
@@ -1184,19 +1300,19 @@ ErrorCodeEnum CMediaControllerEntity::LoadConfig(capture_config_t *conf)
 				char strMessage[MAX_PATH*2] = {0};
 				get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoEnv ,"env camera config error,please check config file or device.");
 				LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_ENVCAM_INITFAIL,strMessage);
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA2801")("上摄像头配置错误,请检查摄像头配置");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V2").setResultCode("RTA2801")("上摄像头配置错误,请检查摄像头配置");
 			} else if (Error == Error_OptCamera){
 				char strMessage[MAX_PATH*2] = {0};
 				get_camera_exception_message(strMessage, MAX_PATH*2, conf->strVideoOpt, "operation camera config error,please check config file or device.");
 				LogWarn(Severity_Middle,Error_DevMedia,ERROR_MOD_MEDIACONTROLLER_OPTCAM_INITFAIL, strMessage);
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA2802")("下摄像头配置错误,请检查摄像头配置");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V2").setResultCode("RTA2802")("下摄像头配置错误,请检查摄像头配置");
 			}
 			else if (Error == Error_AllCamera) {
 				LogWarn(Severity_Middle, Error_DevMedia, ERROR_MOD_MEDIACONTROLLER_CONFIG_ALLERROR, "all config cameras error");
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2").setResultCode("RTA280B")("上下摄像头配置都错误,请检查摄像头配置");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V2").setResultCode("RTA280B")("上下摄像头配置都错误,请检查摄像头配置");
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V2")("摄像头配置正确");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402208V2")("摄像头配置正确");
 			}
 		}
 		else {
@@ -1226,6 +1342,86 @@ void CMediaControllerEntity::OnExternalCameraSwitchFailed(const char* pszFailedM
 }
 
 
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+void CMediaControllerEntity::OnBrocastEnvCameraCapInfo(int icaptime, int irealframes, float frealfps, float fstable)
+{
+	
+	EnvCameraCapInfo ret;
+	CSimpleStringA strMsg = CSimpleStringA::Format("摄像头已打开%d秒, 输出图像%d帧, 实际帧率为%.2ffps, 稳定性偏差为%.4f.", icaptime, irealframes, frealfps, fstable);
+	ret.cameracapmsg = CSimpleStringA2W(strMsg);
+	SpSendBroadcast(GetFunction(), eMsg_EnvCameraCapInfo, eMsgSig_EnvCameraCapInfo, ret);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("spsendbroadcast envcamera cap info is %s", strMsg.GetData());
+}
+
+ErrorCodeEnum CMediaControllerEntity::GetEnvCamCaptureProcess()
+{
+	ErrorCodeEnum Error = Error_Failed;
+	if (m_bStartCamera) {
+		if (m_capture && m_capture->env_video) {
+			unsigned int istarttime = m_capture->env_video->ustarttime;
+			int irealframes = m_capture->env_video->frame_id;
+			unsigned int icaptime = y2k_time_now() - istarttime;
+			float fenvframerate = (float)((float)irealframes / (float)icaptime);
+			int icalcfps = icaptime * 15;
+			float fenvstable = (float)(irealframes - icalcfps) / (float)icalcfps;
+			OnBrocastEnvCameraCapInfo(icaptime, irealframes, fenvframerate, fenvstable);
+			Error = Error_Succeed;
+		}
+		else{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("env capture param is invalid.");
+		}
+	}
+
+	return Error;
+}
+
+ErrorCodeEnum CMediaControllerEntity::StartSaveEnvCamPhoto(const char* pname, const int interval)
+{
+	ErrorCodeEnum Error = Error_Failed;
+	if (m_bStartCamera) {
+		if (m_capture && m_capture->env_video) {
+			m_capture->env_video->bsavephoto = true;
+			snprintf(m_capture->env_video->strsavedir, MAX_PATH, "%s", m_PhotoSaveDir.GetData());
+			snprintf(m_capture->env_video->strphotoname, MAX_PATH, "%s", pname);
+			m_capture->env_video->isaveinterval = interval;
+
+			Error = Error_Succeed;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("env capture param is invalid.");
+		}
+	}
+
+	return Error;
+}
+
+ErrorCodeEnum CMediaControllerEntity::StopSaveEnvCamPhoto()
+{
+	ErrorCodeEnum Error = Error_Failed;
+	if (m_bStartCamera) {
+		if (m_capture && m_capture->env_video) {
+			m_capture->env_video->bsavephoto = false;
+			memset(m_capture->env_video->strphotoname, 0, MAX_PATH);
+			Error = Error_Succeed;
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("env camera capture param is invalid.");
+		}
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("env camera already stop.");
+		Error = Error_Succeed;
+	}
+
+	return Error;
+}
+#endif
+#endif
+
+
 void CMediaControllerEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 	const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
 	const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext& pLinkInfo)
@@ -1365,9 +1561,6 @@ void CMediaControllerEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID
 			if (m_bIsRemoteRecord){
 				LogEvent(Severity_Middle, LOG_EVT_UI_STOPREMOTERECORD, NULL);
 			}
-			else{
-				LogEvent(Severity_Middle, LOG_EVT_UI_STOPRECORD, NULL);
-			}
 				
 			GetFunction()->SetTimer(1, this, 5000);
 		}
@@ -1390,6 +1583,7 @@ void CMediaControllerEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID
 			if (Error_Succeed == StopSalesRecordAudioCapture()){
 
 			}
+
 			if (true == m_bHasStartSpeakerRender){
 				StopSpeakerAudioRender();
 			}
@@ -1412,6 +1606,32 @@ void CMediaControllerEntity::OnLog( const CAutoArray<CUUID> &SubIDs, const CUUID
 		}
 		break;
 
+	case LOG_EVT_UI_STARTCAMERACAPTURE:
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_UI_STARTCAMERACAPTURE event");
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+		HandleStartCameraCapture(pszMessage);
+#endif
+#endif
+	}
+	break;
+
+	case LOG_EVT_UI_STOPCAMERACAPTURE:
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_UI_STOPCAMERACAPTURE event");
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+		HandleStopCameraCapture();
+#endif
+#endif
+	}
+	break;
+
 	default:
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown event.");
 		break;
@@ -1597,7 +1817,7 @@ void CMediaControllerEntity::SetCameraStateInfo(ErrorCodeEnum errorcode)
 		SetCameraSysVar(CAMERA_NO_ERROR);
 		m_bStartCamera = true;
 		m_nCameraErrorCode = Error_Succeed;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3")("摄像头打开成功");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402208V3")("摄像头打开成功");
 	}
 	else {
 		if (Error_EnvCamera == errorcode) {
@@ -1605,27 +1825,27 @@ void CMediaControllerEntity::SetCameraStateInfo(ErrorCodeEnum errorcode)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_ENV_ERROR");
 			m_bStartCamera = true;
 			m_nCameraErrorCode = Error_EnvCamera;
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2803")("上摄像头故障,打开失败");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V3").setResultCode("RTA2803")("上摄像头故障,打开失败");
 		}
 		else if (Error_OptCamera == errorcode) {
 			SetCameraSysVar(CAMERA_OPT_ERROR);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_OPT_ERROR");
 			m_bStartCamera = true;
 			m_nCameraErrorCode = Error_OptCamera;
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2804")("下摄像头故障,打开失败");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V3").setResultCode("RTA2804")("下摄像头故障,打开失败");
 		}
 		else if (Error_AllCamera == errorcode) {
 			SetCameraSysVar(CAMERA_BOTH_ERROR);
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to CAMERA_BOTH_ERROR");
 			m_nCameraErrorCode = Error_AllCamera;
 			m_bStartCamera = false;
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2808")("上下摄像头都故障");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V3").setResultCode("RTA2808")("上下摄像头都故障");
 		}
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Camera State to Other Error");
 			m_nCameraErrorCode = errorcode;
 			m_bStartCamera = false;
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402208V3").setResultCode("RTA2809")("打开摄像头时出现其它异常");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402208V3").setResultCode("RTA2809")("打开摄像头时出现其它异常");
 		}
 	}
 }
@@ -1641,11 +1861,15 @@ ErrorCodeEnum CMediaControllerEntity::ReStartCamera(int nCamera)
 {
 	if (m_capture != NULL)
 	{
-		if((StopCamera(m_capture,nCamera)==-1)){
+		if((stopcamera(m_capture,nCamera)==-1)){
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReStartCamera %d,stop camera fail!", nCamera);
 		}
+#ifdef RVC_OS_WIN
 		Sleep(2000);
-			
+#else
+		sleep(2);
+#endif
+
 		ErrorCodeEnum Error = Error_Succeed;
 		Error = capture_create(&conf, m_capture, nCamera);
 		if (Error == Error_Succeed) 
@@ -1923,6 +2147,48 @@ void CMediaControllerEntity::LogTransactionRecordCtrEvt(int iEvtType)
 	}
 }
 
+
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+void CMediaControllerEntity::HandleStartCameraCapture(const char* pszMessage)
+{
+	int local_view_x = 0;
+	int local_view_y = 0;
+	int local_view_cx = 0;
+	int local_view_cy = 0;
+	char strphotoname[256] = { 0 };
+	int isecond = 0;
+	sscanf(pszMessage, "%d@%d@%d@%d@%d@%s", &local_view_x, &local_view_y, &local_view_cx, &local_view_cy, &isecond, strphotoname);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("photo name is %s, picture interval time is %d.", strphotoname, isecond);
+	if (isecond <= 5) {
+		isecond = 5;
+	}
+	if (!ExistsDirA(m_PhotoSaveDir.GetData())) {
+		CreateDirA(m_PhotoSaveDir.GetData(), true);
+	}
+
+	if (Error_Succeed == StartSaveEnvCamPhoto(strphotoname, isecond)) {
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start Save EnvCam Photo success.");
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start Save EnvCam Photo failed.");
+	}
+}
+
+void CMediaControllerEntity::HandleStopCameraCapture()
+{
+	if (Error_Succeed == StopSaveEnvCamPhoto()) {
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Stop Save EnvCam Photo success.");
+	}
+	else {
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Stop Save EnvCam Photo failed.");
+	}
+}
+#endif
+#endif
+
 ChannelMediaControllerClient::ChannelMediaControllerClient( CMediaControllerEntity *pEntity ) : ChannelService_ClientBase(pEntity)
 {
 
@@ -2095,6 +2361,7 @@ void MediaServiceSession::Handle_ManipulateCameras(SpReqAnsContext<MediaService_
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("rvc Device Type is %s, and cmdType is %d.", Device_Type_Table[eType], ctx->Req.cmdType);
 	
 	if (ctx->Req.cmdType == 0) {
+		LogTransToCMSEvt();
 		if (m_pEntity->m_bStartCamera) {
 			Error = m_pEntity->StopCamerasAndRecord();
 #ifdef RVC_OS_WIN
@@ -2139,6 +2406,93 @@ void MediaServiceSession::Handle_IsCameraOnStatus(SpReqAnsContext<MediaService_I
 	ctx->Answer(Error_Succeed);
 }
 
+void MediaServiceSession::Handle_GetEnvCameraVideoCaptureInfo(SpReqAnsContext<MediaService_GetEnvCameraVideoCaptureInfo_Req, MediaService_GetEnvCameraVideoCaptureInfo_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	ErrorCodeEnum Error = Error_Succeed;
+#ifdef DEVOPS_ON_PRD
+
+#else
+	Error = m_pEntity->GetEnvCameraVideoCaptureInfo(ctx->Ans.strnotice, ctx->Ans.strcmd);
+	if (Error_Succeed != Error) {
+		Error = Error_Failed;
+	}
+#endif
+
+	ctx->Answer(Error);
+}
+
+
+void MediaServiceSession::Handle_GetEnvCamRawBrightnessInfo(SpReqAnsContext<MediaService_GetEnvCamRawBrightnessInfo_Req, MediaService_GetEnvCamRawBrightnessInfo_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	ErrorCodeEnum Error = Error_Succeed;
+	int iMin = 0;
+	int iMax = 0;
+
+#ifdef DEVOPS_ON_PRD
+
+#else
+	if (Error_Succeed == m_pEntity->GetEnvCamRawBrightnessInfo(&iMin, &iMax)) {
+		ctx->Ans.iMinBrightness = iMin;
+		ctx->Ans.iMaxBrightness = iMax;
+	}
+	else {
+		ctx->Ans.iMinBrightness = 0;
+		ctx->Ans.iMaxBrightness = 0;
+		Error = Error_Failed;
+	}
+#endif
+	ctx->Answer(Error);
+}
+
+void MediaServiceSession::Handle_SetEnvCamRawBrightness(SpReqAnsContext<MediaService_SetEnvCamRawBrightness_Req, MediaService_SetEnvCamRawBrightness_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+	ErrorCodeEnum Error = Error_Succeed;
+#ifdef DEVOPS_ON_PRD
+
+#else
+	if (Error_Succeed != m_pEntity->SetEnvCamRawBrightness(ctx->Req.iBrightness)) {
+		Error = Error_Failed;
+	}
+#endif
+	ctx->Answer(Error);
+}
+
+void MediaServiceSession::Handle_TurnOnCamera(SpReqAnsContext<MediaService_TurnOnCamera_Req, MediaService_TurnOnCamera_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+
+	ErrorCodeEnum Error = m_pEntity->StartAllCameras();
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	m_pEntity->GetFunction()->SetTimer(RVC_CAMERA_CAP_PROCESS, m_pEntity, 5 * 1000);
+#endif
+#endif
+
+	ctx->Answer(Error);
+}
+
+void MediaServiceSession::Handle_TurnOffCamera(SpReqAnsContext<MediaService_TurnOffCamera_Req, MediaService_TurnOffCamera_Ans>::Pointer ctx)
+{
+	DbgToBeidou(ctx->link, __FUNCTION__)();
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	m_pEntity->GetFunction()->KillTimer(RVC_CAMERA_CAP_PROCESS);
+#endif
+#endif
+	ErrorCodeEnum CamRet = m_pEntity->StopAllCameras();
+
+	ctx->Answer(CamRet);
+}
+
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CMediaControllerEntity)
 SP_END_ENTITY_MAP()

+ 30 - 2
Module/mod_mediacontroller/mod_mediacontroller.h

@@ -47,7 +47,6 @@ public:
 	virtual void Handle_GetVideoDeviceName(SpReqAnsContext<MediaService_GetVideoDeviceName_Req, MediaService_GetVideoDeviceName_Ans>::Pointer ctx);
 	virtual void Handle_StartCamera(SpOnewayCallContext<MediaService_StartCamera_Info>::Pointer ctx);
 	virtual void Handle_StopCamera(SpOnewayCallContext<MediaService_StopCamera_Info>::Pointer ctx);
-
 	virtual void Handle_StartEnvCamera(SpReqAnsContext<MediaService_StartEnvCamera_Req, MediaService_StartEnvCamera_Ans>::Pointer ctx);
 	virtual void Handle_StopEnvCamera(SpOnewayCallContext<MediaService_StopEnvCamera_Info>::Pointer ctx);
 	virtual void Handle_StartSpeakerRender(SpOnewayCallContext<MediaService_StartSpeakerRender_Info>::Pointer ctx);
@@ -57,6 +56,11 @@ public:
 	virtual void Handle_GetVideoDevices(SpReqAnsContext<MediaService_GetVideoDevices_Req, MediaService_GetVideoDevices_Ans>::Pointer ctx);
 	virtual void Handle_GetCameraInfos(SpReqAnsContext<MediaService_GetCameraInfos_Req, MediaService_GetCameraInfos_Ans>::Pointer ctx);
 	virtual void Handle_ManipulateCameras(SpReqAnsContext<MediaService_ManipulateCameras_Req, MediaService_ManipulateCameras_Ans>::Pointer ctx);
+	virtual void Handle_GetEnvCameraVideoCaptureInfo(SpReqAnsContext<MediaService_GetEnvCameraVideoCaptureInfo_Req, MediaService_GetEnvCameraVideoCaptureInfo_Ans>::Pointer ctx);
+	virtual void Handle_GetEnvCamRawBrightnessInfo(SpReqAnsContext<MediaService_GetEnvCamRawBrightnessInfo_Req, MediaService_GetEnvCamRawBrightnessInfo_Ans>::Pointer ctx);
+	virtual void Handle_SetEnvCamRawBrightness(SpReqAnsContext<MediaService_SetEnvCamRawBrightness_Req, MediaService_SetEnvCamRawBrightness_Ans>::Pointer ctx);
+	virtual void Handle_TurnOnCamera(SpReqAnsContext<MediaService_TurnOnCamera_Req, MediaService_TurnOnCamera_Ans>::Pointer ctx);
+	virtual void Handle_TurnOffCamera(SpReqAnsContext<MediaService_TurnOffCamera_Req, MediaService_TurnOffCamera_Ans>::Pointer ctx);
 	virtual void Handle_IsCameraOnStatus(SpReqAnsContext<MediaService_IsCameraOnStatus_Req, MediaService_IsCameraOnStatus_Ans>::Pointer ctx);
 
 private:
@@ -123,6 +127,23 @@ public:
 	void OnTimeCameraStatusCheck();
 	ErrorCodeEnum ConnectAssistChannel();
 	void LogTransactionRecordCtrEvt(int iEvtType);
+	ErrorCodeEnum GetEnvCamRawBrightnessInfo(int* iMin, int* iMax);
+	ErrorCodeEnum SetEnvCamRawBrightness(int iBrightness);
+	ErrorCodeEnum GetEnvCameraVideoCaptureInfo(CSimpleStringA& strnotice, CSimpleStringA& strcmd);
+
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	void OnBrocastEnvCameraCapInfo(int icaptime, int irealframes, float frealfps, float fstable);
+	ErrorCodeEnum GetEnvCamCaptureProcess();
+	ErrorCodeEnum StartSaveEnvCamPhoto(const char* pname, const int interval);
+	ErrorCodeEnum StopSaveEnvCamPhoto();
+	void HandleStartCameraCapture(const char* pszMessage);
+	void HandleStopCameraCapture();
+#endif
+#endif
+
 	void SetCameraStateInfo(ErrorCodeEnum errorcode);
 
 public:
@@ -138,7 +159,6 @@ public:
 	bool m_bJsOccupyCamera;
 
 private:
-
 #ifdef RVC_OS_WIN
 	IAudioRender* m_pAudioRenderObj;
 	bool m_bSpeakerCap;
@@ -161,4 +181,12 @@ private:
 	int m_iDelayTime;
 	int m_interValTime;
 	bool m_bCameraOffTimerOn;
+
+#ifdef DEVOPS_ON_PRD
+#else
+#ifdef RVC_OS_WIN
+#else
+	CSimpleStringA m_PhotoSaveDir;
+#endif
+#endif
 };

+ 31 - 1
Module/mod_recorder/mod_recorder.cpp

@@ -210,7 +210,7 @@ ErrorCodeEnum CRecorderEntity::__OnStart(ErrorCodeEnum preOperationError)
 	InitRecorder();
 		
 	int i = 0;
-	m_arrListener.Init(8);
+	m_arrListener.Init(10);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_PAUSE_RECORD, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, EVENT_MOD_CONTINUE_RECORD, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_RECORDER_SECTION_FINISHED, NULL, false);
@@ -219,6 +219,8 @@ ErrorCodeEnum CRecorderEntity::__OnStart(ErrorCodeEnum preOperationError)
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_CAMERA_STARTED, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_Middle, Error_IgnoreAll, LOG_EVT_MEDIACONTROLLER_CAMERA_STOPPED, NULL, false);
 	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU, NULL, false);
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTCAMERACAPTURE, NULL, false);
+	GetFunction()->SubscribeLog(m_arrListener[i++], this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPCAMERACAPTURE, NULL, false);
 
 	GetFunction()->RegistSysVarEvent(SYSVAR_ACTIVETRACKINGCAMERA,this);
 	GetFunction()->RegistSysVarEvent(SYSVAR_CAMERASTATE,this);
@@ -613,6 +615,34 @@ void CRecorderEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_UI_RETURNMENU event");
 		break;
 
+	case LOG_EVT_UI_STARTCAMERACAPTURE:
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_UI_STARTCAMERACAPTURE event");
+	#ifdef RVC_OS_WIN
+
+	#else
+			if (m_bStarted) {
+				StopRecord();
+			}
+			int local_view_x = 0;
+			int local_view_y = 0;
+			int local_view_cx = 0;
+			int local_view_cy = 0;
+			char strvideoname[256] = {0};
+			int isecond = 0;
+			sscanf(pszMessage, "%d@%d@%d@%d@%d@%s", &local_view_x, &local_view_y, &local_view_cx, &local_view_cy, &isecond, strvideoname);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("record name is %s, picture interval time is %d.", strvideoname, isecond);
+			SetRecordSessionID(strvideoname);
+			StartRecord(CSimpleStringA::Format("%s%s", RVC_TRANSATCION_RECORD_SUFFIX, strvideoname).GetData());
+	#endif
+		}
+		break;
+
+	case LOG_EVT_UI_STOPCAMERACAPTURE:
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("recv LOG_EVT_UI_STOPCAMERACAPTURE event");
+		StopRecord();
+		break;
+
 	default:
 		break;
 	}

+ 1 - 34
Module/mod_sipphone/Event.h

@@ -155,46 +155,13 @@
 #define EVENT_MOD_SIP_PROCESS_MSG									0x301A0003	//sip process messsage
 #define EVENT_MOD_SIP_ENTITY_STARTING_COST							0x301A0004	//实体启动耗时
 
-//event
-#define EVENT_MOD_CONNECT_PICKUP_CALL								0x10303041	//提机呼叫
-
-#define EVENT_MOD_CONNECT_HANDFREE_TO_PICKUP						0x10303046	//免提->提机
-#define EVENT_MOD_CONNECT_PICKUP_TO_HANDFREE						0x10303047	//提机->免提
-
-#define EVENT_MOD_CONNECT_SLV_HANDFREECALL							0x10303050	//界面拨号,免提呼叫发送给SIPPHONE
-#define EVENT_MOD_CONNECT_SLV_PICKUPCALL							0x10303051  //界面拨号,话筒呼叫发送给SIPPHONE
-
-#define EVENT_MOD_CONNECT_AGENT_HANDFREE_PICKUP						0x10303052	//坐席控制免提转话筒
-#define EVENT_MOD_CONNECT_AGENT_PICKUP_HANDFREE						0x10303053	//坐席控制话筒转免提
-
-#define EVENT_MOD_CONNECT_STOP_RECORD_BROADCAST						0x10303060	//结束双录语音播报
-#define EVENT_MOD_CONNECT_BEGAIN_RECORD_CALL						0x10303061	//开始双录呼叫
-
 #define LOG_EVT_ENTER_ACM_FLOW										0x30500001	//进入坐席控制流程(initiactivetransfer发送)
 #define LOG_EVT_EXIT_ACM_FLOW										0x30500002  //进入坐席控制流程(initiactivetransfer发送)
 
-#define LOG_EVT_RELEASELIVEDETECTION								0x30400003  //通知sipphone释放主动活体
-
-#define LOG_EVT_UI_HIDEONLINEVIDEO									0x30B00010	//隐藏视频连线窗口
-#define LOG_EVT_UI_SHOWONLINEVIDEO									0x30B00011	//显示视频连线窗口
-
-#define LOG_EVT_UI_HIDELOCALVIDEO									0x30B00012	//隐藏本地视频窗口
-#define LOG_EVT_UI_SHOWLOCALVIDEO									0x30B00013	//显示本地视频窗口
-
-#define LOG_EVT_UI_HIDEPERSONAREA									0x30B00014	//隐藏人形框
-#define LOG_EVT_UI_SHOWPERSONAREA									0x30B00015	//显示隐藏人形框
-
-#define LOG_EVT_UI_STARTRECORD										0x30B00001	//开始录像
-#define LOG_EVT_UI_STOPRECORD										0x30B00002	//停止录像
-#define LOG_EVT_UI_RETURNMENU										0x30B00006	//退出到主菜单
-
-#define LOG_EVT_UI_STARTREMOTERECORD								0x30B0000F	//开始远程双录
-#define LOG_EVT_UI_STOPREMOTERECORD									0x30B00018	//停止远程录像
-
 #define LOG_EVT_HANDFREE_MODE_REMOTE_CALL							0x30400006	//以免提模式开始远程连线
 #define LOG_EVT_PICKUP_MODE_REMOTE_CALL								0x30400007	//以话筒模式开始远程连线
 
-#define ACM_CONTROL_PERSONAREA					0x30 // 控制人形框,0:隐藏,1:显示
+#define ACM_CONTROL_PERSONAREA										0x30 // 控制人形框,0:隐藏,1:显示
 
 //sysvar
 #define SYSVAR_SOUNDCARDSTATE	"SoundCardState"

+ 14 - 14
Module/mod_sipphone/audio_session.cpp

@@ -337,28 +337,28 @@ static int phonemedia_start(audio_session_t *session)
 	status = apr_pool_create(&media->pool, NULL);
 	if (status != APR_SUCCESS) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media pool failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310C")("创建音频引擎内存分配失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA310C")("创建音频引擎内存分配失败");
 		return Error_Resource;
 	}
 
 	status = audioengine_create(media->pool, &media->engine);
 	if (status != APR_SUCCESS) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_ENGINE_CREATE_FAILED, "create audio engine failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310D")("创建音频引擎失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA310D")("创建音频引擎失败");
 		goto on_error;
 	}
 
 	status = audioengine_start(media->engine);
 	if (status != APR_SUCCESS) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_ENGINE_START_FAILED, "audio engine start failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310E")("启动音频引擎失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA310E")("启动音频引擎失败");
 		goto on_error;
 	}
 
 	rc = rtp_session_create2(conf->local_rtp_ip, conf->local_rtp_port, 2, &media->rtpsess);
 	if (rc != 0) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_SESSION_CREATE_FAILED, CSimpleStringA::Format("audio rtp session create2 failed and local port is %d, rc=%d", conf->local_rtp_port, rc).GetData());
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA310F")("创建音频流通道失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA310F")("创建音频流通道失败");
 		goto on_error;
 	}
 
@@ -366,21 +366,21 @@ static int phonemedia_start(audio_session_t *session)
 	rc = rtp_session_reset2(media->rtpsess, conf->dir, conf->remote_rtp_ip, conf->remote_rtp_port, conf->remote_rtp_port + 1);
 	if (rc != 0) {
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_SESSION_RESET_FAILED, "audio rtp session reset failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3110")("重置音频流通道失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3110")("重置音频流通道失败");
 		goto on_error;
 	}
 	
 	status = audiobridge_create(media->pool, media->engine, &media->bridge);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_BRIDGE_CREATE_FAILED, "audio bridge create failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3111")("音频通道桥接失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3111")("音频通道桥接失败");
 		goto on_error;
 	}
 
 	status = apr_pool_create(&media->micspk_pool, media->pool);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_APR_POOL_CREATE_FAILED, "create media micspk_pool failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3112")("创建音频设备管理内存分配失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3112")("创建音频设备管理内存分配失败");
 		goto on_error;
 	}
 
@@ -398,7 +398,7 @@ static int phonemedia_start(audio_session_t *session)
 #endif
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_MICSPK_CREATE_FAILED, "create audio audio micspk create failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3113")("创建音频设备管理失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3113")("创建音频设备管理失败");
 		goto on_error;
 	}
 	//音频回调
@@ -422,7 +422,7 @@ static int phonemedia_start(audio_session_t *session)
 		status = audiodsp_create(media->micspk_pool, media->engine, read_opt, write_opt, AUDIO_CLOCK, &media->dspstream);
 		if (status != APR_SUCCESS){
 			LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_DSP_CREATE_FAILED, "create audio dsp failed!");
-			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3114")("创建音频信号处理器失败");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3114")("创建音频信号处理器失败");
 			goto on_error;
 		}
 	}
@@ -439,7 +439,7 @@ static int phonemedia_start(audio_session_t *session)
 		conf->local_ptime*2*AUDIO_CLOCK/1000, &media->resizestream);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RESIZE_CREATE_FAILED, "create audio resize failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3115")("创建音频重采样失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3115")("创建音频重采样失败");
 		goto on_error;
 	}
 
@@ -447,14 +447,14 @@ static int phonemedia_start(audio_session_t *session)
 		AUDIO_CODEC_OPT_ENCODE_WRITE, &media->codecstream);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_CODEC_CREATE_FAILED, "create audio codec failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3116")("创建音频编解码器失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3116")("创建音频编解码器失败");
 		goto on_error;
 	}
 
 	status = audiortp_create(media->pool, media->engine, media->rtpsess, &media->rtpstream);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_RTP_CREATE_FAILED, "create audio rtp failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3117")("创建音频rtp失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3117")("创建音频rtp失败");
 		goto on_error;
 	}
 
@@ -529,7 +529,7 @@ static int phonemedia_start(audio_session_t *session)
 	status = audiocontext_create(media->pool, media->engine, &media->context);
 	if (status != APR_SUCCESS){
 		LogWarn(Severity_Middle, Error_Debug, ERROR_MOD_SIP_AUDIO_CONTEXT_CREATE_FAILED, "create audio context failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3118")("创建音频流水线管理器失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3118")("创建音频流水线管理器失败");
 		goto on_error;
 	}
 
@@ -780,7 +780,7 @@ int audio_session_start_phonemedia(audio_session_t *session, const audio_session
 {
 	int rc;
 	if (!session) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5").setResultCode("RTA3119")("音频通道参数未初始化");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A5").setResultCode("RTA3119")("音频通道参数未初始化");
 		return Error_NotInit;
 	}
 		

+ 11 - 19
Module/mod_sipphone/endpoint.cpp

@@ -157,14 +157,6 @@ static const char *state_desc[] = {
 	"STATE::TERMINATED",
 };
 
-static const char* call_type_table[] = {
-	"NORMAL_CALLTYPE",
-	"PADRINGUP_CALLTYPE",
-	"PADTOPAD_CALLTYPE",
-	"MOBILETOPAD_CALLTYPE",
-	"DOUBLERECORD_CALLTYPE"
-};
-
 #ifndef VIDEOPLAYER_FLAG_DOUBLESIZE
 #define VIDEOPLAYER_FLAG_DOUBLESIZE	0x01
 #endif
@@ -243,11 +235,11 @@ static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *vid
 			rc = audio_session_create(&conf, &call->audio);
 			if (rc != 0) {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
 				return;
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
 			}
 		}
 
@@ -361,11 +353,11 @@ static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *vid
 			rc = audio_session_create(&conf, &call->audio);
 			if (rc != 0) {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
 				return;
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
 			}
 		}
 
@@ -428,9 +420,9 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 	if (audio_desc->media_dir == DIR_NONE) {
 		if (call->audio) {
 			audio_session_stop(call->audio);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A6")("停止音频通道成功");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A6")("停止音频通道成功");
 			audio_session_destroy(call->audio);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A7")("释放音频通道成功");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A7")("释放音频通道成功");
 			call->audio = NULL;
 		}
 		else{
@@ -454,9 +446,9 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 		int rc;
 		if (call->audio) {
 			audio_session_stop(call->audio);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A6")("停止音频通道成功");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A6")("停止音频通道成功");
 			audio_session_destroy(call->audio);
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A7")("释放音频通道成功");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A7")("释放音频通道成功");
 			call->audio = NULL;
 		}
 		if (!call->audio) {
@@ -479,11 +471,11 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 			rc = audio_session_create(&conf, &call->audio);
 			if (rc != 0) {
 				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A4").setResultCode("RTA3109")("视频连线创建音频通道失败");
 				return;
 			}
 			else {
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A4")("视频连线创建音频通道成功");
 			}
 		}
 		audio_session_phonemedia_conf_t phone_conf = {0};
@@ -513,7 +505,7 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
 			return;
 		}
 		else {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A5")("视频连线启动音频通道成功");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A5")("视频连线启动音频通道成功");
 		}
 	}
 }

+ 117 - 34
Module/mod_sipphone/mod_sipphone.cpp

@@ -12,6 +12,7 @@
 #include "audio_session.h"
 #include "video_session.h"
 #include "../mod_counterconnector/Event.h"
+#include "../mod_evtconverter/Event.h"
 
 #define EVT_CONVERTER	"EventConverter"
 
@@ -384,14 +385,6 @@ void CSIPEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const
 		}
 		break;
 
-	case LOG_EVT_RELEASELIVEDETECTION:
-		{
-			m_stVideoParam.bActiveInspect = 0;
-			m_stVideoParam.bShowActiveImg = 0;
-			m_stVideoParam.iCameraSwitch = CAMERA_TYPE_ENV;
-		}
-		break;
-
 	case LOG_EVT_UI_HIDEONLINEVIDEO:
 		{
 			m_stVideoParam.nWindowState = 2;
@@ -419,15 +412,14 @@ void CSIPEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const
 		}
 		break;
 
-	case LOG_EVT_UI_STOPRECORD:
 	case LOG_EVT_UI_STOPREMOTERECORD:
 		{          
 			if (m_stVideoParam.bShowRecordArea){
 				m_stVideoParam.bShowRecordArea = 0;
 			}
-			#ifdef RVC_OS_LINUX
+		#ifdef RVC_OS_LINUX
 			rvc_stop_video_render(m_render);
-			#endif
+		#endif
 		}
 		break;
 
@@ -442,9 +434,9 @@ void CSIPEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const
 			if (m_stVideoParam.nWindowState == 4)
 			{
 				m_stVideoParam.nWindowState = 3;
-				#ifdef RVC_OS_LINUX
+			#ifdef RVC_OS_LINUX
 				ShowLocalVideo();
-				#endif
+			#endif
 			}
 		}
 		break;
@@ -452,9 +444,9 @@ void CSIPEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const
 	case LOG_EVT_UI_HIDELOCALVIDEO:
 		{
 			m_stVideoParam.nWindowState = 4;
-			#ifdef RVC_OS_LINUX
+		#ifdef RVC_OS_LINUX
 			HideLocalVideo();
-			#endif
+		#endif
 		}
 		break;
 
@@ -470,6 +462,29 @@ void CSIPEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const
 		}
 		break;
 
+	case LOG_EVT_UI_STARTCAMERACAPTURE:
+		{
+		#ifdef RVC_OS_WIN
+		#else
+			int local_view_x = 0;
+			int local_view_y = 0;
+			int local_view_cx = 0;
+			int local_view_cy = 0;
+			char str[256] = {0};
+			int isecond = 0;
+			sscanf(pszMessage, "%d@%d@%d@%d@%d@%s", &local_view_x, &local_view_y, &local_view_cx, &local_view_cy, &isecond, str);
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("local_view_x = %d, local_view_y = %d, local_view_cx = %d, local_view_cy = %d.", local_view_x, local_view_y, local_view_cx, local_view_cy);
+			StartCameraRender(local_view_x, local_view_y, local_view_cx, local_view_cy);
+		#endif
+		}
+		break;
+
+	case LOG_EVT_UI_STOPCAMERACAPTURE:
+		{
+			StopCameraRender();
+		}
+		break;
+
 	default:
 		{
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown dwUserCode = 0x%08x.",dwUserCode);
@@ -860,11 +875,11 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 	m_pAudioMgr = CreateAudioMgrObj(&t_callback);
 	if (m_pAudioMgr && 0 == m_pAudioMgr->audio_mgr_initialize()) {
 		m_bAudioMgrInited = true;
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A1")("audio manager initialize success");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A1")("audio manager initialize success");
 	}
 	else {
 		LogWarn(Severity_Middle, Error_Debug, LOG_EVT_SIPPHONE_AUDIOMGR_INITIAL_FAILED, "audio manager initialize failed!");
-		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A1").setResultCode("RTA310B")("音频服务初始化失败");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A1").setResultCode("RTA310B")("音频服务初始化失败");
 	}
 	SetSoundCardSysVar(SOUNDCARD_INIT_STATE);
 
@@ -895,13 +910,13 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("audio config is invalid.");
 		SetSoundCardSysVar(SOUNDCARD_CONFIG_EMPTY);
 		GetFunction()->SetSysVar("AuthErrMsg", "音频配置缺失,请使用硬件配置修改");
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3101")("音频配置缺失,请使用硬件配置修改");
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A3").setResultCode("RTA3101")("音频配置缺失,请使用硬件配置修改");
 		return Error_Param;
 	}
 	
 	uint32_t uCheckRet = CheckAudioDevice();
 	if (RVC_AUDIO_NO_ERROR == uCheckRet) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3")("load audio device config success.");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A3")("load audio device config success.");
 		SetSoundCardSysVar(SOUNDCARD_NO_ERROR);
 	}
 	else {
@@ -909,7 +924,7 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		if (IsBothSoundCardError(uCheckRet)) {		//两组声卡都故障
 			SetSoundCardSysVar(SOUNDCARD_BOTH_ERROR);
 			GetFunction()->SetSysVar("AuthErrMsg", "音频设备故障,请联系厂商排查");
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3102")("音频设备故障,请联系厂商排查");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A3").setResultCode("RTA3102")("音频设备故障,请联系厂商排查");
 			return Error_Param;
 		}
 
@@ -917,12 +932,12 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("can't find handfree audio device.");
 			SetSoundCardSysVar(SOUNDCARD_HANDFREE_ERROR);
 			HandleHandfreeAudioDeviceErrorEvent();
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3103")("识别不到免提声卡");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A3").setResultCode("RTA3103")("识别不到免提声卡");
 		}
 
 		if ((uCheckRet == (RVC_AUDIO_PICKUPIN_ERROR | RVC_AUDIO_PICKUPOUT_ERROR)) || (uCheckRet == RVC_AUDIO_PICKUPIN_ERROR) || (uCheckRet == RVC_AUDIO_PICKUPOUT_ERROR)) {
 			SetSoundCardSysVar(SOUNDCARD_PICKUP_ERROR);
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A3").setResultCode("RTA3104")("话筒声卡故障声卡");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402301A3").setResultCode("RTA3104")("话筒声卡故障声卡");
 		}
 	}
 
@@ -958,7 +973,7 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		CSmartPointer<IEntityFunction> Func = GetFunction();
 		CUUID id;
 		int i = 0;
-		m_arrListener.Init(26);
+		m_arrListener.Init(25);
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_HANDFREE_TO_PICKUP, EVT_CONVERTER);
 		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, EVENT_MOD_CONNECT_PICKUP_TO_HANDFREE, EVT_CONVERTER);
@@ -979,16 +994,10 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_EXIT_ACM_FLOW,NULL,false);
 		m_arrListener[i++] = id;
-		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_RELEASELIVEDETECTION,NULL,false);
-		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_HIDEONLINEVIDEO,NULL,false);
 		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_SHOWONLINEVIDEO,NULL,false);
 		m_arrListener[i++] = id;
-		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD,NULL,false);
-		m_arrListener[i++] = id;
-		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPRECORD,NULL,false);
-		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU,NULL,false);
 		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_HIDELOCALVIDEO,NULL,false);
@@ -1011,6 +1020,10 @@ ErrorCodeEnum CSIPEntity::__OnStart(ErrorCodeEnum preOperationError)
 		m_arrListener[i++] = id;
 		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_PICKUP_MODE_REMOTE_CALL,NULL,false);
 		m_arrListener[i++] = id;
+		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTCAMERACAPTURE, NULL, false);
+		m_arrListener[i++] = id;
+		Func->SubscribeLog(id, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STOPCAMERACAPTURE, NULL, false);
+		m_arrListener[i++] = id;
 	}
 
 	{
@@ -1287,10 +1300,10 @@ ErrorCodeEnum CSIPEntity::RvcGetAudioDeviceInfo()
 #ifdef RVC_OS_WIN
 	ErrorCodeEnum Error = Error_Succeed;
 	CSimpleStringA strAudioInInfos = audio_get_dev_infos(true);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioInDevInfo")(strAudioInInfos.GetData());
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioInDevInfo")(strAudioInInfos.GetData());
 	
 	CSimpleStringA strAudioOutInfos = audio_get_dev_infos(false);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioOutDevInfo")(strAudioOutInfos.GetData());
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioOutDevInfo")(strAudioOutInfos.GetData());
 
 	if (NULL != m_pAudioMgr || !m_bAudioMgrInited) {
 		int icountmic = m_pAudioMgr->audio_get_device_count(true);
@@ -1337,7 +1350,7 @@ ErrorCodeEnum CSIPEntity::RvcGetAudioDeviceInfo()
 		CSimpleStringA strJsonInData = CSimpleStringA::Format("audio in devices [{%s}]", strJsonIn.GetData());
 		LogWarn(Severity_Low, Error_Debug, LOG_EVT_SIPPHONE_GET_AUDIO_IN_INFOS, strJsonInData.GetData());
 
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioInDevInfo")(GetAudioDeviceJsonInfos(true).GetData());
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioInDevInfo")(GetAudioDeviceJsonInfos(true).GetData());
 
 		CSimpleStringA strJsonOut("");
 		int icountspeaker = m_pAudioMgr->audio_get_device_count(false);
@@ -1354,7 +1367,7 @@ ErrorCodeEnum CSIPEntity::RvcGetAudioDeviceInfo()
 		CSimpleStringA strJsonOutData = CSimpleStringA::Format("audio out devices [{%s}]", strJsonOut.GetData());
 		LogWarn(Severity_Low, Error_Debug, LOG_EVT_SIPPHONE_GET_AUDIO_OUT_INFOS, strJsonOutData.GetData());
 
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioOutDevInfo")(GetAudioDeviceJsonInfos(false).GetData());
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402301A2").setAPI("RvcMedia_GetAudioOutDevInfo")(GetAudioDeviceJsonInfos(false).GetData());
 		
 		Error = Error_Succeed;
 	}
@@ -2415,6 +2428,67 @@ CSimpleStringA CSIPEntity::GetAudioDeviceJsonInfos(bool bmicro)
 
 #endif
 
+ErrorCodeEnum CSIPEntity::StartCameraRender(int ivideoview_x, int ivideoview_y, int ivideoview_cx, int ivideoview_cy)
+{
+#ifdef RVC_OS_WIN
+#else
+	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 = ivideoview_cx;
+	render_param.ilocal_view_cy = ivideoview_cy;
+	render_param.ilocal_view_x = ivideoview_x;
+	render_param.ilocal_view_y = ivideoview_y;
+	render_param.ilocal_render_queue = 1;
+
+	m_render->plocal_render = CreateVideoRenderObj(&t_callback);
+	LogWarn(Severity_Low, Error_Debug, EVENT_MOD_SIP_LOCAL_VIDEO_RENDER_CREATE, "local video render create.");
+
+	memcpy(&m_render->render_param, &render_param, sizeof(rvc_video_render_params_t));
+	m_render->local_render_threadid = 0;
+	m_render->remote_render_threadid = 0;
+
+	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, false, &t_render_callback)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start video render success.");
+	}
+#endif // RVC_OS_WIN
+
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CSIPEntity::StopCameraRender()
+{
+#ifdef RVC_OS_WIN
+#else
+	if (Error_Succeed == rvc_stop_video_render(m_render)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("stop video render success.");
+	}
+	if (NULL!= m_render->plocal_render) {
+		DestroyVideoRenderObj(m_render->plocal_render);
+	}
+
+	if (NULL != &m_render->local_render_stop_sem) {
+		sem_destroy(&m_render->local_render_stop_sem);
+	}
+
+	delete(m_render);
+	m_render = NULL;
+#endif // RVC_OS_WIN
+
+	return Error_Succeed;
+}
+
 //
 // CSIPPhoneSession
 //
@@ -2951,7 +3025,7 @@ void CSIPPhoneSession::control_video( ControlVideoCommand_t *pCmd )
 }
 
 #else
-void CSIPPhoneSession::control_video( ControlVideoCommand_t *pCmd )
+void CSIPPhoneSession::control_video( ControlVideoCommand_t *pCmd)
 {
 	if (m_pCall) 
 	{
@@ -3084,6 +3158,15 @@ int CSIPPhoneSession::stop_video_render()
 	}
 	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->remote_render_stop_sem) {
+		sem_destroy(&m_pEntity->m_render->remote_render_stop_sem);
+	}
+
 	delete(m_pEntity->m_render);
 	m_pEntity->m_render = NULL;
 

+ 4 - 2
Module/mod_sipphone/mod_sipphone.h

@@ -348,9 +348,9 @@ private:
 	ErrorCodeEnum SaveRestartRunConfig(unsigned int utime);
 	ErrorCodeEnum AudioDspFlagsUseCentersetting(endpoint_conf_t* conf);
 	//载入运行时配置
-	ErrorCodeEnum LoadAudioRunConfig(int&nHandfreeout,int&nPickupout,int&nHandfreein,int&nPickupin);
+	ErrorCodeEnum LoadAudioRunConfig(int&nHandfreeout, int&nPickupout, int&nHandfreein, int&nPickupin);
 	//保存运行时
-	ErrorCodeEnum SaveAudioRunConfig(int nHandfreeout,int nPickupout,int nHandfreein,int nPickupin);
+	ErrorCodeEnum SaveAudioRunConfig(int nHandfreeout, int nPickupout, int nHandfreein, int nPickupin);
 	// we use root.ini Video section config to decide camera count
 	ErrorCodeEnum DecideScreenCount(int &nCount);
 	DeviceTypeEnum RvcGetDeviceType();
@@ -362,6 +362,8 @@ private:
 	uint32_t CheckAudioDevice();
 	ErrorCodeEnum SetSoundCardSysVar(const CSimpleStringA& newVal);
  	void HandleCheckAudioDevice(const char* pszValue);
+	ErrorCodeEnum StartCameraRender(int ivideoview_x, int ivideoview_y, int ivideoview_cx, int ivideoview_cy);
+	ErrorCodeEnum StopCameraRender();
 
 public:
 	int m_kept_volume_in[2];

+ 0 - 4
Module/mod_sipphone/unix/video_session.cpp

@@ -389,7 +389,6 @@ static void local_put_frame(void *user_data, video_frame *frame)
 
 static int on_rx_frame(video_frame *frame, void *user_data)
 {
-	//LOG_FUNCTION();
 	video_session_t *session = (video_session_t *)user_data;
 	session->irecv_frameid++;
 	if (DOUBLERECORD_CALLTYPE == session->conf.nCallType) {
@@ -430,10 +429,7 @@ static int on_rx_frame(video_frame *frame, void *user_data)
 		}
 	}
 #else
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s:%d session->conf.video_render_cb = 0x%08x and session->conf.video_render_cb->on_video_render = 0x%08x, session->conf.video_render_cb->user_data = 0x%08x.", __FUNCTION__, __LINE__, session->conf.video_render_cb, session->conf.video_render_cb.on_remote_video_render, session->conf.video_render_cb.user_data);
 		session->conf.video_render_cb.on_remote_video_render(frame, session->conf.video_render_cb.user_data);
-		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s:%d", __FUNCTION__, __LINE__);
-
 		used = 1;
 
 		if (false == session->bremoterender) {

+ 0 - 4
Module/mod_sipphone/uuid.cpp

@@ -16,10 +16,6 @@
 #include <audioclient.h>
 
 
-
-
-
-
 const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
 const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
 const IID IID_IAudioRenderClient = __uuidof(IAudioRenderClient);

+ 16 - 4
Module/mod_sipphone/video_render.cpp

@@ -139,6 +139,7 @@ void* rvc_videorender_func(void* arg)
 {
 	rvc_video_render_t* param = (rvc_video_render_t*)arg;
 	int ilocal_video_fresh_time = param->render_param.ilocal_fresh_time;
+	bool bremote_video = false;
 
 	int irender_camera = CAMERA_TYPE_ENV;
 	if (param->render_param.ilocal_view_cx < param->render_param.ilocal_view_cy) {
@@ -150,9 +151,17 @@ void* rvc_videorender_func(void* arg)
 	int iwidth = 0;
 	int iheight = 0;
 	if (CAMERA_TYPE_ENV == irender_camera) {
-		local_video_queue = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_PREVIEW_QUEUE);
-		iwidth = REC_COMMON_VIDEO_PREVIEW_WIDTH;
-		iheight = REC_COMMON_VIDEO_PREVIEW_HEIGHT;
+		if (0 == param->render_param.ilocal_render_queue) {
+			local_video_queue = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_PREVIEW_QUEUE);
+			iwidth = REC_COMMON_VIDEO_PREVIEW_WIDTH;
+			iheight = REC_COMMON_VIDEO_PREVIEW_HEIGHT;
+		}
+		else {
+			local_video_queue = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE);
+			iwidth = REC_COMMON_VIDEO_SNAPSHOT_WIDTH;
+			iheight = REC_COMMON_VIDEO_SNAPSHOT_HEIGHT;
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use sanpshot queue.");
+		}
 	}
 	else {
 		local_video_queue = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_PREVIEW_QUEUE);
@@ -206,6 +215,7 @@ void* rvc_videorender_func(void* arg)
 			if (0 != param->premote_render->VideoRenderSetParam(&tparam_remote)) {
 				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("video render set param failed.");
 			}
+			bremote_video = true;
 		}
 		else {
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("remote video render is null.");
@@ -258,7 +268,9 @@ void* rvc_videorender_func(void* arg)
 			if (bset) {
 				if (bshow_local) {
 					param->plocal_render->ShowVideoWindow();
-					param->premote_render->ShowVideoWindow();
+					if (bremote_video) {
+						param->premote_render->ShowVideoWindow();
+					}
 					bset = false;
 				}
 			}

+ 1 - 0
Module/mod_sipphone/video_render.h

@@ -43,6 +43,7 @@ typedef struct rvc_video_render_params_s {
 	int iremote_move; 
 	int ilocal_fresh_time;
 	int iremote_fresh_time;
+	int ilocal_render_queue;
 }rvc_video_render_params_t;
 
 

+ 49 - 51
Module/mod_snapshot/mod_snapshot.cpp

@@ -20,6 +20,8 @@ using namespace AssistantChannel;
 #include "cv.h"
 #include "highgui.h"
 
+#include "../mod_interactivecontrol/Event.h"
+
 
 #ifdef RVC_OS_WIN
 #define ENV_CAP_TIMEOUT 15
@@ -33,6 +35,10 @@ using namespace AssistantChannel;
 #define RVC_SAFE_DELETE(p) { if(p){ (p)->SafeDelete();  (p)=NULL;} }
 #endif //RVC_SAFE_DELETE
 
+#ifndef MAX_PATH
+#define  MAX_PATH  260
+#endif
+
 class CPhotoCaptureEntity;
 
 class ChannelClient : public ChannelService_ClientBase
@@ -80,7 +86,9 @@ int RotationDown(unsigned char* src, int srcW, int srcH, int channel)
 class CPhotoCaptureEntity : public CEntityBase, public ITimerListener, public ILogListener
 {
 public:
-	CPhotoCaptureEntity() : m_video_env_q(NULL), m_video_opt_q(NULL), m_dwCapture(0), m_bConnectAssist(FALSE) {m_pChannelClient = NULL;}
+	CPhotoCaptureEntity() : m_video_env_q(NULL), m_video_opt_q(NULL), m_dwCapture(0), m_bConnectAssist(false) {
+		m_pChannelClient = NULL;
+	}
 	virtual ~CPhotoCaptureEntity() {}
 	virtual const char *GetEntityName() const { return "Snapshot"; }
 
@@ -130,7 +138,7 @@ public:
 	{
 		m_pChannelClient = new ChannelClient(this);
 		if (Error_Succeed == ConnectAssistChannel()) {
-			m_bConnectAssist = TRUE;
+			m_bConnectAssist = true;
 		}
 		else {
 			GetFunction()->SetTimer(2, this, 3370);
@@ -298,8 +306,10 @@ public:
 			Info.data.m_iLength = sizeof(rc);
 			(*m_pChannelClient)(EntityResource::getLink().upgradeLink())->Send(Info);
 		}
-		if (frm)
+
+		if (frm) {
 			video_frame_delete(frm);
+		}
 	}
 
 	ErrorCodeEnum StartCapture(int id)
@@ -307,7 +317,8 @@ public:
 #if defined(RVC_OS_LINUX)
 		if (eStand1SPlusType == m_eDeviceType) {
 			m_video_env_q = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE);
-		} else { //  == 2
+		} 
+		else { //  == 2
 			m_video_env_q = new Clibvideoqueue(REC_COMMON_VIDEO_ENV_SHM_SNAPSHOT_QUEUE);
 			m_video_opt_q = new Clibvideoqueue(REC_COMMON_VIDEO_OPT_SHM_SNAPSHOT_QUEUE);
 		}
@@ -377,13 +388,13 @@ public:
 			m_dwCapture = 0;
 		}
 		else  if (2 == dwTimerID) {
-			if (FALSE == m_bConnectAssist) {
+			if (false == m_bConnectAssist) {
 				if (Error_Succeed == ConnectAssistChannel()) {
-					m_bConnectAssist = TRUE;
+					m_bConnectAssist = true;
 				}
 			}
 
-			if (TRUE == m_bConnectAssist) {
+			if (true == m_bConnectAssist) {
 				GetFunction()->KillTimer(2);
 			}
 		}
@@ -393,59 +404,45 @@ public:
 		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
 		const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext& pLinkInfo)
 	{
-		if (dwUserCode == MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_ENVOPT || 
-			dwUserCode == MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_OPT ||
-			dwUserCode == MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_ENV) 
+		switch (dwUserCode)
 		{
-			DWORD dwNow = SP::Module::Comm::RVCGetTickCount();
-			Capture(Error_Succeed);
-			StopCapture();
-		}
-		else if (LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS == dwUserCode)
-		{
-			Sleep(975);
-			if (m_pChannelClient != NULL){
-				m_pChannelClient->GetFunction()->CloseSession();
-				m_pChannelClient = NULL;
-				m_bConnectAssist = FALSE;
+		case MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_ENVOPT:
+		case MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_OPT:
+		case MOD_EVENT_MEDIACONTROLLER_FINISHED_CAPTURE_ENV:
+			{
+				DWORD dwNow = SP::Module::Comm::RVCGetTickCount();
+				Capture(Error_Succeed);
+				StopCapture();
 			}
+			break;
 
-			if (Error_Succeed == ConnectAssistChannel()) {
-				m_bConnectAssist = TRUE;
-			}
-			else {
-				GetFunction()->SetTimer(2, this, 3370);
+		case LOG_EVT_MOD_ASSISCHAN_STARTED_SUCCESS:
+			{
+				Sleep(975);
+				if (m_pChannelClient != NULL) {
+					m_pChannelClient->GetFunction()->CloseSession();
+					m_pChannelClient = NULL;
+					m_bConnectAssist = false;
+				}
+
+				if (Error_Succeed == ConnectAssistChannel()) {
+					m_bConnectAssist = true;
+				}
+				else {
+					GetFunction()->SetTimer(2, this, 3370);
+				}
 			}
-		}
-	}
+			break;
 
-private:
-	// we use root.ini Video section config to decide camera count
-	ErrorCodeEnum DecideCameraCount(int &nCount)
-	{
-		CSmartPointer<IEntityFunction> spFunction = GetFunction();
-		CSmartPointer<IConfigInfo> spConfig;
-		ErrorCodeEnum Error = spFunction->OpenConfig(Config_Root, spConfig);
-		if (Error == Error_Succeed) 
-		{
-			CSimpleStringA strVideoEnv;
-			CSimpleStringA strVideoOpt;
-			SpIniMappingTable table;
-			nCount = 0;
-			table.AddEntryString("Video", "EnvCamera", strVideoEnv, "$");
-			table.AddEntryString("Video", "OptCamera", strVideoOpt, "$");
-			Error = table.Load(spConfig);
-			if (Error == Error_Succeed) 
+		default:
 			{
-				if (strVideoEnv.GetLength() > 1)
-					nCount++;
-				if (strVideoOpt.GetLength() > 1)
-					nCount++;
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown dwUserCode = 0x%08x.", dwUserCode);
 			}
+			break;
 		}
-		return Error;
 	}
 
+private:
 	ErrorCodeEnum ConnectAssistChannel()
 	{
 		if (m_pChannelClient == NULL){
@@ -473,6 +470,7 @@ private:
 		return Error;
 	}
 
+
 private:
 	Clibvideoqueue *m_video_env_q;
 	Clibvideoqueue *m_video_opt_q;
@@ -481,7 +479,7 @@ private:
 	DWORD m_dwCapture;
 	DeviceTypeEnum m_eDeviceType;
 	CAutoArray<CUUID> m_arrListener;
-	BOOL m_bConnectAssist;
+	bool m_bConnectAssist;
 };
 
 void ChannelClient::OnMessage( ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData )

+ 7 - 1
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -817,7 +817,7 @@ void CVtmLoaderFSM::s4_on_entry()
 	std::pair<bool, std::string> strResult;
 	strResult = generateJsonStr(msgInfo);
 
-	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, strResult.second.c_str());
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_InfoAboutBootCost, strResult.second.c_str());
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F16")("%s", strResult.second.c_str());
 
 	//oiltmp wait for analyse progress, then change to app log format
@@ -1707,6 +1707,7 @@ bool CVtmLoaderFSM::VerifyVer()
 
 bool CVtmLoaderFSM::GetConfig()
 {
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("before GetConfig terminalNo:[%s]", m_sysInfo.strTerminalID.GetData());
 	//拉取配置前先检查root.ini文件
 	CSimpleStringA csTmpRootIni("");
 	if (!IsRootINIExist(csTmpRootIni) && m_terminalNoFromWeb.IsNullOrEmpty())
@@ -1714,6 +1715,11 @@ bool CVtmLoaderFSM::GetConfig()
 		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini不存在或安装页面未设置终端号,请检查(%s)", csTmpRootIni.GetData()).GetData());
 		return false;
 	}
+	else if (m_sysInfo.strTerminalID.IsNullOrEmpty())
+	{
+		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini中终端号为空,请检查(%s)", csTmpRootIni.GetData()).GetData());
+		return false;
+	}
 	ErrorCodeEnum eErr = Error_Succeed;
 	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始拉取配置");
 	VTMInitParam vtmInitParam(m_terminalNoFromWeb.GetData(), SpDefine::channelId, SpDefine::tokenSecret, SpDefine::CommonLaunchUrl, SpDefine::CenterConfigTotal);

+ 2 - 1
Module/mod_vtmloader/VtmLoader_UserCode.h

@@ -27,4 +27,5 @@ const int VtmLoader_CheckAudio_CfgPickupError = 0x10f0021a;
 const int VtmLoader_CheckAudio_CfgHandFreeError = 0x10f0021b;
 const int VtmLoader_SIPPhoneEntityLoad_Cost = 0x10f0021c;
 const int VtmLoader_DepDirCopyFailed = 0x10f0021d;
-const int VtmLoader_DepDirCopySuc = 0x10f0021e;
+const int VtmLoader_DepDirCopySuc = 0x10f0021e;
+const int VtmLoader_InfoAboutBootCost = 0x10f0021f;

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

@@ -605,7 +605,7 @@ int AudioMgrImpl::audio_get_device_name(char* pstrbuf, size_t ulen, bool binput,
 	else{
 		audio_device = audio_get_output_device(index);
 	}
-		
+
 	size_t unamelen = strlen(audio_device->description);
 	if (ulen > unamelen){
 		memcpy(pstrbuf, audio_device->description, ulen);

+ 58 - 57
Other/libsharememory/libsharememory.cpp

@@ -37,11 +37,9 @@ protected:
 public:
 	libsharememory_impl()
 	{
-
 #ifdef _WIN32
 		m_hMutex = NULL;
 		m_hFileMap = NULL;
-		
 #else
 		m_shid = -1;
 		m_semt = SEM_FAILED;
@@ -98,41 +96,47 @@ public:
 		}
 #else
 		if (szName != NULL && dwBytes > 0) {
-            snprintf(m_strshmname, MAX_PATH, "%s", szName);
-            snprintf(m_strsemname, MAX_PATH, "/mutex.%s", szName);
-			mode_t fm = umask(0);
-            m_shid = shm_open(m_strshmname, O_CREAT | O_TRUNC | O_RDWR, 0777);
-			umask(fm);	
-            if (m_shid >= 0) {
-                //aos_debug_log((LB, "shm_open O_CREAT | O_TRUNC | O_RDWR, 0777) success and share memory %s and size is %d", m_strshmname, dwBytes));
-            } else {
-                //aos_error_log((LB, "shm_open O_CREAT | O_TRUNC | O_RDWR, 0777) %s failed for %s, and errno is %d", m_strshmname, strerror(errno), errno));
-                if (EEXIST == errno) {
-                    //m_shid = shm_open(m_strshmname, O_RDWR, 0);
-                }
-            }
-            if (m_shid != -1) {
-                ftruncate(m_shid, dwBytes);
-                m_pData = mmap(NULL, dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
-                if (MAP_FAILED != m_pData) {
-                    *((unsigned int*)m_pData) = dwBytes;
-                    m_dwBytes = dwBytes;
-					m_semt = sem_open(m_strsemname, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 1);
-                    if (SEM_FAILED == m_semt && EEXIST == errno) {
-						m_semt = sem_open(m_strsemname, 0);
-                        sem_init(m_semt, 32, 1);
-                        int ivalue = -1;
-                        sem_getvalue(m_semt, &ivalue);
-						bRet = true;
-					} else if (SEM_FAILED != m_semt) {
-                        int ivalue = -1;
-                        sem_getvalue(m_semt, &ivalue);
-						bRet = true;
-					} 
-                } 
-            }
-			if (!bRet) {
-				CloseShareMem();
+			char szBuf[MAX_PATH] = { 0 };
+			const char* szFile = tmpnam(szBuf);
+			if (szFile != NULL) {
+				snprintf(m_strshmname, MAX_PATH, "%s", szName);
+				snprintf(m_strsemname, MAX_PATH, "/mutex.%s", szName);
+				m_shid = shm_open(szName, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+				if (m_shid >= 0) {
+					//Debug("%s:%d shm_open O_CREAT|O_RDWR|O_EXCL success and share memory %s and size is %d", __FUNCTION__, __LINE__, szName, dwBytes);
+				}
+				else {
+					//Debug("%s:%d shm_open O_CREAT|O_RDWR|O_EXCL %s failed for %s, and errno is %d", __FUNCTION__, __LINE__, m_strshmname, strerror(errno), errno);
+					if (EEXIST == errno) {
+						m_shid = shm_open(szName, O_RDWR, 0);
+					}
+				}
+
+				if (m_shid >= 0) {
+					if (NULL == m_pData) {
+						ftruncate(m_shid, dwBytes);
+						m_pData = mmap(NULL, dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
+						if (MAP_FAILED != m_pData) {
+							*((unsigned int*)m_pData) = dwBytes;
+							m_dwBytes = dwBytes;
+							sem_t* semt = sem_open(m_strsemname, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, 1);
+							if (NULL == semt) {
+								if (EEXIST == errno) {
+									semt = sem_open(m_strsemname, 0);
+									sem_init(semt, 32, 1);
+								}
+							}
+
+
+							if (NULL != semt) {
+								m_semt = semt;
+								int ivalue = -1;
+								sem_getvalue(m_semt, &ivalue);
+								bRet = true;
+							}
+						}
+					}
+				}
 			}
 		}
 #endif // _WIN32
@@ -142,7 +146,7 @@ public:
 	//打开已有的共享内存区
 	bool OpenShareMem(const char* szName)
 	{
-		bool T=false;
+		bool bRet = false;
 #ifdef _WIN32
 		char szBuf[MAX_PATH];
 		if (szName != NULL)
@@ -164,48 +168,45 @@ public:
 						UnlockShareMem();
 						if (m_dwBytes > 0)
 						{
-							T = true;
+							bRet = true;
 						}
 					}
 				}
 			}
-			if (!T)
+			if (!bRet)
 			{
 				CloseShareMem();
 			}
 		}
 #else
 		if (szName != NULL) {
-			snprintf(m_strshmname, MAX_PATH, "%s", szName);
-			snprintf(m_strsemname, MAX_PATH, "/mutex.%s", szName);
-			mode_t fm = umask(0);
-			m_shid = shm_open(m_strshmname, O_RDWR, 0777);
-			umask(fm);
-			if (m_shid != -1) {
-				m_semt = sem_open(m_strsemname, 0);
-				if (SEM_FAILED != m_semt) {
+			int shid = shm_open(szName, O_RDWR, 0);
+			if (-1 != shid) {
+				m_shid = shid;
+				sem_t* semt = sem_open(m_strsemname, 0);
+				if (SEM_FAILED != semt){
+					m_semt = semt;
 					int ivalue = -1;
-					sem_getvalue(m_semt, &ivalue);
-					lseek(m_shid, 0, SEEK_SET);
-					m_pData = mmap(NULL, m_dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, m_shid, 0);
+					sem_getvalue(semt, &ivalue);
+					m_pData = mmap(NULL, m_dwBytes, PROT_READ | PROT_WRITE, MAP_SHARED, shid, 0);
 					if (MAP_FAILED != m_pData) {
-						if (LockShareMem()) {
+						if (LockShareMem()){
 							m_dwBytes = *((unsigned int*)m_pData);
 							UnlockShareMem();
-							if (m_dwBytes > 0) {
-								T = true;
+							if (m_dwBytes > 0){
+								bRet = true;
 							}
 						}
-					} 
+					}
 				}
 			}
 			
-			if (!T){
+			if (!bRet){
 				CloseShareMem();
 			}
 		}
 #endif // RVC_OS_WIN
-		return T;
+		return bRet;
 	}
 
 	//释放共享内存区

+ 2 - 2
Other/libvideorecord/libvideorecord_impl.cpp

@@ -1800,7 +1800,7 @@ bool libvideorecord_impl::PauseRecord()				//暂停录像
 
 
 bool libvideorecord_impl::StartVideoRecord(int fps, int videoquality, eVideoFormat eFormat, const SubtitleParam* subtitleParam, bool bWholeSection,
-	bool bSessionManage, const char* pathname, int pathlength, const char* wmvfilename, int filenamelength, Rvc_RecordAudioParam_t* pAudioParam)//开始记录
+	bool bSessionManage, const char* pathname, int pathlength, const char* pfilename, int filenamelength, Rvc_RecordAudioParam_t* pAudioParam)//开始记录
 {
 	m_audioqueue = NULL;
 
@@ -1823,7 +1823,7 @@ bool libvideorecord_impl::StartVideoRecord(int fps, int videoquality, eVideoForm
 #endif
 	}
 	else {
-		memcpy(m_FileName, wmvfilename, filenamelength);
+		memcpy(m_FileName, pfilename, filenamelength);
 	}
 
 	m_eFormat = eFormat;

+ 1 - 1
Other/libvideorecord/libvideorecord_impl.h

@@ -52,7 +52,7 @@ public:
 	CHostApi* GetHostApi();
 	int VideoRecord();
 	bool StartVideoRecord(int fps, int videoquality, eVideoFormat eFormat, const SubtitleParam* subtitleParam, bool bWholeSection,
-		bool bSessionManage, const char* pathname, int pathlength, const char* wmvfilename, int filenamelength, Rvc_RecordAudioParam_t* pAudioParam);//开始记录
+		bool bSessionManage, const char* pathname, int pathlength, const char* pfilename, int filenamelength, Rvc_RecordAudioParam_t* pAudioParam);//开始记录
 	bool StopVideoRecord();			//退出
 	bool PauseRecord();				//暂停录像
 	bool ContinueRecord();			//继续录像

+ 4 - 3
Other/unix/libvideocapture/ivideocaptureinterface.h

@@ -75,7 +75,7 @@
 #define VIDEOCAP_OPT_ENABLE_ASYNC_GRAB 0x08
 #define VIDEOCAP_OPT_HOZFLIP		0x10
 
-#define VIDEOCAP_MAX_MODE       12
+#define VIDEOCAP_MAX_MODE			12
 
 /* video device capability */
 typedef struct videocap_device_cap_s {
@@ -142,9 +142,10 @@ public:
 	virtual int StartVideoCapture() = 0;
 	virtual int StopVideoCapture() = 0;
 	virtual void VideoCaptureDestroy() = 0;
-	virtual int GetCamBrightness(int* ibright) = 0;
-	virtual int SetCamBrightness(int ibright) = 0;
+	virtual int GetCamBrightness(int* ibright, bool bRawRange) = 0;
+	virtual int SetCamBrightness(int ibright, bool bRawRange) = 0;
 	virtual int SetCamAutoBrightness() = 0;
+	virtual bool GetCamRawBrightnessRange(int* imin, int* imax) = 0;
 };
 
 

+ 39 - 14
Other/unix/libvideocapture/linux/videocapture_linux.cpp

@@ -142,8 +142,6 @@ int VideoCaptureImpl::VideoCaptureSetParam(videocap_param_t* param)
 	else {
 		//CapLog("%s", "param->option & VIDEOCAP_OPT_EANBLE_RESIZE success.");
 	}
-
-	//CapLog("%s:%d param->option = %d.", __FUNCTION__, __LINE__, param->option);
 	
 	m_capture = (videocap_t*)malloc(sizeof(videocap_t));
 	if (!m_capture) {
@@ -156,8 +154,6 @@ int VideoCaptureImpl::VideoCaptureSetParam(videocap_param_t* param)
 	if (param->option & VIDEOCAP_OPT_ENABLE_GRAB) {
 		int width = mode_width[param->cap_mode];
 		int height = mode_height[param->cap_mode];
-
-		//CapLog("%s:%d, width = %d, height = %d.", __FUNCTION__, __LINE__, width, height);
 		
 		if (video_frame_alloc(width, height, param->frame_fmt, &m_capture->cap_frame) != 0) {
 			free(m_capture);
@@ -174,8 +170,6 @@ int VideoCaptureImpl::VideoCaptureSetParam(videocap_param_t* param)
 		int width = mode_width[param->res_mode];
 		int height = mode_height[param->res_mode];
 		
-		//CapLog("%s:%d, width = %d, height = %d.", __FUNCTION__, __LINE__, width, height);
-		
 		if (video_frame_alloc(width, height, param->frame_fmt, &m_capture->res_frame) != 0) {
 			if (param->option & VIDEOCAP_OPT_ENABLE_GRAB) {
 				video_frame_free(&m_capture->res_frame);
@@ -204,8 +198,6 @@ int VideoCaptureImpl::VideoCaptureSetParam(videocap_param_t* param)
 			return -1;
 		}
 	}
-
-	//CapLog("%s:%d, param->irotate %d.", __FUNCTION__, __LINE__, param->irotate);
 	
 	m_rotate = RotateTrans(param->irotate);
 
@@ -860,6 +852,7 @@ bool VideoCaptureImpl::DeAllocateVideoBuffers()
 bool VideoCaptureImpl::AlignedMallocVideoBuffer()
 {
 	bool bret = false;
+
 	int stride_y = m_in_cap_width;
 	int stride_u = (m_in_cap_width + 1) / 2;
 	int stride_v = (m_in_cap_width + 1) / 2;
@@ -963,16 +956,23 @@ void VideoCaptureImpl::VideoCaptureDestroy()
 	delete this;
 }
 
-int VideoCaptureImpl::GetCamBrightness(int* ibright)
+int VideoCaptureImpl::GetCamBrightness(int* ibright, bool bRawRange)
 {
 	int iret = -1;
+
 	struct v4l2_control ctrl;
 	ctrl.id = V4L2_CID_BRIGHTNESS;
 	if (ioctl(m_deviceFd,VIDIOC_G_CTRL,&ctrl) == -1){
 		CapLog("VIDIOC_S_CTRL get V4L2_CID_BRIGHTNESS error for %s", strerror(errno));
 	}
 	else {
-		*ibright = TransFromRealBrightnessValue(ctrl.value);
+		if (bRawRange) {
+			*ibright = ctrl.value;
+		}
+		else {
+			*ibright = TransFromRealBrightnessValue(ctrl.value);
+		}
+		
 		iret = 0;
 	}	
 
@@ -980,14 +980,21 @@ int VideoCaptureImpl::GetCamBrightness(int* ibright)
 }
 
 
-int VideoCaptureImpl::SetCamBrightness(int ibright)
+int VideoCaptureImpl::SetCamBrightness(int ibright, bool bRawRange)
 {
 	int iret = -1;
+
 	struct v4l2_control ctrl;
 	ctrl.id = V4L2_CID_BRIGHTNESS;
-	ctrl.value = TransToRealBrightnessValue(ibright);
+	if (bRawRange) {
+		ctrl.value = ibright;
+	}
+	else {
+		ctrl.value = TransToRealBrightnessValue(ibright);
+	}
+	
 	if (ioctl(m_deviceFd, VIDIOC_S_CTRL, &ctrl) == -1){
-		CapLog("VIDIOC_S_CTRL set V4L2_CID_BRIGHTNESS error for %s", strerror(errno));
+		CapLog("VIDIOC_S_CTRL set V4L2_CID_BRIGHTNESS error for %s.", strerror(errno));
 	}
 	else{
 		iret = 0;
@@ -1008,7 +1015,6 @@ int VideoCaptureImpl::SetCamAutoBrightness()
 		CapLog("VIDIOC_S_CTRL set V4L2_CID_AUTOBRIGHTNESS error for %s", strerror(errno));
 	}
 	else {
-		CapLog("VIDIOC_S_CTRL set V4L2_CID_AUTOBRIGHTNESS success.");
 		iret = 0;
 	}
 	iret = 0;
@@ -1037,6 +1043,25 @@ bool VideoCaptureImpl::GetCamBrightnessInfo()
 }
 
 
+bool VideoCaptureImpl::GetCamRawBrightnessRange(int* imin, int* imax)
+{
+	bool bret = false;
+
+	struct v4l2_queryctrl qctrl;
+	qctrl.id = V4L2_CID_BRIGHTNESS;
+	if (ioctl(m_deviceFd, VIDIOC_QUERYCTRL, &qctrl) == -1) {
+		CapLog("VIDIOC_QUERYCTRL get V4L2_CID_BRIGHTNESS error for %s", strerror(errno));
+	}
+	else {
+		CapLog("VIDIOC_QUERYCTRL get V4L2_CID_BRIGHTNESS success {min(%d) - max(%d)}, default is %d.", qctrl.minimum, qctrl.maximum, qctrl.default_value);
+		*imin = qctrl.minimum;
+		*imax = qctrl.maximum;
+		bret = true;
+	}
+
+	return bret;
+}
+
 //100 to real brightness value
 int VideoCaptureImpl::TransToRealBrightnessValue(int ibright)
 {

+ 3 - 2
Other/unix/libvideocapture/linux/videocapture_linux.h

@@ -54,9 +54,10 @@ public:
 	virtual int StartVideoCapture();
 	virtual int StopVideoCapture();
 	virtual void VideoCaptureDestroy();
-	int GetCamBrightness(int* ibright);
-	int SetCamBrightness(int ibright);
+	int GetCamBrightness(int* ibright, bool bRawRange);
+	int SetCamBrightness(int ibright, bool bRawRange);
 	int SetCamAutoBrightness();
+	bool GetCamRawBrightnessRange(int* imin, int* imax);
 
 	bool GetCamBrightnessInfo();
 	bool VideoCaptureStarted();