FingerPrintFSM.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. #include "FingerPrintFSM.h"
  2. #include "EventCode.h"
  3. #include "FingerPrint_UserErrorCode.h"
  4. #include "GetDevInfoHelper.h"
  5. #include "path.h"
  6. #include "DevEntityCommBase.hpp"
  7. #define FINGERPRINT_SCAN_TIMEOUT 15000
  8. #define FINGERPRINT_SCAN_INTERNAL 100
  9. #define FINGERPRINT_MATCH_TIMEOUT 15000
  10. #define MAX_FEATURE_LEN 1024
  11. #define FINGERPRINT_INIT_COUNT 3
  12. void CFingerPrintFSM::s0_on_entry()
  13. {
  14. LOG_FUNCTION();
  15. m_devState = DEVICE_STATUS_NORMAL;
  16. }
  17. void CFingerPrintFSM::s0_on_exit()
  18. {
  19. LOG_FUNCTION();
  20. }
  21. unsigned int CFingerPrintFSM::s0_on_event(FSMEvent* e)
  22. {
  23. LOG_FUNCTION();
  24. Dbg("s0 evt %d", e->iEvt);
  25. switch(e->iEvt)
  26. {
  27. case USER_EVT_ERROR:
  28. {
  29. e->SetHandled();
  30. Dbg("s0 on event error");
  31. }
  32. break;
  33. case USER_EVT_QUIT:
  34. {
  35. e->SetHandled();
  36. Dbg("s0 on event quit");
  37. }
  38. break;
  39. case USER_EVT_SCAN:
  40. {
  41. e->SetHandled();
  42. ScanEvent* pSe = dynamic_cast<ScanEvent*>(e);
  43. ScanTask* pSt = new ScanTask(this);
  44. pSt->ctx = pSe->ctx;
  45. GetEntityBase()->GetFunction()->PostThreadPoolTask(pSt);
  46. }
  47. break;
  48. case USER_EVT_CANCEL_SCAN:
  49. {
  50. e->SetHandled();
  51. Dbg("s0 set cancel flag!");
  52. m_bCancelRegister = true;
  53. break;
  54. }
  55. case USER_EVT_MATCH:
  56. {
  57. e->SetHandled();
  58. MatchEvent* pMe = dynamic_cast<MatchEvent*>(e);
  59. MatchTask* pMt = new MatchTask(this);
  60. pMt->ctx = pMe->ctx;
  61. GetEntityBase()->GetFunction()->PostThreadPoolTask(pMt);
  62. }
  63. break;
  64. default:
  65. break;
  66. }
  67. return 0;
  68. }
  69. void CFingerPrintFSM::s1_on_entry()
  70. {
  71. LOG_FUNCTION();
  72. }
  73. void CFingerPrintFSM::s1_on_exit()
  74. {
  75. LOG_FUNCTION();
  76. }
  77. unsigned int CFingerPrintFSM::s1_on_event(FSMEvent* e)
  78. {
  79. LOG_FUNCTION();
  80. Dbg("s1 evt(%d)", e->iEvt);
  81. int ret = 0;
  82. switch(e->iEvt)
  83. {
  84. case USER_EVT_SCAN_FINISHED:
  85. e->SetHandled();
  86. ret = e->param1;
  87. break;
  88. case USER_EVT_CANCEL_SCAN:
  89. e->SetHandled();
  90. Dbg("Set cancel scan flag");
  91. m_bCancelRegister = true;
  92. break;
  93. case USER_EVT_EXIT:
  94. e->SetHandled();
  95. m_bExit = true;
  96. break;
  97. case USER_EVT_QUIT:
  98. e->SetHandled();
  99. break;
  100. default:
  101. break;
  102. }
  103. return ret;
  104. }
  105. void CFingerPrintFSM::s2_on_entry()
  106. {
  107. LOG_FUNCTION();
  108. Dbg("FingerPrint failed.");
  109. m_devState = DEVICE_STATUS_FAULT;
  110. m_testResult = Error_InvalidState;
  111. }
  112. void CFingerPrintFSM::s2_on_exit()
  113. {
  114. LOG_FUNCTION();
  115. }
  116. unsigned int CFingerPrintFSM::s2_on_event(FSMEvent* e)
  117. {
  118. LOG_FUNCTION();
  119. if (e->iEvt == USER_EVT_QUIT)
  120. {
  121. e->SetHandled();
  122. }
  123. return 0;
  124. }
  125. void CFingerPrintFSM::s3_on_entry()
  126. {
  127. LOG_FUNCTION();
  128. }
  129. void CFingerPrintFSM::s3_on_exit()
  130. {
  131. LOG_FUNCTION();
  132. }
  133. unsigned CFingerPrintFSM::s3_on_event(FSMEvent* e)
  134. {
  135. LOG_FUNCTION();
  136. Dbg("s3 evt %d,%d", e->iEvt, e->param1);
  137. int ret = 0;
  138. switch(e->iEvt)
  139. {
  140. case USER_EVT_MATCH_FINISHED:
  141. {
  142. e->SetHandled();
  143. MatchFinishedEvent* mfe = dynamic_cast<MatchFinishedEvent*>(e);
  144. if (mfe->param1 == 0)
  145. mfe->ctx->Answer(Error_Succeed);
  146. else
  147. mfe->ctx->Answer((ErrorCodeEnum)mfe->param1);
  148. }
  149. break;
  150. case USER_EVT_CANCEL_MATCH:
  151. e->SetHandled();
  152. Dbg("Set cancel match flag");
  153. m_bCancelMatch = true;
  154. case USER_EVT_EXIT:
  155. e->SetHandled();
  156. m_bExit = true;
  157. break;
  158. case USER_EVT_QUIT:
  159. e->SetHandled();
  160. break;
  161. default:
  162. break;
  163. }
  164. return 0;
  165. }
  166. ErrorCodeEnum CFingerPrintFSM::OnInit()
  167. {
  168. CSystemStaticInfo sysInfo;
  169. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  170. m_csMachineType = sysInfo.strMachineType;
  171. WORD majorVersion = sysInfo.MachineVersion.GetMajor();
  172. WORD minorVersion = sysInfo.MachineVersion.GetMinor();
  173. CSimpleStringA machineVersion = CSimpleStringA::Format("%d.%d", majorVersion, minorVersion);
  174. m_terminalNo = sysInfo.strTerminalID;
  175. Dbg("MachineType:%s, terminalNo: %s", (const char*)m_csMachineType, (const char*)m_terminalNo);
  176. //TODO:device init
  177. int initCount = 0;
  178. ErrorCodeEnum err;
  179. m_pFingerPrint = NULL;
  180. bool bCreateDevCom = false;
  181. CSimpleStringA dllName;
  182. CDevAdptEntityBase *pEntity = GET_DEV_ENTITY_BASE_POINTER();
  183. ErrorCodeEnum errDev = pEntity->ExtractVendorLibFullPath(dllName);
  184. Dbg("Extract Vendor lib name: %s", (const char*)dllName);
  185. if (errDev != Error_Succeed)
  186. {
  187. Dbg("Get vendor dll(%s) name failed.", (const char*)dllName);
  188. LogError(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_GET_DLLNAME_FAILED_ONINIT, "get dllname failed while init");
  189. return Error_DevLoadFileFailed;
  190. }
  191. //判断是否是蓝牙多合一
  192. CSimpleStringA tmpDevSN("");
  193. bool isFWB = false;
  194. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  195. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  196. {
  197. Dbg("This is fwb device.");
  198. isFWB = true;
  199. }
  200. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  201. CSmartPointer<IConfigInfo> spConfig;
  202. errDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
  203. if (errDev != Error_Succeed)
  204. {
  205. Dbg("open cfg file failed!");
  206. LogError(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_OPEN_ROOT_FAILED_ONINIT, "get dllname failed while init");
  207. return errDev;
  208. }
  209. Dbg("Load library: %s", (const char*)dllName);
  210. m_hVendordDll = LoadLibrary(dllName);
  211. DWORD lastError = GetLastError();
  212. BOOL triedFlag = FALSE;
  213. if (m_hVendordDll == NULL)
  214. {
  215. //SetLastError(lastError);
  216. Dbg("load vendor dll failed first time: %d.", lastError);
  217. if(lastError == 126 && dllName.IsEndWith("FingerPrint.dll", true)) {
  218. Dbg("Not config the vendor at root.ini");
  219. CSimpleStringA strVendor(true);
  220. CSimpleStringA strVersion(true);
  221. CSimpleStringA strBatch(true);
  222. spConfig->ReadConfigValue("Device.PinPad", "Vendor", strVendor);
  223. spConfig->ReadConfigValue("Device.PinPad", "Version", strVersion);
  224. spConfig->ReadConfigValue("Device.PinPad", "Batch", strBatch);
  225. if(strVendor.IsNullOrEmpty() || strVersion.IsNullOrEmpty() || strBatch.IsNullOrEmpty()) {
  226. Dbg("Some related node is not set, cannot continue.");
  227. } else {
  228. strBatch = "1";
  229. if(!strVendor.Compare("Hyosung", true)) {
  230. strVersion = "1";
  231. } else {
  232. if(!m_csMachineType.Compare("RVC.Stand2S", true)) {
  233. strVersion = "7";
  234. //TODO: Support new or old edition machine.
  235. } else if(!m_csMachineType.Compare("RVC.PAD", true)) {
  236. if (isFWB){//蓝牙多合一
  237. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", strVendor);
  238. strVersion = "8";
  239. }else{
  240. strVersion = "1";
  241. }
  242. } else if(!m_csMachineType.Compare("RVC.Desk2S", true)) {
  243. strVersion = "4";
  244. if(machineVersion.Compare("1.0", true)){//低柜一体机(贵宾理财2.0&非贵宾理财2.1)
  245. strBatch = "20";
  246. }
  247. } else if (!m_csMachineType.Compare("RVC.Desk1S", true) && !machineVersion.Compare("1.0", true)){//低柜一体机(厅堂自助)
  248. strVersion = "4";
  249. strBatch = "20";
  250. }else{//eg:CardStore
  251. strVersion = "1";
  252. }
  253. }
  254. CSimpleStringA newFileName(GetEntityBase()->GetEntityName());
  255. newFileName += ".";
  256. newFileName += strVendor;
  257. newFileName += ".";
  258. newFileName += strVersion;
  259. newFileName += ".";
  260. newFileName += strBatch;
  261. newFileName += ".dll";
  262. CSimpleStringA strDepPath;
  263. GetEntityBase()->GetFunction()->GetPath("Dep", strDepPath);
  264. if(strDepPath.IsNullOrEmpty()) {
  265. Dbg("Get Dep path failed!");
  266. } else {
  267. CSimpleStringA fullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strDepPath, (const char*)newFileName);
  268. triedFlag = TRUE;
  269. dllName = fullFilePath;
  270. Dbg("Load library again: %s", (LPCTSTR)dllName);
  271. m_hVendordDll = LoadLibrary(dllName);
  272. if(m_hVendordDll != NULL) {
  273. lastError = GetLastError();
  274. }
  275. }
  276. }
  277. }
  278. }
  279. if (m_hVendordDll == NULL)
  280. {
  281. Dbg("load vendor dll failed(%d).", lastError);
  282. if(lastError != 126 || (!dllName.IsEndWith("FingerPrint.dll", true) && !triedFlag)) {
  283. BOOL fExisted = TRUE;
  284. if(lastError == 126) {
  285. const auto dwRet = GetFileAttributesA((LPCTSTR)dllName);
  286. fExisted = ((dwRet != INVALID_FILE_ATTRIBUTES)
  287. && !(dwRet & FILE_ATTRIBUTE_DIRECTORY));
  288. }
  289. if(!fExisted) {
  290. LogWarn(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_VENDOR_ADAPTER_NOT_EXIST,
  291. CSimpleStringA::Format("library file: %s is not existed!", (LPCTSTR)dllName));
  292. } else {
  293. LogError(Severity_High, Error_NotInit, LOG_ERR_FINGERPRINT_LOAD_ADAPTER_FAILED,
  294. CSimpleStringA::Format("Load library file: %s failed, GLE=%d", (LPCTSTR)dllName, lastError));
  295. }
  296. return Error_DevLoadFileFailed;
  297. }
  298. m_devInit = false;
  299. m_pFingerPrint = NULL;
  300. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_LOADFILE_FAILED,
  301. CSimpleStringA::Format("Load library file: %s failed, GLE=%d", (LPCTSTR)dllName, lastError));
  302. Dbg("Not config, Allow this condition happend.");
  303. return Error_Succeed;
  304. }
  305. if ((CreateDevComponent = (lpCreateDevCom)GetProcAddress(m_hVendordDll, "CreateDevComponent")) == NULL)
  306. {
  307. Dbg("Get CreateDevComponent failed(%d).", GetLastError());
  308. LogError(Severity_High, Error_NotInit, LOG_ERR_FINGERPRINT_CREATE_COMPONENT_FAILED, "Get CreateDevComponent failed.");
  309. return Error_DevLoadFileFailed;
  310. }
  311. if ((ReleaseDevComponent = (lpReleaseDevCom)GetProcAddress(m_hVendordDll, "ReleaseDevComponent")) == NULL)
  312. {
  313. Dbg("Get ReleaseDevComponent failed(%d).", GetLastError());
  314. }
  315. Dbg("Get function suc");
  316. bool bOpenFlag = false;
  317. do
  318. {
  319. if (!bCreateDevCom)
  320. {
  321. if (CreateDevComponent((DeviceBaseClass *&)m_pFingerPrint) != Error_Succeed)
  322. {
  323. LOG_TRACE("Create FingerPrint module failed.");
  324. initCount++;
  325. m_pFingerPrint = NULL;
  326. if (initCount >= FINGERPRINT_INIT_COUNT)
  327. break;
  328. else
  329. continue;
  330. }
  331. bCreateDevCom = true;
  332. LOG_TRACE("Create Fingerprint module succeeded.");
  333. }
  334. int tmpPort = 0;
  335. int baudrate = 0;
  336. spConfig->ReadConfigValueInt("Device.FingerPrint", "Port", tmpPort);
  337. spConfig->ReadConfigValueInt("Device.FingerPrint", "Baudrate", baudrate);
  338. Dbg("port: %d, baudrate: %d", tmpPort, baudrate);
  339. if(isFWB){
  340. if(Error_Succeed != CheckCardSwiperStatus()){
  341. Dbg("this is FWB, device status is not normal now.%d", CheckCardSwiperStatus());
  342. ReleaseDevComponent((DeviceBaseClass *&)m_pFingerPrint);
  343. return Error_DevCommFailed;
  344. }
  345. else{
  346. Dbg("this is FWB, device status is normal now.");
  347. }
  348. }
  349. err = m_pFingerPrint->DevOpen(tmpPort, baudrate);
  350. DevErrorInfo devOpenErrInfo;
  351. if (err != Error_Succeed)
  352. {
  353. LOG_TRACE("Open device failed(%d).", err);
  354. m_pFingerPrint->GetLastErr(devOpenErrInfo);
  355. Dbg("FingerPrint open failed(%s).", devOpenErrInfo.szErrMsg);
  356. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_OPEN_FAILED, "Fingerprint init(DevOpen) failed.");
  357. ReleaseDevComponent((DeviceBaseClass *&)m_pFingerPrint);
  358. return Error_DevCommFailed;
  359. }
  360. } while (m_pFingerPrint == NULL && bOpenFlag == false);
  361. ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN);
  362. ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN);
  363. ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN);
  364. err = m_pFingerPrint->GetDevCategory(m_devCatInfo);
  365. if (err == Error_Succeed)
  366. {
  367. Dbg("%d, %d, %d", strlen(m_devCatInfo.szModel), strlen(m_devCatInfo.szType), strlen(m_devCatInfo.szVendor));
  368. if (strlen(m_devCatInfo.szModel) < 256)
  369. {
  370. Dbg("szMode=%s", m_devCatInfo.szModel);
  371. }
  372. if (m_pFingerPrint != NULL)
  373. {
  374. m_devInit = true;
  375. return Error_Succeed;
  376. }
  377. else
  378. {
  379. return Error_NotInit;
  380. }
  381. }
  382. else
  383. {
  384. Dbg("Invoke vendor routine 'GetDevCategory' failed.");
  385. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETDEVINFO_FAILED, "Get device info(GetDevCategory) failed.");
  386. m_pFingerPrint->DevClose();
  387. ReleaseDevComponent((DeviceBaseClass *&)m_pFingerPrint);
  388. return Error_DevCommFailed;
  389. }
  390. }
  391. ErrorCodeEnum CFingerPrintFSM::OnExit()
  392. {
  393. ErrorCodeEnum err;
  394. CSimpleStringA tmpDevSN("");
  395. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  396. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  397. {
  398. Dbg("This is fwb device.");
  399. return Error_Succeed;
  400. }
  401. else
  402. {
  403. Dbg("This is normal device.");
  404. if (m_pFingerPrint != NULL)
  405. {
  406. err = m_pFingerPrint->DevClose();
  407. if(err != Error_Succeed)
  408. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_CLOSEDEV_FAILED, "Close device (DevClose) failed.");
  409. LOG_TRACE("OnExit hr(%d)", err);
  410. }
  411. if (m_pFingerPrint)
  412. {
  413. ReleaseDevComponent((DeviceBaseClass *&)m_pFingerPrint);
  414. m_pFingerPrint = NULL;
  415. m_devInit = false;
  416. }
  417. return Error_Succeed;
  418. }
  419. }
  420. void CFingerPrintFSM::SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  421. {
  422. //LOG_FUNCTION();
  423. pTransactionContext->SendAnswer(m_testResult);
  424. }
  425. int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
  426. {
  427. LOG_FUNCTION();
  428. if(!m_devInit) {
  429. ctx->Answer(Error_NotInit); //maybe no vendor adapter
  430. return 0;
  431. }
  432. if (m_bCancelRegister) //no cancel button anymore while register
  433. {
  434. ctx->Answer(Error_Cancel);
  435. m_bCancelRegister = false;
  436. return 0;
  437. }
  438. DWORD elapsed = 0;
  439. DWORD dwStart = GetTickCount();
  440. DWORD dwEnd = GetTickCount();
  441. ErrorCodeEnum eErr;
  442. LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
  443. LPBYTE lpbTemplate = new BYTE[MAX_FEATURE_LEN];
  444. memset(lpbFeature, 0, sizeof(lpbFeature));
  445. int lpbLength = MAX_FEATURE_LEN;
  446. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  447. if (ctx->Req.times == 1)
  448. {
  449. Dbg("Before scan fingerprint, clear bmp file");
  450. DeleteBmp(BmpImage);
  451. Dbg("Before scan fingerprint, finish doing clear job.");
  452. m_strPath1 = "";
  453. m_strPath2 = "";
  454. m_strPath3 = "";
  455. }
  456. CSimpleStringA strPath;
  457. eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  458. if(eErr != Error_Succeed)
  459. {
  460. delete[] lpbFeature;
  461. lpbFeature = NULL;
  462. delete[] lpbTemplate;
  463. lpbTemplate = NULL;
  464. Dbg("Get path failed");
  465. LogError(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_REGISTER, "Get dep path failed while register.");
  466. ctx->Answer(Error_Param);
  467. return 0;
  468. }
  469. CSimpleStringA fileName, strPath1, strPath2, strPath3;
  470. switch(ctx->Req.times)
  471. {
  472. case 1:
  473. fileName = "finger1.bmp";
  474. m_strPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
  475. break;
  476. case 2:
  477. fileName = "finger2.bmp";
  478. m_strPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
  479. break;
  480. case 3:
  481. fileName = "finger3.bmp";
  482. m_strPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
  483. break;
  484. default:
  485. fileName = "finger.bmp";
  486. break;
  487. }
  488. strPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
  489. Dbg("get imageName success: %s", strPath);
  490. bool bScanSuccess = false;
  491. m_bCancelRegister = false;
  492. bool bGetTemplateSuc = true;
  493. bool bNotFindImage = false;
  494. bool bFeatureIsNull = false;
  495. bool bExit = false;
  496. while(elapsed < FINGERPRINT_SCAN_TIMEOUT && !m_bCancelRegister && !bScanSuccess)
  497. {
  498. if (m_bExit)
  499. {
  500. Dbg("Exit");
  501. bExit = true;
  502. break;
  503. }
  504. Sleep(FINGERPRINT_SCAN_INTERNAL);
  505. eErr = m_pFingerPrint->Image2Feature(fileName, lpbFeature, lpbLength);
  506. if (eErr == Error_Succeed){
  507. Dbg("Invoke routine 'Image2Feature' success.'");
  508. WIN32_FIND_DATA findData;
  509. Sleep(200);//save image may be delayed some time, not must happen
  510. if (FindFirstFileA((LPCTSTR)strPath, &findData) != INVALID_HANDLE_VALUE && lpbFeature != NULL && lpbLength > 0){
  511. Dbg("fingerprint feature length is %d", lpbLength);
  512. ctx->Ans.imageName = fileName;
  513. if (ctx->Req.times == 3){
  514. //第三次需要合成模板
  515. Dbg("m_strPath1 = %s", m_strPath1.GetData());
  516. Dbg("m_strPath2 = %s", m_strPath2.GetData());
  517. Dbg("m_strPath3 = %s", m_strPath3.GetData());
  518. eErr = m_pFingerPrint->Image2Template(m_strPath1, m_strPath2, m_strPath3, lpbTemplate, lpbLength);
  519. if (eErr == Error_Succeed){
  520. Dbg("Invoke routine 'Image2Template' success");
  521. if (lpbTemplate != NULL && lpbLength > 0){
  522. Dbg("template length is %d", lpbLength);
  523. ctx->Ans.feature = (LPCTSTR)lpbTemplate;
  524. }else{
  525. Dbg("template is NULL");
  526. bGetTemplateSuc = false;
  527. break;
  528. }
  529. }else{
  530. bGetTemplateSuc = false;
  531. DevErrorInfo devErrorInfo;
  532. m_pFingerPrint->GetLastErr(devErrorInfo);
  533. Dbg("Invoke routine 'Image2Template' failed which returned 0x%x(%s)", eErr, devErrorInfo.szErrMsg);
  534. break;
  535. }
  536. }
  537. bScanSuccess = true;
  538. break;
  539. }else if(FindFirstFileA((LPCTSTR)strPath, &findData) == INVALID_HANDLE_VALUE){
  540. Dbg("Cannot find the fingerprint image %s", fileName);
  541. bNotFindImage = true;
  542. break;
  543. }else{
  544. Dbg("Fingerprint feature is NULL.");
  545. bFeatureIsNull = true;
  546. break;
  547. }
  548. }else{
  549. DevErrorInfo devErrInfo;
  550. m_pFingerPrint->GetLastErr(devErrInfo);
  551. Dbg("Invoke routine 'Image2Feature' failed which returned 0x%x(%s) while register.", eErr, devErrInfo.szErrMsg);
  552. }
  553. dwEnd = GetTickCount();
  554. elapsed = dwEnd - dwStart;
  555. }
  556. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning on");
  557. m_bExit = false;
  558. if (bScanSuccess)
  559. ctx->Answer(Error_Succeed);
  560. else if(elapsed >= FINGERPRINT_SCAN_TIMEOUT)
  561. ctx->Answer(Error_TimeOut);
  562. else if(m_bCancelRegister)
  563. ctx->Answer(Error_Cancel);
  564. else{
  565. if(bNotFindImage){
  566. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER, "not find fingerprint image in dep while register.");
  567. ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER);
  568. }else if(bFeatureIsNull){
  569. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER, "fingerprint feature is null while register.");
  570. ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER);
  571. }else{
  572. if(ctx->Req.times == 3 && !bGetTemplateSuc){
  573. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED, "Not generate template correctly.");
  574. ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED);
  575. }
  576. if(bExit){
  577. LogWarn(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_REGISTER_FAILED, "Exit to homepage when register.");
  578. ctx->Answer(Error_Unexpect);
  579. }
  580. }
  581. }
  582. delete[] lpbFeature;
  583. lpbFeature = NULL;
  584. delete[] lpbTemplate;
  585. lpbTemplate = NULL;
  586. return 0;
  587. }
  588. ErrorCodeEnum CFingerPrintFSM::CheckCardSwiperStatus()
  589. {
  590. ErrorCodeEnum errCode = Error_Unexpect;
  591. CardSwiperService_ClientBase *pCardSwiperClient = new CardSwiperService_ClientBase(this->GetEntityBase());
  592. errCode = pCardSwiperClient->Connect();
  593. if(errCode != Error_Succeed)
  594. {
  595. Dbg("connect CardSwiper fail 0x%x(%d).", errCode, errCode);
  596. }
  597. else
  598. {
  599. CardSwiperService_GetDevInfo_Req req = {};
  600. CardSwiperService_GetDevInfo_Ans ans = {};
  601. errCode = pCardSwiperClient->GetDevInfo(req, ans, 3000);
  602. if(errCode != Error_Succeed){
  603. Dbg("CardSwiper::GetDevInfo() fail: 0x%x", errCode);
  604. }else{
  605. Dbg("CardSwiper::GetDevInfo() return state: %d", ans.state);
  606. if (ans.state == DEVICE_STATUS_NOT_READY){
  607. Sleep(500);
  608. CardSwiperService_GetDevInfo_Req req2 = {};
  609. CardSwiperService_GetDevInfo_Ans ans2 = {};
  610. errCode = pCardSwiperClient->GetDevInfo(req2, ans2, 3000);
  611. if(errCode != Error_Succeed){
  612. Dbg("CardSwiper::GetDevInfo() again fail: 0x%x", errCode);
  613. }else{
  614. Dbg("CardSwiper::GetDevInfo() again return state: %d", ans2.state);
  615. if(ans2.state != DEVICE_STATUS_NORMAL){
  616. errCode = Error_DevNotAvailable;
  617. }
  618. }
  619. }else if(ans.state != DEVICE_STATUS_NORMAL){
  620. errCode = Error_DevNotAvailable;
  621. }
  622. }
  623. pCardSwiperClient->GetFunction()->CloseSession();
  624. }
  625. if(pCardSwiperClient != NULL){
  626. pCardSwiperClient->SafeDelete();
  627. pCardSwiperClient = NULL;
  628. }
  629. return errCode;
  630. }
  631. void CFingerPrintFSM::DeleteBmp(int type)
  632. {
  633. if ((type&BmpImage) == BmpImage)
  634. {
  635. Dbg("to delete fingerprint images...");
  636. DeleteFileIfExisted("finger.bmp");
  637. DeleteFileIfExisted("finger1.bmp");
  638. DeleteFileIfExisted("finger2.bmp");
  639. DeleteFileIfExisted("finger3.bmp");
  640. }
  641. if ((type&TestImage) == TestImage)
  642. {
  643. DeleteFileIfExisted("testFinger.bmp");
  644. }
  645. }
  646. ErrorCodeEnum CFingerPrintFSM::DeleteFileIfExisted(LPCTSTR fileName)
  647. {
  648. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  649. {
  650. Dbg("Invalid or empty filename(%s)", fileName);
  651. return Error_Param;
  652. }
  653. CSimpleStringA strPath, strObjPath;
  654. ErrorCodeEnum errCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  655. strObjPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
  656. WIN32_FIND_DATA findData;
  657. if (FindFirstFileA((LPCTSTR)strObjPath, &findData) != INVALID_HANDLE_VALUE)
  658. {
  659. if(DeleteFileA((LPCTSTR)strObjPath) != 0)
  660. {
  661. Dbg("DeleteFile(%s) success.", (LPCTSTR)strObjPath);
  662. return Error_Succeed;
  663. }
  664. else
  665. {
  666. Dbg("DeleteFile(%s) failed LastError(%s).", (LPCTSTR)strObjPath, GetLastError());
  667. return Error_Unexpect;
  668. }
  669. }
  670. if (GetLastError() == ERROR_FILE_NOT_FOUND)
  671. {
  672. return Error_Succeed;
  673. }
  674. Dbg("DeleteFle(%s) Unexpect GetLastError(%s).", (LPCTSTR)strObjPath, GetLastError());
  675. return Error_Unexpect;
  676. }
  677. ErrorCodeEnum CFingerPrintFSM::Match(SpReqAnsContext<FingerPrintService_Match_Req, FingerPrintService_Match_Ans>::Pointer ctx)
  678. {
  679. LOG_FUNCTION();
  680. if (ctx->Req.templateNum <= 0)
  681. {
  682. return Error_Param;
  683. }
  684. if(!m_devInit) {
  685. return Error_NotInit;
  686. }
  687. Dbg("Before scan fingerprint, clear bmp file");
  688. DeleteBmp(BmpImage);
  689. Dbg("Before scan fingerprint, finish doing clear job.");
  690. DWORD elapsed = 0;
  691. DWORD dwStart = GetTickCount();
  692. DWORD dwEnd = GetTickCount();
  693. ErrorCodeEnum eErr;
  694. DevErrorInfo devErrInfo;
  695. LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
  696. memset(lpbFeature, 0, sizeof(lpbFeature));
  697. int lpbLength = MAX_FEATURE_LEN;
  698. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  699. CSimpleStringA strPath;
  700. eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  701. if (eErr != Error_Succeed)
  702. {
  703. LogError(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_MATCH, "get dep path failed while match.");
  704. Dbg("Get dep path failed");
  705. delete[] lpbFeature;
  706. lpbFeature = NULL;
  707. return Error_Param;
  708. }
  709. CSimpleStringA fileName = "finger.bmp";
  710. strPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
  711. Dbg("get imageName success: %s", strPath);
  712. bool bScanSuccess = false;
  713. bool bNotFindImage = false;
  714. bool bFeatureIsNull = false;
  715. bool bExit = false;
  716. m_bCancelMatch = false;
  717. while(elapsed < FINGERPRINT_MATCH_TIMEOUT && !m_bCancelMatch && !bScanSuccess)
  718. {
  719. if (m_bExit)
  720. {
  721. Dbg("Exit");
  722. bExit = true;
  723. break;
  724. }
  725. Sleep(FINGERPRINT_SCAN_INTERNAL);
  726. eErr = m_pFingerPrint->Image2Feature(fileName, lpbFeature, lpbLength);
  727. if (eErr == Error_Succeed)
  728. {
  729. Dbg("Invoke routine 'Image2Feature' success.");
  730. Sleep(200);//save image may be delayed some time, not must happen
  731. WIN32_FIND_DATA findData;
  732. if (FindFirstFileA((LPCTSTR)strPath, &findData) != INVALID_HANDLE_VALUE && lpbFeature != NULL && lpbLength > 0)
  733. {
  734. Dbg("fingerprint feature length is %d", lpbLength);
  735. bScanSuccess = true;
  736. break;
  737. }
  738. else if (FindFirstFileA((LPCTSTR)strPath, &findData) == INVALID_HANDLE_VALUE)
  739. {
  740. Dbg("Cannot find the fingerprint image finger.bmp");
  741. bNotFindImage = true;
  742. break;
  743. }
  744. else
  745. {
  746. Dbg("Fingerprint feature is NULL.");
  747. bFeatureIsNull = true;
  748. break;
  749. }
  750. }
  751. else
  752. {
  753. lpbLength = MAX_FEATURE_LEN;
  754. m_pFingerPrint->GetLastErr(devErrInfo);
  755. Dbg("Invoke routine 'Image2Feature' failed which returned 0x%x(%s)", eErr, devErrInfo.szErrMsg);
  756. }
  757. dwEnd = GetTickCount();
  758. elapsed = dwEnd - dwStart;
  759. }
  760. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning off");
  761. m_bExit = false;
  762. Dbg("after match, clear bmp file");
  763. DeleteBmp(BmpImage);
  764. ErrorCodeEnum retErr;
  765. if (bScanSuccess)
  766. {
  767. int templateNum = ctx->Req.templateNum;
  768. Dbg("templateNum=%d", templateNum);
  769. LPBYTE *lpbTemplates = new LPBYTE[templateNum];
  770. int *lpbTemplateLen = new int[templateNum];
  771. for (int i = 0; i < templateNum; ++i)
  772. {
  773. lpbTemplates[i] = new BYTE[MAX_FEATURE_LEN];
  774. memset(lpbTemplates[i], 0, sizeof(lpbTemplates[i]));
  775. strcpy((char*)lpbTemplates[i], ctx->Req.templates[i]);
  776. lpbTemplateLen[i] = ctx->Req.templateLen[i];
  777. //Dbg("lpbTemplate[%d], length = %d, %s", i, ctx->Req.templateLen[i], lpbTemplates[i]);
  778. }
  779. SYSTEMTIME urlStartTime, urlEndTime;
  780. GetLocalTime(&urlStartTime);
  781. DWORD starTime, endTime;
  782. starTime = GetTickCount();
  783. eErr = m_pFingerPrint->Match(lpbTemplates, lpbTemplateLen, templateNum, lpbFeature, lpbLength);
  784. endTime = GetTickCount();
  785. GetLocalTime(&urlEndTime);
  786. Dbg("MatchTime:%dms", endTime - starTime);
  787. auto urlDuration = getDuration(urlStartTime, urlEndTime);
  788. LogWarn(Severity_High, Error_Debug, LOG_ERR_FINGERPRINT_MATCH_TIME,
  789. generateAlarmJson("FingerPrint", formatTime(urlStartTime).c_str(), urlDuration).GetData());
  790. if (eErr == Error_Succeed) //always true
  791. {
  792. Dbg("Invoke routine 'Match' success");
  793. ctx->Ans.result.Init(templateNum);
  794. for (int i = 0; i < templateNum; ++i)
  795. {
  796. ctx->Ans.result[i] = lpbTemplateLen[i];
  797. }
  798. retErr = Error_Succeed;
  799. }
  800. else
  801. {
  802. m_pFingerPrint->GetLastErr(devErrInfo);
  803. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_INVOKE_MATCH_FAILED, "Invoke routine 'Match' failed.");//no this situation
  804. Dbg("Invoke routine 'Match' failed which returned 0x%x(%s)", eErr, devErrInfo.szErrMsg);
  805. retErr = Error_Unexpect;
  806. }
  807. for (int i = 0; i < templateNum; ++i)
  808. {
  809. delete[] lpbTemplates[i];
  810. lpbTemplates[i] = NULL;
  811. }
  812. delete[] lpbTemplateLen;
  813. lpbTemplateLen = NULL;
  814. delete[] lpbTemplates;
  815. lpbTemplates = NULL;
  816. }
  817. else if (elapsed >= FINGERPRINT_MATCH_TIMEOUT)
  818. {
  819. Dbg("Match timeout(Invoke vendor failed or not press finger)");
  820. retErr = Error_TimeOut;
  821. }
  822. else if (m_bCancelMatch)
  823. {
  824. retErr = Error_Cancel;
  825. }
  826. else
  827. {
  828. if(bNotFindImage)
  829. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_MATCH, "not find fingerprint image in dep while match.");
  830. else if(bFeatureIsNull)
  831. LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_MATCH, "fingerprint feature is null while match.");
  832. else if(bExit)
  833. LogWarn(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_MATCH_FAILED, "Exit to homepage when match.");
  834. retErr = Error_Unexpect;
  835. }
  836. delete[] lpbFeature;
  837. lpbFeature = NULL;
  838. return retErr;
  839. }
  840. ErrorCodeEnum CFingerPrintFSM::GetDevCatInfo(DevCategoryInfo& devInfo)
  841. {
  842. Dbg("DevCatgoryInfo len:%d, %d, %d", strlen(m_devCatInfo.szModel), strlen(m_devCatInfo.szType), strlen(m_devCatInfo.szVendor));
  843. strncpy_s(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN >strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN);
  844. strncpy_s(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN >strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN);
  845. strncpy_s(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN >strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN);
  846. return Error_Succeed;
  847. }
  848. ErrorCodeEnum CFingerPrintFSM::GetDevState(int &state)
  849. {
  850. ErrorCodeEnum errCode;
  851. state = 0;
  852. if(!m_devInit) {
  853. return Error_Succeed;
  854. }
  855. CSimpleStringA fileName = "testFinger.bmp";
  856. LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
  857. int lpbLength = MAX_FEATURE_LEN;
  858. errCode = m_pFingerPrint->Image2Feature(fileName, lpbFeature, lpbLength);
  859. if (errCode == Error_Succeed)
  860. {
  861. state = 1;
  862. DeleteBmp(TestImage);
  863. }
  864. delete[] lpbFeature;
  865. lpbFeature = NULL;
  866. return Error_Succeed;
  867. }
  868. int CFingerPrintFSM::getDuration(SYSTEMTIME time1, SYSTEMTIME time2)
  869. {
  870. ULARGE_INTEGER fTime1;/*FILETIME*/
  871. ULARGE_INTEGER fTime2;/*FILETIME*/
  872. SystemTimeToFileTime(&time1, (FILETIME*)&fTime1);
  873. SystemTimeToFileTime(&time2, (FILETIME*)&fTime2);
  874. unsigned __int64 dft = fTime2.QuadPart - fTime1.QuadPart;
  875. return dft / 10000;
  876. }
  877. std::string CFingerPrintFSM::formatTime(SYSTEMTIME time)
  878. {
  879. char tBuf[1024] = "";
  880. sprintf(tBuf, "%04u-%02u-%02u %02u:%02u:%02u:%03u", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
  881. return tBuf;
  882. }
  883. CSimpleString CFingerPrintFSM::generateAlarmJson(CSimpleString entityName, CSimpleString startTime, int cost)
  884. {
  885. return CSimpleString::Format("[{\"name\":\"%s\",\"time\":\"%s\",\"cost\":%d}]", entityName.GetData(), startTime.GetData(), cost);
  886. }