FingerPrintImpl.cpp 12 KB

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