Browse Source

#IQRV #comment 在设备打开失败时支持自检时尝试打开设备

gifur 3 years ago
parent
commit
baf089ffa0
2 changed files with 137 additions and 64 deletions
  1. 114 63
      Module/mod_HSPScanner/HSPScannerFSM.cpp
  2. 23 1
      Module/mod_HSPScanner/HSPScannerFSM.h

+ 114 - 63
Module/mod_HSPScanner/HSPScannerFSM.cpp

@@ -92,12 +92,14 @@ CHSPScannerFSM::CHSPScannerFSM(void)
 	m_nFatalTimes(0),
 	m_nSrcState(s0),
 	m_csDllName(""),
+	m_csDllFullPath(""),
 	m_csDevNo(""),
 	m_csPort(""),
 	m_csBuadrate(""),
 	m_eDevStatus(DEVICE_STATUS_NOT_READY),
 	m_desiredAction(USER_EVT_QUIT),
 	m_bOpened(false),
+	m_bOpening(false),
 	m_contiErrTimes(0),
 	dwLastUserCode(0),
 	m_dwMaxImageSize(500)
@@ -121,8 +123,7 @@ ErrorCodeEnum CHSPScannerFSM::OnInit()
 	LOG_FUNCTION();
 	GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
 	ErrorCodeEnum erroCode = Error_Succeed;
-
-	CSimpleStringA csDllName(true);
+    m_csDllFullPath.Clear();
     auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
 	CSystemStaticInfo sysInfo;
 	m_csMachineType = "";
@@ -130,64 +131,31 @@ ErrorCodeEnum CHSPScannerFSM::OnInit()
 	m_csMachineType = sysInfo.strMachineType;
 	
 	InitialMaxResizeValue();
-    auto result = pEntity->ExtractVendorLibFullPath(csDllName);
+    auto result = pEntity->ExtractVendorLibFullPath(m_csDllFullPath);
 	if (result == Error_NotConfig) {
         PostEventLIFO(new FSMEvent(USER_EVT_NOCFG));
         return Error_Succeed;
 	}
 	if(FAILURED(result)) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s.", (LPCTSTR)csDllName);
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Fetch Vendor dllName failed %s.", (LPCTSTR)m_csDllFullPath);
 		goto FAIL;
 	}
-	LogWarn(Severity_Low, Error_Unexpect, HSPScanner_UserErrorCode_ROOT_INFO, (LPCTSTR)csDllName);
-	m_adapterInfo.adapterFileName = csDllName;
+	LogWarn(Severity_Low, Error_Unexpect, HSPScanner_UserErrorCode_ROOT_INFO, (LPCTSTR)m_csDllFullPath);
+	m_adapterInfo.adapterFileName = m_csDllFullPath;
 
 	HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, pEntity->vendorLibInfo.strVendor);
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("VendorDllName: %s.", (LPCTSTR)csDllName);
-    result = m_hDevHelper.LoadUp(csDllName);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("VendorDllName: %s.", (LPCTSTR)m_csDllFullPath);
+    result = m_hDevHelper.LoadUp(m_csDllFullPath);
     if (result != Error_Succeed) {
 #ifdef RVC_OS_WIN
         DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s - GLE=%u", (LPCTSTR)pEntity->GetVendorLibName(), GetLastError());
 #endif
-        goto FAIL;
-    }
-
-	result = m_hDevHelper->DevOpen();
-    if (FAILURED(result)) {
-		SetErrPackage(m_errPkg, "OnInit::DevOpen", m_csDevNo, result, MEC_DEVAPI_HSPSCANNER_DevOpen);
-		AlarmDEC(m_errPkg);
-        goto FAIL;
-	}
-	else {
-	    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Open HSPS succ");
-		ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
-		ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
-		ZeroMemory(m_devCat.szVendor, sizeof(m_devCat.szVendor));
-		result = m_hDevHelper->GetDevCategory(m_devCat);
-		if (result == Error_Succeed)
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szVendor:%s,szType:%s,szModel:%s,version:%d.%d.%d.%d", m_devCat.szVendor
-				, m_devCat.szType, m_devCat.szModel, m_devCat.version.wMajor, m_devCat.version.wMinor, m_devCat.version.wRevision, m_devCat.version.wBuild);
-			m_adapterInfo.devCatInfo = m_devCat;
-		}
-		else {
-			SetErrPackage(m_errPkg, "OnInit::GetDevCategory", m_csDevNo, result, MEC_DEVAPI_HSPSCANNER_GetDevCategory);
-			AlarmDEC(m_errPkg);
-		}
+	} else {
+        if (Error_Succeed == (erroCode = TryToOpenDevice())) {
+            m_eDevStatus = DEVICE_STATUS_NORMAL;
+            return erroCode;
+        }
 	}
