fingerprint.nantian.1.1.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. #include "fingerprint.nantian.1.1.h"
  2. #include "log4vendor.h"
  3. FINGERPRINTNANTIAN21_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
  4. {
  5. baseObj = new FingerPrintNantian21();
  6. if (baseObj == NULL)
  7. return Error_Null;
  8. else
  9. return Error_Succeed;
  10. }
  11. FINGERPRINTNANTIAN21_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
  12. {
  13. if (pBaseObj == NULL)
  14. return Error_Param;
  15. FingerPrintNantian21* pTmp = (FingerPrintNantian21*)(pBaseObj);
  16. delete pTmp;
  17. pTmp = NULL;
  18. return Error_Succeed;
  19. }
  20. // 这是已导出类的构造函数。
  21. // 有关类定义的信息,请参阅 FingerPrint.Nantian.4.1.h
  22. FingerPrintNantian21::FingerPrintNantian21()
  23. {
  24. m_gvar = NULL;
  25. m_gvar = new Gvar();
  26. memset(m_errinfo.szErrMsg,0,MAX_DEV_ERROR_MSG_LEN);
  27. strcpy(m_errinfo.szErrMsg,"操作成功");
  28. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  29. m_ecode = Error_Succeed;
  30. char INIPath[100] = "";
  31. CILIX_AUX_X::CILIX_GetModuleCurPath(INIPath);
  32. strcat(INIPath, "fingerprint.nantian.ini");
  33. char log_dir[100] = "";
  34. CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_dir", log_dir, "/etc/nantian");
  35. char log_level[100] = "";
  36. CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_level", log_level, "3");
  37. cmb::log_init_config config;
  38. config.dev_name = "FingerPrintso";
  39. config.log_dir = log_dir;
  40. config.log_level = atoi(log_level);
  41. std::string str;
  42. cmb::log4vendor::init(config, str);
  43. return;
  44. }
  45. FingerPrintNantian21::~FingerPrintNantian21()
  46. {
  47. if (m_gvar)
  48. {
  49. delete m_gvar;
  50. m_gvar = NULL;
  51. }
  52. return;
  53. }
  54. // TODO: 在此添加您的方法。
  55. //
  56. // Open Device
  57. // if usb device, set dwPort = 0
  58. ErrorCodeEnum FingerPrintNantian21::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  59. {
  60. int iret = Error_Succeed;
  61. LOG4VTM(WARN, "<DevOpen> - "<<"Enter-");
  62. CILIXAutoTrace _at(m_gvar->m_trace,"DevOpen",&iret);
  63. if (!m_gvar->m_isLoad)
  64. {
  65. iret = Error_DevLoadFileFailed;
  66. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"DevOpen","辅助库加载或辅助库方法加载失败");
  67. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  68. strcpy(m_errinfo.szErrMsg,"辅助库加载或辅助库方法加载失败");
  69. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  70. m_ecode = (ErrorCodeEnum)iret;
  71. LOG4VTM(WARN, "<DevOpen> - "<<"辅助库加载或辅助库方法加载失败 ");
  72. LOG4VTM(WARN, "<DevOpen> - "<<"Exit-");
  73. return (ErrorCodeEnum)iret;
  74. }
  75. char cDevName[300]="";
  76. iret = m_gvar->FPIFindDevice(m_gvar->m_port,cDevName);
  77. if (iret < 0)
  78. {
  79. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"DevOpen","查找设备失败,FPIFindDevice return =%d",iret);
  80. LOG4VTM(WARN, "<DevOpen> - "<<"查找设备失败,FPIFindDevice return "<<iret);
  81. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  82. strcpy(m_errinfo.szErrMsg,"查找设备失败");
  83. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  84. iret = Error_DevNotAvailable;
  85. m_ecode = (ErrorCodeEnum)iret;
  86. LOG4VTM(WARN, "<DevOpen> - "<<"Exit-");
  87. return (ErrorCodeEnum)iret;
  88. }
  89. m_gvar->m_connect = TRUE;
  90. iret = Error_Succeed;
  91. m_ecode = (ErrorCodeEnum)iret;
  92. LOG4VTM(WARN, "<DevOpen> - "<<"指纹仪打开成功");
  93. LOG4VTM(WARN, "<DevOpen> - "<<"Exit-");
  94. return (ErrorCodeEnum)iret;
  95. }
  96. //扫描指纹并保存指纹图片到默认路径下(dep目录下)
  97. //计算特征值,iLength:输入代表buf最大长度,输出为特征实际长度
  98. //Compute features
  99. ErrorCodeEnum FingerPrintNantian21::Image2Feature(const char* imagePath, LPBYTE lpbFeature, int &iLength)
  100. {
  101. int iret = Error_Succeed;
  102. CILIXAutoTrace _at(m_gvar->m_trace,"Image2Feature",&iret);
  103. LOG4VTM(WARN, "<Image2Feature> - "<<"Entry-");
  104. if (!m_gvar->m_isLoad)
  105. {
  106. iret = Error_DevLoadFileFailed;
  107. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature","辅助库加载或辅助库方法加载失败");
  108. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  109. strcpy(m_errinfo.szErrMsg,"辅助库加载或辅助库方法加载失败");
  110. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  111. m_ecode = (ErrorCodeEnum)iret;
  112. LOG4VTM(WARN, "<Image2Feature> - "<<"辅助库加载或辅助库方法加载失败");
  113. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  114. return (ErrorCodeEnum)iret;
  115. }
  116. if ((strlen(imagePath)==0) || (lpbFeature == NULL))
  117. {
  118. iret = Error_Param;
  119. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature","输入参数或者输出参数为空");
  120. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  121. strcpy(m_errinfo.szErrMsg,"输入参数或者输出参数为空");
  122. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  123. m_ecode = (ErrorCodeEnum)iret;
  124. LOG4VTM(WARN, "<Image2Feature> - "<<"输入参数或者输出参数为空");
  125. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  126. return (ErrorCodeEnum)iret;
  127. }
  128. if (!m_gvar->m_connect)
  129. {
  130. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature", "设备未连接");
  131. iret = Error_DevNotAvailable;
  132. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  133. strcpy(m_errinfo.szErrMsg,"设备未连接");
  134. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  135. m_ecode = (ErrorCodeEnum)iret;
  136. LOG4VTM(WARN, "<Image2Feature> - "<<"设备未连接");
  137. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  138. return (ErrorCodeEnum)iret;
  139. }
  140. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Image2Feature", "传入图片路径:imagePath= %s",imagePath);
  141. //录制指纹特征
  142. char szBuf[1024] = "";
  143. int iszlen = 0;
  144. iret = m_gvar->FPIGetFeature(m_gvar->m_port,szBuf);
  145. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Image2Feature", "FPIGetFeature return %d",iret);
  146. if (iret < 0)
  147. {
  148. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature", "录制指纹特征失败,FPIGetFeature return iret =%d",iret);
  149. LOG4VTM(WARN, "<Image2Feature> - "<<"录制指纹特征失败,FPIGetFeature return iret "<<iret);
  150. iret = Error_DevCommFailed;
  151. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  152. strcpy(m_errinfo.szErrMsg,"录制指纹特征失败");
  153. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  154. m_ecode = (ErrorCodeEnum)iret;
  155. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  156. return (ErrorCodeEnum)iret;
  157. }
  158. //生成一张bmp图片
  159. if (access(m_gvar->m_image,F_OK) != 0)
  160. {
  161. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature", "图片路径不存在,m_gvar->m_image=%s",m_gvar->m_image);
  162. LOG4VTM(WARN, "<Image2Feature> - "<<"图片路径不存在,m_gvar->m_image="<<m_gvar->m_image);
  163. iret = Error_Param;
  164. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  165. strcpy(m_errinfo.szErrMsg,"图片路径不存在");
  166. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  167. m_ecode = (ErrorCodeEnum)iret;
  168. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  169. return (ErrorCodeEnum)iret;
  170. }
  171. //存储指纹图片
  172. char cImageData[512*512]="";
  173. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Image2Feature", "FPIGetImageDat ......................");
  174. LOG4VTM(WARN, "<Image2Feature> - "<<"FPIGetImageDat ......................");
  175. iret = m_gvar->FPIGetImageDat(m_gvar->m_port, cImageData);
  176. LOG4VTM(WARN, "<Image2Feature> - "<<"FPIGetImageDat return "<<iret);
  177. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Image2Feature", "FPIGetImageDat return %d",iret);
  178. if (iret < 0)
  179. {
  180. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature", "获取指纹图像数据操作失败,FPIGetImageDat return =%d",iret);
  181. LOG4VTM(WARN, "<Image2Feature> - "<<"获取指纹图像数据操作失败,FPIGetImageDat return ="<<iret);
  182. iret = Error_DevCommFailed;
  183. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  184. strcpy(m_errinfo.szErrMsg,"获取指纹图像数据操作失败");
  185. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  186. m_ecode = (ErrorCodeEnum)iret;
  187. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  188. return (ErrorCodeEnum)iret;
  189. }
  190. char cPath[1024] = "";
  191. strcpy(cPath,m_gvar->m_image);
  192. strcat(cPath,imagePath);
  193. //生成指纹图片
  194. iret = m_gvar->FPISaveImage(cPath,cImageData);
  195. if (iret < 0)
  196. {
  197. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature", "保存指纹图片操作失败,FPISaveImage return =%d",iret);
  198. LOG4VTM(WARN, "<Image2Feature> - "<<"保存指纹图片操作失败,FPISaveImage return ="<<iret);
  199. iret = Error_DevCommFailed;
  200. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  201. strcpy(m_errinfo.szErrMsg,"保存指纹图片操作失败");
  202. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  203. m_ecode = (ErrorCodeEnum)iret;
  204. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  205. return (ErrorCodeEnum)iret;
  206. }
  207. iszlen = 684;
  208. if ((iLength < iszlen)|| (iLength == 0))
  209. {
  210. iLength = iszlen;
  211. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature","输出指纹特征数据长度=%d",iszlen);
  212. LOG4VTM(WARN, "<Image2Feature> - "<<"输出指纹特征数据长度="<<iszlen);
  213. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  214. strcpy(m_errinfo.szErrMsg,"传入空间长度太小");
  215. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  216. iret = Error_TooSmallBuffer;
  217. m_ecode = (ErrorCodeEnum)iret;
  218. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  219. return (ErrorCodeEnum)iret;
  220. }
  221. iLength = strlen(szBuf);
  222. //新增
  223. memcpy(lpbFeature,szBuf,iLength);
  224. lpbFeature[iLength] = '\0';
  225. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Image2Feature", "指纹特征数据:%s,长度:%d",szBuf,iLength);
  226. LOG4VTM(WARN, "<Image2Feature> - "<<"指纹特征数据长度:"<<iLength);
  227. iret = Error_Succeed;
  228. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Image2Feature", "提取指纹特征成功");
  229. LOG4VTM(WARN, "<Image2Feature> - "<<"提取指纹特征成功");
  230. LOG4VTM(WARN, "<Image2Feature> - "<<"Exit-");
  231. m_ecode = (ErrorCodeEnum)iret;
  232. return (ErrorCodeEnum)iret;
  233. }
  234. //生成特征模板(注册时使用)
  235. //Convert image to template
  236. ErrorCodeEnum FingerPrintNantian21::Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int &iLength)
  237. {
  238. int iret = Error_Succeed;
  239. CILIXAutoTrace _at(m_gvar->m_trace,"Image2Template",&iret);
  240. LOG4VTM(WARN, "<Image2Template> - "<<"Entry-");
  241. if (!m_gvar->m_isLoad)
  242. {
  243. iret = Error_DevLoadFileFailed;
  244. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Template","辅助库加载或辅助库方法加载失败");
  245. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  246. strcpy(m_errinfo.szErrMsg,"辅助库加载或辅助库方法加载失败");
  247. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  248. m_ecode = (ErrorCodeEnum)iret;
  249. LOG4VTM(WARN, "<Image2Template> - "<<"辅助库加载或辅助库方法加载失败");
  250. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  251. return (ErrorCodeEnum)iret;
  252. }
  253. if (!m_gvar->m_connect)
  254. {
  255. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Feature", "设备未连接");
  256. iret = Error_DevNotAvailable;
  257. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  258. strcpy(m_errinfo.szErrMsg,"设备未连接");
  259. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  260. m_ecode = (ErrorCodeEnum)iret;
  261. LOG4VTM(WARN, "<Image2Template> - "<<"设备未连接");
  262. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  263. return (ErrorCodeEnum)iret;
  264. }
  265. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Image2Template","输入合成模板图片路径1:%s,路径2:%s,路径3:%s",
  266. imagePath1,imagePath2,imagePath3);
  267. if ((strlen(imagePath1)==0)||(strlen(imagePath2)==0)||(strlen(imagePath3)==0))
  268. {
  269. iret = Error_Param;
  270. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Template","输入合成模板图片路径为空");
  271. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  272. strcpy(m_errinfo.szErrMsg,"输入合成模板图片路径为空");
  273. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  274. m_ecode = (ErrorCodeEnum)iret;
  275. LOG4VTM(WARN, "<Image2Template> - "<<"输入合成模板图片路径为空");
  276. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  277. return (ErrorCodeEnum)iret;
  278. }
  279. if ((access(imagePath1,F_OK) != 0)||(access(imagePath2,F_OK) != 0)||(access(imagePath3,F_OK) != 0))
  280. {
  281. iret = Error_Param;
  282. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Template","输入合成模板图片不存在");
  283. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  284. strcpy(m_errinfo.szErrMsg,"输入合成模板图片不存在");
  285. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  286. m_ecode = (ErrorCodeEnum)iret;
  287. LOG4VTM(WARN, "<Image2Template> - "<<"输入合成模板图片不存在");
  288. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  289. return (ErrorCodeEnum)iret;
  290. }
  291. char cMBBuf[1024] = "";
  292. int iLen = 0;
  293. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Image2Template","entry FPITplFrmImgBmp ...................");
  294. LOG4VTM(WARN, "<Image2Template> - "<<"entry FPITplFrmImgBmp ...................");
  295. iret = m_gvar->FPITplFrmImgBmp((char*)imagePath1,(char*)imagePath2,(char*)imagePath3,cMBBuf,&iLen);
  296. LOG4VTM(WARN, "<Image2Template> - "<<"Exit FPITplFrmImgBmp ...................");
  297. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Image2Template","Exit FPITplFrmImgBmp ...................");
  298. if (iret < 0)
  299. {
  300. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Template","合成指纹内模板失败,FPITplFrmImgBmp return %d",iret);
  301. LOG4VTM(WARN, "<Image2Template> - "<<"合成指纹内模板失败,FPITplFrmImgBmp return "<<iret);
  302. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  303. strcpy(m_errinfo.szErrMsg,"合成指纹内模板失败");
  304. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  305. iret = Error_Hardware;
  306. m_ecode = (ErrorCodeEnum)iret;
  307. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  308. return (ErrorCodeEnum)iret;
  309. }
  310. if ((iLength < iLen)|| (iLength == 0))
  311. {
  312. iLength = iLen;
  313. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Image2Template","输出指纹特征数据长度=%d",iLen);
  314. LOG4VTM(WARN, "<Image2Template> - "<<"输出指纹特征数据长度="<<iLen);
  315. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  316. strcpy(m_errinfo.szErrMsg,"传入空间长度太小");
  317. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  318. iret = Error_TooSmallBuffer;
  319. m_ecode = (ErrorCodeEnum)iret;
  320. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  321. return (ErrorCodeEnum)iret;
  322. }
  323. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Image2Template","合成指纹内模板成功,iLen = %d",iLen);
  324. LOG4VTM(WARN, "<Image2Template> - "<<"合成指纹内模板成功,iLen="<<iLen);
  325. iLength = iLen;
  326. memcpy(lpbTemplate,cMBBuf,iLength);
  327. lpbTemplate[iLength] = '\0';
  328. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Image2Template", "转base6数据:%s,长度:%d",cMBBuf,iLength);
  329. LOG4VTM(WARN, "<Image2Template> - "<<"转base6数据长度:"<<iLength);
  330. iret = Error_Succeed;
  331. m_ecode = (ErrorCodeEnum)iret;
  332. LOG4VTM(WARN, "<Image2Template> - "<<"Exit-");
  333. return (ErrorCodeEnum)iret;
  334. }
  335. //比对校验
  336. //Match the feature
  337. ErrorCodeEnum FingerPrintNantian21::Match(LPBYTE lpbTemplate[], int iTemplateLen[] ,int templateNum, LPBYTE lbpFeature, int &iFeatureLen ,int level)
  338. {
  339. int iret = Error_Succeed;
  340. CILIXAutoTrace _at(m_gvar->m_trace,"Match",&iret);
  341. LOG4VTM(WARN, "<Match> - "<<"Entry-");
  342. if (!m_gvar->m_isLoad)
  343. {
  344. iret = Error_DevLoadFileFailed;
  345. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Match","辅助库加载或辅助库方法加载失败");
  346. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  347. strcpy(m_errinfo.szErrMsg,"辅助库加载或辅助库方法加载失败");
  348. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  349. m_ecode = (ErrorCodeEnum)iret;
  350. LOG4VTM(WARN, "<Match> - "<<"辅助库加载或辅助库方法加载失败");
  351. LOG4VTM(WARN, "<Match> - "<<"Entry-");
  352. return (ErrorCodeEnum)iret;
  353. }
  354. if ((lpbTemplate == NULL)|| (lbpFeature == NULL)|| (templateNum==0))
  355. {
  356. iret = Error_Param;
  357. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Match","输入参数参数为空或者为0");
  358. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  359. strcpy(m_errinfo.szErrMsg,"输入参数参数为空");
  360. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  361. m_ecode = (ErrorCodeEnum)iret;
  362. LOG4VTM(WARN, "<Match> - "<<"输入参数参数为空或者为0");
  363. LOG4VTM(WARN, "<Match> - "<<"Entry-");
  364. return (ErrorCodeEnum)iret;
  365. }
  366. if (!m_gvar->m_connect)
  367. {
  368. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Match", "设备未连接");
  369. iret = Error_DevNotAvailable;
  370. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  371. strcpy(m_errinfo.szErrMsg,"设备未连接");
  372. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  373. m_ecode = (ErrorCodeEnum)iret;
  374. LOG4VTM(WARN, "<Match> - "<<"设备未连接");
  375. LOG4VTM(WARN, "<Match> - "<<"Entry-");
  376. return (ErrorCodeEnum)iret;
  377. }
  378. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Match", "指纹特征数据=%s,长度=%d",lbpFeature,iFeatureLen);
  379. LOG4VTM(WARN, "<Match> - "<<"指纹特征数据长度="<<iFeatureLen);
  380. int i = 0;
  381. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Match", "指纹比对:level=%d",level);
  382. LOG4VTM(WARN, "<Match> - "<<"指纹比对:level="<<level);
  383. char MbData[1024] = "";
  384. int ilenMb = 0;
  385. char TzData[1024] = "";
  386. strcpy(TzData,(char*)lbpFeature);
  387. for (i=0;i<templateNum;i++)
  388. {
  389. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_DEBUG,"Match", "%d指纹模板数据=%s,长度=%d",i+1,lpbTemplate[i],iTemplateLen[i]);
  390. LOG4VTM(WARN, "<Match> - "<<"长度="<<iTemplateLen[i]);
  391. memset(MbData,0,1024);
  392. //base64转二进制
  393. if (iTemplateLen[i] < 684)
  394. {
  395. iTemplateLen[i] = 0;
  396. }
  397. else
  398. {
  399. memset(MbData,0,1024);
  400. strcpy(MbData,(char*)lpbTemplate[i]);
  401. iret = m_gvar->FPIFpMatch(MbData, TzData, level);
  402. if (iret >= 0)//比对成功
  403. {
  404. iTemplateLen[i] = 1;
  405. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Match", "指纹比对成功");
  406. LOG4VTM(WARN, "<Match> - "<<"指纹比对成功");
  407. }
  408. else
  409. {
  410. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Match", "指纹比对失败,iret=%d",iret);
  411. LOG4VTM(WARN, "<Match> - "<<"指纹比对失败,iret="<<iret);
  412. iTemplateLen[i] = 0;
  413. }
  414. }
  415. }
  416. iret = Error_Succeed;
  417. m_ecode = (ErrorCodeEnum)iret;
  418. LOG4VTM(WARN, "<Match> - "<<"Exit-");
  419. return Error_Succeed;
  420. }
  421. //取消采集指纹图片
  422. ErrorCodeEnum FingerPrintNantian21::Cancel()
  423. {
  424. int iret = Error_Succeed;
  425. CILIXAutoTrace _at(m_gvar->m_trace,"Cancel",&iret);
  426. m_gvar->m_cancel = TRUE;
  427. m_ecode = (ErrorCodeEnum)iret;
  428. return Error_Succeed;
  429. }
  430. //
  431. // Get category infomation about device.
  432. //
  433. ErrorCodeEnum FingerPrintNantian21::GetDevCategory(DevCategoryInfo &devCategory)
  434. {
  435. int iret = Error_Succeed;
  436. CILIXAutoTrace _at(m_gvar->m_trace, "GetDevCategory", &iret);
  437. LOG4VTM(WARN, "<GetDevCategory> - "<<"Enry-");
  438. strcpy(devCategory.szType, "PVER=TCS#MID=TCS316N");
  439. strcpy(devCategory.szVendor, "nantian");
  440. strcpy(devCategory.szModel, "FWID=1.00.25");
  441. devCategory.version.wMajor = 1;
  442. devCategory.version.wMinor = 0;
  443. devCategory.version.wRevision = 0;
  444. devCategory.version.wBuild = 8;
  445. devCategory.eState = DEVICE_STATUS_NOT_READY;
  446. if (!m_gvar->m_isLoad)
  447. {
  448. iret = Error_DevLoadFileFailed;
  449. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"GetDevCategory","辅助库加载或辅助库方法加载失败");
  450. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  451. strcpy(m_errinfo.szErrMsg,"辅助库加载或辅助库方法加载失败");
  452. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  453. devCategory.eState = DEVICE_STATUS_NOT_READY;
  454. m_ecode = (ErrorCodeEnum)iret;
  455. LOG4VTM(WARN, "<GetDevCategory> - "<<"辅助库加载或辅助库方法加载失败");
  456. LOG4VTM(WARN, "<GetDevCategory> - "<<"Exit-");
  457. return (ErrorCodeEnum) iret;
  458. }
  459. if (!m_gvar->m_connect)
  460. {
  461. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"GetDevCategory", "设备未连接");
  462. iret = Error_DevNotAvailable;
  463. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  464. strcpy(m_errinfo.szErrMsg,"设备未连接");
  465. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  466. devCategory.eState = DEVICE_STATUS_NOT_READY;
  467. m_ecode = (ErrorCodeEnum)iret;
  468. LOG4VTM(WARN, "<GetDevCategory> - "<<"设备未连接");
  469. LOG4VTM(WARN, "<GetDevCategory> - "<<"Exit-");
  470. return (ErrorCodeEnum) iret;
  471. }
  472. //查询设备状态
  473. char cDevSN[1024]="";
  474. iret = m_gvar->FPIGetDevSN(m_gvar->m_port,cDevSN);
  475. if (iret >= 0)
  476. {
  477. iret=Error_Succeed;
  478. devCategory.eState = DEVICE_STATUS_NORMAL;
  479. m_ecode = (ErrorCodeEnum)iret;
  480. LOG4VTM(WARN, "<GetDevCategory> - "<<"Exit-");
  481. return (ErrorCodeEnum)iret;
  482. }
  483. else
  484. {
  485. devCategory.eState = DEVICE_STATUS_FAULT;
  486. iret = Error_Hardware;
  487. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"GetDevCategory","获取不到设备信息");
  488. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  489. strcpy(m_errinfo.szErrMsg,"获取不到设备信息");
  490. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  491. m_ecode = (ErrorCodeEnum)iret;
  492. LOG4VTM(WARN, "<GetDevCategory> - "<<"获取不到设备信息");
  493. LOG4VTM(WARN, "<GetDevCategory> - "<<"Exit-");
  494. return (ErrorCodeEnum)iret;
  495. }
  496. }
  497. // Reset device.
  498. // Do the cleaning work and initialize device again in order to return to
  499. // the normal condition.
  500. ErrorCodeEnum FingerPrintNantian21::Reset()
  501. {
  502. int iret = Error_Succeed;
  503. CILIXAutoTrace _at(m_gvar->m_trace,"Reset",&iret);
  504. LOG4VTM(WARN, "<Reset> - "<<"Entry-");
  505. if (!m_gvar->m_isLoad)
  506. {
  507. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Reset","动态库或动态库方法加载失败");
  508. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  509. strcpy(m_errinfo.szErrMsg,"动态库或动态库方法加载失败");
  510. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  511. iret = Error_DevLoadFileFailed;
  512. m_ecode = (ErrorCodeEnum)iret;
  513. LOG4VTM(WARN, "<Reset> - "<<"动态库或动态库方法加载失败");
  514. LOG4VTM(WARN, "<Reset> - "<<"Exit-");
  515. return (ErrorCodeEnum)iret;
  516. }
  517. iret = m_gvar->FPICloseDevice(m_gvar->m_port);
  518. CILIX_AUX_X::Sleep(100);
  519. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"Reset","FPICloseDevice return %d",iret);
  520. LOG4VTM(WARN, "<Reset> - "<<"FPICloseDevice return "<<iret);
  521. char cDevName[300]="";
  522. iret = m_gvar->FPIFindDevice(m_gvar->m_port,cDevName);
  523. if (iret < 0)
  524. {
  525. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"Reset","设备复位失败,FPIFindDevice return %d",iret);
  526. iret = Error_DevConnFailed;
  527. m_gvar->m_connect = FALSE;
  528. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  529. strcpy(m_errinfo.szErrMsg,"设备复位失败");
  530. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  531. m_ecode = (ErrorCodeEnum)iret;
  532. LOG4VTM(WARN, "<Reset> - "<<"设备复位失败,FPIFindDevice return "<<iret);
  533. LOG4VTM(WARN, "<Reset> - "<<"Exit-");
  534. return (ErrorCodeEnum)iret;
  535. }
  536. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_INFO,"PTR_Reset","设备复位成功");
  537. m_gvar->m_connect = TRUE;
  538. iret = Error_Succeed;
  539. m_ecode = (ErrorCodeEnum)iret;
  540. LOG4VTM(WARN, "<Reset> - "<<"设备复位成功");
  541. LOG4VTM(WARN, "<Reset> - "<<"Exit-");
  542. return (ErrorCodeEnum)iret;
  543. }
  544. //
  545. // Close device and do the cleaning work.
  546. // ex. close connection,close port,release memery and so on
  547. ErrorCodeEnum FingerPrintNantian21::DevClose()
  548. {
  549. int iret = Error_Succeed;
  550. CILIXAutoTrace _at(m_gvar->m_trace,"DevClose",&iret);
  551. LOG4VTM(WARN, "<DevClose> - "<<"Entry-");
  552. if (!m_gvar->m_isLoad)
  553. {
  554. m_gvar->m_trace->WriteTrace(CILIXTRACE_L_ERROR,"DevClose","辅助库加载或辅助库方法加载失败");
  555. memset(m_errinfo.szErrMsg,0,sizeof(m_errinfo.szErrMsg));
  556. strcpy(m_errinfo.szErrMsg,"辅助库加载或辅助库方法加载失败");
  557. m_errinfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  558. iret = Error_DevLoadFileFailed;
  559. m_ecode = (ErrorCodeEnum)iret;
  560. LOG4VTM(WARN, "<DevClose> - "<<"辅助库加载或辅助库方法加载失败");
  561. LOG4VTM(WARN, "<DevClose> - "<<"Exit-");
  562. return (ErrorCodeEnum)iret;
  563. }
  564. if (m_gvar->m_connect)
  565. {
  566. m_gvar->FPICloseDevice(m_gvar->m_port);
  567. m_gvar->m_connect = FALSE;
  568. }
  569. iret = Error_Succeed;
  570. m_ecode = (ErrorCodeEnum)iret;
  571. LOG4VTM(WARN, "<DevClose> - "<<"设备关闭成功");
  572. LOG4VTM(WARN, "<DevClose> - "<<"Exit-");
  573. return (ErrorCodeEnum)iret;
  574. }
  575. // Get last error the device issued.
  576. // Error message must include explanatory memorandum ,the original error
  577. // code and anything in favour of location problem.
  578. ErrorCodeEnum FingerPrintNantian21::GetLastErr(DevErrorInfo &devErrInfo)
  579. {
  580. devErrInfo.dwErrMsgLen = 0;
  581. memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  582. devErrInfo.dwErrMsgLen = strlen(m_errinfo.szErrMsg);
  583. memcpy(devErrInfo.szErrMsg, m_errinfo.szErrMsg, devErrInfo.dwErrMsgLen);
  584. return Error_Succeed;
  585. }