|
@@ -7,7 +7,6 @@
|
|
|
#include <thread>
|
|
|
#include <chrono>
|
|
|
#include <fstream>
|
|
|
-#include <ctime>
|
|
|
#include <cstdio>
|
|
|
|
|
|
#ifdef RVC_OS_LINUX
|
|
@@ -15,13 +14,6 @@
|
|
|
#include <unistd.h>
|
|
|
#endif // RVC_OS_LIUNX
|
|
|
|
|
|
-#define FINGERPRINT_SCAN_TIMEOUT 15000 * 1000 //us
|
|
|
-#define FINGERPRINT_SCAN_INTERNAL 100 //ms
|
|
|
-#define FINGERPRINT_MATCH_TIMEOUT 15000 * 1000 //us
|
|
|
-#define MAX_FEATURE_LEN 1024
|
|
|
-
|
|
|
-#define FINGERPRINT_INIT_COUNT 3
|
|
|
-
|
|
|
void CFingerPrintFSM::s0_on_entry()
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
@@ -230,7 +222,7 @@ ErrorCodeEnum CFingerPrintFSM::OnInit()
|
|
|
if (Error_Succeed != errDev)
|
|
|
{
|
|
|
Dbg("load vendorlib or create DevAdapterObject failed.");
|
|
|
- delete m_DevAdptLibHelper; //TODO: 需要考虑蓝牙多合一 DevClose()
|
|
|
+ delete m_DevAdptLibHelper; //TODO: 考虑蓝牙多合一 DevClose()
|
|
|
m_DevAdptLibHelper = nullptr;
|
|
|
return Error_DevLoadFileFailed;
|
|
|
}
|
|
@@ -262,180 +254,255 @@ void CFingerPrintFSM::SelfTest(EntityTestEnum eTestType
|
|
|
pTransactionContext->SendAnswer(m_testResult);
|
|
|
}
|
|
|
|
|
|
-int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
|
|
|
+ErrorCodeEnum CFingerPrintFSM::InitParamBeforeScan(ScanParam *initParam, int scanTime)
|
|
|
{
|
|
|
- LOG_FUNCTION();
|
|
|
- if(!m_devInit) {
|
|
|
- ctx->Answer(Error_NotInit); //maybe no vendor adapter
|
|
|
- return 0;
|
|
|
- }
|
|
|
+ ErrorCodeEnum errCode = Error_Succeed;
|
|
|
+
|
|
|
+ if (!m_devInit)
|
|
|
+ return Error_NotInit; //maybe no vendor adapter
|
|
|
+
|
|
|
if (m_bCancelRegister) //no cancel button anymore while register
|
|
|
{
|
|
|
- ctx->Answer(Error_Cancel);
|
|
|
m_bCancelRegister = false;
|
|
|
- return 0;
|
|
|
+ return Error_Cancel;
|
|
|
}
|
|
|
|
|
|
- CSimpleStringA m_strPath1, m_strPath2, m_strPath3;
|
|
|
- long elapsed = 0;
|
|
|
- clock_t timeStart = clock();
|
|
|
- clock_t timeEnd = clock();
|
|
|
- ErrorCodeEnum eErr;
|
|
|
- LPBYTE lpbFeature = new BYTE[MAX_FEATURE_LEN];
|
|
|
- LPBYTE lpbTemplate = new BYTE[MAX_FEATURE_LEN];
|
|
|
- memset(lpbFeature, 0, sizeof(lpbFeature));
|
|
|
- int lpbLength = MAX_FEATURE_LEN;
|
|
|
+ initParam->m_TimeStart = clock();
|
|
|
+ initParam->m_TimeEnd = clock();
|
|
|
+ initParam->m_TimeLeft = 0;
|
|
|
+
|
|
|
+ initParam->m_Feature = new BYTE[MAX_FEATURE_LEN];
|
|
|
+ initParam->m_Template = new BYTE[MAX_FEATURE_LEN];
|
|
|
+ initParam->m_FeatureLen = MAX_FEATURE_LEN;
|
|
|
+ initParam->m_FullFilePath = "";
|
|
|
+
|
|
|
+ initParam->m_ScanSuc = false;
|
|
|
+ initParam->m_GetTemplateSuc = true;
|
|
|
+ initParam->m_NotFindImage = false;
|
|
|
+ initParam->m_FeatureIsNull = false;
|
|
|
+ initParam->m_Quit = false;
|
|
|
+
|
|
|
+ m_bCancelRegister = false;
|
|
|
+
|
|
|
+ memset(initParam->m_Feature, 0, sizeof(initParam->m_Feature));
|
|
|
+ memset(initParam->m_Template, 0, sizeof(initParam->m_Template));
|
|
|
LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_ON, "FingerPrint warning on");
|
|
|
|
|
|
- if (ctx->Req.times == 1)
|
|
|
+ if (scanTime == 1)
|
|
|
{
|
|
|
Dbg("Before scan fingerprint, clear bmp file");
|
|
|
DeleteBmp(BmpImage);
|
|
|
Dbg("Before scan fingerprint, finish doing clear job.");
|
|
|
- m_strPath1 = "";
|
|
|
- m_strPath2 = "";
|
|
|
- m_strPath3 = "";
|
|
|
+ m_BmpFileFullPath1 = "";
|
|
|
+ m_BmpFileFullPath2 = "";
|
|
|
+ m_BmpFileFullPath3 = "";
|
|
|
}
|
|
|
- CSimpleStringA strPath;
|
|
|
- eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
|
|
|
- if(eErr != Error_Succeed)
|
|
|
+
|
|
|
+ errCode = m_pEntity->GetFunction()->GetPath("Dep", initParam->m_FullFilePath);
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
{
|
|
|
- delete[] lpbFeature;
|
|
|
- lpbFeature = NULL;
|
|
|
- delete[] lpbTemplate;
|
|
|
- lpbTemplate = NULL;
|
|
|
- Dbg("Get path failed");
|
|
|
- LogError(Severity_High, Error_DevLoadFileFailed, LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_REGISTER, "Get dep path failed while register.");
|
|
|
- ctx->Answer(Error_Param);
|
|
|
- return 0;
|
|
|
+ delete[] initParam->m_Feature;
|
|
|
+ initParam->m_Feature = NULL;
|
|
|
+ delete[] initParam->m_Template;
|
|
|
+ initParam->m_Template = NULL;
|
|
|
+ Dbg("Get dep path failed");
|
|
|
+
|
|
|
+ LogError(Severity_High, Error_DevLoadFileFailed
|
|
|
+ , LOG_ERR_FINGERPRINT_GET_DEP_PATH_FAILED_REGISTER
|
|
|
+ , "Get dep path failed while register.");
|
|
|
+
|
|
|
+ return Error_Param;
|
|
|
}
|
|
|
|
|
|
- CSimpleStringA fileName, strPath1, strPath2, strPath3;
|
|
|
- switch(ctx->Req.times)
|
|
|
+ switch (scanTime)
|
|
|
{
|
|
|
case 1:
|
|
|
- fileName = "finger1.bmp";
|
|
|
- m_strPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
|
|
|
+ initParam->m_BmpFileName = "finger1.bmp";
|
|
|
+ m_BmpFileFullPath1 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
|
|
|
+ , (const char*)initParam->m_FullFilePath
|
|
|
+ , (const char*)initParam->m_BmpFileName);
|
|
|
break;
|
|
|
case 2:
|
|
|
- fileName = "finger2.bmp";
|
|
|
- m_strPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
|
|
|
+ initParam->m_BmpFileName = "finger2.bmp";
|
|
|
+ m_BmpFileFullPath2 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
|
|
|
+ , (const char*)initParam->m_FullFilePath
|
|
|
+ , (const char*)initParam->m_BmpFileName);
|
|
|
break;
|
|
|
case 3:
|
|
|
- fileName = "finger3.bmp";
|
|
|
- m_strPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
|
|
|
+ initParam->m_BmpFileName = "finger3.bmp";
|
|
|
+ m_BmpFileFullPath3 = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
|
|
|
+ , (const char*)initParam->m_FullFilePath
|
|
|
+ , (const char*)initParam->m_BmpFileName);
|
|
|
break;
|
|
|
default:
|
|
|
- fileName = "finger.bmp";
|
|
|
+ initParam->m_BmpFileName = "finger.bmp";
|
|
|
break;
|
|
|
}
|
|
|
- strPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", (const char*)strPath, (const char*)fileName);
|
|
|
-
|
|
|
- Dbg("get imageName success: %s", strPath);
|
|
|
-
|
|
|
- bool bScanSuccess = false;
|
|
|
- m_bCancelRegister = false;
|
|
|
- bool bGetTemplateSuc = true;
|
|
|
- bool bNotFindImage = false;
|
|
|
- bool bFeatureIsNull = false;
|
|
|
- bool bExit = false;
|
|
|
+ initParam->m_FullFilePath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s"
|
|
|
+ , (const char*)initParam->m_FullFilePath
|
|
|
+ , (const char*)initParam->m_BmpFileName);
|
|
|
+
|
|
|
+ Dbg("get imageName success: %s", initParam->m_FullFilePath);
|
|
|
|
|
|
- while(elapsed < FINGERPRINT_SCAN_TIMEOUT && !m_bCancelRegister && !bScanSuccess)
|
|
|
+ return errCode;
|
|
|
+}
|
|
|
+
|
|
|
+void CFingerPrintFSM::ScanProcess(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer &ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+
|
|
|
+ while (pScanParam->m_TimeLeft < FINGERPRINT_SCAN_TIMEOUT && !m_bCancelRegister && !pScanParam->m_ScanSuc)
|
|
|
{
|
|
|
if (m_bExit)
|
|
|
{
|
|
|
Dbg("Exit");
|
|
|
- bExit = true;
|
|
|
+ pScanParam->m_Quit = true;
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(FINGERPRINT_SCAN_INTERNAL));
|
|
|
- //Sleep(FINGERPRINT_SCAN_INTERNAL);
|
|
|
- eErr = m_pFingerPrint->Image2Feature(fileName, lpbFeature, lpbLength);
|
|
|
- if (eErr == Error_Succeed){
|
|
|
+
|
|
|
+ pScanParam->m_FeatureLen = MAX_FEATURE_LEN;
|
|
|
+ ErrorCodeEnum errCode = m_pFingerPrint->Image2Feature(pScanParam->m_BmpFileName
|
|
|
+ , pScanParam->m_Feature
|
|
|
+ , pScanParam->m_FeatureLen);
|
|
|
+ if (errCode == Error_Succeed)
|
|
|
+ {
|
|
|
Dbg("Invoke routine 'Image2Feature' success.'");
|
|
|
|
|
|
+ //save image may be delayed some time, not must happen
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
|
|
- //Sleep(200);//save image may be delayed some time, not must happen
|
|
|
+ std::ifstream bmpImage((const char*)pScanParam->m_FullFilePath, std::ifstream::binary);
|
|
|
|
|
|
- std::ifstream bmpImage((const char*)strPath, std::ifstream::binary);
|
|
|
- if (bmpImage && lpbFeature != NULL && lpbLength > 0){
|
|
|
- Dbg("fingerprint feature length is %d", lpbLength);
|
|
|
- ctx->Ans.imageName = fileName;
|
|
|
- if (ctx->Req.times == 3){
|
|
|
- //第三次需要合成模板
|
|
|
- Dbg("m_strPath1 = %s", m_strPath1.GetData());
|
|
|
- Dbg("m_strPath2 = %s", m_strPath2.GetData());
|
|
|
- Dbg("m_strPath3 = %s", m_strPath3.GetData());
|
|
|
-
|
|
|
- eErr = m_pFingerPrint->Image2Template(m_strPath1, m_strPath2, m_strPath3, lpbTemplate, lpbLength);
|
|
|
-
|
|
|
- if (eErr == Error_Succeed){
|
|
|
+ if (bmpImage && pScanParam->m_Feature != NULL && pScanParam->m_FeatureLen > 0)
|
|
|
+ {
|
|
|
+ Dbg("fingerprint feature length is %d", pScanParam->m_FeatureLen);
|
|
|
+ ctx->Ans.imageName = pScanParam->m_BmpFileName;
|
|
|
+ if (ctx->Req.times == 3) {
|
|
|
+ Dbg("m_strPath1 = %s", m_BmpFileFullPath1.GetData());
|
|
|
+ Dbg("m_strPath2 = %s", m_BmpFileFullPath2.GetData());
|
|
|
+ Dbg("m_strPath3 = %s", m_BmpFileFullPath3.GetData());
|
|
|
+
|
|
|
+ errCode = m_pFingerPrint->Image2Template(m_BmpFileFullPath1, m_BmpFileFullPath2
|
|
|
+ , m_BmpFileFullPath3, pScanParam->m_Template
|
|
|
+ , pScanParam->m_FeatureLen);
|
|
|
+
|
|
|
+ if (Error_Succeed == errCode)
|
|
|
+ {
|
|
|
Dbg("Invoke routine 'Image2Template' success");
|
|
|
- if (lpbTemplate != NULL && lpbLength > 0){
|
|
|
- Dbg("template length is %d", lpbLength);
|
|
|
- ctx->Ans.feature = (LPCTSTR)lpbTemplate;
|
|
|
- }else{
|
|
|
+
|
|
|
+ if (pScanParam->m_Template != NULL && pScanParam->m_FeatureLen > 0) {
|
|
|
+ Dbg("template length is %d", pScanParam->m_FeatureLen);
|
|
|
+ ctx->Ans.feature = (LPCTSTR)pScanParam->m_Template;
|
|
|
+ }
|
|
|
+ else {
|
|
|
Dbg("template is NULL");
|
|
|
- bGetTemplateSuc = false;
|
|
|
- break;
|
|
|
+ pScanParam->m_GetTemplateSuc = false;
|
|
|
+ break;
|
|
|
}
|
|
|
- }else{
|
|
|
- bGetTemplateSuc = false;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ pScanParam->m_GetTemplateSuc = false;
|
|
|
DevErrorInfo devErrorInfo;
|
|
|
m_pFingerPrint->GetLastErr(devErrorInfo);
|
|
|
- Dbg("Invoke routine 'Image2Template' failed which returned 0x%x(%s)", eErr, devErrorInfo.szErrMsg);
|
|
|
+ Dbg("Invoke routine 'Image2Template' failed which returned %s(%s)", SpStrError(errCode), devErrorInfo.szErrMsg);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- bScanSuccess = true;
|
|
|
+ pScanParam->m_ScanSuc = true;
|
|
|
break;
|
|
|
- }else if(!bmpImage){
|
|
|
- Dbg("Cannot find the fingerprint image %s", fileName);
|
|
|
- bNotFindImage = true;
|
|
|
+ }else if (!bmpImage) {
|
|
|
+ Dbg("Cannot find the fingerprint image %s", pScanParam->m_BmpFileName);
|
|
|
+ pScanParam->m_NotFindImage = true;
|
|
|
break;
|
|
|
- }else{
|
|
|
+ }else {
|
|
|
Dbg("Fingerprint feature is NULL.");
|
|
|
- bFeatureIsNull = true;
|
|
|
+ pScanParam->m_FeatureIsNull = true;
|
|
|
break;
|
|
|
}
|
|
|
- }else{
|
|
|
+ }else {
|
|
|
DevErrorInfo devErrInfo;
|
|
|
m_pFingerPrint->GetLastErr(devErrInfo);
|
|
|
- Dbg("Invoke routine 'Image2Feature' failed which returned 0x%x(%s) while register.", eErr, devErrInfo.szErrMsg);
|
|
|
+ Dbg("Invoke routine 'Image2Feature' failed which returned %s(%s) while register."
|
|
|
+ , SpStrError(errCode), devErrInfo.szErrMsg);
|
|
|
}
|
|
|
- timeEnd = clock();
|
|
|
- elapsed = timeEnd - timeStart;
|
|
|
+ pScanParam->m_TimeEnd = clock();
|
|
|
+ pScanParam->m_TimeLeft = pScanParam->m_TimeEnd - pScanParam->m_TimeStart;
|
|
|
}
|
|
|
+
|
|
|
LogEvent(Severity_Middle, LOG_EVT_FINGERPRINT_GREEN_OFF, "FingerPrint warning on");
|
|
|
m_bExit = false;
|
|
|
- if (bScanSuccess)
|
|
|
+}
|
|
|
+
|
|
|
+void CFingerPrintFSM::ProcessAfterScan(ScanParam* pScanParam, SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer& ctx)
|
|
|
+{
|
|
|
+ if (pScanParam->m_ScanSuc)
|
|
|
+ {
|
|
|
ctx->Answer(Error_Succeed);
|
|
|
- else if(elapsed >= FINGERPRINT_SCAN_TIMEOUT)
|
|
|
+ }
|
|
|
+ else if (pScanParam->m_TimeLeft >= FINGERPRINT_SCAN_TIMEOUT)
|
|
|
+ {
|
|
|
ctx->Answer(Error_TimeOut);
|
|
|
- else if(m_bCancelRegister)
|
|
|
+ }
|
|
|
+ else if (m_bCancelRegister)
|
|
|
+ {
|
|
|
ctx->Answer(Error_Cancel);
|
|
|
- else{
|
|
|
- if(bNotFindImage){
|
|
|
- LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER, "not find fingerprint image in dep while register.");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (pScanParam->m_NotFindImage)
|
|
|
+ {
|
|
|
+ LogError(Severity_High, Error_Hardware
|
|
|
+ , LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER
|
|
|
+ , "not find fingerprint image in dep while register.");
|
|
|
ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_NO_IMAGE_IN_DEP_REGISTER);
|
|
|
- }else if(bFeatureIsNull){
|
|
|
- LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER, "fingerprint feature is null while register.");
|
|
|
+ }
|
|
|
+ else if (pScanParam->m_FeatureIsNull)
|
|
|
+ {
|
|
|
+ LogError(Severity_High, Error_Hardware
|
|
|
+ , LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER
|
|
|
+ , "fingerprint feature is null while register.");
|
|
|
ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETFEATURE_FAILED_REGISTER);
|
|
|
- }else{
|
|
|
- if(ctx->Req.times == 3 && !bGetTemplateSuc){
|
|
|
- LogError(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED, "Not generate template correctly.");
|
|
|
+ }else {
|
|
|
+ if (ctx->Req.times == 3 && !pScanParam->m_GetTemplateSuc)
|
|
|
+ {
|
|
|
+ LogError(Severity_High, Error_Hardware
|
|
|
+ , LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED
|
|
|
+ , "Not generate template correctly.");
|
|
|
ctx->Answer(Error_Unexpect, LOG_ERR_FINGERPRINT_GETTEMPLATE_FAILED);
|
|
|
- }
|
|
|
- if(bExit){
|
|
|
- LogWarn(Severity_High, Error_Hardware, LOG_ERR_FINGERPRINT_REGISTER_FAILED, "Exit to homepage when register.");
|
|
|
+ }else if (pScanParam->m_Quit) {
|
|
|
+ LogWarn(Severity_High, Error_Hardware
|
|
|
+ , LOG_ERR_FINGERPRINT_REGISTER_FAILED
|
|
|
+ , "Exit to homepage when register.");
|
|
|
ctx->Answer(Error_Unexpect);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- delete[] lpbFeature;
|
|
|
- lpbFeature = NULL;
|
|
|
- delete[] lpbTemplate;
|
|
|
- lpbTemplate = NULL;
|
|
|
+
|
|
|
+ delete[] pScanParam->m_Feature;
|
|
|
+ pScanParam->m_Feature = NULL;
|
|
|
+ delete[] pScanParam->m_Template;
|
|
|
+ pScanParam->m_Template = NULL;
|
|
|
+ delete pScanParam;
|
|
|
+ pScanParam = NULL;
|
|
|
+}
|
|
|
+
|
|
|
+int CFingerPrintFSM::GetImageAndFeature(SpReqAnsContext<FingerPrintService_GetImageAndFeature_Req, FingerPrintService_GetImageAndFeature_Ans>::Pointer ctx)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+
|
|
|
+ ScanParam* pScanParam = new ScanParam();
|
|
|
+ ErrorCodeEnum errCode = InitParamBeforeScan(pScanParam, ctx->Req.times);
|
|
|
+
|
|
|
+ if (errCode != Error_Succeed)
|
|
|
+ ctx->Answer(errCode);
|
|
|
+ else {
|
|
|
+ ScanProcess(pScanParam, ctx);
|
|
|
+ if (pScanParam != NULL && ctx != NULL)
|
|
|
+ ProcessAfterScan(pScanParam, ctx);
|
|
|
+ else
|
|
|
+ ctx->Answer(Error_Param);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -447,20 +514,18 @@ ErrorCodeEnum CFingerPrintFSM::CheckCardSwiperStatus()
|
|
|
if(errCode != Error_Succeed)
|
|
|
{
|
|
|
Dbg("connect CardSwiper fail 0x%x(%d).", errCode, errCode);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
+ }else{
|
|
|
CardSwiperService_GetDevInfo_Req req = {};
|
|
|
CardSwiperService_GetDevInfo_Ans ans = {};
|
|
|
-
|
|
|
errCode = pCardSwiperClient->GetDevInfo(req, ans, 3000);
|
|
|
+
|
|
|
if(errCode != Error_Succeed){
|
|
|
Dbg("CardSwiper::GetDevInfo() fail: 0x%x", errCode);
|
|
|
}else{
|
|
|
Dbg("CardSwiper::GetDevInfo() return state: %d", ans.state);
|
|
|
- if (ans.state == DEVICE_STATUS_NOT_READY){
|
|
|
+ if (ans.state == DEVICE_STATUS_NOT_READY)
|
|
|
+ {
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
|
|
- //Sleep(500);
|
|
|
CardSwiperService_GetDevInfo_Req req2 = {};
|
|
|
CardSwiperService_GetDevInfo_Ans ans2 = {};
|
|
|
errCode = pCardSwiperClient->GetDevInfo(req2, ans2, 3000);
|