Преглед на файлове

#IQRV #comment [Vendor] keba/2022.0713.01 非接发卡器身份证

gifur преди 3 години
родител
ревизия
fd26f97a51

+ 1 - 1
DevAdapter/CMakeLists.txt

@@ -139,7 +139,7 @@ message(STATUS "vendor log library: ${VENDOR_LOG_LIB_NAME}")
 
 # 通过conan的方式管理厂商库
 if(DEVADAPTER_USING_CONAN)
-    set(KEBA_CONAN_LIB_NAME keba/2022.0610.01@LR04.02_VendorLib/testing)
+    set(KEBA_CONAN_LIB_NAME keba/2022.0713.01@LR04.02_VendorLib/testing)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2022.0224.01@LR04.02_VendorLib/testing)
 	set(GRG_CONAN_LIB_NAME grg/2022.0310.01@LR04.02_VendorLib/testing)
 	set(CW_CONAN_LIB_NAME cw/2021.0927.01@LR04.02_VendorLib/testing)

+ 87 - 5
DevAdapter/keba/CardIssuer.keba.1.1/ACT-Sankyo_DevCtrl.cpp

@@ -295,6 +295,83 @@ WORD CACT_Sankyo_DevCtrl::GetDevSN(LPSTR lpDevSN)
 	return wResult;
 }
 
