浏览代码

Z991239-914 #comment other: Scan函数拆解

翟俊伟80258120 5 年之前
父节点
当前提交
d8de45674a
共有 2 个文件被更改,包括 220 次插入124 次删除
  1. 187 122
      Module/mod_FingerPrint/FingerPrintFSM.cpp
  2. 33 2
      Module/mod_FingerPrint/FingerPrintFSM.h

+ 187 - 122
Module/mod_FingerPrint/FingerPrintFSM.cpp

@@ -7,7 +7,6 @@
 #include <thread>
 #include <chrono>
 #include <fstream>
-#include <ctime>
 #include <cstdio>
 
 #ifdef RVC_OS_LINUX
@@ -15,13 +14,6 @@
 #include <unistd.h>
 #endif // RVC_OS_LIUNX
 
-#define FINGERPRINT_SCAN_TIMEOUT 15000 * 1000	//us
-#define FINGERPRINT_SCAN_INTERNAL 100			//ms
-#define FINGERPRINT_MATCH_TIMEOUT 15000 * 1000	//us
-#define MAX_FEATURE_LEN 1024
-
-#define FINGERPRINT_INIT_COUNT 3
-
 void CFingerPrintFSM::s0_on_entry()
 {
 	LOG_FUNCTION();
@@ -230,7 +222,7 @@ ErrorCodeEnum CFingerPrintFSM::OnInit()
 	if (Error_Succeed != errDev)
 	{
 		Dbg("load vendorlib or create DevAdapterObject failed.");
-		delete m_DevAdptLibHelper;    //TODO: 需要考虑蓝牙多合一 DevClose()
+		delete m_DevAdptLibHelper;    //TODO: 考虑蓝牙多合一 DevClose()
 		m_DevAdptLibHelper = nullptr;
 		return Error_DevLoadFileFailed;
 	}
@@ -262,180 +254,255 @@ void CFingerPrintFSM::SelfTest(EntityTestEnum eTestType
 	pTransactionContext->SendAnswer(m_testResult);
 }
 
-int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
+ErrorCodeEnum CFingerPrintFSM::InitParamBeforeScan(ScanParam *initParam, int scanTime)
 {
-	LOG_FUNCTION();
-	if(!m_devInit) {
-		ctx->Answer(Error_NotInit);  //maybe no vendor adapter
-		return 0;
-	}
+	ErrorCodeEnum errCode = Error_Succeed;
+
+	if (!m_devInit)
+		return Error_NotInit; //maybe no vendor adapter
+
 	if (m_bCancelRegister) //no cancel button anymore while register
 	{
-		ctx->Answer(Error_Cancel);
 		m_bCancelRegister = false;
-		return 0;
+		return Error_Cancel;
 	}
 
-	CSimpleStringA m_strPath1, m_strPath2, m_strPath3;
-	long elapsed = 0;
-	clock_t timeStart = clock();
-	clock_t timeEnd = clock();
-	ErrorCodeEnum eErr;
-	LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
-	LPBYTE lpbTemplate = new BYTE[MAX_FEATURE_LEN];
-	memset(lpbFeature, 0, sizeof(lpbFeature));
-	int lpbLength = MAX_FEATURE_LEN;
+	initParam->m_TimeStart = clock();
+	initParam->m_TimeEnd = clock();
+	initParam->m_TimeLeft = 0;
+
+	initParam->m_Feature = new BYTE[MAX_FEATURE_LEN];
+	initParam->m_Template = new BYTE[MAX_FEATURE_LEN];
+	initParam->m_FeatureLen = MAX_FEATURE_LEN;
+	initParam->m_FullFilePath = "";
+
+	initParam->m_ScanSuc = false;
+	initParam->m_GetTemplateSuc = true;
+	initParam->m_NotFindImage = false;
+	initParam->m_FeatureIsNull = false;
+	initParam->m_Quit = false;
+
+	m_bCancelRegister = false;
+
+	memset(initParam->m_Feature, 0, sizeof(initParam->m_Feature));
+	memset(initParam->m_Template, 0, sizeof(initParam->m_Template));
 	LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
 
-	if (ctx->Req.times == 1)
+	if (scanTime == 1)
 	{
 		Dbg("Before scan fingerprint, clear bmp file");
 		DeleteBmp(BmpImage);
 		Dbg("Before scan fingerprint, finish doing clear job.");
-		m_strPath1 = "";
-		m_strPath2 = "";
-		m_strPath3 = "";
+		m_BmpFileFullPath1 = "";
+		m_BmpFileFullPath2 = "";
+		m_BmpFileFullPath3 = "";
 	}
-	CSimpleStringA strPath;
-	eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
-	if(eErr != Error_Succeed)
+
+	errCode = m_pEntity->GetFunction()->GetPath("Dep", initParam->m_FullFilePath);
+	if (errCode != Error_Succeed)
 	{
-		delete[] lpbFeature;
-		lpbFeature = NULL;
-		delete[] lpbTemplate;
-		lpbTemplate = NULL;
-		Dbg("Get path failed");
-		LogError(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_REGISTER, "Get dep path failed while register.");
-		ctx->Answer(Error_Param);
-		return 0;
+		delete[] initParam->m_Feature;
+		initParam->m_Feature = NULL;
+		delete[] initParam->m_Template;
+		initParam->m_Template = NULL;
+		Dbg("Get dep path failed");
+
+		LogError(Severity_High, Error_DevLoadFileFailed
+				, LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_REGISTER
+				, "Get dep path failed while register.");
+		
+		return Error_Param;
 	}
 
-	CSimpleStringA fileName, strPath1, strPath2, strPath3;
-	switch(ctx->Req.times)
+	switch (scanTime)
 	{
 	case 1:
-		fileName = "finger1.bmp";
-		m_strPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
+		initParam->m_BmpFileName = "finger1.bmp";
+		m_BmpFileFullPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s" 
+												 , (const char*)initParam->m_FullFilePath
+												 , (const char*)initParam->m_BmpFileName);
 		break;
 	case 2:
-		fileName = "finger2.bmp";
-		m_strPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
+		initParam->m_BmpFileName = "finger2.bmp";
+		m_BmpFileFullPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
+												 , (const char*)initParam->m_FullFilePath
+												 , (const char*)initParam->m_BmpFileName);
 		break;
 	case 3:
-		fileName = "finger3.bmp";
-		m_strPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
+		initParam->m_BmpFileName = "finger3.bmp";
+		m_BmpFileFullPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
+												 , (const char*)initParam->m_FullFilePath
+												 , (const char*)initParam->m_BmpFileName);
 		break;
 	default:
