FingerPrintImpl.cpp 11 KB

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