FingerPrintFSM.cpp 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541
  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 GET_FINGERPRINT_TIMEOUT (27*1000)
  16. #define FINGERPRINT_SCAN_INTERNAL 100
  17. #define FINGERPRINT_MATCH_TIMEOUT 15000
  18. #define MAX_FEATURE_LEN 1024
  19. #define STANDARD_FEATURE_LEN 684
  20. #pragma region event response
  21. void CFingerPrintFSM::s0_on_entry()
  22. {
  23. LOG_FUNCTION();
  24. m_devState = DEVICE_STATUS_NORMAL;
  25. if (m_FirstStart) {
  26. m_FirstStart = FALSE;
  27. ToLogWarnInfoAboutTerm(this, m_adapterInfo);
  28. }
  29. }
  30. void CFingerPrintFSM::s0_on_exit()
  31. {
  32. LOG_FUNCTION();
  33. }
  34. unsigned int CFingerPrintFSM::s0_on_event(FSMEvent* e)
  35. {
  36. LOG_FUNCTION();
  37. Dbg("s0 evt %d", e->iEvt);
  38. switch (e->iEvt)
  39. {
  40. case USER_EVT_ERROR:
  41. {
  42. e->SetHandled();
  43. break;
  44. }
  45. case USER_EVT_QUIT:
  46. {
  47. e->SetHandled();
  48. break;
  49. }
  50. case USER_EVT_SCAN:
  51. {
  52. e->SetHandled();
  53. ScanEvent* pScanEvt = dynamic_cast<ScanEvent*>(e);
  54. ScanTask* pScanTask = new ScanTask(this);
  55. pScanTask->ctx = pScanEvt->ctx;
  56. GetEntityBase()->GetFunction()->PostThreadPoolTask(pScanTask);
  57. break;
  58. }
  59. case USER_EVT_CANCEL_SCAN:
  60. {
  61. e->SetHandled();
  62. m_bCancelRegister = true;
  63. break;
  64. }
  65. case USER_EVT_SCANEX:
  66. {
  67. e->SetHandled();
  68. ScanExEvent* pScanExEvt = dynamic_cast<ScanExEvent*>(e);
  69. ScanExTask* pScanExTask = new ScanExTask(this);
  70. pScanExTask->ctx = pScanExEvt->ctx;
  71. GetEntityBase()->GetFunction()->PostThreadPoolTask(pScanExTask);
  72. break;
  73. }
  74. case USER_EVT_GETFINGER:
  75. {
  76. e->SetHandled();
  77. GetFingerEvent* getFingerEvt = dynamic_cast<GetFingerEvent*>(e);
  78. GetFingerTask* getFingerTask = new GetFingerTask(this);
  79. getFingerTask->ctx = getFingerEvt->ctx;
  80. GetEntityBase()->GetFunction()->PostThreadPoolTask(getFingerTask);
  81. break;
  82. }
  83. case USER_EVT_GENERATE_TEMPLATE:
  84. {
  85. e->SetHandled();
  86. GenerateTemplateEvent* gtEvt = dynamic_cast<GenerateTemplateEvent*>(e);
  87. GenerateTemplateTask* gtTask = new GenerateTemplateTask(this);
  88. gtTask->ctx = gtEvt->ctx;
  89. GetEntityBase()->GetFunction()->PostThreadPoolTask(gtTask);
  90. break;
  91. }
  92. case USER_EVT_MATCH:
  93. {
  94. e->SetHandled();
  95. MatchEvent* pMatchEvt = dynamic_cast<MatchEvent*>(e);
  96. MatchTask* pMatchTask = new MatchTask(this);
  97. pMatchTask->ctx = pMatchEvt->ctx;
  98. GetEntityBase()->GetFunction()->PostThreadPoolTask(pMatchTask);
  99. break;
  100. }
  101. default:
  102. break;
  103. }
  104. return 0;
  105. }
  106. void CFingerPrintFSM::s1_on_entry()
  107. {
  108. LOG_FUNCTION();
  109. }
  110. void CFingerPrintFSM::s1_on_exit()
  111. {
  112. LOG_FUNCTION();
  113. }
  114. unsigned int CFingerPrintFSM::s1_on_event(FSMEvent* e)
  115. {
  116. LOG_FUNCTION();
  117. Dbg("s1 evt(%d)", e->iEvt);
  118. int ret = 0;
  119. switch (e->iEvt)
  120. {
  121. case USER_EVT_SCAN_FINISHED:
  122. e->SetHandled();
  123. ret = e->param1;
  124. break;
  125. case USER_EVT_SCANEX_FINISHED:
  126. e->SetHandled();
  127. ret = e->param1;
  128. break;
  129. case USER_EVT_GETFINGER_FINISHED:
  130. e->SetHandled();
  131. ret = e->param1;
  132. break;
  133. case USER_EVT_GENERATE_TEMPLATE_FINISHED:
  134. e->SetHandled();
  135. ret = e->param1;
  136. break;
  137. case USER_EVT_CANCEL_SCAN:
  138. e->SetHandled();
  139. Dbg("Set cancel scan flag");
  140. m_bCancelRegister = true;
  141. break;
  142. case USER_EVT_EXIT:
  143. e->SetHandled();
  144. m_bExit = true;
  145. break;
  146. case USER_EVT_QUIT:
  147. e->SetHandled();
  148. break;
  149. default:
  150. break;
  151. }
  152. return ret;
  153. }
  154. void CFingerPrintFSM::s2_on_entry()
  155. {
  156. LOG_FUNCTION();
  157. m_devState = DEVICE_STATUS_FAULT;
  158. m_testResult = Error_InvalidState;
  159. }
  160. void CFingerPrintFSM::s2_on_exit()
  161. {
  162. LOG_FUNCTION();
  163. }
  164. unsigned int CFingerPrintFSM::s2_on_event(FSMEvent* e)
  165. {
  166. LOG_FUNCTION();
  167. if (e->iEvt == USER_EVT_QUIT)
  168. {
  169. e->SetHandled();
  170. }
  171. return 0;
  172. }
  173. void CFingerPrintFSM::s3_on_entry()
  174. {
  175. LOG_FUNCTION();
  176. }
  177. void CFingerPrintFSM::s3_on_exit()
  178. {
  179. LOG_FUNCTION();
  180. }
  181. unsigned CFingerPrintFSM::s3_on_event(FSMEvent* e)
  182. {
  183. LOG_FUNCTION();
  184. Dbg("s3 evt %d,%d", e->iEvt, e->param1);
  185. switch (e->iEvt)
  186. {
  187. case USER_EVT_MATCH_FINISHED:
  188. {
  189. e->SetHandled();
  190. MatchFinishedEvent* matchFinishEvt = dynamic_cast<MatchFinishedEvent*>(e);
  191. if (matchFinishEvt->param1 == 0)
  192. matchFinishEvt->ctx->Answer(Error_Succeed);
  193. else
  194. matchFinishEvt->ctx->Answer((ErrorCodeEnum)matchFinishEvt->param1);
  195. break;
  196. }
  197. case USER_EVT_CANCEL_MATCH:
  198. {
  199. e->SetHandled();
  200. m_bCancelMatch = true;
  201. break;
  202. }
  203. case USER_EVT_EXIT:
  204. {
  205. e->SetHandled();
  206. m_bExit = true;
  207. break;
  208. }
  209. case USER_EVT_QUIT:
  210. {
  211. e->SetHandled();
  212. break;
  213. }
  214. default:
  215. break;
  216. }
  217. return 0;
  218. }
  219. #pragma endregion
  220. #pragma region entity init
  221. ErrorCodeEnum CFingerPrintFSM::OnInit()
  222. {
  223. LOG_FUNCTION();
  224. CDevAdptEntityBase* pEntity = GET_DEV_ENTITY_BASE_POINTER();
  225. pEntity->InitializeVendorLogSwitch();
  226. ErrorCodeEnum errDev;
  227. CSimpleStringA strLibFullPath(true);
  228. CSimpleStringA tmpVendor(""), tmpDevSN(""), tmpDLLVersion("");
  229. //judge if FWB or not
  230. bool isFWB = false;
  231. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor);
  232. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  233. GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion);
  234. if (tmpDLLVersion.GetLength() < 2)
  235. tmpDLLVersion = "8.1";
  236. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  237. {
  238. Dbg("This is fwb device.");
  239. isFWB = true;
  240. m_csDevSN = tmpDevSN;
  241. CSimpleStringA csDepPath(""), prefix(""), suffix("");
  242. GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath);
  243. #ifdef RVC_OS_WIN
  244. preix = "FingerPrint.";
  245. suffix = ".dll";
  246. #else
  247. prefix = "libFingerPrint.";
  248. suffix = ".so";
  249. #endif
  250. strLibFullPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s%s.%s%s"
  251. , csDepPath.GetData(), prefix.GetData(), tmpVendor.GetData(), tmpDLLVersion.GetData(), suffix.GetData());
  252. }
  253. else {
  254. ErrorCodeEnum errDev;
  255. errDev = ExtractVendorLib(strLibFullPath);
  256. if (errDev != Error_Succeed) {
  257. LogWarn(Severity_High, Error_DevLoadFileFailed
  258. , FingerPrint_UserErrorCode_GET_DLLNAME_FAILED_ONINIT
  259. , "get vendorlib failed while init");
  260. return errDev;
  261. }
  262. }
  263. LogWarn(Severity_Low, Error_DevLoadFileFailed
  264. , FingerPrint_UserErrorCode_ROOT_INFO
  265. , strLibFullPath.GetData());
  266. if (!ExistsFile(strLibFullPath))
  267. {
  268. LogWarn(Severity_High, Error_DevLoadFileFailed
  269. , FingerPrint_UserErrorCode_VENDOR_ADAPTER_NOT_EXIST
  270. , "No vendor fingerprint adapter in dep.");
  271. m_devInit = false;
  272. return Error_Succeed;
  273. }
  274. m_adapterInfo.adapterFileName = strLibFullPath;
  275. errDev = m_hDevHelper.LoadUp(strLibFullPath);
  276. if (Error_Succeed != errDev)
  277. {
  278. LogWarn(Severity_High, Error_NotInit, FingerPrint_UserErrorCode_LOAD_ADAPTER_FAILED,
  279. "load vendorlib or create DevAdapterObject failed.");
  280. return Error_DevLoadFileFailed;
  281. }
  282. CSmartPointer<IConfigInfo> spConfig;
  283. errDev = QueryRootConfigObj(spConfig);
  284. if (Error_Succeed != errDev)
  285. return errDev;
  286. errDev = DoDevOpen(spConfig);
  287. if (Error_Succeed != errDev)
  288. return errDev;
  289. return DoGetDevInfo();
  290. }
  291. ErrorCodeEnum CFingerPrintFSM::ExtractVendorLib(CSimpleStringA& strLibFullPath)
  292. {
  293. ErrorCodeEnum errCode = Error_Succeed;
  294. CDevAdptEntityBase* pEntity = GET_DEV_ENTITY_BASE_POINTER();
  295. errCode = pEntity->ExtractVendorLibFullPath(strLibFullPath);
  296. Dbg("Extract Vendor lib name: %s", strLibFullPath.GetData());
  297. if (errCode != Error_Succeed)
  298. {
  299. Dbg("Get vendor libname(%s) failed.", strLibFullPath.GetData());
  300. LogWarn(Severity_High, Error_DevLoadFileFailed
  301. , FingerPrint_UserErrorCode_GET_DLLNAME_FAILED_ONINIT
  302. , "get dllname failed while init");
  303. errCode = Error_DevLoadFileFailed;
  304. }
  305. return errCode;
  306. }
  307. ErrorCodeEnum CFingerPrintFSM::QueryRootConfigObj(CSmartPointer<IConfigInfo>& spConfig)
  308. {
  309. ErrorCodeEnum errDev = Error_Succeed;
  310. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  311. errDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
  312. if (errDev != Error_Succeed)
  313. {
  314. Dbg("open cfg file failed!");
  315. LogWarn(Severity_High, Error_DevLoadFileFailed
  316. , FingerPrint_UserErrorCode_OPEN_ROOT_FAILED_ONINIT
  317. , "get root config file pointer failed while init");
  318. }
  319. return errDev;
  320. }
  321. ErrorCodeEnum CFingerPrintFSM::DoDevOpen(CSmartPointer<IConfigInfo> spConfig)
  322. {
  323. ErrorCodeEnum errDev = Error_Succeed;
  324. do
  325. {
  326. int tmpPort = 0;
  327. int baudrate = 0;
  328. CSimpleStringA tmpVendor(true);
  329. spConfig->ReadConfigValueInt("Device.FingerPrint", "Port", tmpPort);
  330. spConfig->ReadConfigValueInt("Device.FingerPrint", "Baudrate", baudrate);
  331. Dbg("port: %d, baudrate: %d", tmpPort, baudrate);
  332. if (IsFWBDevice(tmpVendor))
  333. {
  334. errDev = CheckCardSwiperStatus();
  335. if (Error_Succeed != errDev)
  336. {
  337. Dbg("this is FWB, device status is not normal now.(%s)", SpStrError(errDev));
  338. errDev = Error_DevCommFailed;
  339. break;
  340. }
  341. else {
  342. Dbg("this is FWB, device status is normal now.");
  343. }
  344. }
  345. errDev = m_hDevHelper->DevOpen(tmpPort, baudrate);
  346. if (errDev != Error_Succeed)
  347. {
  348. SetErrPackage(m_errPkg, "Initial::DevOpen", m_csDevSN, errDev, MEC_DEVAPI_FINGERPRINT_DevOpen);
  349. AlarmDEC(m_errPkg);
  350. errDev = Error_DevCommFailed;
  351. }
  352. } while (0);
  353. return errDev;
  354. }
  355. ErrorCodeEnum CFingerPrintFSM::DoGetDevInfo()
  356. {
  357. ErrorCodeEnum errDev = Error_Succeed;
  358. ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN);
  359. ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN);
  360. ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN);
  361. errDev = m_hDevHelper->GetDevCategory(m_devCatInfo);
  362. if (errDev == Error_Succeed)
  363. {
  364. Dbg("szModel = %s", m_devCatInfo.szModel);
  365. Dbg("szType = %s", m_devCatInfo.szType);
  366. Dbg("szVendor = %s", m_devCatInfo.szVendor);
  367. m_adapterInfo.devCatInfo = m_devCatInfo;
  368. m_devInit = true;
  369. errDev = Error_Succeed;
  370. }
  371. else {
  372. SetErrPackage(m_errPkg, "Initial::GetDevCategory", m_csDevSN, errDev, MEC_DEVAPI_FINGERPRINT_GetDevCategory);
  373. AlarmDEC(m_errPkg);
  374. m_hDevHelper->DevClose();
  375. errDev = Error_DevCommFailed;
  376. }
  377. return errDev;
  378. }
  379. #pragma endregion
  380. #pragma region entity exit
  381. ErrorCodeEnum CFingerPrintFSM::OnExit()
  382. {
  383. if (m_hDevHelper)
  384. {
  385. ErrorCodeEnum errCode = Error_Succeed;
  386. m_hDevHelper.TearDown();//TODO:¿¼ÂÇÀ¶ÑÀ¶àºÏÒ»DevClose£¿£¿£¿
  387. return errCode;
  388. }
  389. return Error_Succeed;
  390. }
  391. #pragma endregion
  392. void CFingerPrintFSM::SelfTest(EntityTestEnum eTestType , CSmartPointer<ITransactionContext> pTransactionContext)
  393. {
  394. //LOG_FUNCTION();
  395. pTransactionContext->SendAnswer(m_testResult);
  396. }
  397. #pragma region register interface - not use anymore in uos
  398. int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
  399. {
  400. LOG_FUNCTION();
  401. ScanParam* pScanParam = new ScanParam();
  402. ErrorCodeEnum errCode = InitParamBeforeScan(pScanParam, ctx->Req.times);
  403. if (errCode != Error_Succeed)
  404. ctx->Answer(errCode);
  405. else {
  406. ScanProcess(pScanParam, ctx);
  407. if (pScanParam != NULL && ctx != NULL)
  408. ProcessAfterScan(pScanParam, ctx);
  409. else
  410. ctx->Answer(Error_Param);
  411. }
  412. return 0;
  413. }
  414. ErrorCodeEnum CFingerPrintFSM::InitParamBeforeScan(ScanParam* initParam, int scanTime)
  415. {
  416. ErrorCodeEnum errCode = Error_Succeed;
  417. errCode = InitCommParam(initParam, RegisterType, scanTime);
  418. if (errCode != Error_Succeed)
  419. return errCode;
  420. switch (scanTime)
  421. {
  422. case 1:
  423. initParam->m_BmpFileName = "finger1.bmp";
  424. m_BmpFileFullPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  425. , initParam->m_DepPath.GetData()
  426. , initParam->m_BmpFileName.GetData());
  427. break;
  428. case 2:
  429. initParam->m_BmpFileName = "finger2.bmp";
  430. m_BmpFileFullPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  431. , initParam->m_DepPath.GetData()
  432. , initParam->m_BmpFileName.GetData());
  433. break;
  434. case 3:
  435. initParam->m_BmpFileName = "finger3.bmp";
  436. m_BmpFileFullPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  437. , initParam->m_DepPath.GetData()
  438. , initParam->m_BmpFileName.GetData());
  439. break;
  440. default:
  441. initParam->m_BmpFileName = "finger.bmp";
  442. break;
  443. }
  444. initParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  445. , initParam->m_DepPath.GetData()
  446. , initParam->m_BmpFileName.GetData());
  447. Dbg("get imageName success: %s", initParam->m_FullFilePath.GetData());
  448. return errCode;
  449. }
  450. void CFingerPrintFSM::ScanProcess(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx)
  451. {
  452. LOG_FUNCTION();
  453. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  454. while (pScanParam->m_TimeLeft < FINGERPRINT_SCAN_TIMEOUT
  455. && !m_bCancelRegister && !pScanParam->m_ScanSuc)
  456. {
  457. if (m_bExit)
  458. {
  459. Dbg("Exit");
  460. pScanParam->m_Quit = true;
  461. break;
  462. }
  463. SLEEP(FINGERPRINT_SCAN_INTERNAL);
  464. pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
  465. ErrorCodeEnum errCode = m_hDevHelper->Image2Feature(pScanParam->m_BmpFileName
  466. , pScanParam->m_Feature
  467. , pScanParam->m_FeatureLen);
  468. if (errCode == Error_Succeed)
  469. {
  470. Dbg("Invoke routine 'Image2Feature' success.'");
  471. SLEEP(200);
  472. if (ExistsFile(pScanParam->m_FullFilePath)
  473. && pScanParam->m_Feature != NULL
  474. && pScanParam->m_FeatureLen > 0)
  475. {
  476. Dbg("fingerprint feature length is %d", pScanParam->m_FeatureLen);
  477. ctx->Ans.imageName = pScanParam->m_BmpFileName;
  478. if (ctx->Req.times == 3) {
  479. Dbg("m_strPath1 = %s", m_BmpFileFullPath1.GetData());
  480. Dbg("m_strPath2 = %s", m_BmpFileFullPath2.GetData());
  481. Dbg("m_strPath3 = %s", m_BmpFileFullPath3.GetData());
  482. errCode = m_hDevHelper->Image2Template(m_BmpFileFullPath1, m_BmpFileFullPath2
  483. , m_BmpFileFullPath3, pScanParam->m_Template
  484. , pScanParam->m_FeatureLen);
  485. if (Error_Succeed == errCode)
  486. {
  487. Dbg("Invoke routine 'Image2Template' success");
  488. if (pScanParam->m_Template != NULL && pScanParam->m_FeatureLen == 684)
  489. {
  490. ctx->Ans.feature = (LPCTSTR)pScanParam->m_Template;
  491. Dbg("Ans.feature = %s", ctx->Ans.feature.GetData());
  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. }
  499. else {
  500. pScanParam->m_GetTemplateSuc = false;
  501. DevErrorInfo devErrorInfo;
  502. m_hDevHelper->GetLastErr(devErrorInfo);
  503. Dbg("Invoke routine 'Image2Template' failed which returned %s(%s)"
  504. , SpStrError(errCode), devErrorInfo.szErrMsg);
  505. break;
  506. }
  507. }
  508. pScanParam->m_ScanSuc = true;
  509. break;
  510. }
  511. else if (!ExistsFile(pScanParam->m_FullFilePath)) {
  512. Dbg("Cannot find the fingerprint image %s", pScanParam->m_BmpFileName.GetData());
  513. pScanParam->m_NotFindImage = true;
  514. break;
  515. }
  516. else {
  517. Dbg("Fingerprint feature is NULL.");
  518. pScanParam->m_FeatureIsNull = true;
  519. break;
  520. }
  521. }
  522. else {
  523. DevErrorInfo devErrInfo;
  524. m_hDevHelper->GetLastErr(devErrInfo);
  525. Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s) while register."
  526. , SpStrError(errCode), devErrInfo.szErrMsg);
  527. }
  528. pScanParam->m_TimeEnd = RVCGetTickCount();
  529. pScanParam->m_TimeLeft = pScanParam->m_TimeEnd - pScanParam->m_TimeStart;
  530. }
  531. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning off");
  532. m_bExit = false;
  533. }
  534. void CFingerPrintFSM::ProcessAfterScan(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx)
  535. {
  536. if (pScanParam->m_ScanSuc)
  537. {
  538. ctx->Answer(Error_Succeed);
  539. }
  540. else if (pScanParam->m_TimeLeft >= FINGERPRINT_SCAN_TIMEOUT)
  541. {
  542. ctx->Answer(Error_TimeOut);
  543. }
  544. else if (m_bCancelRegister)
  545. {
  546. ctx->Answer(Error_Cancel);
  547. }
  548. else {
  549. if (pScanParam->m_NotFindImage)
  550. {
  551. LogError(Severity_High, Error_Hardware
  552. , FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_REGISTER
  553. , "not find fingerprint image in dep while register.");
  554. ctx->Answer(Error_Unexpect, FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_REGISTER);
  555. }
  556. else if (pScanParam->m_FeatureIsNull)
  557. {
  558. LogError(Severity_High, Error_Hardware
  559. , FingerPrint_UserErrorCode_GETFEATURE_FAILED_REGISTER
  560. , "fingerprint feature is null while register.");
  561. ctx->Answer(Error_Unexpect, FingerPrint_UserErrorCode_GETFEATURE_FAILED_REGISTER);
  562. }
  563. else {
  564. if (ctx->Req.times == 3 && !pScanParam->m_GetTemplateSuc)
  565. {
  566. LogError(Severity_High, Error_Hardware
  567. , FingerPrint_UserErrorCode_GETTEMPLATE_FAILED
  568. , "Not generate template correctly.");
  569. ctx->Answer(Error_Unexpect, FingerPrint_UserErrorCode_GETTEMPLATE_FAILED);
  570. }
  571. else if (pScanParam->m_Quit) {
  572. LogWarn(Severity_Middle, Error_Hardware
  573. , FingerPrint_UserErrorCode_REGISTER_FAILED
  574. , "Exit to homepage when register.");
  575. ctx->Answer(Error_Unexpect);
  576. }
  577. }
  578. }
  579. delete[] pScanParam->m_Feature;
  580. pScanParam->m_Feature = NULL;
  581. delete[] pScanParam->m_Template;
  582. pScanParam->m_Template = NULL;
  583. delete pScanParam;
  584. pScanParam = NULL;
  585. }
  586. #pragma endregion
  587. #pragma region register interface - not use anymore in uos
  588. int CFingerPrintFSM::GetImageAndFeatureEx(SpReqAnsContext<FingerPrintService_GetImageAndFeatureEx_Req, FingerPrintService_GetImageAndFeatureEx_Ans>::Pointer ctx)
  589. {
  590. LOG_FUNCTION();
  591. ScanParam* pScanParam = new ScanParam();
  592. ErrorCodeEnum errCode = InitParamBeforeScan(pScanParam, ctx->Req.times);
  593. if (errCode != Error_Succeed)
  594. ctx->Answer(errCode);
  595. else {
  596. ScanProcessEx(pScanParam, ctx);
  597. if (pScanParam != NULL && ctx != NULL)
  598. ProcessAfterScanEx(pScanParam, ctx);
  599. else
  600. ctx->Answer(Error_Param);
  601. }
  602. return 0;
  603. }
  604. void CFingerPrintFSM::ScanProcessEx(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeatureEx_Req, FingerPrintService_GetImageAndFeatureEx_Ans>::Pointer& ctx)
  605. {
  606. LOG_FUNCTION();
  607. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  608. while (pScanParam->m_TimeLeft < FINGERPRINT_SCAN_TIMEOUT
  609. && !m_bCancelRegister && !pScanParam->m_ScanSuc)
  610. {
  611. if (m_bExit)
  612. {
  613. Dbg("Exit");
  614. pScanParam->m_Quit = true;
  615. break;
  616. }
  617. SLEEP(FINGERPRINT_SCAN_INTERNAL);
  618. pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
  619. ErrorCodeEnum errCode = m_hDevHelper->Image2Feature(pScanParam->m_BmpFileName
  620. , pScanParam->m_Feature
  621. , pScanParam->m_FeatureLen);
  622. if (errCode == Error_Succeed)
  623. {
  624. Dbg("Invoke routine 'Image2Feature' success.'");
  625. Dbg("FingerPrint feature length is %d", pScanParam->m_FeatureLen);
  626. SLEEP(200);
  627. if (ExistsFile(pScanParam->m_FullFilePath)
  628. && pScanParam->m_Feature != NULL
  629. && pScanParam->m_FeatureLen == STANDARD_FEATURE_LEN)
  630. {
  631. ctx->Ans.imageName = pScanParam->m_BmpFileName;
  632. pScanParam->m_Feature[STANDARD_FEATURE_LEN] = '\0';
  633. Dbg("after add eof, feature = %s", (LPCTSTR)pScanParam->m_Feature);
  634. if (ctx->Req.times == 3) {
  635. Dbg("m_strPath1 = %s", m_BmpFileFullPath1.GetData());
  636. Dbg("m_strPath2 = %s", m_BmpFileFullPath2.GetData());
  637. Dbg("m_strPath3 = %s", m_BmpFileFullPath3.GetData());
  638. pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
  639. errCode = m_hDevHelper->Image2Template(m_BmpFileFullPath1, m_BmpFileFullPath2
  640. , m_BmpFileFullPath3, pScanParam->m_Template
  641. , pScanParam->m_FeatureLen);
  642. if (Error_Succeed == errCode)
  643. {
  644. Dbg("Invoke routine 'Image2Template' success");
  645. Dbg("template length is %d", pScanParam->m_FeatureLen);
  646. if (pScanParam->m_Template != NULL && pScanParam->m_FeatureLen == STANDARD_FEATURE_LEN)
  647. {
  648. pScanParam->m_Template[STANDARD_FEATURE_LEN] = '\0';
  649. ctx->Ans.feature = (LPCTSTR)pScanParam->m_Template;
  650. Dbg("Ans.feature = %s", ctx->Ans.feature.GetData());
  651. }
  652. else {
  653. Dbg("template len is: %d, or template is NULL", pScanParam->m_FeatureLen);
  654. pScanParam->m_GetTemplateSuc = false;
  655. break;
  656. }
  657. }
  658. else {
  659. pScanParam->m_GetTemplateSuc = false;
  660. DevErrorInfo devErrorInfo;
  661. m_hDevHelper->GetLastErr(devErrorInfo);
  662. Dbg("Invoke routine 'Image2Template' failed which returned %s(%s)"
  663. , SpStrError(errCode), devErrorInfo.szErrMsg);
  664. break;
  665. }
  666. }
  667. pScanParam->m_ScanSuc = true;
  668. break;
  669. }
  670. else if (!ExistsFile(pScanParam->m_FullFilePath)) {
  671. Dbg("Cannot find the fingerprint image %s", pScanParam->m_BmpFileName.GetData());
  672. pScanParam->m_NotFindImage = true;
  673. break;
  674. }
  675. else {
  676. Dbg("Fingerprint feature is NULL.");
  677. pScanParam->m_FeatureIsNull = true;
  678. break;
  679. }
  680. }
  681. else {
  682. DevErrorInfo devErrInfo;
  683. m_hDevHelper->GetLastErr(devErrInfo);
  684. Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s) while register."
  685. , SpStrError(errCode), devErrInfo.szErrMsg);
  686. }
  687. pScanParam->m_TimeEnd = RVCGetTickCount();
  688. pScanParam->m_TimeLeft = pScanParam->m_TimeEnd - pScanParam->m_TimeStart;
  689. }
  690. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning off");
  691. m_bExit = false;
  692. }
  693. void CFingerPrintFSM::ProcessAfterScanEx(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeatureEx_Req, FingerPrintService_GetImageAndFeatureEx_Ans>::Pointer& ctx)
  694. {
  695. ctx->Ans.reserved1.Init(10);
  696. ctx->Ans.reserved1.Init(10);
  697. if (pScanParam->m_ScanSuc)
  698. {
  699. ctx->Ans.reserved1[0] = 1;
  700. ctx->Answer(Error_Succeed);
  701. }
  702. else if (pScanParam->m_TimeLeft >= FINGERPRINT_SCAN_TIMEOUT)
  703. {
  704. ctx->Ans.reserved1[0] = 2;
  705. ctx->Answer(Error_Succeed);
  706. }
  707. else if (m_bCancelRegister)
  708. {
  709. m_bCancelRegister = false;
  710. ctx->Ans.reserved1[0] = 3;
  711. ctx->Answer(Error_Succeed);
  712. }
  713. else {
  714. if (pScanParam->m_NotFindImage)
  715. {
  716. LogError(Severity_High, Error_Hardware
  717. , FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_REGISTER
  718. , "not find fingerprint image in dep while register.");
  719. ctx->Answer(Error_NotExist, FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_REGISTER);
  720. }
  721. else if (pScanParam->m_FeatureIsNull)
  722. {
  723. ctx->Ans.reserved1[0] = 4;
  724. LogError(Severity_High, Error_Hardware
  725. , FingerPrint_UserErrorCode_GETFEATURE_FAILED_REGISTER
  726. , "fingerprint feature is null while register.");
  727. ctx->Answer(Error_Succeed, FingerPrint_UserErrorCode_GETFEATURE_FAILED_REGISTER);
  728. }
  729. else {
  730. if (ctx->Req.times == 3 && !pScanParam->m_GetTemplateSuc)
  731. {
  732. ctx->Ans.reserved1[0] = 5;
  733. LogError(Severity_High, Error_Hardware
  734. , FingerPrint_UserErrorCode_GETTEMPLATE_FAILED
  735. , "Not generate template correctly.");
  736. ctx->Answer(Error_Succeed, FingerPrint_UserErrorCode_GETTEMPLATE_FAILED);
  737. }
  738. else if (pScanParam->m_Quit) {
  739. ctx->Ans.reserved1[0] = 6;
  740. LogWarn(Severity_Middle, Error_Hardware
  741. , FingerPrint_UserErrorCode_REGISTER_FAILED
  742. , "Exit to homepage when register.");
  743. ctx->Answer(Error_Succeed);
  744. }
  745. }
  746. }
  747. delete[] pScanParam->m_Feature;
  748. pScanParam->m_Feature = NULL;
  749. delete[] pScanParam->m_Template;
  750. pScanParam->m_Template = NULL;
  751. delete pScanParam;
  752. pScanParam = NULL;
  753. }
  754. #pragma endregion
  755. #pragma region collect finger for register and match interface
  756. int CFingerPrintFSM::GetFingerPrint(SpReqAnsContext<FingerPrintService_GetFingerPrint_Req, FingerPrintService_GetFingerPrint_Ans>::Pointer ctx)
  757. {
  758. LOG_FUNCTION();
  759. if (!m_devInit) {
  760. Dbg("GetFingerPrint return failed for device isn't init suc.");
  761. ctx->Answer(Error_NotInit); //maybe no vendor adapter
  762. return 0;
  763. }
  764. Dbg("ctx->Req.times = %d", ctx->Req.times);
  765. if (ctx->Req.times <= 0 || ctx->Req.times > 10)
  766. {
  767. ctx->Answer(Error_Param);
  768. return 0;
  769. }
  770. ErrorCodeEnum errCode = Error_Succeed;
  771. ScanParam* pScanParam = new ScanParam();
  772. errCode = InitCommParam(pScanParam, RegisterType, ctx->Req.times);
  773. if (errCode != Error_Succeed) {
  774. Dbg("InitCommParam with EC = 0x%x(%s)", errCode, SpStrError(errCode));
  775. ctx->Answer(errCode);
  776. }
  777. else {
  778. CollectProcess(pScanParam, ctx);
  779. if (pScanParam != NULL && ctx != NULL)
  780. ProcessAfterCollect(pScanParam, ctx);
  781. else
  782. ctx->Answer(Error_Param);
  783. }
  784. return 0;
  785. }
  786. void CFingerPrintFSM::CollectProcess(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetFingerPrint_Req, FingerPrintService_GetFingerPrint_Ans>::Pointer& ctx)
  787. {
  788. LOG_FUNCTION();
  789. m_bCancelRegister = false;
  790. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  791. CSimpleStringA fileName = CSimpleStringA::Format("finger%d.bmp", ctx->Req.times);
  792. pScanParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", pScanParam->m_DepPath.GetData(), fileName.GetData());
  793. Dbg("<GetFingerPrint> imageName = %s", fileName.GetData());
  794. while (pScanParam->m_TimeLeft < GET_FINGERPRINT_TIMEOUT
  795. && !m_bCancelRegister && !m_bCancelMatch && !pScanParam->m_bGetFingerPrintSuc)
  796. {
  797. if (m_bExit)
  798. {
  799. Dbg("Exit");
  800. pScanParam->m_Quit = true;
  801. break;
  802. }
  803. SLEEP(FINGERPRINT_SCAN_INTERNAL);
  804. pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
  805. ErrorCodeEnum errCode = m_hDevHelper->Image2Feature(fileName
  806. , pScanParam->m_Feature
  807. , pScanParam->m_FeatureLen);
  808. if (errCode == Error_Succeed)
  809. {
  810. SLEEP(200);
  811. if (ExistsFile(pScanParam->m_FullFilePath)
  812. && pScanParam->m_Feature != NULL
  813. && pScanParam->m_FeatureLen == STANDARD_FEATURE_LEN)
  814. {
  815. ctx->Ans.imageName = fileName;
  816. pScanParam->m_Feature[STANDARD_FEATURE_LEN] = '\0';
  817. ctx->Ans.feature = (LPCTSTR)pScanParam->m_Feature;
  818. pScanParam->m_bGetFingerPrintSuc = true;
  819. Dbg("Image2Feature success.");
  820. break;
  821. }
  822. else if (!ExistsFile(pScanParam->m_FullFilePath))
  823. {
  824. Dbg("Cannot find the fingerprint image %s", fileName.GetData());
  825. pScanParam->m_NotFindImage = true;
  826. break;
  827. }
  828. else if (pScanParam->m_FeatureLen != STANDARD_FEATURE_LEN) {
  829. Dbg("vendor returned feature length is not right.");
  830. pScanParam->m_bLenIsNotRight = true;
  831. break;
  832. }
  833. else {
  834. Dbg("Fingerprint feature is NULL.");
  835. pScanParam->m_FeatureIsNull = true;
  836. break;
  837. }
  838. }
  839. else {
  840. DevErrorInfo devErrInfo;
  841. m_hDevHelper->GetLastErr(devErrInfo);
  842. Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s) while register."
  843. , SpStrError(errCode), devErrInfo.szErrMsg);
  844. }
  845. pScanParam->m_TimeEnd = RVCGetTickCount();
  846. pScanParam->m_TimeLeft = pScanParam->m_TimeEnd - pScanParam->m_TimeStart;
  847. }
  848. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning off");
  849. m_bExit = false;
  850. }
  851. void CFingerPrintFSM::ProcessAfterCollect(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetFingerPrint_Req, FingerPrintService_GetFingerPrint_Ans>::Pointer& ctx)
  852. {
  853. LOG_FUNCTION();
  854. ctx->Ans.reserved1.Init(10);
  855. if (pScanParam->m_bGetFingerPrintSuc)
  856. {
  857. ctx->Ans.reserved1[0] = 1;
  858. ctx->Answer(Error_Succeed);
  859. }
  860. else if (pScanParam->m_TimeLeft >= FINGERPRINT_SCAN_TIMEOUT)
  861. {
  862. m_bCancelRegister = false;
  863. m_bCancelMatch = false;
  864. ctx->Ans.reserved1[0] = 2;
  865. ctx->Answer(Error_Succeed);
  866. }
  867. else if (m_bCancelRegister || m_bCancelMatch) {
  868. m_bCancelRegister = false;
  869. m_bCancelMatch = false;
  870. ctx->Ans.reserved1[0] = 3;
  871. ctx->Answer(Error_Succeed);
  872. }
  873. else {
  874. if (pScanParam->m_NotFindImage) {
  875. LogError(Severity_High, Error_Hardware, FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_REGISTER, "not find fingerprint image in dep while register.");
  876. ctx->Ans.reserved1[0] = 7;
  877. ctx->Answer(Error_Succeed, FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_REGISTER);
  878. }
  879. else if (pScanParam->m_FeatureIsNull) {
  880. LogError(Severity_High, Error_Hardware, FingerPrint_UserErrorCode_GETFEATURE_FAILED_REGISTER, "fingerprint feature is null while register.");
  881. ctx->Ans.reserved1[0] = 4;
  882. ctx->Answer(Error_Succeed, FingerPrint_UserErrorCode_GETFEATURE_FAILED_REGISTER);
  883. }
  884. else if (pScanParam->m_bLenIsNotRight) {
  885. LogError(Severity_High, Error_Hardware, FingerPrint_UserErrorCode_FEATURELEN_ISNOTRIGHT, "fingerprint feature len is not right.");
  886. ctx->Ans.reserved1[0] = 5;
  887. ctx->Answer(Error_Succeed);
  888. }
  889. else if (pScanParam->m_Quit) {
  890. LogWarn(Severity_High, Error_Hardware, FingerPrint_UserErrorCode_REGISTER_FAILED, "Exit to homepage when register.");
  891. ctx->Ans.reserved1[0] = 6;
  892. ctx->Answer(Error_Succeed);
  893. }
  894. }
  895. delete[] pScanParam->m_Feature;
  896. pScanParam->m_Feature = NULL;
  897. if (pScanParam->m_Template != NULL) {
  898. delete[] pScanParam->m_Template;
  899. pScanParam->m_Template = NULL;
  900. }
  901. delete pScanParam;
  902. pScanParam = NULL;
  903. }
  904. #pragma endregion
  905. #pragma region generate template
  906. int CFingerPrintFSM::GenerateTemplate(SpReqAnsContext<FingerPrintService_GenerateTemplate_Req, FingerPrintService_GenerateTemplate_Ans>::Pointer ctx)
  907. {
  908. LOG_FUNCTION();
  909. if (!m_devInit) {
  910. Dbg("GenerateTemplate return failed for device isn't init suc.");
  911. ctx->Answer(Error_NotInit);
  912. return 0;
  913. }
  914. if (m_bCancelRegister) {
  915. ctx->Answer(Error_Cancel);
  916. m_bCancelRegister = false;
  917. return 0;
  918. }
  919. ErrorCodeEnum errCode;
  920. LPBYTE lpbTemplate = new BYTE[MAX_FEATURE_LEN];
  921. int lpbLength = MAX_FEATURE_LEN;
  922. std::vector<CSimpleStringA> imagePaths;
  923. CSimpleStringA strPath;
  924. m_pEntity->GetFunction()->GetPath("Dep", strPath);
  925. for (int i = 0; i < ctx->Req.FingerIDList.GetCount(); ++i)
  926. {
  927. char buf[8];
  928. ZeroMemory(buf, 8);
  929. _itoa(ctx->Req.FingerIDList[i], buf, 10);
  930. CSimpleStringA tempStr = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "finger%d.bmp", strPath.GetData(), ctx->Req.FingerIDList[i]);
  931. imagePaths.push_back(tempStr);
  932. Dbg("imageName:%s", imagePaths[i].GetData());
  933. if (!ExistsFile(imagePaths[i]))
  934. {
  935. Dbg("image <%s> not exist.", imagePaths[i].GetData());
  936. DeleteBmp(BmpImage);
  937. ctx->Answer(Error_NoTarget);
  938. return 0;
  939. }
  940. }
  941. errCode = m_hDevHelper->Image2Template(imagePaths[0], imagePaths[1], imagePaths[2], lpbTemplate, lpbLength);
  942. if (Error_Succeed == errCode)
  943. {
  944. Dbg("Invoke routine 'Image2Template' success");
  945. Dbg("template length is %d", lpbLength);
  946. if (lpbTemplate != NULL && lpbLength == STANDARD_FEATURE_LEN) {
  947. //Dbg("before add eof, template = %s", (LPCTSTR)lpbTemplate);
  948. lpbTemplate[lpbLength] = '\0';
  949. //Dbg("after add eof, template = %s", (LPCTSTR)lpbTemplate);
  950. ctx->Ans.templateFeature = (LPCTSTR)lpbTemplate;
  951. }
  952. else {
  953. Dbg("template is NULL or template length is not right.");
  954. errCode = Error_Unexpect;
  955. }
  956. }
  957. else {
  958. SetErrPackage(m_errPkg, "GenerateTemplate::Image2Template", m_csDevSN, errCode, MEC_DEVAPI_FINGERPRINT_Image2Template);
  959. AlarmDEC(m_errPkg);
  960. errCode = Error_Unexpect;
  961. }
  962. DeleteBmp(BmpImage);
  963. if (errCode == Error_Succeed)
  964. ctx->Answer(Error_Succeed);
  965. else {
  966. SetErrPackage(m_errPkg, "generate template failed", m_csDevSN, Error_Unexpect, FingerPrint_UserErrorCode_GETTEMPLATE_FAILED);
  967. ctx->Answer(errCode, AlarmDEC(m_errPkg));
  968. }
  969. delete[] lpbTemplate;
  970. lpbTemplate = NULL;
  971. return 0;
  972. }
  973. #pragma endregion
  974. #pragma region match - old interface
  975. ErrorCodeEnum CFingerPrintFSM::Match(SpReqAnsContext<FingerPrintService_Match_Req, FingerPrintService_Match_Ans>::Pointer ctx)
  976. {
  977. LOG_FUNCTION();
  978. ScanParam* initParam = new ScanParam();
  979. ErrorCodeEnum errCode = InitParamBeforeMatch(initParam, ctx->Req.templateNum);
  980. if (errCode != Error_Succeed)
  981. return errCode;
  982. ScanBeforeMatch(initParam);
  983. errCode = MatchProcess(initParam, ctx);
  984. return errCode;
  985. }
  986. ErrorCodeEnum CFingerPrintFSM::InitParamBeforeMatch(ScanParam* initParam, int templateNum)
  987. {
  988. ErrorCodeEnum errCode = Error_Succeed;
  989. errCode = InitCommParam(initParam, MatchType, 0, templateNum);
  990. if (errCode != Error_Succeed)
  991. return errCode;
  992. initParam->m_BmpFileName = "finger.bmp";
  993. initParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  994. , initParam->m_DepPath.GetData()
  995. , initParam->m_BmpFileName.GetData());
  996. Dbg("get imageName success: %s", initParam->m_FullFilePath.GetData());
  997. return Error_Succeed;
  998. }
  999. void CFingerPrintFSM::ScanBeforeMatch(ScanParam* initParam)
  1000. {
  1001. ErrorCodeEnum errCode = Error_Succeed;
  1002. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
  1003. while (initParam->m_TimeLeft < FINGERPRINT_MATCH_TIMEOUT
  1004. && !m_bCancelMatch && !initParam->m_ScanSuc)
  1005. {
  1006. if (m_bExit)
  1007. {
  1008. Dbg("Exit");
  1009. initParam->m_Quit = true;
  1010. break;
  1011. }
  1012. SLEEP(FINGERPRINT_SCAN_INTERNAL);
  1013. initParam->m_FeatureLen = MAX_FEATURE_LEN;
  1014. errCode = m_hDevHelper->Image2Feature(initParam->m_BmpFileName
  1015. , initParam->m_Feature
  1016. , initParam->m_FeatureLen);
  1017. if (errCode == Error_Succeed)
  1018. {
  1019. Dbg("Invoke routine 'Image2Feature' success.");
  1020. SLEEP(200);
  1021. if (ExistsFile(initParam->m_FullFilePath) && initParam->m_Feature != NULL && initParam->m_FeatureLen > 0)
  1022. {
  1023. Dbg("fingerprint feature length is %d", initParam->m_FeatureLen);
  1024. initParam->m_ScanSuc = true;
  1025. break;
  1026. }
  1027. else if (!ExistsFile(initParam->m_FullFilePath))
  1028. {
  1029. Dbg("Cannot find the fingerprint image finger.bmp");
  1030. initParam->m_NotFindImage = true;
  1031. break;
  1032. }
  1033. else {
  1034. Dbg("Fingerprint feature is NULL.");
  1035. initParam->m_FeatureIsNull = true;
  1036. break;
  1037. }
  1038. }
  1039. else {
  1040. DevErrorInfo devErrInfo;
  1041. m_hDevHelper->GetLastErr(devErrInfo);
  1042. Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s)"
  1043. , SpStrError(errCode), devErrInfo.szErrMsg);
  1044. }
  1045. initParam->m_TimeEnd = RVCGetTickCount();
  1046. initParam->m_TimeLeft = initParam->m_TimeEnd - initParam->m_TimeStart;
  1047. }
  1048. LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning off");
  1049. m_bExit = false;
  1050. Dbg("after match, clear bmp file");
  1051. DeleteBmp(BmpImage);
  1052. }
  1053. ErrorCodeEnum CFingerPrintFSM::MatchProcess(ScanParam* initParam, SpReqAnsContext<FingerPrintService_Match_Req, FingerPrintService_Match_Ans>::Pointer& ctx)
  1054. {
  1055. ErrorCodeEnum errCode = Error_Succeed;
  1056. if (initParam->m_ScanSuc)
  1057. {
  1058. Dbg("templateNum=%d", ctx->Req.templateNum);
  1059. int templateNum = ctx->Req.templateNum;
  1060. LPBYTE* lpbTemplates = new LPBYTE[templateNum];
  1061. int* lpbTemplateLen = new int[templateNum];
  1062. for (int i = 0; i < templateNum; ++i)
  1063. {
  1064. lpbTemplates[i] = new BYTE[MAX_FEATURE_LEN];
  1065. memset(lpbTemplates[i], 0, sizeof(lpbTemplates[i]));
  1066. strcpy((char*)lpbTemplates[i], ctx->Req.templates[i]);
  1067. lpbTemplateLen[i] = ctx->Req.templateLen[i];
  1068. }
  1069. ULLINT startMatch = RVCGetTickCount();
  1070. errCode = m_hDevHelper->Match(lpbTemplates, lpbTemplateLen, templateNum,
  1071. initParam->m_Feature, initParam->m_FeatureLen);
  1072. ULLINT endMatch = RVCGetTickCount();
  1073. int duration = endMatch - startMatch;
  1074. LogWarn(Severity_Middle, Error_Debug, FingerPrint_UserErrorCode_MATCH_TIME,
  1075. GenerateAlarmJson("FingerPrint", duration).GetData());
  1076. if (errCode == Error_Succeed) //always true
  1077. {
  1078. Dbg("Invoke routine 'Match' success");
  1079. ctx->Ans.result.Init(templateNum);
  1080. for (int i = 0; i < templateNum; ++i)
  1081. ctx->Ans.result[i] = lpbTemplateLen[i];
  1082. }
  1083. else {
  1084. DevErrorInfo devErrInfo;
  1085. m_hDevHelper->GetLastErr(devErrInfo);
  1086. LogError(Severity_High, Error_Hardware
  1087. , FingerPrint_UserErrorCode_INVOKE_MATCH_FAILED
  1088. , "Invoke routine 'Match' failed.");//no this situation
  1089. Dbg("Invoke routine 'Match' failed which returned %s(%s)"
  1090. , SpStrError(errCode), devErrInfo.szErrMsg);
  1091. errCode = Error_Unexpect;
  1092. }
  1093. for (int i = 0; i < templateNum; ++i)
  1094. {
  1095. delete[] lpbTemplates[i];
  1096. lpbTemplates[i] = NULL;
  1097. }
  1098. delete[] lpbTemplateLen;
  1099. lpbTemplateLen = NULL;
  1100. delete[] lpbTemplates;
  1101. lpbTemplates = NULL;
  1102. }
  1103. else if (initParam->m_TimeLeft >= FINGERPRINT_MATCH_TIMEOUT)
  1104. {
  1105. Dbg("Match timeout(Invoke vendor failed or not press finger)");
  1106. errCode = Error_TimeOut;
  1107. }
  1108. else if (m_bCancelMatch)
  1109. {
  1110. errCode = Error_Cancel;
  1111. }
  1112. else
  1113. {
  1114. if (initParam->m_NotFindImage)
  1115. {
  1116. LogError(Severity_High, Error_Hardware
  1117. , FingerPrint_UserErrorCode_NO_IMAGE_IN_DEP_MATCH
  1118. , "not find fingerprint image in dep while match.");
  1119. }
  1120. else if (initParam->m_FeatureIsNull)
  1121. {
  1122. LogError(Severity_High, Error_Hardware
  1123. , FingerPrint_UserErrorCode_GETFEATURE_FAILED_MATCH
  1124. , "fingerprint feature is null while match.");
  1125. }
  1126. else if (initParam->m_Quit)
  1127. {
  1128. LogWarn(Severity_Middle, Error_Hardware
  1129. , FingerPrint_UserErrorCode_MATCH_FAILED
  1130. , "Exit to homepage when match.");
  1131. }
  1132. errCode = Error_Unexpect;
  1133. }
  1134. delete[] initParam->m_Feature;
  1135. initParam->m_Feature = NULL;
  1136. delete initParam;
  1137. initParam = NULL;
  1138. return errCode;
  1139. }
  1140. #pragma endregion
  1141. #pragma region common function
  1142. ErrorCodeEnum CFingerPrintFSM::InitCommParam(ScanParam* initParam, int operateType, int scanTime, int templateNum)
  1143. {
  1144. LOG_FUNCTION();
  1145. ErrorCodeEnum errCode = Error_Succeed;
  1146. if (!initParam)
  1147. return Error_Param;
  1148. if (!m_devInit)
  1149. errCode = Error_NotInit; //maybe no vendor adapter
  1150. //if ((operateType & RegisterType) == RegisterType)
  1151. //{
  1152. // if (m_bCancelRegister) //no cancel button anymore while register
  1153. // {
  1154. // Dbg("cancel flag");
  1155. // m_bCancelRegister = false;
  1156. // errCode = Error_Cancel;
  1157. // }
  1158. //}
  1159. if ((operateType & MatchType) == MatchType && templateNum <= 0)
  1160. errCode = Error_Param;
  1161. if (errCode != Error_Succeed) {
  1162. delete initParam;
  1163. initParam = NULL;
  1164. return errCode;
  1165. }
  1166. initParam->m_TimeStart = RVCGetTickCount();
  1167. initParam->m_TimeEnd = RVCGetTickCount();
  1168. initParam->m_TimeLeft = 0;
  1169. initParam->m_Feature = new BYTE[MAX_FEATURE_LEN];
  1170. initParam->m_FeatureLen = MAX_FEATURE_LEN;
  1171. initParam->m_FullFilePath = "";
  1172. initParam->m_ScanSuc = false;
  1173. initParam->m_NotFindImage = false;
  1174. initParam->m_FeatureIsNull = false;
  1175. initParam->m_bLenIsNotRight = false;
  1176. initParam->m_bGetFingerPrintSuc = false;
  1177. initParam->m_Quit = false;
  1178. if (scanTime == 1)
  1179. {
  1180. m_BmpFileFullPath1 = "";
  1181. m_BmpFileFullPath2 = "";
  1182. m_BmpFileFullPath3 = "";
  1183. Dbg("before scan fingerprint, clear bmp file");
  1184. DeleteBmp(BmpImage);
  1185. Dbg("before scan fingerprint, finish doing clear job");
  1186. }
  1187. if ((operateType & RegisterType) == RegisterType)
  1188. {
  1189. initParam->m_Template = new BYTE[MAX_FEATURE_LEN];
  1190. initParam->m_GetTemplateSuc = true;
  1191. m_bCancelRegister = false;
  1192. memset(initParam->m_Template, 0, sizeof(initParam->m_Template));
  1193. }
  1194. else
  1195. m_bCancelMatch = false;
  1196. memset(initParam->m_Feature, 0, sizeof(initParam->m_Feature));
  1197. errCode = m_pEntity->GetFunction()->GetPath("Dep", initParam->m_DepPath);
  1198. if (errCode != Error_Succeed)
  1199. {
  1200. Dbg("operateType = %d", RegisterType);
  1201. delete[] initParam->m_Feature;
  1202. initParam->m_Feature = NULL;
  1203. if ((operateType & RegisterType) == RegisterType)
  1204. {
  1205. delete[] initParam->m_Template;
  1206. initParam->m_Template = NULL;
  1207. Dbg("Get dep path failed while register.");
  1208. LogError(Severity_High, Error_DevLoadFileFailed
  1209. , FingerPrint_UserErrorCode_GET_DEP_PATH_FAILED_REGISTER
  1210. , "Get dep path failed while register.");
  1211. }
  1212. else {
  1213. Dbg("Get dep path failed while match.");
  1214. LogError(Severity_High, Error_DevLoadFileFailed
  1215. , FingerPrint_UserErrorCode_GET_DEP_PATH_FAILED_MATCH
  1216. , "get dep path failed while match.");
  1217. }
  1218. delete initParam;
  1219. initParam = NULL;
  1220. return Error_Param;
  1221. }
  1222. return Error_Succeed;
  1223. }
  1224. ErrorCodeEnum CFingerPrintFSM::GetDevCatInfo(DevCategoryInfo& devInfo)
  1225. {
  1226. Dbg("m_devCatInfo.szModel:%s, len:%d", m_devCatInfo.szModel, strlen(m_devCatInfo.szModel));
  1227. Dbg("m_devCatInfo.szType:%s, len:%d", m_devCatInfo.szType, strlen(m_devCatInfo.szType));
  1228. Dbg("m_devCatInfo.szVendor:%s, len:%d", m_devCatInfo.szVendor, strlen(m_devCatInfo.szVendor));
  1229. #ifdef RVC_OS_WIN
  1230. strncpy_s(devInfo.szModel, MAX_DEV_MODEL_LEN, m_devCatInfo.szModel, strlen(m_devCatInfo.szModel));
  1231. strncpy_s(devInfo.szType, MAX_DEV_TYPE_LEN, m_devCatInfo.szType, strlen(m_devCatInfo.szType));
  1232. strncpy_s(devInfo.szVendor, MAX_DEV_VENDOR_LEN, m_devCatInfo.szVendor, strlen(m_devCatInfo.szVendor));
  1233. #else
  1234. strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN);
  1235. strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN);
  1236. strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN);
  1237. #endif // RVC_OS_WIN
  1238. return Error_Succeed;
  1239. }
  1240. CSimpleString CFingerPrintFSM::GenerateAlarmJson(CSimpleString entityName, int cost)
  1241. {
  1242. return CSimpleString::Format("[{\"name\":\"%s\",\"cost\":%d}]", entityName.GetData(), cost);
  1243. }
  1244. ErrorCodeEnum CFingerPrintFSM::GetDevState(int& state)
  1245. {
  1246. ErrorCodeEnum errCode;
  1247. state = 0;
  1248. if (!m_devInit) {
  1249. return Error_Succeed;
  1250. }
  1251. CSimpleStringA fileName = "testFinger.bmp";
  1252. LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
  1253. int lpbLength = MAX_FEATURE_LEN;
  1254. errCode = m_hDevHelper->Image2Feature(fileName, lpbFeature, lpbLength);
  1255. if (errCode == Error_Succeed)
  1256. {
  1257. state = 1;
  1258. DeleteBmp(TestImage);
  1259. }
  1260. delete[] lpbFeature;
  1261. lpbFeature = NULL;
  1262. return Error_Succeed;
  1263. }
  1264. bool CFingerPrintFSM::IsFWBDevice(CSimpleString& vendorName)
  1265. {
  1266. CSimpleStringA tmpDevSN("");
  1267. bool isFWB = false;
  1268. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  1269. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  1270. {
  1271. Dbg("This is fwb device.");
  1272. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", vendorName);
  1273. isFWB = true;
  1274. }
  1275. return isFWB;
  1276. }
  1277. ErrorCodeEnum CFingerPrintFSM::CheckCardSwiperStatus()
  1278. {
  1279. ErrorCodeEnum errCode = Error_Unexpect;
  1280. CardSwiperService_ClientBase* pCardSwiperClient = new CardSwiperService_ClientBase(this->GetEntityBase());
  1281. errCode = pCardSwiperClient->Connect();
  1282. if (errCode != Error_Succeed)
  1283. {
  1284. Dbg("connect CardSwiper fail %s.", SpStrError(errCode));
  1285. pCardSwiperClient->SafeDelete();
  1286. }
  1287. else {
  1288. CardSwiperService_GetDevInfo_Req req = {};
  1289. CardSwiperService_GetDevInfo_Ans ans = {};
  1290. errCode = pCardSwiperClient->GetDevInfo(req, ans, 3000);
  1291. if (errCode != Error_Succeed)
  1292. {
  1293. Dbg("CardSwiper::GetDevInfo() fail: 0x%x", errCode);
  1294. }
  1295. else {
  1296. Dbg("CardSwiper::GetDevInfo() return state: %d", ans.state);
  1297. if (ans.state == DEVICE_STATUS_NOT_READY)
  1298. {
  1299. SLEEP(500);
  1300. CardSwiperService_GetDevInfo_Req req2 = {};
  1301. CardSwiperService_GetDevInfo_Ans ans2 = {};
  1302. errCode = pCardSwiperClient->GetDevInfo(req2, ans2, 3000);
  1303. if (errCode != Error_Succeed)
  1304. {
  1305. Dbg("CardSwiper::GetDevInfo() again fail with err(%s)", SpStrError(errCode));
  1306. }
  1307. else {
  1308. Dbg("CardSwiper::GetDevInfo() again return state: %d", ans2.state);
  1309. if (ans2.state != DEVICE_STATUS_NORMAL)
  1310. errCode = Error_DevNotAvailable;
  1311. }
  1312. }
  1313. else if (ans.state != DEVICE_STATUS_NORMAL)
  1314. errCode = Error_DevNotAvailable;
  1315. }
  1316. pCardSwiperClient->GetFunction()->CloseSession();
  1317. }
  1318. return errCode;
  1319. }
  1320. void CFingerPrintFSM::DeleteBmp(int type)
  1321. {
  1322. if ((type & BmpImage) == BmpImage)
  1323. {
  1324. Dbg("to delete fingerprint images...");
  1325. CSimpleStringA imageName;
  1326. DeleteFileIfExisted("finger.bmp");
  1327. for (int i = 1; i <= 10; ++i) {
  1328. imageName = CSimpleString::Format("finger%d.bmp", i);
  1329. DeleteFileIfExisted(imageName.GetData());
  1330. }
  1331. }
  1332. if ((type & TestImage) == TestImage)
  1333. {
  1334. DeleteFileIfExisted("testFinger.bmp");
  1335. }
  1336. }
  1337. ErrorCodeEnum CFingerPrintFSM::DeleteFileIfExisted(const char* fileName)
  1338. {
  1339. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  1340. {
  1341. Dbg("Invalid or empty filename(%s)", fileName);
  1342. return Error_Param;
  1343. }
  1344. CSimpleStringA strPath, strObjPath;
  1345. ErrorCodeEnum errCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1346. strObjPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
  1347. , strPath.GetData(), fileName);
  1348. if (ExistsFileA(strObjPath))
  1349. {
  1350. if (RemoveFileA(strObjPath))
  1351. {
  1352. Dbg("DeleteFile(%s) success.", strObjPath.GetData());
  1353. return Error_Succeed;
  1354. }
  1355. else {
  1356. Dbg("DeleteFile(%s) failed LastError(%s).", strObjPath.GetData(), GetLastError());
  1357. return Error_Unexpect;
  1358. }
  1359. }
  1360. else {
  1361. Dbg("file %s not exist.", fileName);
  1362. return Error_Succeed;
  1363. }
  1364. }
  1365. #pragma endregion