-		fileName = "finger.bmp";
+		initParam->m_BmpFileName = "finger.bmp";
 		break;
 	}
-	strPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
-	
-	Dbg("get imageName success: %s", strPath);
-	
-	bool bScanSuccess = false;
-	m_bCancelRegister = false;
-	bool bGetTemplateSuc = true;
-	bool bNotFindImage = false;
-	bool bFeatureIsNull = false;
-	bool bExit = false;
+	initParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
+													, (const char*)initParam->m_FullFilePath
+													, (const char*)initParam->m_BmpFileName);
+
+	Dbg("get imageName success: %s", initParam->m_FullFilePath);
 
-	while(elapsed < FINGERPRINT_SCAN_TIMEOUT && !m_bCancelRegister && !bScanSuccess)
+	return errCode;
+}
+
+void CFingerPrintFSM::ScanProcess(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer &ctx)
+{
+	LOG_FUNCTION();
+
+	while (pScanParam->m_TimeLeft < FINGERPRINT_SCAN_TIMEOUT && !m_bCancelRegister && !pScanParam->m_ScanSuc)
 	{
 		if (m_bExit)
 		{
 			Dbg("Exit");
-			bExit = true;
+			pScanParam->m_Quit = true;
 			break;
 		}
+
 		std::this_thread::sleep_for(std::chrono::milliseconds(FINGERPRINT_SCAN_INTERNAL));
-		//Sleep(FINGERPRINT_SCAN_INTERNAL);
-		eErr = m_pFingerPrint->Image2Feature(fileName, lpbFeature, lpbLength);
-		if (eErr == Error_Succeed){
+
+		pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
+		ErrorCodeEnum errCode = m_pFingerPrint->Image2Feature(pScanParam->m_BmpFileName
+															, pScanParam->m_Feature
+															, pScanParam->m_FeatureLen);
+		if (errCode == Error_Succeed) 
+		{
 			Dbg("Invoke routine 'Image2Feature' success.'");
 
+			//save image may be delayed some time, not must happen
 			std::this_thread::sleep_for(std::chrono::milliseconds(200));
-			//Sleep(200);//save image may be delayed some time, not must happen
+			std::ifstream bmpImage((const char*)pScanParam->m_FullFilePath, std::ifstream::binary);
 
-			std::ifstream bmpImage((const char*)strPath, std::ifstream::binary);
-			if (bmpImage && lpbFeature != NULL && lpbLength > 0){
-				Dbg("fingerprint feature length is %d", lpbLength);
-				ctx->Ans.imageName = fileName;
-				if (ctx->Req.times == 3){
-					//第三次需要合成模板
-					Dbg("m_strPath1 = %s", m_strPath1.GetData());
-					Dbg("m_strPath2 = %s", m_strPath2.GetData());
-					Dbg("m_strPath3 = %s", m_strPath3.GetData());
-
-					eErr = m_pFingerPrint->Image2Template(m_strPath1, m_strPath2, m_strPath3, lpbTemplate, lpbLength);
-
-					if (eErr == Error_Succeed){
+			if (bmpImage && pScanParam->m_Feature != NULL && pScanParam->m_FeatureLen > 0) 
+			{
+				Dbg("fingerprint feature length is %d", pScanParam->m_FeatureLen);
+				ctx->Ans.imageName = pScanParam->m_BmpFileName;
+				if (ctx->Req.times == 3) {
+					Dbg("m_strPath1 = %s", m_BmpFileFullPath1.GetData());
+					Dbg("m_strPath2 = %s", m_BmpFileFullPath2.GetData());
+					Dbg("m_strPath3 = %s", m_BmpFileFullPath3.GetData());
+
+					errCode = m_pFingerPrint->Image2Template(m_BmpFileFullPath1, m_BmpFileFullPath2
+															, m_BmpFileFullPath3, pScanParam->m_Template
+															, pScanParam->m_FeatureLen);
+
+					if (Error_Succeed == errCode)
+					{
 						Dbg("Invoke routine 'Image2Template' success");
-						if (lpbTemplate != NULL && lpbLength > 0){
-							Dbg("template length is %d", lpbLength);
-							ctx->Ans.feature = (LPCTSTR)lpbTemplate;
-						}else{
+
+						if (pScanParam->m_Template != NULL && pScanParam->m_FeatureLen > 0) {
+							Dbg("template length is %d", pScanParam->m_FeatureLen);
+							ctx->Ans.feature = (LPCTSTR)pScanParam->m_Template;
+						}
+						else {
 							Dbg("template is NULL");
-							bGetTemplateSuc = false;
-							break; 
+							pScanParam->m_GetTemplateSuc = false;
+							break;
 						}
-					}else{
-						bGetTemplateSuc = false;
+					}
+					else {
+						pScanParam->m_GetTemplateSuc = false;
 						DevErrorInfo devErrorInfo;
 						m_pFingerPrint->GetLastErr(devErrorInfo);
-						Dbg("Invoke routine 'Image2Template' failed which returned 0x%x(%s)", eErr, devErrorInfo.szErrMsg);
+						Dbg("Invoke routine 'Image2Template' failed which returned %s(%s)", SpStrError(errCode), devErrorInfo.szErrMsg);
 						break;
 					}
 				}
-				bScanSuccess = true;
+				pScanParam->m_ScanSuc = true;
 				break;
-			}else if(!bmpImage){
-				Dbg("Cannot find the fingerprint image %s", fileName);
-				bNotFindImage = true;
+			}else if (!bmpImage) {
+				Dbg("Cannot find the fingerprint image %s", pScanParam->m_BmpFileName);
+				pScanParam->m_NotFindImage = true;
 				break;
-			}else{
+			}else {
 				Dbg("Fingerprint feature is NULL.");
-				bFeatureIsNull = true;
+				pScanParam->m_FeatureIsNull = true;
 				break;
 			}
-		}else{
+		}else {
 			DevErrorInfo devErrInfo;
 			m_pFingerPrint->GetLastErr(devErrInfo);
-			Dbg("Invoke routine 'Image2Feature' failed which returned 0x%x(%s) while register.", eErr, devErrInfo.szErrMsg);
+			Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s) while register."
+				, SpStrError(errCode), devErrInfo.szErrMsg);
 		}
-		timeEnd = clock();
-		elapsed = timeEnd - timeStart;
+		pScanParam->m_TimeEnd = clock();
+		pScanParam->m_TimeLeft = pScanParam->m_TimeEnd - pScanParam->m_TimeStart;
 	}
+
 	LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning on");
 	m_bExit = false;
-	if (bScanSuccess)
+}
+
+void CFingerPrintFSM::ProcessAfterScan(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx)
+{
+	if (pScanParam->m_ScanSuc)
+	{
 		ctx->Answer(Error_Succeed);
-	else if(elapsed >= FINGERPRINT_SCAN_TIMEOUT)
+	}
+	else if (pScanParam->m_TimeLeft >= FINGERPRINT_SCAN_TIMEOUT)
+	{
 		ctx->Answer(Error_TimeOut);
-	else if(m_bCancelRegister)
+	}
+	else if (m_bCancelRegister)
+	{
 		ctx->Answer(Error_Cancel);
-	else{
-		if(bNotFindImage){
-			LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER, "not find fingerprint image in dep while register.");
+	}
+	else {
+		if (pScanParam->m_NotFindImage)
+		{
+			LogError(Severity_High, Error_Hardware
+				   , LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER
+				   , "not find fingerprint image in dep while register.");
 			ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER);
-		}else if(bFeatureIsNull){
-			LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER, "fingerprint feature is null while register.");
+		}
+		else if (pScanParam->m_FeatureIsNull) 
+		{
+			LogError(Severity_High, Error_Hardware
+				   , LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER
+				   , "fingerprint feature is null while register.");
 			ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER);
-		}else{
-			if(ctx->Req.times == 3 && !bGetTemplateSuc){
-				LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED, "Not generate template correctly.");
+		}else {
+			if (ctx->Req.times == 3 && !pScanParam->m_GetTemplateSuc)
+			{
+				LogError(Severity_High, Error_Hardware
+					   , LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED
+					   , "Not generate template correctly.");
 				ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED);
-			}
-			if(bExit){
-				LogWarn(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_REGISTER_FAILED, "Exit to homepage when register.");
+			}else if (pScanParam->m_Quit) {
+				LogWarn(Severity_High, Error_Hardware
+					   , LOG_ERR_FINGERPRINT_REGISTER_FAILED
+					   , "Exit to homepage when register.");
 				ctx->Answer(Error_Unexpect);
 			}
 		}
 	}
-	delete[] lpbFeature;
-	lpbFeature = NULL;
-	delete[] lpbTemplate;
-	lpbTemplate = NULL;
+
+	delete[] pScanParam->m_Feature;
+	pScanParam->m_Feature = NULL;
+	delete[] pScanParam->m_Template;
+	pScanParam->m_Template = NULL;
+	delete pScanParam;
+	pScanParam = NULL;
+}
+
+int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
+{
+	LOG_FUNCTION();
+	
+	ScanParam* pScanParam = new ScanParam();
+	ErrorCodeEnum errCode = InitParamBeforeScan(pScanParam, ctx->Req.times);
+
+	if (errCode != Error_Succeed)
+		ctx->Answer(errCode);
+	else {
+		ScanProcess(pScanParam, ctx);
+		if (pScanParam != NULL && ctx != NULL)
+			ProcessAfterScan(pScanParam, ctx);
+		else
+			ctx->Answer(Error_Param);
+	}
+
 	return 0;
 }
 