-    m_bOpened = true;
-	{
-        m_nRecX = 1280;
-        m_nRecY = 0;
-        m_nRecW = 1920;
-        ErrorCodeEnum ecInit = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
-        ErrorCodeEnum ecInitScan = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
-        ErrorCodeEnum ecInitRotate = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
-        ErrorCodeEnum ecInitColor = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
-        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ViewPos: %s, Scan: %s, rotate: %s, color: %s.", SpStrError(ecInit), SpStrError(ecInitScan), SpStrError(ecInitRotate), SpStrError(ecInitColor));
-    }
-	m_eDevStatus = DEVICE_STATUS_NORMAL;
-	return result;
 
 FAIL:
 
@@ -197,7 +165,6 @@ FAIL:
 
 ErrorCodeEnum CHSPScannerFSM::OnExit()
 {
-	LOG_FUNCTION();
 
 	if(m_hDevHelper)
 	{
@@ -323,6 +290,10 @@ unsigned int CHSPScannerFSM::s0_on_event(FSMEvent* e)
 		DelAndGetNewFileName(strNoUsed);
 	}
 	break;
+	case USER_EVT_GOTOHELL:
+		e->SetHandled();
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HSPScaner init failed!");
+		break;
 	default:
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("UnHandle event ! %d", e->iEvt);
@@ -524,17 +495,13 @@ void CHSPScannerFSM::s3_on_entry()
 	m_nTickTimes = 0;
 	m_bOperating = FALSE;
 
-	int nStatus = IsDevConnected();
-
-	if(nStatus == 0)
-	{
+	const int nStatus = IsDevConnected();
+	if (nStatus == 0) {
 		PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT));
-	}
-	else
-	{
+	} else {
 		// move here. --Josephus at 19:07:40 20161214
 		m_ecSelfTest = Error_InvalidState;
-		if(nStatus != -1) {
+		if (nStatus != -1) {
 			ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET / 6);
 		}
 	}
@@ -561,6 +528,9 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 			StartPreviewEvent* pEvt = dynamic_cast<StartPreviewEvent*>(e);
 			if (!m_bOpened) {
 				pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
+				//if (Error_Succeed == TryToOpenDevice()) {
+				//	PostEventFIFO(new FSMEvent(USER_EVT_OPENSUCC));
+				//}
 			} else {
 				StartPreviewTask* pTask = new StartPreviewTask(this);
 				pTask->SetContext(pEvt->m_ctx);
@@ -577,7 +547,7 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 		break;
 	case USER_EVT_STOPPREVIEW:
 		{
-			if(m_hDevHelper)
+			if(m_hDevHelper && m_bOpened)
 			{
 				CancelTimer(RESET_TIMER_ID);
 				StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
@@ -604,6 +574,9 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 
 				StopPreviewEvent* pEvt = dynamic_cast<StopPreviewEvent*>(e);
 				pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
+				//if (Error_Succeed == TryToOpenDevice()) {
+				//	PostEventFIFO(new FSMEvent(USER_EVT_OPENSUCC));
+				//}
 			} 
 		}
 		e->SetHandled();
@@ -624,8 +597,13 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 		}
 		e->SetHandled();
 		break;
+	case USER_EVT_OPENSUCC:
+		///*TODO(80374374@9/2/2022):  */
+		e->SetHandled();
+		break;
 	case USER_EVT_RESET:
 		{
+		if (m_bOpened) {
 			ErrorCodeEnum erroCode = m_hDevHelper->Reset();
 			Dbg("Reset operation returned %s.", SpStrError(erroCode));
 			if(FAILURED(erroCode))
@@ -682,13 +660,15 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 					uRet = 2;
 				}
 			}
