FingerPrintFSM.cpp 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  1. #include "FingerPrintFSM.h"
  2. #include "EventCode.h"
  3. #include "FingerPrint_UserErrorCode.h"
  4. #include "GetDevInfoHelper.h"
  5. #include <cstdio>
  6. #include <thread>
  7. #include <chrono>
  8. #include <fstream>
  9. #ifdef RVC_OS_LINUX
  10. #include <sys/stat.h>
  11. #include <unistd.h>
  12. #endif // RVC_OS_LIUNX
  13. using namespace SP::Module::Comm;
  14. #define FINGERPRINT_SCAN_TIMEOUT 15000
  15. #define FINGERPRINT_SCAN_INTERNAL 100
  16. #define FINGERPRINT_MATCH_TIMEOUT 15000
  17. #define MAX_FEATURE_LEN 1024
  18. #pragma region event response
  19. void CFingerPrintFSM::s0_on_entry()
  20. {
  21. LOG_FUNCTION();
  22. m_devState = DEVICE_STATUS_NORMAL;
  23. }
  24. void CFingerPrintFSM::s0_on_exit()
  25. {
  26. LOG_FUNCTION();
  27. }
  28. unsigned int CFingerPrintFSM::s0_on_event(FSMEvent* e)
  29. {
  30. LOG_FUNCTION();
  31. Dbg("s0 evt %d", e->iEvt);
  32. switch (e->iEvt)
  33. {
  34. case USER_EVT_ERROR:
  35. {
  36. e->SetHandled();
  37. break;
  38. }
  39. case USER_EVT_QUIT:
  40. {
  41. e->SetHandled();
  42. break;
  43. }
  44. case USER_EVT_SCAN:
  45. {
  46. e->SetHandled();
  47. ScanEvent* pScanEvt = dynamic_cast<ScanEvent*>(e);
  48. ScanTask* pScanTask = new ScanTask(this);
  49. pScanTask->ctx = pScanEvt->ctx;
  50. GetEntityBase()->GetFunction()->PostThreadPoolTask(pScanTask);
  51. break;
  52. }
  53. case USER_EVT_CANCEL_SCAN:
  54. {
  55. e->SetHandled();
  56. m_bCancelRegister = true;
  57. break;
  58. }
  59. case USER_EVT_MATCH:
  60. {
  61. e->SetHandled();
  62. MatchEvent* pMatchEvt = dynamic_cast<MatchEvent*>(e);
  63. MatchTask* pMatchTask = new MatchTask(this);
  64. pMatchTask->ctx = pMatchEvt->ctx;
  65. GetEntityBase()->GetFunction()->PostThreadPoolTask(pMatchTask);
  66. break;
  67. }
  68. default:
  69. break;
  70. }
  71. return 0;
  72. }
  73. void CFingerPrintFSM::s1_on_entry()
  74. {
  75. LOG_FUNCTION();
  76. }
  77. void CFingerPrintFSM::s1_on_exit()
  78. {
  79. LOG_FUNCTION();
  80. }
  81. unsigned int CFingerPrintFSM::s1_on_event(FSMEvent* e)
  82. {
  83. LOG_FUNCTION();
  84. Dbg("s1 evt(%d)", e->iEvt);
  85. int ret = 0;
  86. switch (e->iEvt)
  87. {
  88. case USER_EVT_SCAN_FINISHED:
  89. e->SetHandled();
  90. ret = e->param1;
  91. break;
  92. case USER_EVT_CANCEL_SCAN:
  93. e->SetHandled();
  94. m_bCancelRegister = true;
  95. break;
  96. case USER_EVT_EXIT:
  97. e->SetHandled();
  98. m_bExit = true;
  99. break;
  100. case USER_EVT_QUIT:
  101. e->SetHandled();
  102. break;
  103. default:
  104. break;
  105. }
  106. return ret;
  107. }
  108. void CFingerPrintFSM::s2_on_entry()
  109. {
  110. LOG_FUNCTION();
  111. m_devState = DEVICE_STATUS_FAULT;
  112. m_testResult = Error_InvalidState;
  113. }
  114. void CFingerPrintFSM::s2_on_exit()
  115. {
  116. LOG_FUNCTION();
  117. }
  118. unsigned int CFingerPrintFSM::s2_on_event(FSMEvent* e)
  119. {
  120. LOG_FUNCTION();
  121. if (e->iEvt == USER_EVT_QUIT)
  122. {
  123. e->SetHandled();
  124. }
  125. return 0;
  126. }
  127. void CFingerPrintFSM::s3_on_entry()
  128. {
  129. LOG_FUNCTION();
  130. }
  131. void CFingerPrintFSM::s3_on_exit()
  132. {
  133. LOG_FUNCTION();
  134. }
  135. unsigned CFingerPrintFSM::s3_on_event(FSMEvent* e)
  136. {
  137. LOG_FUNCTION();
  138. Dbg("s3 evt %d,%d", e->iEvt, e->param1);
  139. switch (e->iEvt)
  140. {
  141. case USER_EVT_MATCH_FINISHED:
  142. {
  143. e->SetHandled();
  144. MatchFinishedEvent* matchFinishEvt = dynamic_cast<MatchFinishedEvent*>(e);
  145. if (matchFinishEvt->param1 == 0)
  146. matchFinishEvt->ctx->Answer(Error_Succeed);
  147. else
  148. matchFinishEvt->ctx->Answer((ErrorCodeEnum)matchFinishEvt->param1);
  149. break;
  150. }
  151. case USER_EVT_CANCEL_MATCH:
  152. {
  153. e->SetHandled();
  154. m_bCancelMatch = true;
  155. break;
  156. }
  157. case USER_EVT_EXIT:
  158. {
  159. e->SetHandled();
  160. m_bExit = true;
  161. break;
  162. }
  163. case USER_EVT_QUIT:
  164. {
  165. e->SetHandled();
  166. break;
  167. }
  168. default:
  169. break;
  170. }
  171. return 0;
  172. }
  173. #pragma endregion
  174. #pragma region entity init
  175. ErrorCodeEnum CFingerPrintFSM::OnInit()
  176. {
  177. LOG_FUNCTION();
  178. ErrorCodeEnum errDev;
  179. CSimpleStringA strLibFullPath(true);
  180. errDev = ExtractVendorLib(strLibFullPath);
  181. if (errDev != Error_Succeed)
  182. return errDev;
  183. CSmartPointer<IConfigInfo> spConfig;
  184. errDev = QueryRootConfigObj(spConfig);
  185. if (Error_Succeed != errDev)
  186. return errDev;
  187. if (strLibFullPath.IsEndWith("FingerPrint.dll")
  188. || strLibFullPath.IsEndWith("libFingerPrint.so"))
  189. {
  190. Dbg("No config in root.ini for FingerPrint.");
  191. GetVendorLibName(spConfig, strLibFullPath);
  192. }
  193. Dbg("vendorlib name: %s", strLibFullPath.GetData());
  194. if(!ExistsFile(strLibFullPath))
  195. {
  196. Dbg("No vendor fingerprint adapter in dep.");
  197. m_devInit = false;
  198. return Error_Succeed;
  199. }
  200. errDev = m_hDevHelper.LoadUp(strLibFullPath);
  201. if (Error_Succeed != errDev)
  202. {
  203. Dbg("load vendorlib or create DevAdapterObject failed.");
  204. return Error_DevLoadFileFailed;
  205. }
  206. errDev = DoDevOpen(spConfig);
  207. if (Error_Succeed != errDev)
  208. return errDev;
  209. return DoGetDevInfo();
  210. }
  211. ErrorCodeEnum CFingerPrintFSM::ExtractVendorLib(CSimpleStringA& strLibFullPath)
  212. {
  213. ErrorCodeEnum errCode = Error_Succeed;
  214. CDevAdptEntityBase* pEntity = GET_DEV_ENTITY_BASE_POINTER();
  215. errCode = pEntity->ExtractVendorLibFullPath(strLibFullPath);
  216. Dbg("Extract Vendor lib name: %s", strLibFullPath.GetData());
  217. if (errCode != Error_Succeed)
  218. {
  219. Dbg("Get vendor libname(%s) failed.", strLibFullPath.GetData());
  220. LogError(Severity_High, Error_DevLoadFileFailed
  221. , LOG_ERR_FINGERPRINT_GET_DLLNAME_FAILED_ONINIT
  222. , "get dllname failed while init");
  223. errCode = Error_DevLoadFileFailed;
  224. }
  225. return errCode;
  226. }
  227. ErrorCodeEnum CFingerPrintFSM::QueryRootConfigObj(CSmartPointer<IConfigInfo>& spConfig)
  228. {
  229. ErrorCodeEnum errDev = Error_Succeed;
  230. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  231. errDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
  232. if (errDev != Error_Succeed)
  233. {
  234. Dbg("open cfg file failed!");
  235. LogError(Severity_High, Error_DevLoadFileFailed
  236. , LOG_ERR_FINGERPRINT_OPEN_ROOT_FAILED_ONINIT
  237. , "get root config file pointer failed while init");
  238. }
  239. return errDev;
  240. }
  241. ErrorCodeEnum CFingerPrintFSM::DoDevOpen(CSmartPointer<IConfigInfo> spConfig)
  242. {
  243. ErrorCodeEnum errDev = Error_Succeed;
  244. do
  245. {
  246. int tmpPort = 0;
  247. int baudrate = 0;
  248. CSimpleStringA tmpVendor(true);
  249. spConfig->ReadConfigValueInt("Device.FingerPrint", "Port", tmpPort);
  250. spConfig->ReadConfigValueInt("Device.FingerPrint", "Baudrate", baudrate);
  251. Dbg("port: %d, baudrate: %d", tmpPort, baudrate);
  252. if (IsFWBDevice(tmpVendor))
  253. {
  254. errDev = CheckCardSwiperStatus();
  255. if (Error_Succeed != errDev)
  256. {
  257. Dbg("this is FWB, device status is not normal now.(%s)", SpStrError(errDev));
  258. errDev = Error_DevCommFailed;
  259. break;
  260. }
  261. else {
  262. Dbg("this is FWB, device status is normal now.");
  263. }
  264. }
  265. errDev = m_hDevHelper->DevOpen(tmpPort, baudrate);
  266. if (errDev != Error_Succeed)
  267. {
  268. WORD devErrCode = errDev;
  269. CSimpleStringA errMsg = "";
  270. GetAndSplitDevErrInfo(errMsg, devErrCode, "DevOpen"); //TODO: devErrCode???
  271. LogError(Severity_High, Error_Hardware
  272. , LOG_ERR_FINGERPRINT_OPEN_FAILED
  273. , "Fingerprint init(DevOpen) failed.");
  274. errDev = Error_DevCommFailed;
  275. }
  276. } while (0);
  277. return errDev;
  278. }
  279. ErrorCodeEnum CFingerPrintFSM::DoGetDevInfo()
  280. {
  281. ErrorCodeEnum errDev = Error_Succeed;
  282. ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN);
  283. ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN);
  284. ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN);
  285. errDev = m_hDevHelper->GetDevCategory(m_devCatInfo);
  286. if (errDev == Error_Succeed)
  287. {
  288. Dbg("szModel = %s", m_devCatInfo.szModel);
  289. Dbg("szType = %s", m_devCatInfo.szType);
  290. Dbg("szVendor = %s", m_devCatInfo.szVendor);
  291. m_devInit = true;
  292. errDev = Error_Succeed;
  293. }
  294. else {
  295. LogError(Severity_High, Error_Hardware
  296. , LOG_ERR_FINGERPRINT_GETDEVINFO_FAILED
  297. , "Get device info(GetDevCategory) failed.");
  298. errDev = Error_DevCommFailed;
  299. }
  300. return errDev;
  301. }
  302. void CFingerPrintFSM::GetVendorLibName(CSmartPointer<IConfigInfo> spConfig
  303. , CSimpleString& dllName)
  304. {
  305. CSimpleString machineVersion(true);
  306. CSimpleString machineType(true);
  307. CSimpleStringA strVendor(true);
  308. CSimpleStringA strVersion(true);
  309. CSimpleStringA strBatch(true);
  310. TerminalMachineInfo terminalInfo = GetTerminalMachineInfo(GetEntityBase());
  311. machineType = Type2Str(terminalInfo.type);
  312. machineVersion = CSimpleStringA::Format("%d.%d", terminalInfo.gen.major, terminalInfo.gen.minor);
  313. spConfig->ReadConfigValue("Device.PinPad", "Vendor", strVendor);
  314. spConfig->ReadConfigValue("Device.PinPad", "Version", strVersion);
  315. spConfig->ReadConfigValue("Device.PinPad", "Batch", strBatch);
  316. if (strVendor.IsNullOrEmpty() || strVersion.IsNullOrEmpty() || strBatch.IsNullOrEmpty())
  317. {
  318. Dbg("Some related node is not set, cannot continue.");
  319. return;
  320. }
  321. strBatch = "1";
  322. if (!strVendor.Compare("Hyosung", true))
  323. {
  324. strVersion = "1";
  325. }
  326. else {
  327. switch (terminalInfo.type)
  328. {
  329. case RVC_Stand2S:
  330. strVersion = "7";
  331. break;
  332. case RVC_PAD:
  333. if (IsFWBDevice(strVendor))
  334. strVersion = "8";
  335. else
  336. strVersion = "1";
  337. break;
  338. case RVC_Desk2S:
  339. strVersion = "4";
  340. strBatch = machineVersion.Compare("1.0") ? "20" : strBatch;
  341. break;
  342. case RVC_Desk1S:
  343. if (!machineVersion.Compare("1.0"))
  344. {
  345. strVersion = "4";
  346. strBatch = "20";
  347. }
  348. break;
  349. case RVC_CardStore:
  350. strVersion = "5";
  351. break;
  352. default:
  353. strVersion = "1";
  354. break;
  355. }
  356. }
  357. CSimpleStringA newFileName(GetEntityBase()->GetEntityName());
  358. CSimpleStringA tmpFileName = newFileName +
  359. "." + strVendor +
  360. "." + strVersion +
  361. "." + strBatch;
  362. CSimpleStringA libPrefix("lib");
  363. #ifdef RVC_OS_WIN
  364. newFileName = tmpFileName + ".dll";
  365. #else
  366. newFileName = libPrefix + tmpFileName + ".so";
  367. #endif // RVC_OS_WIN
  368. CSimpleStringA strDepPath;
  369. GetEntityBase()->GetFunction()->GetPath("Dep", strDepPath);
  370. if (strDepPath.IsNullOrEmpty())
  371. {
  372. Dbg("Get Dep path failed!");
  373. }
  374. else {
  375. dllName = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  376. , strDepPath.GetData()
  377. , newFileName.GetData());
  378. }
  379. }
  380. #pragma endregion
  381. #pragma region entity exit
  382. ErrorCodeEnum CFingerPrintFSM::OnExit()
  383. {
  384. if (m_hDevHelper)
  385. {
  386. ErrorCodeEnum errCode = Error_Succeed;
  387. m_hDevHelper.TearDown();//TODO:¿¼ÂÇÀ¶ÑÀ¶àºÏÒ»DevClose£¿£¿£¿
  388. return errCode;
  389. }
  390. return Error_Succeed;
  391. }
  392. #pragma endregion
  393. void CFingerPrintFSM::SelfTest(EntityTestEnum eTestType , CSmartPointer<ITransactionContext> pTransactionContext)
  394. {
  395. //LOG_FUNCTION();
  396. pTransactionContext->SendAnswer(m_testResult);
  397. }
  398. #pragma region register
  399. int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
  400. {
  401. LOG_FUNCTION();
  402. ScanParam* pScanParam = new ScanParam();
  403. ErrorCodeEnum errCode = InitParamBeforeScan(pScanParam, ctx->Req.times);
  404. if (errCode != Error_Succeed)
  405. ctx->Answer(errCode);
  406. else {
  407. ScanProcess(pScanParam, ctx);
  408. if (pScanParam != NULL && ctx != NULL)
  409. ProcessAfterScan(pScanParam, ctx);
  410. else
  411. ctx->Answer(Error_Param);
  412. }
  413. return 0;
  414. }
  415. ErrorCodeEnum CFingerPrintFSM::InitParamBeforeScan(ScanParam* initParam, int scanTime)
  416. {
  417. ErrorCodeEnum errCode = Error_Succeed;
  418. errCode = InitCommParam(initParam, RegisterType, scanTime);
  419. if (errCode != Error_Succeed)
  420. return errCode;
  421. switch (scanTime)
  422. {
  423. case 1:
  424. initParam->m_BmpFileName = "finger1.bmp";
  425. m_BmpFileFullPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  426. , initParam->m_DepPath.GetData()
  427. , initParam->m_BmpFileName.GetData());
  428. break;
  429. case 2:
  430. initParam->m_BmpFileName = "finger2.bmp";
  431. m_BmpFileFullPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  432. , initParam->m_DepPath.GetData()
  433. , initParam->m_BmpFileName.GetData());
  434. break;
  435. case 3:
  436. initParam->m_BmpFileName = "finger3.bmp";
  437. m_BmpFileFullPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  438. , initParam->m_DepPath.GetData()
  439. , initParam->m_BmpFileName.GetData());
  440. break;
  441. default:
  442. initParam->m_BmpFileName = "finger.bmp";
  443. break;
  444. }
  445. initParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  446. , initParam->m_DepPath.GetData()
  447. , initParam->m_BmpFileName.GetData());
  448. Dbg("get imageName success: %s", initParam->m_FullFilePath.GetData());
  449. return errCode;
  450. }
  451. void CFingerPrintFSM::ScanProcess(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx)
  452. {
  453. LOG_FUNCTION();
  454. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  455. while (pScanParam->m_TimeLeft < FINGERPRINT_SCAN_TIMEOUT
  456. && !m_bCancelRegister && !pScanParam->m_ScanSuc)
  457. {
  458. if (m_bExit)
  459. {
  460. Dbg("Exit");
  461. pScanParam->m_Quit = true;
  462. break;
  463. }
  464. SLEEP(FINGERPRINT_SCAN_INTERNAL);
  465. pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
  466. ErrorCodeEnum errCode = m_hDevHelper->Image2Feature(pScanParam->m_BmpFileName
  467. , pScanParam->m_Feature
  468. , pScanParam->m_FeatureLen);
  469. if (errCode == Error_Succeed)
  470. {
  471. Dbg("Invoke routine 'Image2Feature' success.'");
  472. SLEEP(200);
  473. if (ExistsFile(pScanParam->m_FullFilePath)
  474. && pScanParam->m_Feature != NULL
  475. && pScanParam->m_FeatureLen > 0)
  476. {
  477. Dbg("fingerprint feature length is %d", pScanParam->m_FeatureLen);
  478. ctx->Ans.imageName = pScanParam->m_BmpFileName;
  479. if (ctx->Req.times == 3) {
  480. Dbg("m_strPath1 = %s", m_BmpFileFullPath1.GetData());
  481. Dbg("m_strPath2 = %s", m_BmpFileFullPath2.GetData());
  482. Dbg("m_strPath3 = %s", m_BmpFileFullPath3.GetData());
  483. errCode = m_hDevHelper->Image2Template(m_BmpFileFullPath1, m_BmpFileFullPath2
  484. , m_BmpFileFullPath3, pScanParam->m_Template
  485. , pScanParam->m_FeatureLen);
  486. if (Error_Succeed == errCode)
  487. {
  488. Dbg("Invoke routine 'Image2Template' success");
  489. if (pScanParam->m_Template != NULL && pScanParam->m_FeatureLen == 684)
  490. {
  491. ctx->Ans.feature = (CSimpleStringA)(pScanParam->m_Template);
  492. }
  493. else {
  494. Dbg("template len is: %d, or template is NULL", pScanParam->m_FeatureLen);
  495. pScanParam->m_GetTemplateSuc = false;
  496. break;
  497. }
  498. }else {
  499. pScanParam->m_GetTemplateSuc = false;
  500. DevErrorInfo devErrorInfo;
  501. m_hDevHelper->GetLastErr(devErrorInfo);
  502. Dbg("Invoke routine 'Image2Template' failed which returned %s(%s)"
  503. , SpStrError(errCode), devErrorInfo.szErrMsg);
  504. break;
  505. }
  506. }
  507. pScanParam->m_ScanSuc = true;
  508. break;
  509. }
  510. else if (!ExistsFile(pScanParam->m_FullFilePath)) {
  511. Dbg("Cannot find the fingerprint image %s", pScanParam->m_BmpFileName);
  512. pScanParam->m_NotFindImage = true;
  513. break;
  514. }
  515. else {
  516. Dbg("Fingerprint feature is NULL.");
  517. pScanParam->m_FeatureIsNull = true;
  518. break;
  519. }
  520. }
  521. else {
  522. DevErrorInfo devErrInfo;
  523. m_hDevHelper->GetLastErr(devErrInfo);
  524. Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s) while register."
  525. , SpStrError(errCode), devErrInfo.szErrMsg);
  526. }
  527. pScanParam->m_TimeEnd = RVCGetTickCount();
  528. pScanParam->m_TimeLeft = pScanParam->m_TimeEnd - pScanParam->m_TimeStart;
  529. }
  530. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning on");
  531. m_bExit = false;
  532. }
  533. void CFingerPrintFSM::ProcessAfterScan(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx)
  534. {
  535. if (pScanParam->m_ScanSuc)
  536. {
  537. ctx->Answer(Error_Succeed);
  538. }
  539. else if (pScanParam->m_TimeLeft >= FINGERPRINT_SCAN_TIMEOUT)
  540. {
  541. ctx->Answer(Error_TimeOut);
  542. }
  543. else if (m_bCancelRegister)
  544. {
  545. ctx->Answer(Error_Cancel);
  546. }
  547. else {
  548. if (pScanParam->m_NotFindImage)
  549. {
  550. LogError(Severity_High, Error_Hardware
  551. , LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER
  552. , "not find fingerprint image in dep while register.");
  553. ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER);
  554. }
  555. else if (pScanParam->m_FeatureIsNull)
  556. {
  557. LogError(Severity_High, Error_Hardware
  558. , LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER
  559. , "fingerprint feature is null while register.");
  560. ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER);
  561. }
  562. else {
  563. if (ctx->Req.times == 3 && !pScanParam->m_GetTemplateSuc)
  564. {
  565. LogError(Severity_High, Error_Hardware
  566. , LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED
  567. , "Not generate template correctly.");
  568. ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED);
  569. }
  570. else if (pScanParam->m_Quit) {
  571. LogWarn(Severity_High, Error_Hardware
  572. , LOG_ERR_FINGERPRINT_REGISTER_FAILED
  573. , "Exit to homepage when register.");
  574. ctx->Answer(Error_Unexpect);
  575. }
  576. }
  577. }
  578. delete[] pScanParam->m_Feature;
  579. pScanParam->m_Feature = NULL;
  580. delete[] pScanParam->m_Template;
  581. pScanParam->m_Template = NULL;
  582. delete pScanParam;
  583. pScanParam = NULL;
  584. }
  585. #pragma endregion
  586. #pragma region match
  587. ErrorCodeEnum CFingerPrintFSM::Match(SpReqAnsContext<FingerPrintService_Match_Req, FingerPrintService_Match_Ans>::Pointer ctx)
  588. {
  589. LOG_FUNCTION();
  590. ScanParam* initParam = new ScanParam();
  591. ErrorCodeEnum errCode = InitParamBeforeMatch(initParam, ctx->Req.templateNum);
  592. if (errCode != Error_Succeed)
  593. return errCode;
  594. ScanBeforeMatch(initParam);
  595. errCode = MatchProcess(initParam, ctx);
  596. return errCode;
  597. }
  598. ErrorCodeEnum CFingerPrintFSM::InitParamBeforeMatch(ScanParam* initParam, int templateNum)
  599. {
  600. ErrorCodeEnum errCode = Error_Succeed;
  601. errCode = InitCommParam(initParam, MatchType, 0, templateNum);
  602. if (errCode != Error_Succeed)
  603. return errCode;
  604. initParam->m_BmpFileName = "finger.bmp";
  605. initParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  606. , initParam->m_DepPath.GetData()
  607. , initParam->m_BmpFileName.GetData());
  608. Dbg("get imageName success: %s", initParam->m_FullFilePath.GetData());
  609. return Error_Succeed;
  610. }
  611. void CFingerPrintFSM::ScanBeforeMatch(ScanParam* initParam)
  612. {
  613. ErrorCodeEnum errCode = Error_Succeed;
  614. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  615. while (initParam->m_TimeLeft < FINGERPRINT_MATCH_TIMEOUT
  616. && !m_bCancelMatch && !initParam->m_ScanSuc)
  617. {
  618. if (m_bExit)
  619. {
  620. Dbg("Exit");
  621. initParam->m_Quit = true;
  622. break;
  623. }
  624. SLEEP(FINGERPRINT_SCAN_INTERNAL);
  625. initParam->m_FeatureLen = MAX_FEATURE_LEN;
  626. errCode = m_hDevHelper->Image2Feature(initParam->m_BmpFileName
  627. , initParam->m_Feature
  628. , initParam->m_FeatureLen);
  629. if (errCode == Error_Succeed)
  630. {
  631. Dbg("Invoke routine 'Image2Feature' success.");
  632. SLEEP(200);
  633. if (ExistsFile(initParam->m_FullFilePath) && initParam->m_Feature != NULL && initParam->m_FeatureLen > 0)
  634. {
  635. Dbg("fingerprint feature length is %d", initParam->m_FeatureLen);
  636. initParam->m_ScanSuc = true;
  637. break;
  638. }
  639. else if (!ExistsFile(initParam->m_FullFilePath))
  640. {
  641. Dbg("Cannot find the fingerprint image finger.bmp");
  642. initParam->m_NotFindImage = true;
  643. break;
  644. }
  645. else {
  646. Dbg("Fingerprint feature is NULL.");
  647. initParam->m_FeatureIsNull = true;
  648. break;
  649. }
  650. }
  651. else {
  652. DevErrorInfo devErrInfo;
  653. m_hDevHelper->GetLastErr(devErrInfo);
  654. Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s)"
  655. , SpStrError(errCode), devErrInfo.szErrMsg);
  656. }
  657. initParam->m_TimeEnd = RVCGetTickCount();
  658. initParam->m_TimeLeft = initParam->m_TimeEnd - initParam->m_TimeStart;
  659. }
  660. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning off");
  661. m_bExit = false;
  662. Dbg("after match, clear bmp file");
  663. DeleteBmp(BmpImage);
  664. }
  665. ErrorCodeEnum CFingerPrintFSM::MatchProcess(ScanParam* initParam, SpReqAnsContext<FingerPrintService_Match_Req, FingerPrintService_Match_Ans>::Pointer& ctx)
  666. {
  667. ErrorCodeEnum errCode = Error_Succeed;
  668. if (initParam->m_ScanSuc)
  669. {
  670. Dbg("templateNum=%d", ctx->Req.templateNum);
  671. int templateNum = ctx->Req.templateNum;
  672. LPBYTE* lpbTemplates = new LPBYTE[templateNum];
  673. int* lpbTemplateLen = new int[templateNum];
  674. for (int i = 0; i < templateNum; ++i)
  675. {
  676. lpbTemplates[i] = new BYTE[MAX_FEATURE_LEN];
  677. memset(lpbTemplates[i], 0, sizeof(lpbTemplates[i]));
  678. strcpy((char*)lpbTemplates[i], ctx->Req.templates[i]);
  679. lpbTemplateLen[i] = ctx->Req.templateLen[i];
  680. }
  681. ULLINT startMatch = RVCGetTickCount();
  682. errCode = m_hDevHelper->Match(lpbTemplates, lpbTemplateLen, templateNum,
  683. initParam->m_Feature, initParam->m_FeatureLen);
  684. ULLINT endMatch = RVCGetTickCount();
  685. int duration = endMatch - startMatch;
  686. LogWarn(Severity_High, Error_Debug, LOG_ERR_FINGERPRINT_MATCH_TIME,
  687. GenerateAlarmJson("FingerPrint", duration).GetData());
  688. if (errCode == Error_Succeed) //always true
  689. {
  690. Dbg("Invoke routine 'Match' success");
  691. ctx->Ans.result.Init(templateNum);
  692. for (int i = 0; i < templateNum; ++i)
  693. ctx->Ans.result[i] = lpbTemplateLen[i];
  694. }
  695. else {
  696. DevErrorInfo devErrInfo;
  697. m_hDevHelper->GetLastErr(devErrInfo);
  698. LogError(Severity_High, Error_Hardware
  699. , LOG_ERR_FINGERPRINT_INVOKE_MATCH_FAILED
  700. , "Invoke routine 'Match' failed.");//no this situation
  701. Dbg("Invoke routine 'Match' failed which returned %s(%s)"
  702. , SpStrError(errCode), devErrInfo.szErrMsg);
  703. errCode = Error_Unexpect;
  704. }
  705. for (int i = 0; i < templateNum; ++i)
  706. {
  707. delete[] lpbTemplates[i];
  708. lpbTemplates[i] = NULL;
  709. }
  710. delete[] lpbTemplateLen;
  711. lpbTemplateLen = NULL;
  712. delete[] lpbTemplates;
  713. lpbTemplates = NULL;
  714. }
  715. else if (initParam->m_TimeLeft >= FINGERPRINT_MATCH_TIMEOUT)
  716. {
  717. Dbg("Match timeout(Invoke vendor failed or not press finger)");
  718. errCode = Error_TimeOut;
  719. }
  720. else if (m_bCancelMatch)
  721. {
  722. errCode = Error_Cancel;
  723. }
  724. else
  725. {
  726. if (initParam->m_NotFindImage)
  727. {
  728. LogError(Severity_High, Error_Hardware
  729. , LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_MATCH
  730. , "not find fingerprint image in dep while match.");
  731. }
  732. else if (initParam->m_FeatureIsNull)
  733. {
  734. LogError(Severity_High, Error_Hardware
  735. , LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_MATCH
  736. , "fingerprint feature is null while match.");
  737. }
  738. else if (initParam->m_Quit)
  739. {
  740. LogWarn(Severity_High, Error_Hardware
  741. , LOG_ERR_FINGERPRINT_MATCH_FAILED
  742. , "Exit to homepage when match.");
  743. }
  744. errCode = Error_Unexpect;
  745. }
  746. delete[] initParam->m_Feature;
  747. initParam->m_Feature = NULL;
  748. delete initParam;
  749. initParam = NULL;
  750. return errCode;
  751. }
  752. #pragma endregion
  753. #pragma region common function
  754. ErrorCodeEnum CFingerPrintFSM::InitCommParam(ScanParam* initParam, int operateType, int scanTime, int templateNum)
  755. {
  756. ErrorCodeEnum errCode = Error_Succeed;
  757. if (!initParam)
  758. return Error_Param;
  759. if (!m_devInit)
  760. errCode = Error_NotInit; //maybe no vendor adapter
  761. if ((operateType & RegisterType) == RegisterType)
  762. {
  763. if (m_bCancelRegister) //no cancel button anymore while register
  764. {
  765. m_bCancelRegister = false;
  766. errCode = Error_Cancel;
  767. }
  768. }
  769. if ((operateType & MatchType) == MatchType && templateNum <= 0)
  770. errCode = Error_Param;
  771. if (errCode != Error_Succeed) {
  772. delete initParam;
  773. initParam = NULL;
  774. return errCode;
  775. }
  776. initParam->m_TimeStart = RVCGetTickCount();
  777. initParam->m_TimeEnd = RVCGetTickCount();
  778. initParam->m_TimeLeft = 0;
  779. initParam->m_Feature = new BYTE[MAX_FEATURE_LEN];
  780. initParam->m_FeatureLen = MAX_FEATURE_LEN;
  781. initParam->m_FullFilePath = "";
  782. initParam->m_ScanSuc = false;
  783. initParam->m_NotFindImage = false;
  784. initParam->m_FeatureIsNull = false;
  785. initParam->m_Quit = false;
  786. if (scanTime == 1)
  787. {
  788. m_BmpFileFullPath1 = "";
  789. m_BmpFileFullPath2 = "";
  790. m_BmpFileFullPath3 = "";
  791. }
  792. Dbg("before scan fingerprint, clear bmp file");
  793. DeleteBmp(BmpImage);
  794. Dbg("before scan fingerprint, finish doing clear job");
  795. if ((operateType & RegisterType) == RegisterType)
  796. {
  797. initParam->m_Template = new BYTE[MAX_FEATURE_LEN];
  798. initParam->m_GetTemplateSuc = true;
  799. m_bCancelRegister = false;
  800. memset(initParam->m_Template, 0, sizeof(initParam->m_Template));
  801. }
  802. else
  803. m_bCancelMatch = false;
  804. memset(initParam->m_Feature, 0, sizeof(initParam->m_Feature));
  805. errCode = m_pEntity->GetFunction()->GetPath("Dep", initParam->m_DepPath);
  806. if (errCode != Error_Succeed)
  807. {
  808. delete[] initParam->m_Feature;
  809. initParam->m_Feature = NULL;
  810. if ((operateType & RegisterType) == RegisterType)
  811. {
  812. delete[] initParam->m_Template;
  813. initParam->m_Template = NULL;
  814. Dbg("Get dep path failed while register.");
  815. LogError(Severity_High, Error_DevLoadFileFailed
  816. , LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_REGISTER
  817. , "Get dep path failed while register.");
  818. }
  819. else {
  820. Dbg("Get dep path failed while match.");
  821. LogError(Severity_High, Error_DevLoadFileFailed
  822. , LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_MATCH
  823. , "get dep path failed while match.");
  824. }
  825. delete initParam;
  826. initParam = NULL;
  827. return Error_Param;
  828. }
  829. return Error_Succeed;
  830. }
  831. ErrorCodeEnum CFingerPrintFSM::GetDevCatInfo(DevCategoryInfo& devInfo)
  832. {
  833. Dbg("m_devCatInfo.szModel:%s, len:%d", m_devCatInfo.szModel, strlen(m_devCatInfo.szModel));
  834. Dbg("m_devCatInfo.szType:%s, len:%d", m_devCatInfo.szModel, strlen(m_devCatInfo.szType));
  835. Dbg("m_devCatInfo.szVendor:%s, len:%d", m_devCatInfo.szModel, strlen(m_devCatInfo.szVendor));
  836. #ifdef RVC_OS_WIN
  837. strncpy_s(devInfo.szModel, MAX_DEV_MODEL_LEN, m_devCatInfo.szModel, strlen(m_devCatInfo.szModel));
  838. strncpy_s(devInfo.szType, MAX_DEV_TYPE_LEN, m_devCatInfo.szType, strlen(m_devCatInfo.szType));
  839. strncpy_s(devInfo.szVendor, MAX_DEV_VENDOR_LEN, m_devCatInfo.szVendor, strlen(m_devCatInfo.szVendor));
  840. #else
  841. strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN);
  842. strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN);
  843. strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN);
  844. #endif // RVC_OS_WIN
  845. return Error_Succeed;
  846. }
  847. CSimpleString CFingerPrintFSM::GenerateAlarmJson(CSimpleString entityName, int cost)
  848. {
  849. return CSimpleString::Format("[{\"name\":\"%s\",\"cost\":%d}]", entityName.GetData(), cost);
  850. }
  851. ErrorCodeEnum CFingerPrintFSM::GetDevState(int& state)
  852. {
  853. ErrorCodeEnum errCode;
  854. state = 0;
  855. if (!m_devInit) {
  856. return Error_Succeed;
  857. }
  858. CSimpleStringA fileName = "testFinger.bmp";
  859. LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
  860. int lpbLength = MAX_FEATURE_LEN;
  861. errCode = m_hDevHelper->Image2Feature(fileName, lpbFeature, lpbLength);
  862. if (errCode == Error_Succeed)
  863. {
  864. state = 1;
  865. DeleteBmp(TestImage);
  866. }
  867. delete[] lpbFeature;
  868. lpbFeature = NULL;
  869. return Error_Succeed;
  870. }
  871. bool CFingerPrintFSM::IsFWBDevice(CSimpleString& vendorName)
  872. {
  873. CSimpleStringA tmpDevSN("");
  874. bool isFWB = false;
  875. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  876. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  877. {
  878. Dbg("This is fwb device.");
  879. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", vendorName);
  880. isFWB = true;
  881. }
  882. return isFWB;
  883. }
  884. ErrorCodeEnum CFingerPrintFSM::CheckCardSwiperStatus()
  885. {
  886. ErrorCodeEnum errCode = Error_Unexpect;
  887. CardSwiperService_ClientBase* pCardSwiperClient = new CardSwiperService_ClientBase(this->GetEntityBase());
  888. errCode = pCardSwiperClient->Connect();
  889. if (errCode != Error_Succeed)
  890. {
  891. Dbg("connect CardSwiper fail %s.", SpStrError(errCode));
  892. }
  893. else {
  894. CardSwiperService_GetDevInfo_Req req = {};
  895. CardSwiperService_GetDevInfo_Ans ans = {};
  896. errCode = pCardSwiperClient->GetDevInfo(req, ans, 3000);
  897. if (errCode != Error_Succeed)
  898. {
  899. Dbg("CardSwiper::GetDevInfo() fail: 0x%x", errCode);
  900. }
  901. else {
  902. Dbg("CardSwiper::GetDevInfo() return state: %d", ans.state);
  903. if (ans.state == DEVICE_STATUS_NOT_READY)
  904. {
  905. SLEEP(500);
  906. CardSwiperService_GetDevInfo_Req req2 = {};
  907. CardSwiperService_GetDevInfo_Ans ans2 = {};
  908. errCode = pCardSwiperClient->GetDevInfo(req2, ans2, 3000);
  909. if (errCode != Error_Succeed)
  910. {
  911. Dbg("CardSwiper::GetDevInfo() again fail with err(%s)", SpStrError(errCode));
  912. }
  913. else {
  914. Dbg("CardSwiper::GetDevInfo() again return state: %d", ans2.state);
  915. if (ans2.state != DEVICE_STATUS_NORMAL)
  916. errCode = Error_DevNotAvailable;
  917. }
  918. }
  919. else if (ans.state != DEVICE_STATUS_NORMAL)
  920. errCode = Error_DevNotAvailable;
  921. }
  922. pCardSwiperClient->GetFunction()->CloseSession();
  923. }
  924. if (pCardSwiperClient != NULL)
  925. {
  926. pCardSwiperClient->SafeDelete();
  927. pCardSwiperClient = NULL;
  928. }
  929. return errCode;
  930. }
  931. void CFingerPrintFSM::DeleteBmp(int type)
  932. {
  933. if ((type & BmpImage) == BmpImage)
  934. {
  935. Dbg("to delete fingerprint images...");
  936. DeleteFileIfExisted("finger.bmp");
  937. DeleteFileIfExisted("finger1.bmp");
  938. DeleteFileIfExisted("finger2.bmp");
  939. DeleteFileIfExisted("finger3.bmp");
  940. }
  941. if ((type & TestImage) == TestImage)
  942. {
  943. DeleteFileIfExisted("testFinger.bmp");
  944. }
  945. }
  946. ErrorCodeEnum CFingerPrintFSM::DeleteFileIfExisted(const char* fileName)
  947. {
  948. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  949. {
  950. Dbg("Invalid or empty filename(%s)", fileName);
  951. return Error_Param;
  952. }
  953. CSimpleStringA strPath, strObjPath;
  954. ErrorCodeEnum errCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  955. strObjPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  956. , strPath.GetData(), fileName);
  957. if (ExistsFileA(strObjPath))
  958. {
  959. if (RemoveFileA(strObjPath))
  960. {
  961. Dbg("DeleteFile(%s) success.", strObjPath.GetData());
  962. return Error_Succeed;
  963. }
  964. else {
  965. Dbg("DeleteFile(%s) failed LastError(%s).", strObjPath.GetData(), GetLastError());
  966. return Error_Unexpect;
  967. }
  968. }
  969. else {
  970. Dbg("file %s not exist.", fileName);
  971. return Error_Succeed;
  972. }
  973. }
  974. #pragma endregion