@@ -447,20 +514,18 @@ ErrorCodeEnum CFingerPrintFSM::CheckCardSwiperStatus()
 	if(errCode != Error_Succeed)
 	{
 		Dbg("connect CardSwiper fail 0x%x(%d).", errCode, errCode);
-	}
-	else
-	{
+	}else{
 		CardSwiperService_GetDevInfo_Req req = {};
 		CardSwiperService_GetDevInfo_Ans ans = {};
-
 		errCode = pCardSwiperClient->GetDevInfo(req, ans, 3000);
+
 		if(errCode != Error_Succeed){
 			Dbg("CardSwiper::GetDevInfo() fail: 0x%x", errCode);
 		}else{
 			Dbg("CardSwiper::GetDevInfo() return state: %d", ans.state);
-			if (ans.state == DEVICE_STATUS_NOT_READY){
+			if (ans.state == DEVICE_STATUS_NOT_READY)
+			{
 				std::this_thread::sleep_for(std::chrono::milliseconds(500));
-				//Sleep(500);
 				CardSwiperService_GetDevInfo_Req req2 = {};
 				CardSwiperService_GetDevInfo_Ans ans2 = {};
 				errCode = pCardSwiperClient->GetDevInfo(req2, ans2, 3000);

+ 33 - 2
Module/mod_FingerPrint/FingerPrintFSM.h

@@ -4,9 +4,36 @@
 #include "DevFSMCommBase.hpp"
 #include "FingerPrintClass.h"
 #include "CardSwiper_client_g.h"
+#include <ctime>
 
 using namespace CardSwiper;
 
+#define FINGERPRINT_SCAN_TIMEOUT 15000 * 1000	//us
+#define FINGERPRINT_SCAN_INTERNAL 100			//ms
+#define FINGERPRINT_MATCH_TIMEOUT 15000 * 1000	//us
+#define MAX_FEATURE_LEN 1024
+
+struct ScanParam
+{
+	CSimpleStringA m_DepPath;
+	CSimpleStringA m_FullFilePath;
+	CSimpleStringA m_BmpFileName;
+
+	clock_t m_TimeStart;
+	clock_t m_TimeEnd;
+	DWORD m_TimeLeft;
+
+	LPBYTE m_Feature;
+	LPBYTE m_Template;
+	int m_FeatureLen;
+
+	bool m_ScanSuc;
+	bool m_GetTemplateSuc;
+	bool m_NotFindImage;
+	bool m_FeatureIsNull;
+	bool m_Quit;
+};
+
 enum EvtType
 {
 	USER_EVT_TEST = EVT_USER + 1,
@@ -171,16 +198,20 @@ public:
 	ErrorCodeEnum DoGetDevInfo();
 	ErrorCodeEnum QueryRootConfigObj(CSmartPointer<IConfigInfo> &spConfig);
 	bool IsFWBDevice();
+	ErrorCodeEnum InitParamBeforeScan(ScanParam *initParam, int scanTime);
+	void ScanProcess(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer &ctx);
+	void ProcessAfterScan(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx);
 
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
 
 private:
 	DevAdptLibHelper<FingerPrintClass> *m_DevAdptLibHelper;
-	lpCreateDevCom CreateDevComponent;
-	lpReleaseDevCom ReleaseDevComponent;
 	ErrorCodeEnum m_testResult;
 	DevCategoryInfo m_devCatInfo;
 	DevStateEnum m_devState;
+	CSimpleStringA m_BmpFileFullPath1;
+	CSimpleStringA m_BmpFileFullPath2;
+	CSimpleStringA m_BmpFileFullPath3;
 	bool m_bCancelRegister;
 	bool m_bCancelMatch;
 	bool m_devInit;