+		
+		}
+
 		}
 		e->SetHandled();
 		break;
 	case EVT_TIMER:
 		{
-			if(e->param1 == RESET_TIMER_ID)
-			{
+			if (e->param1 == RESET_TIMER_ID) {
 				FSMEvent* pEvt = new FSMEvent(USER_EVT_RESET);
 				PostEventFIFO(pEvt);
 				ScheduleTimer(RESET_TIMER_ID, MILLISECOND_TO_RESET);
@@ -704,6 +684,9 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 			GetDevStatusEvent* pEvt = dynamic_cast<GetDevStatusEvent*>(e);
 			if (!m_bOpened) {
 				pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
+				//if (Error_Succeed == TryToOpenDevice()) {
+				//	PostEventFIFO(new FSMEvent(USER_EVT_OPENSUCC));
+				//}
 			} else {
 				GetDevStatusTask* pTask = new GetDevStatusTask(this);
 				pTask->SetContext(pEvt->m_ctx);
@@ -714,10 +697,14 @@ unsigned int CHSPScannerFSM::s3_on_event(FSMEvent* e)
 		break;
 	case USER_EVT_GETINFO:
 		{
-			GetDevInfoTask* pTask = new GetDevInfoTask(this);
 			GetDevInfoEvent* pEvt = dynamic_cast<GetDevInfoEvent*>(e);
-			pTask->SetContext(pEvt->m_ctx);
-			GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+			if (!m_bOpened) {
+				pEvt->m_ctx->Answer(Error_DevNotAvailable, GetLastUserCode());
+			} else {
+				GetDevInfoTask* pTask = new GetDevInfoTask(this);
+				pTask->SetContext(pEvt->m_ctx);
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+			}
 		}
 		e->SetHandled();
 		break;
@@ -1007,7 +994,7 @@ void CHSPScannerFSM::s7_on_entry()
 
 void CHSPScannerFSM::s7_on_exit()
 {
-	if(m_hDevHelper)
+	if(m_hDevHelper && m_bOpened)
 	{
 		HspsDevStatus status = {0};
 		ErrorCodeEnum erroCode = m_hDevHelper->GetDevStatus(status);
@@ -1879,7 +1866,29 @@ UINT CHSPScannerFSM::UnitTest(LPCTSTR testTag)
 void CHSPScannerFSM::SelfTest(EntityTestEnum eTestType,
 	CSmartPointer<ITransactionContext> pTransactionContext)
 {
-	pTransactionContext->SendAnswer(m_ecSelfTest);
+	static int openFailedCount = 0;
+	if (GetCurrState()->id == CHSPScannerFSM::s3) {
+		if (!m_bOpened && !m_bOpening) {
+
+            if (!(bool)m_hDevHelper) {
+                pTransactionContext->SendAnswer(Error_InvalidState);
+                return;
+            }
+
+			openFailedCount++;
+			if (openFailedCount > 3) {
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("try to open device exceed limited times, let selftest to restart it! %d", openFailedCount);
+				pTransactionContext->SendAnswer(Error_InvalidState);
+				return;
+			} 
+
+			OpenDeviceTask* pTask = new OpenDeviceTask(this);
+			GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+		} else if (m_bOpened && openFailedCount != 0) {
+			openFailedCount = 0;
+		}
+	}
+	pTransactionContext->SendAnswer(Error_Succeed /*m_ecSelfTest*/);
 }
 
 void CHSPScannerFSM::OnStateTrans(int iSrcState, int iDstState) 
@@ -2007,3 +2016,45 @@ void CHSPScannerFSM::InitialMaxResizeValue()
 		return;
 	}
 }
+
+ErrorCodeEnum CHSPScannerFSM::TryToOpenDevice()
+{
+	ErrorCodeEnum result(Error_Succeed);
+	m_bOpening = true;
+
+    result = m_hDevHelper->DevOpen();
+    if (FAILURED(result)) {
+        SetErrPackage(m_errPkg, "OnInit::DevOpen", m_csDevNo, result, MEC_DEVAPI_HSPSCANNER_DevOpen);
+        AlarmDEC(m_errPkg);
+    } else {
+        DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Open HSPS succ");
+        ZeroMemory(m_devCat.szModel, sizeof(m_devCat.szModel));
+        ZeroMemory(m_devCat.szType, sizeof(m_devCat.szType));
+        ZeroMemory(m_devCat.szVendor, sizeof(m_devCat.szVendor));
+        result = m_hDevHelper->GetDevCategory(m_devCat);
+        if (result == Error_Succeed) {
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("szVendor:%s,szType:%s,szModel:%s,version:%d.%d.%d.%d", m_devCat.szVendor
+                                                         , m_devCat.szType, m_devCat.szModel, m_devCat.version.wMajor, m_devCat.version.wMinor, m_devCat.version.wRevision, m_devCat.version.wBuild);
+            m_adapterInfo.devCatInfo = m_devCat;
+        } else {
+            SetErrPackage(m_errPkg, "OnInit::GetDevCategory", m_csDevNo, result, MEC_DEVAPI_HSPSCANNER_GetDevCategory);
+            AlarmDEC(m_errPkg);
+        }
+
+        m_bOpened = true;
+        {
+            m_nRecX = 1280;
+            m_nRecY = 0;
+            m_nRecW = 1920;
+            ErrorCodeEnum ecInit = m_hDevHelper->SetViewPos(m_nRecX, m_nRecY, m_nRecW);
+            ErrorCodeEnum ecInitScan = m_hDevHelper->SetParam(HSPS_MODEL_SCANSIZE, HSPS_SCAN_FULL);
+            ErrorCodeEnum ecInitRotate = m_hDevHelper->SetParam(HSPS_MODEL_ROTATE, HSPS_ROTATE_NOANGLE);
+            ErrorCodeEnum ecInitColor = m_hDevHelper->SetParam(HSPS_MODEL_COLOR, HSPS_COLOR_FULL);
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ViewPos: %s, Scan: %s, rotate: %s, color: %s.", SpStrError(ecInit), SpStrError(ecInitScan), SpStrError(ecInitRotate), SpStrError(ecInitColor));
+        }
+        m_eDevStatus = DEVICE_STATUS_NORMAL;
+    }
+
+	m_bOpening = false;
+    return result;
+}

+ 23 - 1
Module/mod_HSPScanner/HSPScannerFSM.h

@@ -60,6 +60,7 @@ enum EvtType
 
 	USER_EVT_NOCFG,
 	USER_EVT_GOTOHELL,
+	USER_EVT_OPENSUCC,
 
 	USER_EVT_QUIT
 };
@@ -246,6 +247,7 @@ public:
 		FSM_RULE_ENTRY(s3, s0, USER_EVT_RESET, 0)
 		FSM_RULE_ENTRY(s3, s3, USER_EVT_RESET, 1)
 		FSM_RULE_ENTRY(s3, s1, USER_EVT_RESET, 2)
+		FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_OPENSUCC)
 
 		FSM_RULE_ENTRY(s1, s2, USER_EVT_SHOWPROPERTY, 0)
 		FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_SHOWPROPERTY_FINISHED)
@@ -386,6 +388,9 @@ public:
 
 	UINT UnitTest(LPCTSTR testTag);
 
+	bool m_bOpened;
+	bool m_bOpening;
+
 	void SetLastUserCode(DWORD dwCode = 0) 
 	{ 
 		dwLastUserCode = dwCode; 
@@ -407,6 +412,8 @@ private:
 	int m_nRecX, m_nRecY, m_nRecW;
 
 	CSimpleStringA m_csDllName;
+	CSimpleStringA m_csDllFullPath;
+
 	CSimpleStringA m_csDevNo;
 	CSimpleStringA m_csPort, m_csBuadrate;
 	DevStateEnum m_eDevStatus;
@@ -424,7 +431,6 @@ private:
 
 public:
 
-    bool m_bOpened;
 
 	DWORD GetCustLastErrorCode() { return m_dwErroCode; }
 	void SetCustLastErrorCode(DWORD dwVal = 0) { m_dwErroCode = dwVal; }
@@ -447,6 +453,8 @@ public:
 		
 	}
 
+	ErrorCodeEnum TryToOpenDevice();
+
 private:
 	BOOL GetCurImageName(CSimpleStringA& csImagName, bool bExt = false);
 	BOOL DelAndGetNewFileName(CSimpleStringA& csfileName);
@@ -689,4 +697,18 @@ struct GetDevInfoTask : public ITaskSp
 	}
 };
 
+struct OpenDeviceTask : public ITaskSp
+{
+	CHSPScannerFSM* m_fsm;
+	OpenDeviceTask(CHSPScannerFSM* fsm) : m_fsm(fsm) {}
+	void Process()
+	{
+		if (!m_fsm->m_bOpened) {
+				if (Error_Succeed == m_fsm->TryToOpenDevice()) {
+					m_fsm->PostEventFIFO(new FSMEvent(USER_EVT_OPENSUCC));
+				}
+		}
+	}
+};
+
 #endif //_HSPSCANNER_FSM_H_