+WORD CACT_Sankyo_DevCtrl::GetVersion(LPSTR lpVersion)
+{
+    COMMAND command = {0};
+    BYTE bCmp = '1';
+    command.bCommandTag = CMD_TAG;
+    command.bCommandCode = 0x76;
+    command.bParameterCode = 0x30;
+    command.Data.lpbBody = &bCmp;
+    command.Data.dwSize = 1;
+
+    REPLY reply;
+    WORD wResult = CRT_SUCCESS;
+    memset(&reply, 0x00, sizeof(REPLY));
+    BOOL bRet = m_pDevCtrlImpl->ExecuteCommand(command, &reply);
+    if (bRet == FALSE)
+    {
+        wResult = CRT_OFFLINE;
+        return wResult;
+    }
+
+    if (reply.replyType == NegativeReply)
+    {
+        wResult = m_pDevCtrlImpl->GetErrResValue(reply.message.negativeReply);
+    }
+    else
+    {
+        if ((reply.message.positiveReply.Data.bBody != NULL) &&
+            (reply.message.positiveReply.Data.dwSize > 0))
+        {
+            memcpy(lpVersion, reply.message.positiveReply.Data.bBody, reply.message.positiveReply.Data.dwSize);
+        }
+        else
+        {
+            wResult = /*CRT_INVALID_DATA*/ACT_RES_INVALID_DATA;
+        }
+    }
+
+    return wResult;
+}
+
+WORD CACT_Sankyo_DevCtrl::GetCHUVersion(LPSTR lpVersion)
+{
+    COMMAND command = {0};
+    command.bCommandTag = CMD_TAG;
+    command.bCommandCode = 0x41;
+    command.bParameterCode = 0x31;
+
+    REPLY reply;
+    WORD wResult = CRT_SUCCESS;
+    memset(&reply, 0x00, sizeof(REPLY));
+    BOOL bRet = m_pDevCtrlImpl->ExecuteCommand(command, &reply);
+    if (bRet == FALSE)
+    {
+        wResult = CRT_OFFLINE;
+        return wResult;
+    }
+
+    if (reply.replyType == NegativeReply)
+    {
+        wResult = m_pDevCtrlImpl->GetErrResValue(reply.message.negativeReply);
+    }
+    else
+    {
+        if ((reply.message.positiveReply.Data.bBody != NULL) &&
+            (reply.message.positiveReply.Data.dwSize > 0))
+        {
+            memcpy(lpVersion, reply.message.positiveReply.Data.bBody, reply.message.positiveReply.Data.dwSize);
+        }
+        else
+        {
+            wResult = /*CRT_INVALID_DATA*/ACT_RES_INVALID_DATA;
+        }
+    }
+
+    return wResult;
+}
+
 WORD CACT_Sankyo_DevCtrl::Reset(WORD wAction)
 {
 	COMMAND command;
@@ -1096,16 +1173,18 @@ WORD CACT_Sankyo_DevCtrl::GetWarningDetail(LPDevErrDetail lpErrDetail, WORD wRes
 */
 
 
-WORD CACT_Sankyo_DevCtrl::GetErrorDetail(LPDevErrDetail lpErrDetail)
+WORD CACT_Sankyo_DevCtrl::GetErrorDetail(LPDevErrDetail lpErrDetail, WORD wRes)
 {
     WORD wResult = CRT_SUCCESS;
-    WORD wErrCode = 0;
+    //WORD wErrCode = 0;
     WORD wOffSet = 0;
     CHAR szDetail[] = "HWERROR: ";
     wOffSet = strlen(szDetail);
     memset(lpErrDetail->szErrDetail, 0x00, sizeof(lpErrDetail->szErrDetail));
     memcpy(lpErrDetail->szErrDetail, szDetail, wOffSet);
-    REPLY reply;
+    CHAR szDefault[128] = {0x00};
+
+    /*REPLY reply;
 
     wResult = GetDevErrCode(&reply);
     if (wResult == CRT_OFFLINE)
@@ -1124,9 +1203,9 @@ WORD CACT_Sankyo_DevCtrl::GetErrorDetail(LPDevErrDetail lpErrDetail)
         return CRT_SUCCESS;
     }
 
-    wErrCode = m_pDevCtrlImpl->GetErrResValue(reply.message.negativeReply);
+    wErrCode = m_pDevCtrlImpl->GetErrResValue(reply.message.negativeReply);*/
 
-    switch(wErrCode)
+    switch(wRes)
     {
     case EXWORDHL(CRT_RES_CARD_JAM):
         lpErrDetail->iErrCode = DEP_NO_E_CARDISSUER_JAM;
@@ -1289,6 +1368,9 @@ WORD CACT_Sankyo_DevCtrl::GetErrorDetail(LPDevErrDetail lpErrDetail)
         strcpy(&lpErrDetail->szErrDetail[wOffSet], "电机阻塞或过载,ACT_RES_MOTOR_JAM_OR_OVERLOAD");
         break;
     default:
+        sprintf(szDefault, "DefaultErr: %x", wRes);
+        memset(lpErrDetail->szErrDetail, 0x00, sizeof(lpErrDetail->szErrDetail));
+        memcpy(lpErrDetail->szErrDetail, szDefault, strlen(szDetail));
         break;
     }
 

+ 3 - 1
DevAdapter/keba/CardIssuer.keba.1.1/ACT-Sankyo_DevCtrl.h

@@ -17,6 +17,8 @@ public:
 	WORD Close();
 	WORD GetDevStatus(LPDevStatus lpDevStatus);
 	WORD GetDevSN(LPSTR lpDevSN);
+    WORD GetVersion(LPSTR lpVersion);
+    WORD GetCHUVersion(LPSTR lpVersion);
 	WORD Reset(WORD wAction);
 	WORD PermitInsertion(WORD wCardType);
 	WORD DenyInsertion();
@@ -34,7 +36,7 @@ public:
 	WORD CheckReleaseIC();
 
 public:
-	WORD GetErrorDetail(LPDevErrDetail lpErrDetail);
+    WORD GetErrorDetail(LPDevErrDetail lpErrDetail, WORD wRes);
 	WORD GetWarningDetail(LPDevErrDetail lpErrDetail, WORD wRes);
 	WORD GetCRTErrCode(WORD wValue);
 

+ 25 - 21
DevAdapter/keba/CardIssuer.keba.1.1/ACT_SDK_DevCtrlImpl.cpp

@@ -35,36 +35,28 @@ void CACT_SDK_DevCtrlImpl::CloseDevice()
 BOOL CACT_SDK_DevCtrlImpl::ExecuteCommand(const COMMAND cmdToSend, LPREPLY lpReply, DWORD dwTimeOut/* = CMD_TIMEOUT*/)
 {
     long lRet = 0;
+    bool bRetry = false;
 
-    /*
     if (cmdToSend.bCommandCode == 0x31 && cmdToSend.bParameterCode == 0x30)
     {
-        usleep(50 * 1000);
-    }
-    if (cmdToSend.bCommandCode == 0x30 && cmdToSend.bParameterCode == 0x32)
-    {
-        usleep(500 * 1000);
+        bRetry = true;
     }
     if (cmdToSend.bCommandCode == 0x31 && cmdToSend.bParameterCode == 0x33)
     {
-        usleep(100 * 1000);
-        LogM("usleep(100000); line=%d",__LINE__);
+        bRetry = true;
     }
-    if (cmdToSend.bCommandCode == 0x40 && cmdToSend.bParameterCode == 0x32)
+    if (cmdToSend.bCommandCode == 0x76 && cmdToSend.bParameterCode == 0x31)
     {
-        usleep(100 * 1000);
-        LogM("usleep(100000); line=%d",__LINE__);
+        bRetry = true;
     }
-    */
 
     lRet = m_pSDKComIO->SendAndRecv(cmdToSend, lpReply, dwTimeOut);
     if (lRet != F5_S_SUCCESS)
     {
-        if (lRet == F5_E_DEV_NOT_READY)
+        if (bRetry == TRUE)
         {
-            //usleep(1000 * 1000);
             usleep(500 * 1000);
-            LogM("lRet == F5_E_DEV_NOT_READY line=%d",__LINE__);
+            LogM("lRet == SendAndRecv lRet=[%d] line=%d", lRet,__LINE__);
             lRet = m_pSDKComIO->SendAndRecv(cmdToSend, lpReply, dwTimeOut);
             if (lRet != F5_S_SUCCESS)
             {
@@ -121,8 +113,14 @@ BOOL CACT_SDK_DevCtrlImpl::GetHopperSensorInfo(LPCRTHoppersInfo lpHoppersInfo, L
 	lpHoppersInfo->bRetainBinExist = lpResData[0] >> 1 & CRT_SENSOR_MASK;
 	lpHoppersInfo->bRetainBinFull = lpResData[0] >> 2 & CRT_SENSOR_MASK;
 	//Hopper1
-	lpHoppersInfo->bHopper1Exist = lpResData[2] & CRT_SENSOR_MASK;
+    lpHoppersInfo->bHopper1Full = FALSE;
+    lpHoppersInfo->bHopper1Exist = lpResData[2] & CRT_SENSOR_MASK;
 	lpHoppersInfo->bHopper1Empty = (lpResData[2] >> 4 & CRT_SENSOR_MASK) == 0x00 ? TRUE : FALSE;
+
+    if (lpHoppersInfo->bHopper1Exist == FALSE)
+    {
+        lpHoppersInfo->bHopper1Exist = lpHoppersInfo->bHopper1Empty == TRUE ? FALSE : TRUE;
+    }
 	lpHoppersInfo->bHopper1Low = lpResData[2] >> 5 & CRT_SENSOR_MASK;
 	if (lpHoppersInfo->bHopper1Exist == TRUE)
 	{
@@ -136,8 +134,14 @@ BOOL CACT_SDK_DevCtrlImpl::GetHopperSensorInfo(LPCRTHoppersInfo lpHoppersInfo, L
 		}
 	}
 	//Hopper2
+    lpHoppersInfo->bHopper2Full = FALSE;
 	lpHoppersInfo->bHopper2Exist = lpResData[3] & CRT_SENSOR_MASK;
 	lpHoppersInfo->bHopper2Empty = (lpResData[3] >> 4 & CRT_SENSOR_MASK) == 0x00 ? TRUE : FALSE;
+
+    if (lpHoppersInfo->bHopper2Exist == FALSE)
+    {
+        lpHoppersInfo->bHopper2Exist = lpHoppersInfo->bHopper2Empty == TRUE ? FALSE : TRUE;
+    }
 	lpHoppersInfo->bHopper2Low = lpResData[3] >> 5 & CRT_SENSOR_MASK;
 	if (lpHoppersInfo->bHopper2Exist == TRUE)
 	{
@@ -398,16 +402,16 @@ WORD CACT_SDK_DevCtrlImpl::GetNGCRTResult(WORD wValue)
 		wResult = CRT_IC_INVALID;
 		break;
 	case ACT_RES_TYPE_ISSUER:
-		if (wValue == ACT_RES_CARDREADER_COMM_ERROR)
+        if (wValue == EXWORDHL(ACT_RES_CARDREADER_COMM_ERROR))
 		{
 			wResult = CRT_OFFLINE;
 		}
-		else if (wValue == ACT_RES_JAM_OR_SENSOR_ERROR ||
-			wValue == ACT_RES_MOTOR_JAM_OR_OVERLOAD)
+        else if (wValue == EXWORDHL(ACT_RES_JAM_OR_SENSOR_ERROR) ||
+            wValue == EXWORDHL(ACT_RES_MOTOR_JAM_OR_OVERLOAD))
 		{
 			wResult = CRT_JAM;
 		}
-		else if (wValue == ACT_RES_HOOK_NOT_AT_POS)
+        else if (wValue == EXWORDHL(ACT_RES_HOOK_NOT_AT_POS))
 		{
 			wResult = CRT_HWERR;
 		}
@@ -417,7 +421,7 @@ WORD CACT_SDK_DevCtrlImpl::GetNGCRTResult(WORD wValue)
 		}
 		break;
 	case CRT_RES_TYPE_WARNING:
-		if (wValue == ACT_RES_INVALID_DATA)
+        if (wValue == EXWORDHL(ACT_RES_INVALID_DATA))
 		{
 			wResult = CRT_INVALID_DATA;
 		}

+ 42 - 8
DevAdapter/keba/CardIssuer.keba.1.1/CardIssuerClassImpl_ACT-Sankyo.cpp

@@ -21,6 +21,8 @@ CardIssuerClassImpl::CardIssuerClassImpl():
     int nRet = Error_Succeed;
     m_pACT_Sankyo_DevCtrl = new CACT_Sankyo_DevCtrl();
     memset(m_szErrMsg, 0x00, sizeof(m_szErrMsg));
+    memset(m_szFWVer,  0x00, sizeof(m_szFWVer));
+    memset(m_szCHUVer,  0x00, sizeof(m_szCHUVer));
     //LogM("CardIssuer,Ver:202106101912");
 }
 
@@ -44,8 +46,14 @@ ErrorCodeEnum CardIssuerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     //CSetupMutex baseMutex(CARDISSUER_ADAPTER_MUTEX);
     std::lock_guard<std::mutex> lock(m_mutex);
     LOG_FUNCTION();
+    memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
+    memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
+    memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
 
-    strcpy(devCategory.szType, "PVER=ACT#MID=ACT-F5-5540-0SH");
+    CHAR szType[256] = {0x00};
+    sprintf(szType, "PVER=ACT#MID=ACT-F5-5540-0SH.FW[%s].FW[%s]", m_szFWVer, m_szCHUVer);
+
+    memcpy(devCategory.szType, szType, strlen(szType));
     strcpy(devCategory.szModel, "CM=V2.0");
     strcpy(devCategory.szVendor, "keba");
     LogM("CardIssuerClassImpl->GetDevCategory():devCategory.szType=%s,devCategory.szModel=%s,devCategory.szVendor=%s line=%d",devCategory.szType,devCategory.szModel,devCategory.szVendor,__LINE__);
@@ -565,7 +573,24 @@ ErrorCodeEnum CardIssuerClassImpl::ActiveICCard()
 {
     std::lock_guard<std::mutex> lock(m_mutex);
     LOG_FUNCTION();
-    int nRet=m_pACT_Sankyo_DevCtrl->ChipPower(CARD_READER_ICC_ACTIVE);
+    int nRet = 0;
+    int nTryRet = 0;
+    int nTryTime = 0;
+
+    do
+    {
+        nRet = m_pACT_Sankyo_DevCtrl->ChipPower(CARD_READER_ICC_ACTIVE);
+        if (nRet == CRT_SUCCESS)
+        {
+            break;
+        }
+        nTryTime++;
+
+        m_pACT_Sankyo_DevCtrl->ChipPower(CARD_READER_ICC_RELEASE);
+        m_pACT_Sankyo_DevCtrl->ChipPower(CARD_READER_ICC_CONTACT);
+    } while ((nRet != CRT_SUCCESS) && (nTryTime < 3));
+
+
     LogM("CardIssuerClassImpl::leave->ActiveICCard()->m_pACT_Sankyo_DevCtrl->ChipPower(CARD_READER_ICC_ACTIVE) nRet=[%d] line=%d!!", nRet,__LINE__);
     return ErrorCodeToCMB(nRet);
 }
@@ -683,20 +708,29 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYT
     LOG_FUNCTION();
     LogM("CardIssuerClassImpl::entry->CardIssuer->DevOpenEx(dwPort=%d,dwBaudRate=%d, btOpenType,pDevSN=%s, line=%d)",dwPort,dwBaudRate,pDevSN,__LINE__);
     btType=2;
+    WORD wSetRet = 0;
+
     WORD wRet = m_pACT_Sankyo_DevCtrl->Open(dwPort, dwBaudRate);
     if (wRet == CRT_SUCCESS)
     {
         m_bDevOpen = true;
         wRet = m_pACT_Sankyo_DevCtrl->Reset(CARD_READER_DEV_ACT_HOLD);
         LogM("CardIssuerClassImpl::leave->DevOpenEx()->m_pACT_Sankyo_DevCtrl->Reset() wRet=[%d] line=%d", wRet,__LINE__);
+        btType = DEV_OPEN_TYPE_COM;
+        wSetRet = m_pACT_Sankyo_DevCtrl->ReturnOffRetractCounter();
+        LogM("CardIssuerClassImpl::entry->DevOpenEx()->m_pACT_Sankyo_DevCtrl->Reset()->m_pACT_Sankyo_DevCtrl->ReturnOffRetractCounter()wRet=[%d] line=%d",
+             wSetRet,__LINE__);
+        wSetRet = m_pACT_Sankyo_DevCtrl->GetVersion(m_szFWVer);
+        LogM("CardIssuerClassImpl::entry->DevOpenEx()->m_pACT_Sankyo_DevCtrl->Reset()->m_pACT_Sankyo_DevCtrl->GetVersion()wRet=[%d] ver[%x] line=%d",
+             wSetRet, m_szFWVer, __LINE__);
+        wSetRet = m_pACT_Sankyo_DevCtrl->GetCHUVersion(m_szCHUVer);
+        LogM("CardIssuerClassImpl::entry->DevOpenEx()->m_pACT_Sankyo_DevCtrl->Reset()->m_pACT_Sankyo_DevCtrl->GetCHUVersion()wRet=[%d] ver[%x] line=%d",
+             wSetRet, m_szCHUVer, __LINE__);
         if (wRet == CRT_SUCCESS)
         {
-            btType = DEV_OPEN_TYPE_COM;
-            wRet = m_pACT_Sankyo_DevCtrl->ReturnOffRetractCounter();
-            LogM("CardIssuerClassImpl::entry->DevOpenEx()->m_pACT_Sankyo_DevCtrl->Reset()->m_pACT_Sankyo_DevCtrl->ReturnOffRetractCounter()wRet=[%d] line=%d", wRet,__LINE__);
+            LogM("CardIssuerClassImpl::leave->DevOpenEx() sucessfull line=%d",__LINE__);
+            return Error_Succeed;
         }
-        LogM("CardIssuerClassImpl::leave->DevOpenEx() sucessfull line=%d",__LINE__);
-        return Error_Succeed;
     }
     LogM("CardIssuerClassImpl::leave->DevOpenEx() failed line=%d",__LINE__);
     return ErrorCodeToCMB(wRet);
@@ -937,7 +971,7 @@ ErrorCodeEnum CardIssuerClassImpl::_ErrorCodeToCMB(WORD wRes, const CHAR* strFun
     }
     else
     {
-        m_pACT_Sankyo_DevCtrl->GetErrorDetail(&getErrDetail);
+        m_pACT_Sankyo_DevCtrl->GetErrorDetail(&getErrDetail, wRes);
     }
 
     sprintf(szErrDetail, "%s,Code=[%s]", getErrDetail.szErrDetail, getErrDetail.szErrCode);

+ 21 - 18
DevAdapter/keba/CardIssuer.keba.1.1/CardIssuerClassImpl_ACT-Sankyo.h

@@ -8,7 +8,7 @@
 
 #define CARDISSUER_ADAPTER_MUTEX		"CardIssuerAdapterMutex"
 
-//编译版
+//锟斤拷锟斤拷锟芥
 #define  FILE_MAJOR  1
 #define  FILE_MINOR  0
 #define  FILE_REVISION  0
@@ -62,7 +62,7 @@ protected:
 	virtual ErrorCodeEnum ICCommand(CmdInfo sendBuf,CmdInfo &recvBuf);
 
 	////////////////////////////////////////////////////////////////////////////
-	////////非接(IC)部分 start,没有此部分,在接口实现中直接返回Error_NotImpl///////////////
+	////////锟角斤拷(IC)锟斤拷锟斤拷 start锟斤拷没锟叫此诧拷锟街o拷锟节接匡拷实锟斤拷锟斤拷直锟接凤拷锟斤拷Error_NotImpl///////////////
 	////////////////////////////////////////////////////////////////////////////
 
 	virtual ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char &outType);
@@ -74,11 +74,11 @@ protected:
 	virtual ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo &recvBuf);
 
 	virtual ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo &recvBuf);
-	////////非接(IC)部分 end/////////////////////////////////////////////////////////
+	////////锟角斤拷(IC)锟斤拷锟斤拷 end/////////////////////////////////////////////////////////
 
 
 	/////////////////////////////////////////////////////////////////////////
-	///以下是便携式卡机特有API,接口实现中其他机型直接返回Error_NotImpl即可//
+	///锟斤拷锟斤拷锟角憋拷携式锟斤拷锟斤拷锟斤拷锟斤拷API锟斤拷锟接匡拷实锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷直锟接凤拷锟斤拷Error_NotImpl锟斤拷锟斤拷//
 	/////////////////////////////////////////////////////////////////////////
 
 	virtual ErrorCodeEnum DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType,const char *pDevSN, BYTE &btType);
@@ -89,7 +89,7 @@ protected:
 
 	virtual ErrorCodeEnum SendWorkingKey(const char *pWorkingKey);
 
-	//安全锁接口部分 begin
+	//锟斤拷全锟斤拷锟接口诧拷锟斤拷 begin
 	virtual ErrorCodeEnum SLLoadKey(const SCIKeyInfo key);
 
 	virtual ErrorCodeEnum SLSetParam(SCIParamType eType, int value);
@@ -97,32 +97,35 @@ protected:
 	virtual ErrorCodeEnum SLUnLock(const SCICheckCode checkCode, bool bTemp = true);
 	virtual ErrorCodeEnum SLGetTempData(SCITempData &ksnData, SCITempData &ramData);
 	virtual ErrorCodeEnum SLOpenDoor(const SCITempData data);
-	//安全锁接口部分 end
+	//锟斤拷全锟斤拷锟接口诧拷锟斤拷 end
 
-	//蓝牙控制部分 start
-	//蓝牙指令控制,命令参看SCIBluetoothCMD说明
+	//锟斤拷锟斤拷锟斤拷锟狡诧拷锟斤拷 start
+	//锟斤拷锟斤拷指锟斤拷锟斤拷锟狡o拷锟斤拷锟斤拷锟轿匡拷SCIBluetoothCMD说锟斤拷
 	virtual ErrorCodeEnum BluetoothControl(SCIBluetoothCMD eCmd);
-	//修改配对密码
+	//锟睫革拷锟斤拷锟斤拷锟斤拷锟斤拷
 	virtual ErrorCodeEnum BluetoothModifyKey(unsigned char *key);
-	//修改蓝牙设备名称
+	//锟睫革拷锟斤拷锟斤拷锟借备锟斤拷锟斤拷
 	virtual ErrorCodeEnum BluetoothModifyName(unsigned char *name);
-	//获取版本信
+	//锟斤拷取锟芥本锟斤拷
 	virtual ErrorCodeEnum BluetoothGetVersion(char *&version);
-	//获取连接设备名称
+	//锟斤拷取锟斤拷锟斤拷锟借备锟斤拷锟斤拷
 	virtual ErrorCodeEnum BluetoothGetConnectName(unsigned char *&name);
-	//获取连接设备信号强度
+	//锟斤拷取锟斤拷锟斤拷锟借备锟脚猴拷强锟斤拷
 	virtual ErrorCodeEnum BluetoothGetSignalStrength(unsigned char *&signal);
-	//蓝牙控制部分 end
+	//锟斤拷锟斤拷锟斤拷锟狡诧拷锟斤拷 end
 
-	//控制灯光
-	//eLight:所控制的灯 ;
-	//bOnOff:true 亮灯;fasle 灭灯
+	//锟斤拷锟狡灯癸拷
+	//eLight锟斤拷锟斤拷锟斤拷锟狡的碉拷 锟斤拷
+	//bOnOff锟斤拷true 锟斤拷锟狡o拷fasle 锟斤拷锟斤拷
 	virtual ErrorCodeEnum LightControl(SCILightType eLight, bool bOnOff);
-	//以百分比数值返回剩余电量(1-100),例如剩余51%,则bat赋值为51
+	//锟皆百分憋拷锟斤拷值锟斤拷锟斤拷剩锟斤拷锟斤拷锟斤拷锟斤拷1-100锟斤拷锟斤拷锟斤拷锟斤拷剩锟斤拷51%锟斤拷锟斤拷bat锟斤拷值为51
 	virtual ErrorCodeEnum QueryBatteryPower(int &bat);
 private:
 	bool m_bDevOpen;
+    bool m_bOpenReset;
 	CHAR m_szErrMsg[MAX_DEV_ERROR_MSG_LEN];
+    CHAR m_szFWVer[128];
+    CHAR m_szCHUVer[128];
     WORD m_wDevErrCode;
     //void SaveErrorInfo(CHAR* errMsg, CHAR* errCode, WORD wDevCode);
     void _SaveErrorInfo(CHAR* errMsg, int errCode, const CHAR* strFunc, int nLine);

+ 22 - 9
DevAdapter/keba/ContactlessCard.keba.1.1/CRT_RFIC_Ctrl.cpp

@@ -312,7 +312,7 @@ int CDevDllLoad::CrtActiveCard(LPCRT_ART_Info lpGetATR)
         nRet = m_fnReaderConnect(byRecvData, &nRecvLen);
         if (nRet != CRT_SUCCESS)
         {
-            sleep(200);
+            usleep(200*1000);
             nCount++;
         }
         else
@@ -320,7 +320,7 @@ int CDevDllLoad::CrtActiveCard(LPCRT_ART_Info lpGetATR)
             bConnect = TRUE;
             break;
         }
-    } while (nCount < 10);
+    } while (nCount < 20);
 
     if (bConnect == FALSE)
     {
@@ -341,22 +341,35 @@ int CDevDllLoad::CrtChipIO(CRT_Chip_Info sendInfo, LPCRT_Chip_Info lpRecvInfo)
 {
     int nRet = CRT_SUCCESS;
     int nRecvLen = 0;
+    WORD wTime = 0;
     BYTE byRecvData[CRT_CHIP_BUFF_LEN] = {0x00};
+    CRT_ART_Info crtGetATR = {0x00};
 
     if (lpRecvInfo == NULL || sendInfo.byData == NULL || sendInfo.nLen == 0)
     {
         return CRT_ERR_PARAM;
     }
 
-    nRet = m_fnSendApdu(sendInfo.byData, sendInfo.nLen, byRecvData, &nRecvLen);
-    if (nRet != CRT_SUCCESS || nRecvLen == 0)
+    do
     {
-        nRet = CRT_ERR_CHIPIO;
-    }
-    else
+        nRet = m_fnSendApdu(sendInfo.byData, sendInfo.nLen, byRecvData, &nRecvLen);
+        if (nRet != CRT_SUCCESS || nRecvLen == 0)
+        {
+            usleep(100*1000);
+            CrtActiveCard(&crtGetATR);
+            wTime++;
+        }
+        else
+        {
+            lpRecvInfo->nLen = nRecvLen;
+            memcpy(lpRecvInfo->byData, byRecvData, nRecvLen);
+            break;
+        }
+    } while ((nRet != CRT_SUCCESS) && (wTime < 3));
+
+    if (nRet != CRT_SUCCESS)
     {
-        lpRecvInfo->nLen = nRecvLen;
-        memcpy(lpRecvInfo->byData, byRecvData, nRecvLen);
+        nRet = CRT_ERR_CHIPIO;
     }
 
     return nRet;

+ 44 - 16
DevAdapter/keba/ContactlessCard.keba.1.1/rficclassimpl_crt603cz7.cpp

@@ -330,6 +330,7 @@ ErrorCodeEnum RFICClassImpl::ActiveContactlessICCard(char fstType,char scdType,c
     LogM("RFICClassImpl::Entry->ContactlessCard ActiveContactlessICCard()!");
     int nRet = CRT_SUCCESS;
     int nType = CRT_CARD_TYPE_UNKNOWN;
+    WORD wTime = 0;
     char szGetUID[16] = {0x00};
     CRT_ART_Info crtGetATR = {0x00};
 
@@ -337,7 +338,48 @@ ErrorCodeEnum RFICClassImpl::ActiveContactlessICCard(char fstType,char scdType,c
     {
         return Error_NotInit;
     }
-    nRet = m_pDll->CrtGetCardType(&nType);
+
+    do
+    {
+        nRet = m_pDll->CrtGetCardType(&nType);
+        if (nRet == CRT_SUCCESS)
+        {
+            LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %d",nType);
+            if (nType == CRT_CARD_TYPE_TYPEA)
+            {
+                outType = 'A';
+                break;
+            }
+            else if (nType == CRT_CARD_TYPE_TYPEB)
+            {
+                outType = 'B';
+                break;
+            }
+            else
+            {
+                wTime++;
+                LogM("Do CrtGetCardType() success! <=> nType = %c",nType);
+                //return Error_NotImpl;
+            }
+        }
+        else
+        {
+            wTime++;
+        }
+        usleep(100*1000);
+        if (wTime > 5)
+        {
+            LogM("Do CrtGetCardType() Break!");
+            break;
+        }
+    } while ((nRet != CRT_SUCCESS) || ((nType != CRT_CARD_TYPE_TYPEA) && (nType != CRT_CARD_TYPE_TYPEB)));
+
+    if (nType == 0 || nType > 2)
+    {
+        LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %c",nType);
+        return Error_NotImpl;
+    }
+
     if (nRet != CRT_SUCCESS)
     {
         LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() failed! <=> iRet = %d",nRet);
@@ -345,19 +387,7 @@ ErrorCodeEnum RFICClassImpl::ActiveContactlessICCard(char fstType,char scdType,c
         SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_GET_CARD_TYPE, __FUNCTION__, __LINE__);
         return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
     }
-    LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %d",nType);
-    if (nType == CRT_CARD_TYPE_TYPEA)
-    {
-        outType = 'A';
-    }
-    else if (nType == CRT_CARD_TYPE_TYPEB)
-    {
-        outType = 'B';
-    }
-    else
-    {
-        return Error_NotImpl;
-    }
+
     LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %c",outType);
     nRet = m_pDll->CrtActiveCard(&crtGetATR);
     if (nRet != CRT_SUCCESS)
@@ -587,7 +617,5 @@ int RFICClassImpl::GetDllPathLocal(std::string &dllPath)
    dllPath = szBuff;
    dllPath+="/";
    return Error_Succeed;
-
-
 }
 

+ 19 - 20
DevAdapter/keba/IDCertificate.keba.1.1/idcertificate.cpp

@@ -1,4 +1,4 @@
-#include "idcertificate.h"
+#include "idcertificate.h"
 #include <stdarg.h>
 #include "log4vendor.h"
 #include "stdafx.h"
@@ -452,12 +452,12 @@ ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
     {
 
     }
-    else if (nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)
-    {
-         SaveErrorInfo("IDCerAuthenticate()->GetMyIDCardType()无效卡", DEP_NO_E_IDCERTIFICATE_INVALID_CARD, __FUNCTION__, __LINE__);
-         LogE("IDCerAuthenticate()->GetMyIDCardType()无效卡, nRet=%d,line=%d", Error_DevMedia, __LINE__);
-        return Error_DevMedia;
-    }
+//    else if (nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)
+//    {
+//         SaveErrorInfo("IDCerAuthenticate()->GetMyIDCardType()无效卡", DEP_NO_E_IDCERTIFICATE_INVALID_CARD, __FUNCTION__, __LINE__);
+//         LogE("IDCerAuthenticate()->GetMyIDCardType()无效卡, nRet=%d,line=%d", Error_DevMedia, __LINE__);
+//        return Error_DevMedia;
+//    }
     else if (IDDIGITALCOPIER_STATUS_PASSAGE_JAM == nRet)
     {
         char err[MAX_DEV_ERROR_MSG_LEN] = {0};
@@ -506,12 +506,12 @@ ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
     {
         LogM("IDCerAuthenticate(),认证成功,line=%d", __LINE__);
     }
-    else if(nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)    //身份证电子信息处理错误
-    {
-        SaveErrorInfo("IDCerAuthenticate()无效卡", DEP_NO_E_IDCERTIFICATE_UNAUTHED, __FUNCTION__, __LINE__);
-        LogE("IDCerAuthenticate(),无效卡, nRet=%d,line=%d", Error_DevMedia, __LINE__);
-        return Error_DevMedia;
-    }
+//    else if(nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)    //身份证电子信息处理错误
+//    {
+//        SaveErrorInfo("IDCerAuthenticate()无效卡", DEP_NO_E_IDCERTIFICATE_UNAUTHED, __FUNCTION__, __LINE__);
+//        LogE("IDCerAuthenticate(),无效卡, nRet=%d,line=%d", Error_DevMedia, __LINE__);
+//        return Error_DevMedia;
+//    }
     else if (IDDIGITALCOPIER_STATUS_PASSAGE_JAM == nRet)
     {
         char err[MAX_DEV_ERROR_MSG_LEN] = {0};
@@ -551,8 +551,8 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo &idCerInfo)
     {
         //SaveErrorInfo(__LINE__, __FUNCTION__);
         SaveErrorInfo("IDCerGetData()未认证成功", DEP_NO_E_IDCERTIFICATE_UNAUTHED, __FUNCTION__, __LINE__);
-        LogE("IDCerGetData(),未认证成功, nRet=%d,line=%d", Error_DevMedia, __LINE__);
-        return Error_DevMedia;
+        LogE("IDCerGetData(),未认证成功, nRet=%d,line=%d", Error_FailVerify, __LINE__);
+        return Error_FailVerify;
     }
     m_bAuthed = false;  //认证成功只能读一次,下次必须重新认证;
     std::string dllPath = "";
@@ -890,8 +890,8 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
     {
         //SaveErrorInfo(__LINE__, __FUNCTION__);
         SaveErrorInfo("未认证成功。", DEP_NO_E_IDCERTIFICATE_UNAUTHED, __FUNCTION__, __LINE__);
-        LogE("IDCerGetDataEx(),未认证成功, nRet=%d", Error_DevMedia);
-        return Error_DevMedia;
+        LogE("IDCerGetDataEx(),未认证成功, nRet=%d", Error_FailVerify);
+        return Error_FailVerify;
     }
     m_bAuthed = false;  //认证成功只能读一次,下次必须重新认证;
 
@@ -1385,7 +1385,7 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
     {
         //无效卡(这里包括港澳台居住证,因为未接到招行提出改造此接口要求;)
         SaveErrorInfo("IDCerGetDataEx()无效卡", DEP_NO_E_IDCERTIFICATE_INVALID_CARD, __FUNCTION__, __LINE__);
-        //g_pLog->Print("IDCerGetDataEx(), 无效卡, nRet=%d", Error_DevMedia);
+        LogE("IDCerGetDataEx(), 无效卡, nRet=%d", Error_DevMedia);
         return Error_DevMedia;
     }
     LogM("IDCerGetDataEx(), nRet=%d", Error_Succeed);
@@ -1420,8 +1420,7 @@ ErrorCodeEnum IDCerClassImpl::ForceIDEject()
     if ((nRet == Error_Succeed) && pos == 0)
     {
 		SaveErrorInfo("ForceIDEject()未检测到卡", DEP_NO_E_IDCERTIFICATE_NO_CARD, __FUNCTION__, __LINE__);
-        LogM("ForceIDEject(), 未检测到卡, nRet=%d,line=%d", Error_DevMedia, __LINE__);
-        //return Error_DevMedia;
+        LogM("ForceIDEject(), 未检测到卡, line=%d", __LINE__);
     }
     int bRet = m_cBS_ID81IDCImpl.EjectIdCard(m_SecDeviceNum);
     if (bRet != IDDIGITALCOPIER_NO_ERROR)