Răsfoiți Sursa

Z991239-6140 #comment 打开设备的逻辑放到线程池

80374374 6 luni în urmă
părinte
comite
b416b5fc90
2 a modificat fișierele cu 101 adăugiri și 76 ștergeri
  1. 64 63
      Module/mod_HSPScanner/HSPScannerFSM.cpp
  2. 37 13
      Module/mod_HSPScanner/HSPScannerFSM.h

+ 64 - 63
Module/mod_HSPScanner/HSPScannerFSM.cpp

@@ -54,7 +54,6 @@ const char* EvtTypeToString(int nEvtType)
 			T_STRINGY(USER_EVT_SHOWPROPERTY_FINISHED)
 			T_STRINGY(EVT_TIMER)
 			T_STRINGY(USER_EVT_SETPROPERTYINVIEW_FINISHED)
-			T_STRINGY(USER_EVT_NOCFG)
 			T_STRINGY(USER_EVT_HIDEPREVIEW)
 			T_STRINGY(USER_EVT_GOTOHELL)
 			T_STRINGY(USER_EVT_STARTPREVIEW_JS)
@@ -65,6 +64,8 @@ const char* EvtTypeToString(int nEvtType)
 			T_STRINGY(USER_EVT_SCANIMAGE_JS_DONE)
 			T_STRINGY(USER_EVT_SETPARAM_JS)
 			T_STRINGY(EVT_MAINPAGE_DISPLAY)
+			T_STRINGY(USER_EVT_INIT)
+			T_STRINGY(USER_EVT_INIT_FINISHED)
 	default:
 		return "Unknown EventType";
 		break;
@@ -131,44 +132,31 @@ ErrorCodeEnum CHSPScannerFSM::OnInit()
 {
 	ErrorCodeEnum erroCode = Error_Succeed;
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Source Code complied at: %s %s", __DATE__, __TIME__);
+	SetDevInitFlag(false);
 	AddStateHooker(this);
 	InitialMaxResizeValue();
 	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
 	pEntity->InitializeVendorLogSwitch();
 	CSimpleStringA strNoUse(true);
 	auto result = pEntity->ExtractVendorLibFullPath(strNoUse);
-	if (result == Error_NotConfig) {
-		PostEventLIFO(new FSMEvent(USER_EVT_NOCFG));
-		SetDevInitingFlag(false);
-		return Error_Succeed;
-	}
 	if (FAILURED(result)) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s(%s).", (LPCTSTR)strNoUse, SpStrError(result));
+		if (result == Error_NotConfig) {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The Dll is not config.");
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s(%s).", (LPCTSTR)strNoUse, SpStrError(result));
+		}
 		goto FAIL;
 	}
 	FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
 	LogWarn(Severity_Low, Error_Unexpect, HSPScanner_UserErrorCode_ROOT_INFO, (LPCTSTR)m_adapterInfo.adapterFilePath);
-	erroCode = LoadUpAdapterLibrary();
-	if (erroCode == Error_Succeed) {
-		if (Error_Succeed == (erroCode = TryToOpenDevice())) {
-			SetDevInitFlag(true);
-			SetDevState(DEVICE_STATUS_NORMAL);
-			SetDevInitingFlag(false);
-			return erroCode;
-		}
-	}
-	//TODO: JS对外错误码提示  [Gifur@2025324]
-	else if (erroCode == Error_NotExist) {
-		SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT);
-	}
-	else {
-		SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED);
-	}
+	PostEventLIFO(new FSMEvent(USER_EVT_INIT));
+	return erroCode;
 
 FAIL:
 
-	SetDevInitFlag(false);
 	SetDevInitingFlag(false);
+	SetDevInitFlag(false);
 	PostEventLIFO(new FSMEvent(USER_EVT_GOTOHELL));
 	return Error_Succeed;
 }
@@ -328,9 +316,9 @@ unsigned int CHSPScannerFSM::s0_Idle_on_event(FSMEvent* e)
 		}
 		e->SetHandled();
 		break;
