fingerprint.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. #include "fingerprint.h"
  2. #include "CkLog.h"
  3. //CTraceManager g_Trace;
  4. LOG_EXTERN()
  5. //获取当前模块所在路径
  6. void GetModulePath(char* lpStrPath)
  7. {
  8. LOG_FUNCTION();
  9. char szBuff[MAX_PATH];
  10. Dl_info path_info;
  11. std::string strLog = "";
  12. memset(&path_info, 0x00, sizeof(path_info));
  13. memset(szBuff, 0x00, sizeof(szBuff));
  14. int iRet = dladdr((const void*)GetModulePath, &path_info);
  15. if(!iRet)
  16. {
  17. return;
  18. }
  19. else
  20. {
  21. strcpy(szBuff, path_info.dli_fname);
  22. char *pLast=strrchr(szBuff, '/'); //find last '/'
  23. if(nullptr != pLast) *pLast = 0; //cut
  24. strcat(szBuff, "/"); //
  25. if(nullptr != lpStrPath)
  26. strcpy(lpStrPath, szBuff);
  27. }
  28. }
  29. FingerPrintClassImpl::FingerPrintClassImpl():
  30. m_pDll(nullptr)
  31. ,m_bDevOpen(false)
  32. ,m_nPort(-1)
  33. ,m_strIniPath("")
  34. ,m_strDllPath("")
  35. {
  36. LOG_FUNCTION();
  37. memset(m_strModulePath, 0x00, sizeof(m_strModulePath));
  38. GetModulePath(m_strModulePath); //获取so所在路径
  39. m_strIniPath = m_strModulePath;
  40. m_strIniPath += "CK-VTM-E1000.INI";
  41. m_strDllPath = m_strModulePath;
  42. }
  43. FingerPrintClassImpl::~FingerPrintClassImpl()
  44. {
  45. LOG_FUNCTION();
  46. DevClose();
  47. if(m_pDll != nullptr)
  48. {
  49. delete m_pDll;
  50. }
  51. m_bDevOpen = false;
  52. }
  53. ErrorCodeEnum FingerPrintClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  54. {
  55. LOG_FUNCTION();
  56. LogM("FingerPrintClassImpl::Entry->FingerPrint GetDevCategory()!");
  57. int iRet = 0;
  58. char szDevInfo[128] = {0};
  59. char sID[1024] = {0};
  60. //记日志
  61. memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
  62. memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
  63. memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
  64. memset(szDevInfo, 0, sizeof(szDevInfo));
  65. memset(sID, 0, sizeof(sID));
  66. iRet = m_pDll->FPIGetVersion(szDevInfo,sID);
  67. if(iRet == FP_ERROR_SUCCESS)
  68. {
  69. snprintf(devCategory.szType,sizeof (devCategory.szType) ,"PVER=Wellcom#MID=%s", szDevInfo);
  70. }
  71. else
  72. {
  73. memcpy(devCategory.szType, "PVER=Wellcom#MID=JZT-998APB-V20_V1.0.4.1_SC_[20150320]", strlen("PVER=Wellcom#MID=JZT-998APB-V20_V1.0.4.1_SC_[20150320]"));
  74. SaveErrorInfo(iRet);
  75. }
  76. memcpy(devCategory.szVendor, "keba", strlen("keba"));
  77. LogM("devCategory.szType = %s",devCategory.szType);
  78. LogM("devCategory.szVendor = %s",devCategory.szVendor);
  79. LogM("FingerPrintClassImpl::Leave->FingerPrint GetDevCategory() sucessfull!");
  80. return Error_Succeed;
  81. }
  82. // Reset device.
  83. // Do the cleaning work and initialize device again in order to return to
  84. // the normal condition.
  85. ErrorCodeEnum FingerPrintClassImpl::Reset()
  86. {
  87. LOG_FUNCTION();
  88. LogM("FingerPrintClassImpl::Entry->FingerPrint Reset()!");
  89. DevClose();
  90. LogM("FingerPrintClassImpl::Leave->FingerPrint Reset() sucessfull!");
  91. return DevOpen(0, 0);
  92. }
  93. //
  94. // Close device and do the cleaning work.
  95. // ex. close connection,close port,release memery and so on
  96. ErrorCodeEnum FingerPrintClassImpl::DevClose()
  97. {
  98. //记日志
  99. LOG_FUNCTION();
  100. LogM("FingerPrintClassImpl::Entry->FingerPrint DevClose()!");
  101. if(!m_bDevOpen)
  102. {
  103. return Error_Succeed;
  104. }
  105. //CLOSEDEV();
  106. m_pDll->FPIDeviceClose();
  107. m_pDll->FreeDLL();
  108. m_bDevOpen = false;
  109. LogM("FingerPrintClassImpl::Leave->FingerPrint DevClose() sucessfull!");
  110. return Error_Succeed;
  111. }
  112. // Get last error the device issued.
  113. // Error message must include explanatory memorandum ,the original error
  114. // code and anything in favour of location problem.
  115. ErrorCodeEnum FingerPrintClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  116. {
  117. LOG_FUNCTION();
  118. LogM("FingerPrintClassImpl::Entry->FingerPrint GetLastErr()!");
  119. devErrInfo.dwErrMsgLen = 0;
  120. memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
  121. devErrInfo.dwErrMsgLen = (m_shErrCode << 16);
  122. sprintf(devErrInfo.szErrMsg, m_szErrMsg);
  123. devErrInfo.dwErrMsgLen += (strlen(devErrInfo.szErrMsg) & 0x0000FFFF);
  124. LogM("devErrInfo.szErrMsg = %s",devErrInfo.szErrMsg);
  125. LogM("FingerPrintClassImpl::Leave->FingerPrint GetLastErr() sucessfull!");
  126. return Error_Succeed;
  127. }
  128. ErrorCodeEnum FingerPrintClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  129. {
  130. LOG_FUNCTION();
  131. LogM("FingerPrintClassImpl::Entry->FingerPrint DevOpen()!");
  132. int iRet;
  133. CHAR strDllPath[256] = {0};
  134. char sDevInfo[64+1] = {0};
  135. char sID[1024] = {0};
  136. const char * tmpStr = "libFpDriverUSB_FGB.keba.so";
  137. strncat(strDllPath, "libFpDriverUSB_FGB.keba.so",strlen(tmpStr));
  138. m_pDll = new CDevDllLoad(strDllPath);
  139. if (nullptr == m_pDll)
  140. {
  141. LogM("FingerPrintClassImpl::Entry->FingerPrint DevOpen() new object CDevDllLoad failed!");
  142. SaveErrorInfo("对象创建失败", DEC_DEV_OBJECT_CREATE_FAILED);
  143. return Error_DevNotAvailable;
  144. }
  145. iRet = m_pDll->FPIDeviceInit();
  146. //记日志
  147. if(iRet != 1)
  148. {
  149. LogM("FingerPrintClassImpl::Entry->FingerPrint DevOpen()->m_pDll->FPIDeviceInit() failed! <=> iRet = %d",iRet);
  150. m_bDevOpen = false;
  151. return Error_DevNotAvailable;
  152. }
  153. LogM("FingerPrintClassImpl::Entry->FingerPrint DevOpen()->m_pDll->FPIDeviceInit() success! <=> iRet = %d",iRet);
  154. m_bDevOpen = true;
  155. memset(sDevInfo, 0, sizeof(sDevInfo));
  156. memset(sID, 0, sizeof(sID));
  157. iRet = m_pDll->FPIGetVersion(sDevInfo,sID);
  158. if (iRet == 1)
  159. {
  160. LogM("FingerPrintClassImpl::Leave->FingerPrint DevOpen()->m_pDll->FPIGetVersion sucessfull!");
  161. }
  162. return Error_Succeed;
  163. }
  164. void FingerPrintClassImpl::SaveErrorInfo(CHAR* errMsg, int errCode)
  165. {
  166. LOG_FUNCTION();
  167. LogM("FingerPrintClassImpl::Entry->FingerPrint SaveErrorInfo(CHAR* errMsg, int errCode)! <=> errMsg = %s errCode = %d",errMsg,errCode);
  168. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  169. snprintf(m_szErrMsg, sizeof (m_szErrMsg),"%s[%d]", errMsg, errCode);
  170. LogM("FingerPrintClassImpl::Leave->FingerPrint DevOpen()->m_pDll->SaveErrorInfo(CHAR* errMsg, int errCode) sucessfull!");
  171. }
  172. void FingerPrintClassImpl::SaveErrorInfo(DevErrorInfo devErrorInfo)
  173. {
  174. LOG_FUNCTION();
  175. LogM("FingerPrintClassImpl::Entry->FingerPrint SaveErrorInfo(DevErrorInfo devErrorInfo)! <=> devErrorInfo.szErrMsg = %s",devErrorInfo.szErrMsg);
  176. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  177. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%s",devErrorInfo.szErrMsg);
  178. LogM("FingerPrintClassImpl::Leave->FingerPrint DevOpen()->m_pDll->SaveErrorInfo(DevErrorInfo devErrorInfo) sucessfull!");
  179. }
  180. void FingerPrintClassImpl::SaveErrorInfo(int nErrorCode)
  181. {
  182. LOG_FUNCTION();
  183. LogM("FingerPrintClassImpl::Entry->FingerPrint SaveErrorInfo(int nErrorCode)! <=> nErrorCode = %d",nErrorCode);
  184. ErrorCodeEnum ret;
  185. switch (nErrorCode)
  186. {
  187. case FP_ERROR_SUCCESS:
  188. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  189. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_SUCCESS, "成功");
  190. m_shErrCode = DEC_SUCCESS;
  191. ret = Error_Succeed;
  192. break;
  193. case FP_ERROR_INVALID_PARAMETER:
  194. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  195. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_INVALID_PARAMETER, "参数错误。给定函数的参数有错误。");
  196. m_shErrCode = DEC_INVALID_PARAMETER;
  197. ret = Error_Param;
  198. break;
  199. case FP_ERROR_NOT_ENOUGH_MEMORY:
  200. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  201. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_NOT_ENOUGH_MEMORY, "内存分配失败。没有分配到足够的内存。");
  202. m_shErrCode = DEC_ALLOC_DENY;
  203. ret = Error_Param;
  204. break;
  205. case FP_ERROR_NOT_SUPPORT_FUNCTION:
  206. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  207. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_NOT_SUPPORT_FUNCTION, "功能未开放。调用函数的功能没有实现。");
  208. m_shErrCode = DEC_FUNCTION_MISMATCH;
  209. ret = Error_Param;
  210. break;
  211. case FP_ERROR_DEVICE_NOT_FOUND:
  212. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  213. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_DEVICE_NOT_FOUND, "设备不存在。初始化的时候,检测到设备不存在。");
  214. m_shErrCode = DEC_DEV_NOT_FOUND;
  215. ret = Error_DevConnFailed;
  216. break;
  217. case FP_ERROR_DEVICE_NOT_INIT:
  218. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  219. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_DEVICE_NOT_INIT, "设备未初始化。");
  220. m_shErrCode = DEC_DEV_NOT_OPENED;
  221. ret = Error_NotInit;
  222. break;
  223. case FP_ERROR_INVALIDE_CODE:
  224. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  225. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_INVALIDE_CODE, "非法的错误号。");
  226. m_shErrCode = DEC_INVALID_PARAMETER;
  227. ret = Error_Param;
  228. break;
  229. case FP_ERROR_NO_PRIVILEGE:
  230. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  231. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_NO_PRIVILEGE, "没有授权。");
  232. m_shErrCode = DEC_INVALID_PARAMETER;
  233. ret = Error_Param;
  234. break;
  235. case FP_ERROR_BASE64:
  236. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  237. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_DEVICE_NOT_FOUND, "BASE64编解码失败。");
  238. m_shErrCode = DEC_INVALID_PARAMETER;
  239. ret = Error_Param;
  240. break;
  241. case FP_ERROR_EXCEPTION:
  242. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  243. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_EXCEPTION, "操作异常");
  244. m_shErrCode = DEC_INVALID_PARAMETER;
  245. ret = Error_Param;
  246. break;
  247. case FP_ERROR_RESERVE:
  248. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  249. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_RESERVE, "系统保留");
  250. m_shErrCode = DEC_INVALID_PARAMETER;
  251. ret = Error_Param;
  252. break;
  253. case FP_ERROR_MAC:
  254. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  255. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_MAC, "MAC错误");
  256. m_shErrCode = DEC_INVALID_MAC;
  257. ret = Error_Param;
  258. break;
  259. case FP_ERROR_ID:
  260. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  261. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_ID, "设备ID错误");
  262. m_shErrCode = DEC_INVALID_PARAMETER;
  263. ret = Error_Param;
  264. break;
  265. case FP_ERROR_IMAGE:
  266. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  267. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_IMAGE, "图像错误");
  268. m_shErrCode = DEC_INVALID_PARAMETER;
  269. ret = Error_Param;
  270. break;
  271. case FP_ERROR_FILE_NO_FOUND:
  272. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  273. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_FILE_NO_FOUND, "文件不存在");
  274. m_shErrCode = DEC_INVALID_PARAMETER;
  275. ret = Error_Param;
  276. break;
  277. case FP_ERROR_UNSUCCESS:
  278. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  279. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_UNSUCCESS, "操作失败");
  280. m_shErrCode = DEC_INVALID_PARAMETER;
  281. ret = Error_Param;
  282. break;
  283. case FP_ERROR_UNKNOWN:
  284. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  285. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_UNKNOWN, "未知错误");
  286. m_shErrCode = DEC_UNEXPECTED;
  287. ret = Error_Param;
  288. break;
  289. case FP_ERROR_DEVICECMD:
  290. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  291. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_DEVICECMD, "通讯错误");
  292. m_shErrCode = DEC_COMMUNICATION_FAILED;
  293. ret = Error_DevCommFailed;
  294. break;
  295. case FP_ERROR_TIMEOUT:
  296. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  297. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_TIMEOUT, "操作超时");
  298. m_shErrCode = DEC_TIMEOUT;
  299. ret = Error_TimeOut;
  300. break;
  301. case FP_ERROR_CANCEL:
  302. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  303. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_CANCEL, "操作取消");
  304. m_shErrCode = DEC_CANCEL;
  305. ret = Error_Cancel;
  306. break;
  307. case FP_ERROR_IMAGE_NOTENOUGH:
  308. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  309. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_IMAGE_NOTENOUGH, "图像不合格");
  310. m_shErrCode = DEC_EXCEPTION;
  311. ret = Error_Param;
  312. break;
  313. case FP_ERROR_IS_BUSY:
  314. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  315. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_IS_BUSY, "设备正忙");
  316. m_shErrCode = DEC_HARDWARE;
  317. ret = Error_Busy;
  318. break;
  319. case FP_ERROR_FINGER_VERIFY:
  320. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  321. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_FINGER_VERIFY, "指纹比对失败");
  322. m_shErrCode = DEC_INVALID_PARAMETER;
  323. ret = Error_MisMatched;
  324. break;
  325. case FP_ERROR_FINGER_EXTRACT:
  326. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  327. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_FINGER_EXTRACT, "合成特征失败");
  328. m_shErrCode = DEC_INVALID_PARAMETER;
  329. ret = Error_Param;
  330. break;
  331. case FP_ERROR_FINGER_ENROLL:
  332. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  333. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_FINGER_ENROLL, "合成模板失败");
  334. m_shErrCode = DEC_INVALID_PARAMETER;
  335. ret = Error_Param;
  336. break;
  337. case FP_ERROR_FINGER_ILLEGAL:
  338. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  339. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_FINGER_ILLEGAL, "非法指纹数据");
  340. m_shErrCode = DEC_INVALID_DATA;
  341. ret = Error_Param;
  342. break;
  343. case FP_ERROR_INVALID_TEMPLATE:
  344. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  345. snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FP_ERROR_INVALID_TEMPLATE, "模板参数错误");
  346. m_shErrCode = DEC_INVALID_DATA;
  347. ret = Error_Param;
  348. break;
  349. case FP_ERROR_INVALID_FEATURE:
  350. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  351. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FP_ERROR_INVALID_FEATURE, "特征参数错误");
  352. m_shErrCode = DEC_INVALID_DATA;
  353. ret = Error_Param;
  354. break;
  355. default:
  356. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  357. snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",nErrorCode, "其它未定义的错误");
  358. m_shErrCode = DEC_ERROR_CODE_UNRECOGNIZABLE;
  359. ret = Error_Param;
  360. break;
  361. }
  362. LogM("FingerPrintClassImpl::Leave->FingerPrint DevOpen()->m_pDll->SaveErrorInfo(int nErrorCode) sucessfull!");
  363. }
  364. ErrorCodeEnum FingerPrintClassImpl::ScanFingerAndSaveImage(const char* imageName)
  365. {
  366. LOG_FUNCTION();
  367. LogM("FingerPrintClassImpl::Entry->FingerPrint ScanFingerAndSaveImage(const char* imageName)! <=>imageName = %s",imageName);
  368. int iRet =0;
  369. if( !m_bDevOpen )
  370. {
  371. SaveErrorInfo("ScanFingerAndSaveImage()->Dev is not open",Error_DevNotAvailable );
  372. //记日志
  373. return Error_DevNotAvailable;
  374. }
  375. iRet= m_pDll->FPIImg2Bmp(const_cast<char*>(imageName));
  376. if(iRet != FP_ERROR_SUCCESS)
  377. {
  378. SaveErrorInfo(iRet);
  379. LogM("FingerPrintClassImpl::entry->FingerPrint ScanFingerAndSaveImage()->m_pDll->FPIImg2Bmp failed!");
  380. return Error_DevMedia;
  381. }
  382. LogM("FingerPrintClassImpl::leave->FingerPrint ScanFingerAndSaveImage() sucessfull!");
  383. return Error_Succeed;
  384. }
  385. //计算特征值,iLength:输入代表buf最大长度,输出为特征实际长度
  386. //Compute features
  387. ErrorCodeEnum FingerPrintClassImpl::Image2Feature(const char* imagePath, LPBYTE lpbFeature, int &iLength)
  388. {
  389. LOG_FUNCTION();
  390. LogM("FingerPrintClassImpl::entry FingerPrint->Image2Feature()");
  391. int iRet =0;
  392. CHAR strImgPath[256] = {0};
  393. snprintf(strImgPath, sizeof(strImgPath), "%s%s", m_strModulePath, imagePath); //拼装图片路径
  394. LogM("自己改造好的PATH=%s",strImgPath);
  395. if( !m_bDevOpen )
  396. {
  397. SaveErrorInfo("Image2Feature()->Dev is not open",Error_DevNotAvailable );
  398. LogM("FingerPrintClassImpl::entry FingerPrint->Image2Feature()->Dev is not open");
  399. return Error_DevNotAvailable;
  400. }
  401. if(Error_Succeed != ScanFingerAndSaveImage(strImgPath))
  402. {
  403. LogM("FingerPrintClassImpl::entry FingerPrint->Image2Feature()->ScanFingerAndSaveImage() failed");
  404. return Error_DevMedia;
  405. }
  406. iRet = m_pDll->FPIBmp2Feature(const_cast<char*>(strImgPath), (char*)lpbFeature, &iLength);
  407. if(iRet != FP_ERROR_SUCCESS)
  408. {
  409. LOG4VTM(INFO,"FingerPrintClassImpl::entry FingerPrint->Image2Feature()->m_pDll->FPIBmp2Feature failed");
  410. LogM("FingerPrintClassImpl::entry FingerPrint->Image2Feature()->m_pDll->FPIBmp2Feature failed");
  411. SaveErrorInfo(iRet);
  412. return Error_DevMedia;
  413. }
  414. LogM("特征值长度=%d ",iLength);
  415. LogM("FingerPrintClassImpl::leave FingerPrint->Image2Feature() scessfull");
  416. return Error_Succeed;
  417. }
  418. //生成特征模板(注册时使用)
  419. //Convert image to template
  420. ErrorCodeEnum FingerPrintClassImpl::Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int &iLength)
  421. {
  422. LOG_FUNCTION();
  423. LogM("FingerPrintClassImpl::entry FingerPrint->Image2Template()");
  424. LogM("招行传递的图片PATH1=%s ",imagePath1);
  425. LogM("招行传递的图片PATH2=%s ",imagePath2);
  426. LogM("招行传递的图片PATH3=%s ",imagePath3);
  427. int iRet =0;
  428. CHAR strImgPath1[256] = {0};
  429. CHAR strImgPath2[256] = {0};
  430. CHAR strImgPath3[256] = {0};
  431. memcpy(strImgPath1,imagePath1,strlen(imagePath1));
  432. memcpy(strImgPath2,imagePath2,strlen(imagePath2));
  433. memcpy(strImgPath3,imagePath3,strlen(imagePath3));
  434. if( !m_bDevOpen )
  435. {
  436. SaveErrorInfo("Image2Template()->Dev is not open",Error_DevNotAvailable );
  437. return Error_DevNotAvailable;
  438. }
  439. iRet = m_pDll->FPIBmp2Template(const_cast<char*>(imagePath1), const_cast<char*>(imagePath2), const_cast<char*>(imagePath3), (char*)lpbTemplate,&iLength);
  440. if(iRet != FP_ERROR_SUCCESS)
  441. {
  442. SaveErrorInfo(iRet);
  443. LOG4VTM(INFO,"FingerPrintClassImpl::leave FingerPrint->Image2Template() failed ");
  444. return Error_DevMedia;
  445. }
  446. LogM("FingerPrintClassImpl::leave FingerPrint->Image2Template() scessfull!");
  447. LogM("模板值长度=%d ",iLength);
  448. LogM("FingerPrintClassImpl::leave FingerPrint->Image2Template() scessfull!");
  449. return Error_Succeed;
  450. }
  451. ErrorCodeEnum FingerPrintClassImpl::Match(LPBYTE lpbTemplate[], int iTemplateLen[] ,int templateNum, LPBYTE lbpFeature, int &iFeatureLen ,int level)
  452. {
  453. LOG_FUNCTION();
  454. LogM("FingerPrintClassImpl::entry FingerPrint->Match()");
  455. LogM("模板数组的个数=%d ",templateNum);
  456. LogM("特征值长度=%d ",iFeatureLen);
  457. int iRet =0;
  458. if( !m_bDevOpen )
  459. {
  460. SaveErrorInfo("Match()->Dev is not open",Error_DevNotAvailable );
  461. LogM("FingerPrintClassImpl::leave FingerPrint->Match() failed");
  462. return Error_DevNotAvailable;
  463. }
  464. for(int i=0; i<templateNum;i=i+1)
  465. {
  466. LogM("当前模板[%d]的长度=%d ",i,iTemplateLen[i]);
  467. iRet = m_pDll->FPIMatch((char*)(lpbTemplate[i]), (char*)(lbpFeature), level);
  468. if (iRet == FP_ERROR_SUCCESS)
  469. {
  470. iTemplateLen[i]=1;
  471. }
  472. else
  473. {
  474. iTemplateLen[i]=0;
  475. }
  476. LogM("与每个模板匹配的结果iTemplateLen[%d] = %d",i,iTemplateLen[i]);
  477. }
  478. LogM("FingerPrintClassImpl::leave FingerPrint->Match() scessfull");
  479. return Error_Succeed;
  480. }
  481. //取消采集指纹图片
  482. ErrorCodeEnum FingerPrintClassImpl::Cancel()
  483. {
  484. LOG_FUNCTION();
  485. LogM("FingerPrintClassImpl::entry FingerPrint->Cancel()!");
  486. int iRet =0;
  487. if( !m_bDevOpen )
  488. {
  489. //SaveErrorInfo("Cancel()->Dev is not open",Error_DevNotAvailable );
  490. LOG4VTM(INFO,"FingerPrintClassImpl::leave FingerPrint->Cancel() failed");
  491. return Error_DevNotAvailable;
  492. }
  493. iRet = m_pDll->FPICancel();
  494. if(iRet != FP_ERROR_SUCCESS)
  495. {
  496. SaveErrorInfo(iRet);
  497. LOG4VTM(INFO,"FingerPrintClassImpl::leave FingerPrint->Cancel() failed");
  498. return Error_DevMedia;
  499. }
  500. LogM("FingerPrintClassImpl::leave FingerPrint->Cancel() scessfull");
  501. return Error_Succeed;
  502. }