FingerPrintFSM.cpp 30 KB

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