FingerPrintImpl.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /*
  2. * Create by LocalUser on 2020/9/22
  3. */
  4. #include "FingerPrintImpl.h"
  5. #include "log4vendor.h"
  6. FingerPrintImpl::FingerPrintImpl()
  7. {
  8. _fingerDev = new FingerDev();
  9. // m_DevStatus = DEVICE_STATUS_NORMAL;
  10. m_DevErrInfo.dwErrMsgLen = 0;
  11. memset(m_DevErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  12. m_sLibPath[0] = 0;
  13. m_bInitOK = false;
  14. }
  15. FingerPrintImpl::~FingerPrintImpl()
  16. {
  17. if(_fingerDev != NULL)
  18. delete _fingerDev;
  19. _fingerDev = NULL;
  20. }
  21. int getFileVer(char* sFile, short& ch1, short& ch2)
  22. {
  23. ch1 = 0;
  24. ch2 = 0;
  25. char* pFind = strstr(sFile, ".so");
  26. char* pTemp = pFind;
  27. while (pTemp)
  28. {
  29. pFind = pTemp;
  30. pTemp = strstr(pFind + 3, ".so");
  31. }
  32. if (pFind == NULL) return 0;
  33. pTemp = pFind - 1;
  34. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  35. if (*pTemp == '.')
  36. ch2 = atoi(pTemp+1);
  37. pTemp--;
  38. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  39. if (*pTemp == '.')
  40. ch1 = atoi(pTemp+1);
  41. return 1;
  42. }
  43. ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
  44. {
  45. LOG4VTM_FUNCTION();
  46. if (!m_bInitOK)
  47. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "GetDevCategory");
  48. char sInfo[128];
  49. int iRet = _fingerDev->GetVersion(sInfo);
  50. ErrorCodeEnum errcode = HandleDevError(iRet, "Reset");
  51. if (errcode == Error_Succeed) {
  52. strcpy(devCategory.szType ,sInfo);
  53. devCategory.eState = DEVICE_STATUS_NORMAL;
  54. }
  55. else{
  56. //"WELLCOM_JZT-998APB-V72_V2.0.1.0_N_R_GA[20201016]
  57. strcpy(devCategory.szType , "WELLCOM_JZT-998APB-Get-Error");
  58. devCategory.eState = DEVICE_STATUS_FAULT;
  59. }
  60. strcpy(devCategory.szModel , "FWID=Well0000");
  61. strcpy(devCategory.szVendor , "cw");
  62. char sPath[256], sFile[128] = {0};
  63. GetCurLibsPath(sPath, sFile);
  64. short v1,v2;
  65. getFileVer(sFile, v1, v2);
  66. devCategory.version.wMajor = v1;
  67. devCategory.version.wMinor = v2;
  68. devCategory.version.wRevision = 0xffff;
  69. devCategory.version.wBuild = FILE_VERSION;
  70. char szRet[512] = {0};
  71. sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)",
  72. devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState);
  73. LOG4VTM(INFO, szRet);
  74. return Error_Succeed;
  75. }
  76. ErrorCodeEnum FingerPrintImpl::Reset()
  77. {
  78. LOG4VTM_FUNCTION();
  79. if (!m_bInitOK)
  80. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "Reset");
  81. int iRt = 0;
  82. ErrorCodeEnum errcode = Error_Succeed;
  83. iRt = _fingerDev->Reset();
  84. errcode = HandleDevError(iRt, "Reset");
  85. return errcode;
  86. }
  87. ErrorCodeEnum FingerPrintImpl::DevClose()
  88. {
  89. LOG4VTM_FUNCTION();
  90. if (!m_bInitOK)
  91. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "GetDevCategory");
  92. int iRt = 0;
  93. ErrorCodeEnum errcode = Error_Succeed;
  94. iRt = _fingerDev->Close();
  95. errcode = HandleDevError(iRt, "DevClose");
  96. m_bInitOK = false;
  97. return errcode;
  98. }
  99. ErrorCodeEnum FingerPrintImpl::GetLastErr(DevErrorInfo &devErrInfo)
  100. {
  101. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  102. return Error_Succeed;
  103. }
  104. ErrorCodeEnum FingerPrintImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  105. {
  106. LOG4VTM_FUNCTION();
  107. int iRt = 0;
  108. GetCurLibsPath(m_sLibPath, NULL);
  109. char cFilePath[300] = {0};
  110. sprintf(cFilePath, "DevOpen GetCurProcPath = %s", m_sLibPath);
  111. LOG4VTM(INFO, cFilePath);
  112. sprintf(cFilePath, "%s/cw/libFpWell.cw.so", m_sLibPath); //usr symbolic link to point the real so
  113. ErrorCodeEnum errcode = Error_Succeed;
  114. iRt = _fingerDev->Open(cFilePath);
  115. errcode = HandleDevError(iRt, "DevOpen");
  116. m_bInitOK = errcode == Error_Succeed;
  117. return errcode;
  118. }
  119. //采集指纹图片及对应特征值,imagePath保存图片名,lpbFeature保存对应特征,iLength:输入代表buf最大长度,输出为特征实际长度
  120. //dep目录说明:应用在上层目录,动态库在dep目录,生成的临时文件也在dep目录
  121. //当前目录和进程所在目录为上层目录,动态库和临时文件目录为dep子目录
  122. ErrorCodeEnum FingerPrintImpl::Image2Feature(const char* imageName, LPBYTE lpbFeature, int &iLength)
  123. {
  124. LOG4VTM_FUNCTION();
  125. if (!m_bInitOK)
  126. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "Image2Feature");
  127. char logMsg[1024] = {0};
  128. char sImgPath[260] = {0};
  129. sprintf(sImgPath, "%s/%s", m_sLibPath, imageName);
  130. remove(sImgPath);
  131. sprintf(logMsg, "Image2Feature imagePath: %s", sImgPath);
  132. LOG4VTM(INFO, logMsg);
  133. int iRt = _fingerDev->GetFPIImg2Bmp(sImgPath);
  134. ErrorCodeEnum errcode = HandleDevError(iRt, "GetFPIImg2Bmp");
  135. if(Error_Succeed == errcode)
  136. {
  137. LOG4VTM(INFO, "获取特征图片成功");
  138. iRt = _fingerDev->GetFPIBmp2Feature(sImgPath, lpbFeature, iLength);
  139. errcode = HandleDevError(iRt, "GetFPIBmp2Feature");
  140. }
  141. sprintf(logMsg, "Image2Feature Return Length = %d", iLength);
  142. LOG4VTM(INFO, logMsg);
  143. return errcode;
  144. }
  145. //生成特征模板(注册时使用)
  146. //Convert image to template
  147. ErrorCodeEnum FingerPrintImpl::Image2Template(const char* imagePath1, const char* imagePath2, const char* imagePath3, LPBYTE lpbTemplate, int &iLength)
  148. {
  149. LOG4VTM_FUNCTION();
  150. if (!m_bInitOK)
  151. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "Image2Template");
  152. char logMsg[1024] = {0};
  153. sprintf(logMsg, "imagePath1:%s,imagePath2:%s,imagePath3:%s", imagePath1, imagePath2, imagePath3);
  154. LOG4VTM(INFO, logMsg);
  155. int iRt = 0;
  156. ErrorCodeEnum errcode = Error_Succeed;
  157. iRt = _fingerDev->GetFPIBmp2Template(imagePath1, imagePath2, imagePath3, lpbTemplate, iLength);
  158. errcode = HandleDevError(iRt, "Image2Template");
  159. sprintf(logMsg, "Return Length = %d", iLength);
  160. LOG4VTM(INFO, logMsg);
  161. return errcode;
  162. }
  163. //比对校验
  164. //Match the feature
  165. ErrorCodeEnum FingerPrintImpl::Match(LPBYTE lpbTemplate[], int iTemplateLen[] ,int templateNum, LPBYTE lbpFeature, int &iFeatureLen ,int level)
  166. {
  167. LOG4VTM_FUNCTION();
  168. if (!m_bInitOK)
  169. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "Match");
  170. char logMsg[1024] = {0};
  171. int iRt = 0;
  172. ErrorCodeEnum errcode = Error_Succeed;
  173. //保存各个模板长度
  174. int *templen = new int[templateNum + 1];
  175. memset(templen, 0, templateNum + 1);
  176. memcpy(templen, iTemplateLen, templateNum);
  177. //初始化比对结果
  178. memset(iTemplateLen, 0, templateNum);
  179. for (int i = 0; i < templateNum; i++)
  180. {
  181. sprintf(logMsg, "TemplateNum:%d, Template%d[Length:%d], level:%d", templateNum, i+1, templen[i], level);
  182. LOG4VTM(INFO, logMsg);
  183. iRt = _fingerDev->FPIMatch(lpbTemplate[i], lbpFeature, level);
  184. if(LS_ERROR_SUCCESS == iRt)
  185. {
  186. //比对成功,设置标志为1
  187. iTemplateLen[i] = 1;
  188. }
  189. else if(LS_ERROR_MATCH == iRt || LS_ERROR_FEATURE == iRt || LS_ERROR_TEMPLATE == iRt)
  190. {
  191. //比对失败,设置标志为0
  192. iTemplateLen[i] = 0;
  193. }
  194. else
  195. {
  196. //其他异常错误,直接返回失败
  197. errcode = HandleDevError(iRt, "FPIMatch");
  198. break;
  199. }
  200. sprintf(logMsg, "iTemplateLen[%d]:%s(%d)", i, iTemplateLen[i] == 1 ? "比对成功" : "比对失败", iRt);
  201. LOG4VTM(INFO, logMsg);
  202. }
  203. //释放缓冲区
  204. delete []templen;
  205. return errcode;
  206. }
  207. //取消采集指纹图片
  208. ErrorCodeEnum FingerPrintImpl::Cancel()
  209. {
  210. LOG4VTM_FUNCTION();
  211. if (!m_bInitOK)
  212. return HandleDevError(LS_ERROR_DEVICE_NOT_INIT, "Cancel");
  213. int iRt = 0;
  214. ErrorCodeEnum errcode = Error_Succeed;
  215. iRt = _fingerDev->Cancel();
  216. errcode = HandleDevError(iRt, "Cancel");
  217. if(Error_Succeed == errcode)
  218. {
  219. LOG4VTM(INFO, "取消成功");
  220. }
  221. return errcode;
  222. }
  223. ErrorCodeEnum FingerPrintImpl::HandleDevError(int nRt, LPCTSTR lpszFormat, ...)
  224. {
  225. ErrorCodeEnum eRt = Error_Succeed;
  226. int wHWErrorCode = LS_ERROR_SUCCESS; //硬件设备错误码
  227. char strErrInfo[128];
  228. switch (nRt)
  229. {
  230. case LS_ERROR_SUCCESS:
  231. wHWErrorCode = LS_ERROR_SUCCESS;
  232. eRt = Error_Succeed;
  233. strcpy(strErrInfo, "成功");
  234. break;
  235. case LS_ERROR_DEVICE_NOT_INIT://未初始化
  236. wHWErrorCode = LS_ERROR_DEVICE_NOT_INIT;
  237. eRt = Error_DevConnFailed;
  238. strcpy(strErrInfo, "未初始化");
  239. break;
  240. case LS_ERROR_DEVICE_NOT_FOUND: //设备不存在
  241. wHWErrorCode = LS_ERROR_DEVICE_NOT_FOUND;
  242. eRt = Error_DevConnFailed;
  243. strcpy(strErrInfo, "设备不存在");
  244. break;
  245. case LS_ERROR_INVALID_PARAMETER://参数非法
  246. wHWErrorCode = LS_ERROR_INVALID_PARAMETER;
  247. eRt = Error_Param;
  248. strcpy(strErrInfo, "参数非法");
  249. break;
  250. case LS_ERROR_NOT_ENOUGH_MEMORY://内存溢出
  251. wHWErrorCode = LS_ERROR_NOT_ENOUGH_MEMORY;
  252. eRt = Error_Stoped;
  253. strcpy(strErrInfo, "内存溢出");
  254. break;
  255. case LS_ERROR_NOT_SUPPORT_FUNCTION://功能未开放
  256. wHWErrorCode = LS_ERROR_NOT_SUPPORT_FUNCTION;
  257. eRt = Error_Stoped;
  258. strcpy(strErrInfo, "功能未开放");
  259. break;
  260. case LS_ERROR_INVALIDE_CODE://非法错误号
  261. wHWErrorCode = LS_ERROR_INVALIDE_CODE;
  262. eRt = Error_Stoped;
  263. strcpy(strErrInfo, "非法错误号");
  264. break;
  265. case LS_ERROR_TIMEOUT://超时
  266. wHWErrorCode = LS_ERROR_TIMEOUT;
  267. eRt = Error_TimeOut;
  268. strcpy(strErrInfo, "超时");
  269. break;
  270. case LS_ERROR_FEATURE://特征错误
  271. wHWErrorCode = LS_ERROR_FEATURE;
  272. eRt = Error_DevLoadFileFailed;
  273. strcpy(strErrInfo, "特征错误");
  274. break;
  275. case LS_ERROR_TEMPLATE://模板错误
  276. wHWErrorCode = LS_ERROR_TEMPLATE;
  277. eRt = Error_DevLoadFileFailed;
  278. strcpy(strErrInfo, "模板错误");
  279. break;
  280. case LS_ERROR_KEY://密钥错误
  281. wHWErrorCode = LS_ERROR_KEY;
  282. eRt = Error_DevLoadFileFailed;
  283. strcpy(strErrInfo, "密钥错误");
  284. break;
  285. case LS_ERROR_IMAGE_ERR://密钥错误
  286. wHWErrorCode = LS_ERROR_IMAGE_ERR;
  287. eRt = Error_DevLoadFileFailed;
  288. strcpy(strErrInfo, "图像错误");
  289. break;
  290. default:
  291. wHWErrorCode = LS_ERROR_OTHERERROR;
  292. eRt = Error_Stoped;
  293. strcpy(strErrInfo, "未知错误码");
  294. break;
  295. }
  296. char errMsg[300] = {0};
  297. va_list arglist;
  298. va_start(arglist, lpszFormat);
  299. _vsnprintf(errMsg, 128, lpszFormat, arglist);
  300. va_end(arglist);
  301. errMsg[200]=0;
  302. strcat(errMsg, " ");
  303. strcat(errMsg, strErrInfo);
  304. //对dwErrMsgLen字段进行拆分
  305. // 高两字节存储硬件设备错误码 (dwErrMsgLen & 0xFFFF0000)
  306. // 低两字节保留以前的作用即:存储错误信息字符串szErrMsg的实际有效长度
  307. m_DevErrInfo.dwErrMsgLen = (eRt<<16)&0xFFFF0000;
  308. m_DevErrInfo.dwErrMsgLen += strlen(m_DevErrInfo.szErrMsg)&0x0000FFFF;
  309. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", eRt, errMsg);
  310. // memset(m_DevErrInfo.szErrMsg,0,MAX_DEV_ERROR_MSG_LEN);
  311. // memcpy(m_DevErrInfo.szErrMsg,strErrInfo.data(),strErrInfo.length());
  312. if (eRt != Error_Succeed)
  313. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  314. else
  315. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  316. return eRt;
  317. }