-	case USER_EVT_NOCFG:
+	case USER_EVT_INIT:
 		e->SetHandled();
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HSPScaner is not cofig now.");
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("To open device.");
 		break;
 	case EVT_MAINPAGE_DISPLAY:
 	case USER_EVT_EXIT:
@@ -1335,20 +1323,20 @@ unsigned int CHSPScannerFSM::s7_Exit_on_event(FSMEvent* e)
 	return uRet;
 }
 
-void CHSPScannerFSM::s8_NotConfig_on_entry()
+void CHSPScannerFSM::s8_Init_on_entry()
 {
-	SetDevState(DEVICE_STATUS_NORMAL); //避免握手重启
-	SetLastUserCode(HSPScanner_UserErrorCode_DLLNAME_NOCFG);
+	SetLastUserCode(LOG_WARN_HSPS_OPENING_NOW);
+	GetEntityBase()->GetFunction()->PostThreadPoolTask(new InitTask(this));
 }
 
-void CHSPScannerFSM::s8_NotConfig_on_exit()
+void CHSPScannerFSM::s8_Init_on_exit()
 {
-	
+
 }
 
-unsigned int CHSPScannerFSM::s8_NotConfig_on_event(FSMEvent* e)
+unsigned int CHSPScannerFSM::s8_Init_on_event(FSMEvent* e)
 {
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s8_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s8_Init_on_event: %s(%d), %d.", EvtTypeToString(e->iEvt), e->iEvt, e->param1);
 	unsigned int uRet = 0;
 	switch (e->iEvt) {
 		/** JS Component  [Gifur@20241112]*/
@@ -1356,32 +1344,28 @@ unsigned int CHSPScannerFSM::s8_NotConfig_on_event(FSMEvent* e)
 	{
 		JS::StartPreviewEvent* pEvt = dynamic_cast<JS::StartPreviewEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_STARTPREVIEW_JS] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_NotConfig, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_CANCELPREVIEW_JS:
 	{
 		JS::CancelPreviewEvent* pEvt = dynamic_cast<JS::CancelPreviewEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreviewJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_CANCELPREVIEW_JS] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_NotConfig, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SCANIMAGE_JS:
 	{
 		JS::ScanImageEvent* pEvt = dynamic_cast<JS::ScanImageEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SCANIMAGE_JS] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_NotConfig, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SETPARAM_JS:
 	{
 		JS::SetParamEvent* pEvt = dynamic_cast<JS::SetParamEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetParamJS).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SETPARAM_JS] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_NotConfig, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	/** JS Compoent Done  [Gifur@20241112]*/
@@ -1389,74 +1373,67 @@ unsigned int CHSPScannerFSM::s8_NotConfig_on_event(FSMEvent* e)
 	{
 		StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_StartPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_STARTPREVIEW] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_STOPPREVIEW:
 	{
 		StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_CancelPreview).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_STOPPREVIEW] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SCANIMAGE:
 	{
 		ScanImageEvent* pEvt = dynamic_cast<ScanImageEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImage).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SCANIMAGE] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SCANIMAGE_EX:
 	{
 		ScanImageExEvent* pEvt = dynamic_cast<ScanImageExEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ScanImageEx).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SCANIMAGE_EX] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SHOWPROPERTY:
 	{
 		ShowPropertyEvent* pEvt = dynamic_cast<ShowPropertyEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_ShowProperty).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SHOWPROPERTY] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SETPROPERTY:
 	{
 		SetPropertyEvent* pEvt = dynamic_cast<SetPropertyEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetProperty).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SETPROPERTY] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_SETWINPOS:
 	{
 		SetWinPosEvent* pEvt = dynamic_cast<SetWinPosEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_SetWinPos).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SETWINPOS] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
 	case USER_EVT_GETSTATUS:
 	{
 		GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
 		pEvt->SetHandled();
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(HSPScannerService_LogCode_GetDevStatus).setResultCode(MapCode2RTAString(GetLastUserCode()))("[USER_EVT_SETWINPOS] 硬件未配置");
-		pEvt->m_ctx->Answer(Error_InvalidState, GetLastUserCode());
+		pEvt->m_ctx->Answer(Error_NotInit, GetLastUserCode());
 	}
 	break;
-	case USER_EVT_GETINFO:
+	case USER_EVT_GOTOHELL:
 	{
-		GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
-		GetDevInfoTask* pTask = new GetDevInfoTask(this);
-		pTask->SetContext(pEvt->m_ctx);
-		GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+		e->SetHandled();
+	}
+	break;
+	case USER_EVT_INIT_FINISHED:
+	{
+		e->SetHandled();
 	}
-	e->SetHandled();
 	break;
 	default:
 		break;
@@ -2001,6 +1978,30 @@ int CHSPScannerFSM::GetDevInfo(SpReqAnsContext<HSPScannerService_GetDevInfo_Req,
 	return nRes;
 }
 
+int CHSPScannerFSM::Initial()
+{
+	SetDevInitingFlag(true);
+	SetDevInitFlag(false);
+	ErrorCodeEnum erroCode = LoadUpAdapterLibrary();
+	if (erroCode == Error_Succeed) {
+		if (Error_Succeed == (erroCode = TryToOpenDevice())) {
+			SetDevInitFlag(true);
+			SetDevState(DEVICE_STATUS_NORMAL);
+			SetDevInitingFlag(false);
+			return 0;
+		}
+	}
+	else if (erroCode == Error_NotExist) {
+		SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_NOTEIXT);
+	}
+	else {
+		SetLastUserCode(HSPScanner_UserErrorCode_LOAD_DLLFILE_FAILED);
+	}
+	SetDevInitingFlag(false);
+	SetDevInitFlag(false);
+	return 1;
+}
+
 BOOL CHSPScannerFSM::GetCurImageName(CSimpleStringA& csImagName, bool bExt /*= false*/)
 {
     if (bExt) {

+ 37 - 13
Module/mod_HSPScanner/HSPScannerFSM.h

@@ -64,9 +64,10 @@ enum EvtType
 	USER_EVT_EXIT,
 	USER_EVT_EXIT_FINISHED,
 
-	USER_EVT_NOCFG,
 	USER_EVT_GOTOHELL,
-	USER_EVT_QUIT
+	USER_EVT_QUIT,
+	USER_EVT_INIT,
+	USER_EVT_INIT_FINISHED
 };
 
 namespace JS
@@ -110,7 +111,9 @@ public:
 
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 
-	enum {sIdle, sPreview, sProperty, sFault, sPicture, sFault_Offline, sHidePreview, sExit, sFault_NotConfig};
+	enum {
+		sIdle, sPreview, sProperty, sFault, sPicture, sFault_Offline, sHidePreview, sExit, sInit
+	};
 
 	BEGIN_FSM_STATE(CHSPScannerFSM)
 		FSM_STATE_ENTRY(sIdle, "Idle", s0_Idle_on_entry, s0_Idle_on_exit, s0_Idle_on_event)
@@ -121,7 +124,7 @@ public:
 		FSM_STATE_ENTRY(sFault_Offline, "DeviceOff", s5_DeviceOff_on_entry, s5_DeviceOff_on_exit, s5_DeviceOff_on_event)
 		FSM_STATE_ENTRY(sHidePreview, "HidePreview", s6_HidePreview_on_entry, s6_HidePreview_on_exit, s6_HidePreview_on_event)
 		FSM_STATE_ENTRY(sExit, "Exit", s7_Exit_on_entry, s7_Exit_on_exit, s7_Exit_on_event)
-		FSM_STATE_ENTRY(sFault_NotConfig, "NotConfig", s8_NotConfig_on_entry, s8_NotConfig_on_exit, s8_NotConfig_on_event)
+		FSM_STATE_ENTRY(sInit, "Init", s8_Init_on_entry, s8_Init_on_exit, s8_Init_on_event)
 	END_FSM_STATE()
 
 	
@@ -192,13 +195,11 @@ public:
 		FSM_RULE_ENTRY(sExit, sHidePreview, USER_EVT_EXIT_FINISHED, 3)
 		FSM_RULE_ENTRY(sExit, sFault_Offline, USER_EVT_EXIT_FINISHED, 4)
 
-
 		FSM_RULE_ENTRY(sExit, sFault, USER_EVT_EXIT_FINISHED, 1)
 
-		FSM_RULE_ENTRY_ANY(sIdle, sFault_NotConfig, USER_EVT_NOCFG)
+		FSM_RULE_ENTRY_ANY(sIdle, sInit, USER_EVT_INIT)
 		FSM_RULE_ENTRY_ANY(sIdle, sFault, USER_EVT_GOTOHELL)
 
-
 		/** JS Compoent  [Gifur@20241114]*/
 		FSM_RULE_ENTRY(sIdle, sPreview, USER_EVT_STARTPREVIEW_JS_DONE, 0)
 		FSM_RULE_ENTRY(sIdle, sFault, USER_EVT_STARTPREVIEW_JS_DONE, 1) //预览失败
@@ -218,7 +219,10 @@ public:
 		FSM_RULE_ENTRY_ANY(sPreview, sExit, EVT_MAINPAGE_DISPLAY)
 		FSM_RULE_ENTRY_ANY(sHidePreview, sExit, EVT_MAINPAGE_DISPLAY)
 		/** JS Compoent Done [Gifur@20241114]*/
-		
+
+		FSM_RULE_ENTRY_ANY(sInit, sIdle, USER_EVT_INIT_FINISHED)
+		FSM_RULE_ENTRY_ANY(sInit, sFault, USER_EVT_GOTOHELL)
+
 	END_FSM_RULE()
 
 	virtual void s0_Idle_on_entry();
@@ -253,10 +257,9 @@ public:
 	virtual void s7_Exit_on_exit();
 	virtual unsigned int s7_Exit_on_event(FSMEvent* e);
 
-	//NotConfig
-	virtual void s8_NotConfig_on_entry();
-	virtual void s8_NotConfig_on_exit();
-	virtual unsigned int s8_NotConfig_on_event(FSMEvent* e);
+	virtual void s8_Init_on_entry();
+	virtual void s8_Init_on_exit();
+	virtual unsigned int s8_Init_on_event(FSMEvent* e);
 
 	virtual void OnStateTrans(int iSrcState, int iDstState);
 
@@ -321,6 +324,8 @@ public:
 	ErrorCodeEnum TryToOpenDevice();
 	LPCTSTR MapCode2RTAString(DWORD dwValue);
 
+
+	int Initial();
 protected:
 	
 	ErrorCodeEnum SetPreviewProperty(const JS::PreviewSettings& val, const char* logCode = "");
@@ -338,6 +343,7 @@ private:
 	bool m_lightOn;
 
 private:
+
 	BOOL GetCurImageName(CSimpleStringA& csImagName, bool bExt = false);
 	BOOL DelAndGetNewFileName(CSimpleStringA& csfileName, bool bInBusiness = false);
 	ErrorCodeEnum DeleteFileIfExisted(LPCTSTR fileName);
@@ -619,6 +625,25 @@ namespace JS {
 }
 /** JS Component Done  [Gifur@20241112]*/
 
+struct InitTask : public ITaskSp
+{
+	CHSPScannerFSM* fsm;
+	InitTask(CHSPScannerFSM* f) : fsm(f) {}
+
+	void Process()
+	{
+		const int ret = fsm->Initial();
+		if (ret == 0) {
+			FSMEvent* e = new FSMEvent(USER_EVT_INIT_FINISHED);
+			fsm->PostEventFIFO(e);
+		}
+		else {
+			FSMEvent* e = new FSMEvent(USER_EVT_GOTOHELL);
+			fsm->PostEventFIFO(e);
+		}
+	}
+};
+
 struct StartPreviewTask : public ITaskSp
 {
 	CHSPScannerFSM* m_fsm;
@@ -679,7 +704,6 @@ struct SetPropertyInPreviewTask : public ITaskSp
 	}
 };
 
-
 struct StopPreviewTask : public ITaskSp
 {
 	CHSPScannerFSM* m_fsm;