Explorar el Código

#IQRV #comment [DevAdapter] keba/2021.0330.01

gifur hace 4 años
padre
commit
0e9a40e261

+ 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/2021.0312.01@LR04.02_VendorLib/testing)
+    set(KEBA_CONAN_LIB_NAME keba/2021.0330.01@LR04.02_VendorLib/testing)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2021.0310.01@LR04.02_VendorLib/testing)
 	set(GRG_CONAN_LIB_NAME grg/2021.0325.01@LR04.02_VendorLib/testing)
 	set(CW_CONAN_LIB_NAME cw/2021.0317.01@LR04.02_VendorLib/testing)

+ 0 - 1
DevAdapter/keba/CMakeLists.txt

@@ -18,7 +18,6 @@ add_subdirectory(CardIssuer.keba.1.1)
 add_subdirectory(ContactlessCard.keba.1.1)
 add_subdirectory(FingerPrint.keba.1.1)
 add_subdirectory(Gpio.keba.1.1)
-#add_subdirectory(HSPScannerService_keba)
 add_subdirectory(HSPScanner.keba.1.1)
 add_subdirectory(IDCertificate.keba.1.1)
 add_subdirectory(PinPad.keba.1.1)

+ 26 - 15
DevAdapter/keba/Gpio.keba.1.1/GpioClassImpl_DistrBusUSB.cpp

@@ -51,13 +51,18 @@ GpioClassImpl::GpioClassImpl():
 
     memset(m_sIniPath, 0, sizeof(m_sIniPath));
 //    strcpy(m_sIniPath, "data\\home\\keba\\DevAdapter\\CK-VTM-E1000.INI");
-    CFileDir::GetFilePathName(
-            getpid(), "INI", "CK-VTM-E1000.INI",
-            m_sIniPath, sizeof(m_sIniPath));
-
-
+//    CFileDir::GetFilePathName(
+//            getpid(), "INI", "CK-VTM-E1000.INI",
+//            m_sIniPath, sizeof(m_sIniPath));
+
+    char sPath[256]{0};
+    GetCurModulePath(sPath, nullptr);
+    memcpy(m_sIniPath,sPath,sizeof (sPath));
+    sprintf(m_sIniPath, "%s/%s", m_sIniPath, "keba/Adapter_L.keba.INI");
+    LogM("GPIO的配置文件=%s",m_sIniPath);
     m_nUSBDelay = g_iniAccess.GetPrivateProfileInt("Gpio", "USBDELAY", 3000, m_sIniPath);
 
+
      KEBA_DevCtrl=new CKEBA_DevCtrl();
      m_wDevStatus = DEVICE_STATUS_NOT_READY;
 }
@@ -239,6 +244,8 @@ ErrorCodeEnum GpioClassImpl::DevOpen(GpioInitParam initParam)
 ErrorCodeEnum GpioClassImpl::WritePort(DWORD dwPort, BYTE btData)
 {
     LOG_FUNCTION();
+    //zouchuang rang jia 50ms
+    usleep(50*1000);
     LogM("WritePort()input parameter:dwPort:%d, btData:0x%02x", dwPort, btData);
 	if(dwPort == 0)
 	{
@@ -246,7 +253,7 @@ ErrorCodeEnum GpioClassImpl::WritePort(DWORD dwPort, BYTE btData)
 			m_bIsUSBOn = true;
 		else if (m_bIsUSBOn)
 		{
-            sleep(m_nUSBDelay);
+             usleep(m_nUSBDelay*1000);
 			m_bIsUSBOn = false;
 		}
 	}
@@ -332,22 +339,26 @@ ErrorCodeEnum GpioClassImpl::ReadPort(DWORD dwPort,BYTE &btStatus)
 	BYTE inBuffer[8]={0};
 	BYTE outBuffer[8]={0};
 	ULONG  bytesReturned = 0; 
-	int iPin, iInputNo;
-	int portno;
+    int iPin = 0, iInputNo = 0;
+    int portno = 0;
     BOOL bRet = FALSE, bFailFlag = FALSE;
     WORD wStatus = 0;
     CHAR cErrmsg[128] = {0};
 	memset(inBuffer, 0x00, 8);
 
 	btStatus = 0x00;
-
-	if(m_dir[dwPort])  
+	
+	for(int i = 0; i < m_dwPortNum; i ++)
 	{
-		portno = dwPort + 4;
-	}
-	else
-	{
-		portno = dwPort - m_outputPortTotal;
+		if(!m_dir[i])	
+		{
+			portno ++;
+			if(i == dwPort)
+			{
+				portno --;
+				break;
+			}
+		}
 	}
 	char inputPin[20] = {0};
 	for(int i = 1; i<=8; i++ )

+ 3 - 17
DevAdapter/keba/HSPScanner.keba.1.1/CMakeLists.txt

@@ -38,10 +38,8 @@ if(RVC_INTEGRATE_BUILD)
     endif(NOT CONAN_QT_ROOT )
     find_package(Qt5 COMPONENTS Core DBus REQUIRED 
         HINTS ${CONAN_QT_ROOT} NO_SYSTEM_ENVIRONMENT_PATH )
-    conan_cmake_run( REQUIRES  opencv/3.1.0@LR04.02_ThirdParty/stable BASIC_SETUP CMAKE_TARGETS)
 else()
     find_package(Qt5 COMPONENTS Core DBus REQUIRED)
-    find_package(OpenCV REQUIRED)
 endif(RVC_INTEGRATE_BUILD)
 #生成动态库
 rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
@@ -57,22 +55,10 @@ target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
 #链接keba依赖的日志库以及锁库
 target_link_libraries(${MODULE_FULL_NAME} Common.keba)
 
-#链接OpenCV
-if(RVC_INTEGRATE_BUILD)
-    #链接银行opencv头文件路径和库路径和依赖opencv库
-    target_include_directories(${MODULE_FULL_NAME} PUBLIC  ${CONAN_INCLUDE_DIRS_OPENCV})
-    target_link_directories(${MODULE_FULL_NAME} PUBLIC  ${CONAN_LIB_DIRS_OPENCV})
-    target_link_libraries( ${MODULE_FULL_NAME}   ${CONAN_LIBS_OPENCV})
-else()
-    #链接Opencv的头文件路径
-    target_include_directories(${MODULE_FULL_NAME} PUBLIC ${OpenCV_INCLUDE_DIRS})
-    #链接opencv依赖的库
-    target_link_libraries( ${MODULE_FULL_NAME}   ${OpenCV_LIBS})
 
-endif(RVC_INTEGRATE_BUILD)
-    #链接Qt依赖的库
-    target_link_libraries(${MODULE_FULL_NAME}  Qt5::Core)
-    target_link_libraries(${MODULE_FULL_NAME}  Qt5::DBus)
+#链接Qt依赖的库
+target_link_libraries(${MODULE_FULL_NAME}  Qt5::Core)
+target_link_libraries(${MODULE_FULL_NAME}  Qt5::DBus)
 
 #设置动态库输出路径:/data/home/keba/DevAdapter/cmbsz/lib/gcc_aarch64或者gcc_x64
 

+ 10 - 1
DevAdapter/keba/HSPScanner.keba.1.1/CkDBus.cpp

@@ -284,13 +284,16 @@ long CkDBus::CallRemoteFunc_Send(LPDBusInfo lpDbusNames, LPARAM lParam)
     DBusConnection *conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
     if (dbus_error_is_set(&err))
     {
+
         fprintf(stderr, "Connection Error (%s)\n", err.message);
         dbus_error_free(&err);
+        LogM("err=%d,err.message=%s,function=%s,line=%d",LFS_ERR_INVALID_DBUS_OBJECT,err.message,__FUNCTION__,__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
 
     if (nullptr == conn)
     {
+        LogM("err==%d,nullptr == conn,function=%s,line=%d",LFS_ERR_INVALID_DBUS_OBJECT,__FUNCTION__,__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
 
@@ -300,6 +303,7 @@ long CkDBus::CallRemoteFunc_Send(LPDBusInfo lpDbusNames, LPARAM lParam)
                                                      lpDbusNames->sMethodName); // method name
     if (nullptr == msg)
     {
+       LogM("err==%d,nullptr == msg,function=%s,line=%d",LFS_ERR_INVALID_DBUS_OBJECT,__FUNCTION__,__LINE__);
        fprintf(stderr, "Message Null\n");
        return LFS_ERR_INVALID_DBUS_OBJECT;
     }
@@ -312,6 +316,7 @@ long CkDBus::CallRemoteFunc_Send(LPDBusInfo lpDbusNames, LPARAM lParam)
     if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_INT64, (void*)&_lParam))
     {
         fprintf(stderr, "Out Of Memory!\n");
+        LogM("line=%d",__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
 
@@ -329,11 +334,13 @@ long CkDBus::CallRemoteFunc_Send(LPDBusInfo lpDbusNames, LPARAM lParam)
     if (!dbus_connection_send_with_reply (conn, msg, &pending, tout))
     {
         fprintf(stderr, "Out Of Memory!\n");
+        LogM("line=%d",__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
     if (nullptr == pending)
     {
         fprintf(stderr, "Pending Call Null\n");
+        LogM("line=%d",__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
 
@@ -353,6 +360,7 @@ long CkDBus::CallRemoteFunc_Send(LPDBusInfo lpDbusNames, LPARAM lParam)
     if (nullptr == msg)
     {
         fprintf(stderr, "Reply Null\n");
+        LogM("line=%d",__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
 
@@ -364,11 +372,13 @@ long CkDBus::CallRemoteFunc_Send(LPDBusInfo lpDbusNames, LPARAM lParam)
     if (!dbus_message_iter_init(msg, &args))
     {
         fprintf(stderr, "Message has no arguments!\n");
+        LogM("line=%d",__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
     else if (DBUS_TYPE_INT32 != dbus_message_iter_get_arg_type(&args))
     {
         fprintf(stderr, "Argument is not int!\n");
+        LogM("line=%d",__LINE__);
         return LFS_ERR_INVALID_DBUS_OBJECT;
     }
     else
@@ -621,7 +631,6 @@ void* CkSharedMemory::GetWritePtr(int size)
             LogM("pM->attach()=false!,function=%s,line=%d",__FUNCTION__,__LINE__);
         }
     }
-
     return nullptr;
 }
 

+ 74 - 88
DevAdapter/keba/HSPScanner.keba.1.1/hspscannerimpl.cpp

@@ -8,24 +8,16 @@ HSPSClassImpl::HSPSClassImpl()
 {
     m_sLibPath[0] = 0;
     m_DBusInf_S = CkDBus::GetDBusInfo_S("HSPScanner");
-    //m_lpRQInf=(LPDBusRQInfo)CkDBus::shmget_ptr(FTOK_FILE, sizeof(DBusRQInfo));
-
     CkDBus::m_pid_Client = GetProcessId();  //
-    //m_HSPScannerSercive_Pid=CkDBus::m_HSPScannerSercive_Pid;
     m_bOpen=false;
 }
 
 HSPSClassImpl::~HSPSClassImpl()
 {
-        //m_pHSPSThread->exit();
 
-//    CkDBus::Kill_HSPScannerSercive();
-//    shmdt(m_lpRQInf);
+    DevClose();
 }
 
-//pid_t m_pid_Client;
-//pid_t m_pid_Service;
-
 ErrorCodeEnum HSPSClassImpl::DevOpen()
 {
     LOG_FUNCTION();
@@ -44,15 +36,18 @@ ErrorCodeEnum HSPSClassImpl::DevOpen()
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
-
+    ckMem.Lock();
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "DevOpen");
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
+    ckMem.UnLock();
 
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
+    ckMem.UnLock();
     m_bOpen=true;
     return (ErrorCodeEnum)lRet;
 }
@@ -62,19 +57,20 @@ ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     LOG_FUNCTION();
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "GetDevCategory");
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     devCategory=m_lpRQInf->funcInf.devCategory;
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
@@ -83,18 +79,18 @@ ErrorCodeEnum HSPSClassImpl::Reset()
     LOG_FUNCTION();
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
-
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "Reset");
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
@@ -103,23 +99,26 @@ ErrorCodeEnum HSPSClassImpl::DevClose()
     LOG_FUNCTION();
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "DevClose");
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     LogM("适配器将主动关闭服务端 服务端pid=[%ld],line=%d", (long)CkDBus::m_pid_Service,__LINE__);
 //    //主动关闭服务端
+    ckMem.Lock();
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "CloseServer");//关闭服务端
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
+    ckMem.UnLock();
     lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
     LogM("适配器关闭服务端lRet=%d, 服务端pid=[%ld],line=%d",lRet, (long)CkDBus::m_pid_Service,__LINE__)
     return (ErrorCodeEnum)lRet;
@@ -130,19 +129,20 @@ ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
     LOG_FUNCTION();
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "GetLastErr"); 
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
     devErrInfo=m_lpRQInf->funcInf.devErrInfo;
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 
 }
@@ -153,6 +153,7 @@ ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
 	LogM("HSPSClassImpl::SetParam(type=%d,value=%d),line=%d",type,value,__LINE__);
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
@@ -160,79 +161,64 @@ ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
     m_lpRQInf->funcInf.Param1=type;
     m_lpRQInf->funcInf.Param2=value;
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
         CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
-//nValue 值为0时关闭预览并隐藏窗口
 ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
 {
     LOG_FUNCTION();
 	LogM("HSPSClassImpl::SetPreview(nValue=%d),line=%d",nValue,__LINE__);
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "SetPreview");
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
     m_lpRQInf->funcInf.Param1= nValue;
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
-    //
-    //	Scan Image from device and store the image.
-    //	-pszFileName[in] Store the path and name using suffix ".jpg"
-    //		specifies that where the image will be located and what it would be named.
-    //	拍摄照片,传入的文件名已带绝对路径,无需再进行拼接处理
-    //
+
 ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
 {
     LOG_FUNCTION();
 	LogM("HSPSClassImpl::ScanImage(pszFileName=%s),line=%d",pszFileName,__LINE__);
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     strcpy(m_lpRQInf->funcInf.sFuncName, "ScanImage");
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
     strcpy(m_lpRQInf->funcInf.sFileName,pszFileName);
-
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
-//	Scan Image from device and return the image data in byte format.
-    //	-pBtImg[out] The buffer used to store the scanned image data.
-    //		存储图片字节流的缓冲区,大小为 nBtLen 字节
-    //	-nBtLen[in,out] Indicate the max byte-type size of pBtImg could be stored
-    //		and Store the real byte-type size of pBtImg had used when returned.
-    //		when detect value of nBtLen is 0 or smaller that necessary size, please
-    //		set nBtlen with real byte-type size and return Error_TooSmallBuffer.
-    //		如果nBtLen指定的字节数过小,那么对nBtLen赋值实际所需的大小并返回 Error_TooSmallBuffer,此操作仅允许一次
-    //	-pszFileName[in] Store the path and name where the image file should be located
-    //		while "" indicates that the image file shouldn't be stored at locate.
-    //		文件名长度为零表示不在本地生成图片文件
-    //
+
 ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg,  int& nBtLen, const char* pszFileName)
 {
     LOG_FUNCTION();
@@ -240,36 +226,39 @@ ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg,  int& nBtLen, const char*
     LogM("HSPSClassImpl::ScanImageEx(pBtImg, nBtLen=[%d], pszFileName=[%s])", nBtLen, pszFileName);
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
-
+    LogM("m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo)),line=%d",__LINE__);
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
     //memset(pBtImg, 0x00, nBtLen);
     strcpy(m_lpRQInf->funcInf.sFuncName, "ScanImageEx");
+
     m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
     m_lpRQInf->funcInf.Param1 = nBtLen;
     if(nullptr != pszFileName && strlen(pszFileName) > 0)
         strcpy(m_lpRQInf->funcInf.sFileName, pszFileName);
-
+    LogM("CkDBus::CallRemoteFunc_Send,line=%d",__LINE__);
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
+    ckMem.Lock();
+    if(pBtImg!=nullptr)
+    {
+        memcpy(pBtImg,  m_lpRQInf->funcInf.BtImg, m_lpRQInf->funcInf.Param1);
+    }
+    else {
+        LogM("Error_TooSmallBuffer,line=%d",__LINE__);
+    }
 
-
-    memcpy(pBtImg,  m_lpRQInf->funcInf.BtImg, m_lpRQInf->funcInf.Param1);
     nBtLen = m_lpRQInf->funcInf.Param1;
 
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
-    //
-    //	Set position and width of preview dialog with the rate of length to width: 16:9.
-    //	-nX[in] The X coordinate of leftTop point.
-    //  -nY[in] The Y coordinate of leftTop point.
-    //	-nWidth[in] The Width of Preview Dialog .
-    //	传入预览窗口显示的坐标,左上角的横坐标nX,左上角的纵坐标nY,以及预览窗口的宽,宽与高的比例为 16:9
-    //
+
 ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
 {
     LOG_FUNCTION();
@@ -277,6 +266,7 @@ ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
 
 
     CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
     m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
     memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
@@ -285,47 +275,43 @@ ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
     m_lpRQInf->funcInf.Param1=nX;
     m_lpRQInf->funcInf.Param2=nY;
     m_lpRQInf->funcInf.Param3=nWidth;
+    ckMem.UnLock();
     long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
 	LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
-
+    ckMem.Lock();
     if(m_lpRQInf->funcInf.pid_Service > 0)
            CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
-
+    ckMem.UnLock();
     return (ErrorCodeEnum)lRet;
 }
 
-    //
-    //	Show property dialog of HSPS of LiangTian.
-    //	If there is no property dialog function, ignore it and return Error_NotImpl(更新20161117).
-    //  更新20161117:用于打开良田高拍仪设备的设置属性页,可能用不到
-    //
+
 ErrorCodeEnum HSPSClassImpl::SetProperty()
 {
     return Error_Succeed;
 }
 
-    //
-    //	Get current status of device.
-    //
+
 ErrorCodeEnum HSPSClassImpl::GetDevStatus(HspsDevStatus& status)
 {
-        LOG_FUNCTION();
-
-        CkSharedMemory ckMem(CkSharedMemoryKey);
-        m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
-
-        memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
-        strcpy(m_lpRQInf->funcInf.sFuncName, "GetDevStatus");
-        m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
-
-        long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
-		LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
+    LOG_FUNCTION();
 
-        status=m_lpRQInf->funcInf.status;
+    CkSharedMemory ckMem(CkSharedMemoryKey);
+    ckMem.Lock();
+    m_lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
 
-        if(m_lpRQInf->funcInf.pid_Service > 0)
-               CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
+    memset(m_lpRQInf, 0x00, sizeof(DBusRQInfo));
+    strcpy(m_lpRQInf->funcInf.sFuncName, "GetDevStatus");
+    m_lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
+    ckMem.UnLock();
+    long lRet = CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (long)CkDBus::m_pid_Client);
+    LogM("CkDBus::CallRemoteFunc_Send(&m_DBusInf_S, (LPARAM)m_lpRQInf.func=%s)=%ld,line=%d",m_lpRQInf->funcInf.sFuncName,lRet,__LINE__);
+    ckMem.Lock();
+    status=m_lpRQInf->funcInf.status;
 
-        return (ErrorCodeEnum)lRet;
+    if(m_lpRQInf->funcInf.pid_Service > 0)
+           CkDBus::m_pid_Service = m_lpRQInf->funcInf.pid_Service;
+    ckMem.UnLock();
+    return (ErrorCodeEnum)lRet;
 }
 

+ 3 - 78
DevAdapter/keba/HSPScanner.keba.1.1/hspscannerimpl.h

@@ -6,8 +6,6 @@
 
 #include "HSPScannerClass.h"
 #include <QThread>
-//#include "hspscannerform.h"
-//#include "ThreadWorker.h"
 #include "CkDBus.h"
 
 
@@ -30,104 +28,31 @@ public:
 
 public:
 
-    //
-    //	Device initialization.
-    //	Connect to High speed portable scanner.
-    //	更新20161117:只做设备连接操作,不显示窗口
-    //
     virtual ErrorCodeEnum DevOpen();
 
-    //
-    //	Set param, more detail please to see ParamType and its according ParamTypeValue.
-    //
     virtual ErrorCodeEnum SetParam(ParamType type, ParamTypeValue value);
 
-    //
-    //	Command the device to start to preview or stop previewing.
-    //	-nValue[in] set 1 means StartPreview while 0 means StopPreview.
-    //	If the device' state had been setted before what the nValue commanded, ignore it and
-    //		return Error_Succeed.
-    //	The function returns only the specified behavior is done completely, StartPreview in special.
-    //  更新20161117: nValue值为 1 时打开预览,确保当前打开预览过程执行结束且窗口处于显示状态才返回Error_Succeed,
-    //	nValue值为 0 时关闭预览并隐藏窗口
-    //
-    //
     virtual ErrorCodeEnum SetPreview(short nValue);
 
-    //
-    //	Scan Image from device and store the image.
-    //	-pszFileName[in] Store the path and name using suffix ".jpg"
-    //		specifies that where the image will be located and what it would be named.
-    //	拍摄照片,传入的文件名已带绝对路径,无需再进行拼接处理
-    //
     virtual ErrorCodeEnum ScanImage(const char* pszFileName);
 
-    //
-    //	Scan Image from device and return the image data in byte format.
-    //	-pBtImg[out] The buffer used to store the scanned image data.
-    //		存储图片字节流的缓冲区,大小为 nBtLen 字节
-    //	-nBtLen[in,out] Indicate the max byte-type size of pBtImg could be stored
-    //		and Store the real byte-type size of pBtImg had used when returned.
-    //		when detect value of nBtLen is 0 or smaller that necessary size, please
-    //		set nBtlen with real byte-type size and return Error_TooSmallBuffer.
-    //		如果nBtLen指定的字节数过小,那么对nBtLen赋值实际所需的大小并返回 Error_TooSmallBuffer,此操作仅允许一次
-    //	-pszFileName[in] Store the path and name where the image file should be located
-    //		while "" indicates that the image file shouldn't be stored at locate.
-    //		文件名长度为零表示不在本地生成图片文件
-    //
-    //
     virtual ErrorCodeEnum ScanImageEx(BYTE* pBtImg,  int& nBtLen, const char* pszFileName = "");
 
-    //
-    //	Set position and width of preview dialog with the rate of length to width: 16:9.
-    //	-nX[in] The X coordinate of leftTop point.
-    //  -nY[in] The Y coordinate of leftTop point.
-    //	-nWidth[in] The Width of Preview Dialog .
-    //	传入预览窗口显示的坐标,左上角的横坐标nX,左上角的纵坐标nY,以及预览窗口的宽,宽与高的比例为 16:9
-    //
     virtual ErrorCodeEnum SetViewPos(int nX, int nY, int nWidth);
 
-    //
-    //	Show property dialog of HSPS of LiangTian.
-    //	If there is no property dialog function, ignore it and return Error_NotImpl(更新20161117).
-    //  更新20161117:用于打开良田高拍仪设备的设置属性页,可能用不到
-    //
     virtual ErrorCodeEnum SetProperty();
 
-    //
-    //	Get current status of device.
-    //
     virtual ErrorCodeEnum GetDevStatus(HspsDevStatus& status);
 
     virtual ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
-    //
-    //	Reset device.
-    //	Do the cleaning work and initialize device again in order to return to
-    //	the normal condition.
+
     virtual ErrorCodeEnum Reset();
-    //
-    //	Close device and do the cleaning work.
-    //	ex. close connection,close port,release memery and so on
+
     virtual ErrorCodeEnum DevClose();
-    //
-    //	Get last error the device issued.
-    //	Error message must include explanatory memorandum ,the original error
-    //	code and anything in favour of location problem.
-    virtual ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
 
-//Q_SIGNALS:
-//    void startThreadWork_signal();
+    virtual ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
 
 private:
-//    WorkerClass *m_WorkerObj;
-//    QThread*  m_WorkerThread;
-//    void startWorkerThread();
-
-    //HSPScannerForm m_CamDevice;
-
-
-    //HSPSThread m_HSPSThread;
-    //QThread*  m_pHSPSThread;
 
     DevErrorInfo m_DevErrInfo;
 

+ 10 - 0
DevAdapter/keba/IDCertificate.keba.1.1/BS_ID81IDCLibImpl.cpp

@@ -331,3 +331,13 @@ int BS_ID81IDCLibImpl::GetAllTypeCardInfo(unsigned DeviceID,int iCardType,void*
     int nRet = GetAllTypeIdInfo(DeviceID, iCardType,idinfo, ImageName);
     return nRet;
 }
+
+int BS_ID81IDCLibImpl::SetAutoFeedEnabled(unsigned DeviceID, int nMode)
+{
+    if (SetAutoFeedEnable == NULL)
+    {
+        return IDDIGITALCOPIER_PORT_ERROR;
+    }
+    int nRet = SetAutoFeedEnable(DeviceID, nMode);
+    return nRet;
+}

+ 1 - 0
DevAdapter/keba/IDCertificate.keba.1.1/BS_ID81IDCLibImpl.h

@@ -49,6 +49,7 @@ public:
     int GetMyIDCardType(unsigned DeviceID, int* iCardType);
     int GetMyGATIDInfo(unsigned DeviceID, IDInfoGAT* mIDInfoGAT, char *ImageName);
     int GetAllTypeCardInfo(unsigned DeviceID,int iCardType,void* idinfo,char* ImageName);
+    int SetAutoFeedEnabled(unsigned DeviceID,int nMode);
 
 public:
     // -------2019-07-09----------------------

+ 210 - 187
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"
@@ -67,7 +67,9 @@ m_bDevOpen(false)
 {
     LOG_FUNCTION();
     SecDeviceNum = 0;
+    m_wDevStatus = DEVICE_STATUS_NOT_READY;
 }
+
 IDCerClassImpl::~IDCerClassImpl()
 {
     LOG_FUNCTION();
@@ -75,6 +77,7 @@ IDCerClassImpl::~IDCerClassImpl()
     DevClose();
     SecDeviceNum = 0;
     std::string tmpPath = "";
+    m_wDevStatus = DEVICE_STATUS_NOT_READY;
     if( GetDllPathLocal(tmpPath) == Error_Succeed )
     {
     }
@@ -127,29 +130,29 @@ IDCerClassImpl::~IDCerClassImpl()
 
 int getFileVer(char* sFile, short &ch1, short &ch2)
 {
-        ch1 = 0;
-        ch2 = 0;
-        char* pFind = strstr(sFile, ".so");
-        char* pTemp = pFind;
-        while(pTemp)
-        {
-            pFind = pTemp;
-            pTemp = strstr(pFind + 3, ".so");
-        }
-        if(pFind == nullptr) return 0;
+    ch1 = 0;
+    ch2 = 0;
+    char* pFind = strstr(sFile, ".so");
+    char* pTemp = pFind;
+    while(pTemp)
+    {
+        pFind = pTemp;
+        pTemp = strstr(pFind + 3, ".so");
+    }
+    if(pFind == nullptr) return 0;
 
-        pTemp = pFind - 1;
-        while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
-        if(*pTemp == '.')
-            ch2 = atoi(pTemp + 1);
+    pTemp = pFind - 1;
+    while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
+    if(*pTemp == '.')
+        ch2 = atoi(pTemp + 1);
 
-        pTemp--;
-        while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
+    pTemp--;
+    while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
 
-        if(*pTemp == '.')
-            ch1 = atoi(pTemp + 1);
+    if(*pTemp == '.')
+        ch1 = atoi(pTemp + 1);
 
-        return 1;
+    return 1;
 }
 
 ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
@@ -159,10 +162,27 @@ ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
     memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
     memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
     memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
-    memcpy(devCategory.szType, "PVER=SNBC#MID=ID8101", strlen("PVER=SNBC#MID=ID8101"));
+    memcpy(devCategory.szType, "BSID81S", strlen("BSID81S"));
     memcpy(devCategory.szVendor, "keba", strlen("keba"));
-    devCategory.eState = DEVICE_STATUS_NORMAL;
 
+    DEVSTATUS m_DeviceStatus;
+    memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
+
+    int nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+    if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+    {
+        sleep(1);
+        DevOpen(SecDeviceNum);
+        nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+        if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+        {
+            SaveErrorInfo("通讯异常", Error_DevCommFailed);
+            LogM("DeviceStatus(), 通讯异常, nRet=%d,line=%d", nRet, __LINE__);
+            m_wDevStatus = DEVICE_STATUS_FAULT;
+        }
+    }
+
+    devCategory.eState = (DevStateEnum)m_wDevStatus;
     char sPath[256], sFile[128] = {0};
     GetCurModulePath(sPath, sFile);
     short v1,v2;
@@ -195,30 +215,39 @@ ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
                       devCategory.szModel);
     return Error_Succeed;
 }
+
 //	Reset device.
 //	Do the cleaning work and initialize device again in order to return to
 //	the normal condition.
 ErrorCodeEnum IDCerClassImpl::Reset()
 {
     LOG_FUNCTION();
-    LogM("Reset() Entry.");
-    if(!m_bDevOpen)
+    LogM("Reset() Entry,line=%d", __LINE__);
+
+    if (DevOpen(0) != Error_Succeed)
     {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        LogM("Reset(), 设备未打开, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
+        sleep(1);
+         if (DevOpen(0) != Error_Succeed)
+         {
+             m_wDevStatus = DEVICE_STATUS_NOT_READY;
+             SaveErrorInfo("设备未打开", Error_DevNotAvailable);
+             LogM("Reset(), 设备未打开, nRet=%d,line=%d", Error_DevNotAvailable, __LINE__);
+             return Error_DevNotAvailable;
+         }
     }
 
     int nRet = m_cBS_ID81IDCImpl.ResetWithAction(SecDeviceNum, 0);//复位模式,0---退卡,1---吞卡,2---退卡并持卡,3---无动作。
     if (IDDIGITALCOPIER_NO_ERROR != nRet)
     {
+        m_wDevStatus = DEVICE_STATUS_FAULT;
         SaveErrorInfo("设备通信异常", Error_DevConnFailed);
-        LogM("Reset() 复位模式, 0-- 退卡 动作失败");
+        LogM("Reset() 复位模式, 0-- 退卡 动作失败,line=%d", __LINE__);
         return Error_DevConnFailed;
     }
+    m_wDevStatus = DEVICE_STATUS_NORMAL;
     m_bAuthed = false;
     m_iCardType = -1;
-    LogM("Reset() 复位模式, 0-- 退卡 动作成功");
+    LogM("Reset() 复位模式, 0-- 退卡 动作成功,line=%d", __LINE__);
     return Error_Succeed;
 }
 //
@@ -228,34 +257,30 @@ ErrorCodeEnum IDCerClassImpl::DevClose()
 {
     LOG_FUNCTION();
     LogM("DevClose() Entry.");
+    m_wDevStatus = DEVICE_STATUS_NOT_READY;
     int nRet = m_cBS_ID81IDCImpl.CloseDev(SecDeviceNum);
-    if (IDDIGITALCOPIER_NO_ERROR != nRet)
-    {
-        SaveErrorInfo("设备通信异常", Error_DevConnFailed);
-        LogM("DevClose(), 设备通信异常, nRet=%d", nRet);
-        return Error_DevConnFailed;
-    }
 
     m_bDevOpen = false;
     m_bAuthed = false;
     m_iCardType = -1;
-    LogM("DevClose(), nRet=%d", nRet);
+    LogM("DevClose(SecDeviceNum = %d), nRet=%d,line=%d", SecDeviceNum, nRet, __LINE__);
     return Error_Succeed;
 }
+
 //	Get last error the device issued.
 //	Error message must include explanatory memorandum ,the original error
 //	code and anything in favour of location problem.
 ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
 {
     LOG_FUNCTION();
-    LogM("IDCerClassImpl::Entry->IDCerClassImpl GetLastErr()!");
+    LogM("IDCerClassImpl::Entry->IDCerClassImpl GetLastErr()! line=%d", __LINE__);
     devErrInfo.dwErrMsgLen = strlen(m_szErrMsg);
     memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
 
     memcpy(devErrInfo.szErrMsg, m_szErrMsg, MIN(devErrInfo.dwErrMsgLen, MAX_DEV_ERROR_MSG_LEN));
     LogM("GetLastErr() return:\n\
-                        devErrInfo.szErrMsg = %s, \n\
-                        devErrInfo.dwErrMsgLen = %d", devErrInfo.szErrMsg, devErrInfo.dwErrMsgLen);
+                           devErrInfo.szErrMsg = %s, \n\
+                           devErrInfo.dwErrMsgLen = %d,line=%d", devErrInfo.szErrMsg, devErrInfo.dwErrMsgLen, __LINE__);
 
     return Error_Succeed;
 }
@@ -266,16 +291,18 @@ ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
 ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
 {
     LOG_FUNCTION();
-    LogM("DevOpen(dwPort = %d) Entry.", dwPort);
+    LogM("DevOpen(dwPort = %d) Entry,line=%d", dwPort, __LINE__);
     unsigned int DevNumber = 8;	//统计当前设备数量
     ScannerInfoRec  ScannerInfo[8] = {0};                  //设备信息
     m_bAuthed = false;
     m_iCardType = -1;
 
+    DevClose();
     int nRet = m_cBS_ID81IDCImpl.EnumScannerDev(ScannerInfo, &DevNumber);
     if (DevNumber <= 0)
     {
         m_bDevOpen = false;
+        m_wDevStatus = DEVICE_STATUS_NOT_READY;
         SaveErrorInfo("未找到设备", Error_DevNotAvailable);
         SH_DeleteFileOrDirectory("LogModuleErrMsg.log");
         SH_DeleteFileOrDirectory("bin\\LogModuleErrMsg.log");
@@ -291,19 +318,21 @@ ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
         if (IDDIGITALCOPIER_NO_ERROR == nRet)
         {
             m_bDevOpen = true;
+            m_wDevStatus = DEVICE_STATUS_NORMAL;
             SH_DeleteFileOrDirectory("LogModuleErrMsg.log");
             SH_DeleteFileOrDirectory("bin\\LogModuleErrMsg.log");
             SH_DeleteFileOrDirectory("..\\bin\\LogModuleErrMsg.log");
-            LogM("DevOpen(), nRet=%d.", nRet);
+            LogM("DevOpen(), SecDeviceNum = %d, nRet=%d,line=%d", SecDeviceNum, nRet, __LINE__);
             return Error_Succeed;
         }
     }
     m_bDevOpen = false;
+    m_wDevStatus = DEVICE_STATUS_NOT_READY;
     SaveErrorInfo("设备通信异常", Error_DevConnFailed);
     SH_DeleteFileOrDirectory("LogModuleErrMsg.log");
     SH_DeleteFileOrDirectory("bin\\LogModuleErrMsg.log");
     SH_DeleteFileOrDirectory("..\\bin\\LogModuleErrMsg.log");
-    LogE("DevOpen, 设备通信异常, nRet = %d. ", nRet);
+    LogE("DevOpen, 设备通信异常, nRet = %d,line=%d ", nRet, __LINE__);
     return Error_DevConnFailed;
 }
 //
@@ -316,12 +345,6 @@ ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
 {
     LOG_FUNCTION();
     LogM("IDCerRFControl(), bControl = %d", bControl);
-    if(!m_bDevOpen)
-    {
-        //g_pLog->Print("IDCerRFControl(), !m_bDevOpen, nRet=%d", Error_DevNotAvailable);
-        LogE("IDCerRFControl(), !m_bDevOpen, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
     if (bControl)
     {
         /*
@@ -408,9 +431,10 @@ ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
     {
         ForceIDEject();
     }
-    LogM("IDCerRFControl(), nRet = %d", Error_Succeed);
+    LogM("IDCerRFControl(), nRet = %d,line=%d", Error_Succeed, __LINE__);
     return Error_Succeed;
 }
+
 //
 //	Optional.
 //	Certificate authentication.
@@ -419,93 +443,27 @@ ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
 {
     LOG_FUNCTION();
     LogM("IDCerAuthenticate() Entry.");
-    if(!m_bDevOpen)
+    int nRet = 0;
+    ErrorCodeEnum nRetErr =OnCheckCard();
+    if (nRetErr  != Error_Succeed)
     {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        LogE("IDCerAuthenticate(), !m_bDevOpen, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
-    DWORD	dwStart = GetTickCount();
-    DWORD	dwNow = dwStart;
-    DEVSTATUS m_DeviceStatus;
-    int pos = -1;
-    int nRet;
-    bool bCard = false;
-    while ((dwNow - dwStart) <= 1000)
-    {
-        pos = -1;
-        memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
-        nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
-        if (nRet != IDDIGITALCOPIER_NO_ERROR)
-        {
-            char err[MAX_DEV_ERROR_MSG_LEN] = {0};
-            sprintf(err, "通讯异常%d", nRet);
-            SaveErrorInfo(err, Error_DevCommFailed);
-            LogE("IDCerAuthenticate(), 通讯异常%d, nRet=%d", nRet, Error_DevCommFailed);
-            return Error_DevCommFailed;
-        }
-        if ((m_DeviceStatus.iStatusInputSensorHaveCard == 1) &&
-            (m_DeviceStatus.iStatusMiddleSensorHaveCard == 0) &&
-            (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
-        {
-            pos = 2;
-        }
-        else if ((m_DeviceStatus.iStatusMiddleSensorHaveCard == 1) ||
-                    (m_DeviceStatus.iStatusScanSensorHaveCard ==1))
-        {
-            pos = 1;
-        }
-        else
-        {
-            pos = 0;
-        }
-        if (pos <= 0)
-        {
-            usleep(100*1000);
-            dwNow = GetTickCount();
-        }
-        else
-        {
-            bCard = true;
-            break;
-        }
-    }
-    if (!bCard)
-    {
-        SaveErrorInfo("未检测到卡", Error_Unexpect);
-        LogE("IDCerAuthenticate(),未检测到卡, nRet=%d", Error_Unexpect);
-        return Error_Unexpect;
+        return nRetErr;
     }
+    LogM("IDCerAuthenticate():CheckIdCard检测到卡并已吸入, nRet=%d,line=%d", nRetErr, __LINE__);
 
-    nRet = m_cBS_ID81IDCImpl.CheckIdCard(SecDeviceNum, 100);
-    if ((IDDIGITALCOPIER_TIMEOUT_ERROR == nRet) ||
-        (IDDIGITALCOPIER_NO_CARD == nRet))
-    {
-        SaveErrorInfo("未检测到卡", Error_Unexpect);
-        LogE("IDCerAuthenticate(),未检测到卡, nRet=%d", Error_Unexpect);
-        return Error_Unexpect;
-    }
-    else if (IDDIGITALCOPIER_NO_ERROR != nRet)
-    {
-        char err[MAX_DEV_ERROR_MSG_LEN] = {0};
-        sprintf(err, "通讯失败%d", nRet);
-        SaveErrorInfo(err, Error_DevConnFailed);
-        LogE("IDCerAuthenticate(),通讯失败,nRet=%d", nRet, Error_DevConnFailed);
-        return Error_DevConnFailed;
-    }
     int iCardType = -1;
     memset(&m_IDInfoEx, 0x00, sizeof(IDInfoEx));
     memset(&m_IDForeignInfo, 0x00, sizeof(IDInfoForeign));
     memset(&m_IDInfoGAT, 0x00, sizeof(IDInfoGAT));
     memset(PhotoPath, 0, MAX_FILE_PATH);
-    std::string dllPath;
+    std::string dllPath = "";
     int bRet = GetDllPathLocal(dllPath);
     memcpy(PhotoPath, dllPath.c_str(), dllPath.length());
     dllPath += "zp.bmp";
     char FileName0[256]={0};
     memcpy(FileName0, dllPath.c_str(), dllPath.length());
     std::string strLog = "IDCerAuthenticate(),PhotoPath=[" + dllPath + "]";
-    LogM("%s",strLog.c_str());
+    LogM("%s,line=%d",strLog.c_str(), __LINE__);
     nRet = m_cBS_ID81IDCImpl.GetMyIDCardType(SecDeviceNum, &iCardType);
     if(nRet == IDDIGITALCOPIER_NO_ERROR)
     {
@@ -514,14 +472,22 @@ ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
     else if (nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)
     {
         SaveErrorInfo("无效卡", Error_DevMedia);
-        LogE("IDCerAuthenticate(),无效卡, nRet=%d", Error_DevMedia);
-        //m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
+         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};
+        sprintf(err, "塞卡%d", nRet);
+        SaveErrorInfo(err, Error_Unexpect);
+        LogE("IDCerAuthenticate(),塞卡,nRet=%d, SecDeviceNum=%d,line=%d", nRet, SecDeviceNum, __LINE__);
+        return Error_Unexpect;
+    }
     else
     {
         SaveErrorInfo("通讯异常", Error_DevCommFailed);
-        LogE("IDCerAuthenticate(),通讯异常%d,nRet=%d", nRet, Error_DevCommFailed);
+        LogE("IDCerAuthenticate(),通讯异常%d,nRet=%d,line=%d", nRet, Error_DevCommFailed, __LINE__);
+        m_wDevStatus = DEVICE_STATUS_FAULT;
         return Error_DevCommFailed;
     }
 
@@ -555,27 +521,35 @@ ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
 
     if(nRet == IDDIGITALCOPIER_NO_ERROR)
     {
-        LogM("IDCerAuthenticate(),认证成功");
+        LogM("IDCerAuthenticate(),认证成功,line=%d", __LINE__);
     }
     else if ((nRet == IDDIGITALCOPIER_NO_ERROR) ||
         (nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR))    //身份证电子信息处理错误
     {
         SaveErrorInfo("无效卡", Error_DevMedia);
-        LogE("IDCerAuthenticate(),无效卡, nRet=%d", Error_DevMedia);
-        m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
+        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};
+        sprintf(err, "塞卡%d", nRet);
+        SaveErrorInfo(err, Error_Unexpect);
+        LogE("IDCerAuthenticate(),塞卡,nRet=%d, SecDeviceNum=%d,line=%d", nRet, SecDeviceNum, __LINE__);
+        return Error_Unexpect;
+    }
     else
     {
         char err[MAX_DEV_ERROR_MSG_LEN] = {0};
         sprintf(err, "通讯失败%d", nRet);
         SaveErrorInfo(err, Error_DevConnFailed);
-        LogE("IDCerAuthenticate()通讯失败, nRet=%d", Error_DevCommFailed);
+        LogE("IDCerAuthenticate()通讯失败, nRet=%d,line=%d", Error_DevCommFailed, __LINE__);
+        m_wDevStatus = DEVICE_STATUS_FAULT;
         return Error_DevConnFailed;
     }
     m_bAuthed = true;     // true:认证成功;
     m_iCardType = iCardType;    // 认证成功后,卡的类型;
-    LogM("IDCerAuthenticate(), nRet=%d", Error_Succeed);
+    LogM("IDCerAuthenticate(), nRet=%d,line=%d", Error_Succeed, __LINE__);
     return Error_Succeed;
 }
 //  获取证件信息,包括二代身份证、外国人永久居留证
@@ -584,21 +558,16 @@ ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
 ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo &idCerInfo)
 {
     LOG_FUNCTION();
-    LogM("IDCerGetData() Entry.");
-    if(!m_bDevOpen)
-    {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        LogE("IDCerGetData(),设备未打开, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
+    LogM("IDCerGetData() Entry,line=%d", __LINE__);
+
     if (!m_bAuthed)
     {
         SaveErrorInfo("未认证成功。", Error_DevMedia);
-        LogE("IDCerGetData(),未认证成功, nRet=%d", Error_DevMedia);
+        LogE("IDCerGetData(),未认证成功, nRet=%d,line=%d", Error_DevMedia, __LINE__);
         return Error_DevMedia;
     }
     m_bAuthed = false;  //认证成功只能读一次,下次必须重新认证;
-    std::string dllPath;
+    std::string dllPath = "";
     int bRet = GetDllPathLocal(dllPath);
     std::string ckStr = dllPath + "ck.bmp";
     std::string zpStr = dllPath + "zp.bmp";
@@ -914,12 +883,7 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo &idCerInfo)
 ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
 {
     LOG_FUNCTION();
-    if(!m_bDevOpen)
-    {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        LogE("IDCerGetDataEx(),设备未打开, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
+
     if (!m_bAuthed)
     {
         SaveErrorInfo("未认证成功。", Error_DevMedia);
@@ -928,7 +892,7 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
     }
     m_bAuthed = false;  //认证成功只能读一次,下次必须重新认证;
 
-    std::string dllPath;
+    std::string dllPath = "";
     int bRet = GetDllPathLocal(dllPath);
 
     std::string ckStr = dllPath + "ck.bmp";
@@ -1432,44 +1396,33 @@ ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
 ErrorCodeEnum IDCerClassImpl::ForceIDEject()
 {
     LOG_FUNCTION();
-    LogM("ForceIDEject() Entry.");
-    if(!m_bDevOpen)
-    {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        //g_pLog->Print("ForceIDEject(), 设备未打开, nRet=%d", Error_DevNotAvailable);
-        LogM("ForceIDEject(), 设备未打开, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
+    LogM("ForceIDEject() Entry,line=%d", __LINE__);
+
     int pos = -1;
     ErrorCodeEnum nRet = QueryCardPos(pos);
     if ((nRet == Error_Succeed) && pos == 0)
     {
         SaveErrorInfo("未检测到卡", Error_DevMedia);
-        LogM("ForceIDEject(), 未检测到卡, nRet=%d", Error_DevMedia);
-        return Error_DevMedia;
+        LogM("ForceIDEject(), 未检测到卡, nRet=%d,line=%d", Error_DevMedia, __LINE__);
+        //return Error_DevMedia;
     }
     int bRet = m_cBS_ID81IDCImpl.EjectIdCard(SecDeviceNum);
     if (bRet != IDDIGITALCOPIER_NO_ERROR)
     {
         SaveErrorInfo("通讯异常", Error_DevCommFailed);
-        LogM("ForceIDEject(), 通讯异常, nRet=%d", Error_DevCommFailed);
+        LogM("ForceIDEject(), 通讯异常, nRet=%d, SecDeviceNum = %d,line=%d", bRet, SecDeviceNum, __LINE__);
         return Error_DevCommFailed;
     }
-    LogM("ForceIDEject(), nRet=%d", Error_Succeed);
+    LogM("ForceIDEject(), nRet=%d, SecDeviceNum = %d,line=%d", bRet, SecDeviceNum, __LINE__);
     return Error_Succeed;
 }
 
 ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
 {
     LOG_FUNCTION();
-    if(!m_bDevOpen)
-    {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        LogM("ScanIDAndSaveImage(), 设备未打开, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
+
     memset(PhotoPath, 0, MAX_FILE_PATH);
-    std::string dllPath;
+    std::string dllPath = "";
     GetDllPathLocal(dllPath);
     memcpy(PhotoPath, dllPath.c_str(), dllPath.length());
     char FileNamefront[256] = {0};
@@ -1478,13 +1431,33 @@ ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
     strcat_s(FileNamefront, "idfront.bmp");
     strcpy_s(FileNameback, PhotoPath);
     strcat_s(FileNameback, "idback.bmp");
-    int nRet = m_cBS_ID81IDCImpl.StartScan(SecDeviceNum);
+
+    DEVSTATUS m_DeviceStatus;
+    memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
+    int nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+    if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+    {
+        sleep(1);
+        DevOpen(SecDeviceNum);
+        nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+        if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+        {
+            SaveErrorInfo("通讯异常", Error_DevCommFailed);
+            LogM("DeviceStatus(), 通讯异常, nRet=%d,line=%d", nRet, __LINE__);
+            m_wDevStatus = DEVICE_STATUS_FAULT;
+            return Error_DevCommFailed;
+        }
+    }
+    LogM("DeviceStatus()正常, nRet=%d, line=%d", nRet, __LINE__);
+    nRet = m_cBS_ID81IDCImpl.StartScan(SecDeviceNum);
     if (nRet != IDDIGITALCOPIER_NO_ERROR)
     {
+        m_wDevStatus = DEVICE_STATUS_FAULT;
         SaveErrorInfo("通讯异常", Error_DevCommFailed);
-        LogM("ScanIDAndSaveImage(), 通讯异常, nRet=%d", Error_DevCommFailed);
+        LogM("StartScan(), 通讯异常, nRet=%d, line=%d", nRet, __LINE__);
         return Error_DevCommFailed;
     }
+    LogM("StartScan()正常, nRet=%d, line=%d", nRet, __LINE__);
     int iFrontLen;
     int iRearLen;
     //--------------改为与厂家DEMO相似,采用NEW方式申请数组空间;
@@ -1497,27 +1470,27 @@ ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
         if (nRet != IDDIGITALCOPIER_NO_ERROR)
         {
             SaveErrorInfo("通讯异常", Error_DevCommFailed);
-            nRet = m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
-            LogM("ScanIDAndSaveImage(), 通讯异常, nRet=%d", Error_DevCommFailed);
+            LogM("SaveToFile(), 通讯异常, nRet=%d,line=%d", Error_DevCommFailed, __LINE__);
             delete []cFrontImgBuf;
             delete []cRearImgBuf;
             return Error_DevCommFailed;
         }
+        LogM("SaveToFile()正常, nRet=%d, iFrontLen=%d, line=%d", nRet, iFrontLen, __LINE__);
     }
+    LogM("ReadCard()正常, nRet=%d, iFrontLen = %d, line=%d", nRet, iFrontLen, __LINE__);
     if (iRearLen>0)
     {
         nRet = m_cBS_ID81IDCImpl.SaveToFile(SecDeviceNum,cRearImgBuf,iRearLen,FileNameback,1);
         if (nRet != IDDIGITALCOPIER_NO_ERROR)
         {
             SaveErrorInfo("通讯异常", Error_DevCommFailed);
-            nRet = m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
-            LogM("ScanIDAndSaveImage(), 通讯异常, nRet=%d", Error_DevCommFailed);
+            LogM("SaveToFile(), 通讯异常, nRet=%d, iRearLen = %d, line=%d", Error_DevCommFailed, iRearLen, __LINE__);
             delete []cFrontImgBuf;
             delete []cRearImgBuf;
             return Error_DevCommFailed;
         }
+        LogM("SaveToFile()正常, nRet=%d, iRearLen = %d, line=%d", nRet, iRearLen, __LINE__);
     }
-    nRet = m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
     LogM("ScanIDAndSaveImage(), nRet=%d", Error_Succeed);
     delete []cFrontImgBuf;
     delete []cRearImgBuf;
@@ -1527,23 +1500,24 @@ ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
 ErrorCodeEnum IDCerClassImpl::QueryCardPos(int &pos)
 {
     LOG_FUNCTION();
-    LogM("QueryCardPos() Entry.");
-    if(!m_bDevOpen)
-    {
-        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
-        LogM("QueryCardPos(), 设备未打开, nRet=%d", Error_DevNotAvailable);
-        return Error_DevNotAvailable;
-    }
+    LogM("QueryCardPos() Entry,line=%d", __LINE__);
 
     DEVSTATUS m_DeviceStatus;
     memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
 
     int nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
-    if (nRet != IDDIGITALCOPIER_NO_ERROR)
+    if (nRet == IDDIGITALCOPIER_PORT_ERROR)
     {
-        SaveErrorInfo("通讯异常", Error_DevCommFailed);
-        LogM("QueryCardPos(), 通讯异常, nRet=%d", Error_DevCommFailed);
-        return Error_DevCommFailed;
+        sleep(1);
+        DevOpen(SecDeviceNum);
+        nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+        if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+        {
+            SaveErrorInfo("通讯异常", Error_DevCommFailed);
+            LogM("DeviceStatus(), 通讯异常, nRet=%d,line=%d", nRet, __LINE__);
+            m_wDevStatus = DEVICE_STATUS_FAULT;
+            return Error_DevCommFailed;
+        }
     }
 
     if ((m_DeviceStatus.iStatusInputSensorHaveCard == 1) &&
@@ -1551,22 +1525,22 @@ ErrorCodeEnum IDCerClassImpl::QueryCardPos(int &pos)
         (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
     {
         pos = 2;
-        LogM("QueryCardPos(), pos=2, 证件在进卡口");
+        LogM("QueryCardPos(), pos=2, 证件在进卡口,line=%d", __LINE__);
     }
     if ((m_DeviceStatus.iStatusMiddleSensorHaveCard == 1) ||
         (m_DeviceStatus.iStatusScanSensorHaveCard ==1))
     {
         pos = 1;
-        LogM("QueryCardPos(), pos=1, 证件在读卡器内部");
+        LogM("QueryCardPos(), pos=1, 证件在读卡器内部,line=%d", __LINE__);
     }
     if ((m_DeviceStatus.iStatusInputSensorHaveCard == 0) &&
         (m_DeviceStatus.iStatusMiddleSensorHaveCard == 0) &&
         (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
     {
         pos = 0;
-        LogM("QueryCardPos(), pos=0, 未检测到任何证件");
+        LogM("QueryCardPos(), pos=0, 未检测到任何证件,line=%d", __LINE__);
     }
-    LogM("QueryCardPos(), nRet=%d", Error_Succeed);
+    LogM("QueryCardPos(), nRet=%d,line=%d", Error_Succeed, __LINE__);
     return Error_Succeed;
 }
 
@@ -1578,6 +1552,7 @@ void IDCerClassImpl::SaveErrorInfo(CHAR* errMsg, int errCode)
     memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
     sprintf(m_szErrMsg, "%s[%d]", errMsg, errCode);
 }
+
 int IDCerClassImpl::string_format(std::string &str, const std::string fmt, ...)
 {
     char *buf;
@@ -1636,3 +1611,51 @@ std::string& IDCerClassImpl::trim(std::string &sStr, std::string sPatten)
     sStr.erase(sStr.find_last_not_of(sPatten) + 1);
     return sStr;
 }
+
+ErrorCodeEnum IDCerClassImpl::OnCheckCard()
+{
+    int nRet = IDDIGITALCOPIER_NO_ERROR;
+    DEVSTATUS m_DeviceStatus;
+
+     memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
+     nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+     if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+     {
+         sleep(1);
+         DevOpen(SecDeviceNum);
+         nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
+         if (nRet == IDDIGITALCOPIER_PORT_ERROR)
+         {
+             SaveErrorInfo("通讯异常", Error_DevCommFailed);
+             LogM("DeviceStatus(), 通讯异常, nRet=%d", nRet);
+             m_wDevStatus = DEVICE_STATUS_FAULT;
+             return Error_DevCommFailed;
+         }
+     }
+     nRet = m_cBS_ID81IDCImpl.CheckIdCard(SecDeviceNum, 3000);
+     if ((IDDIGITALCOPIER_TIMEOUT_ERROR == nRet) ||
+         (IDDIGITALCOPIER_NO_CARD == nRet))
+     {
+         SaveErrorInfo("未检测到卡", Error_Unexpect);
+         LogE("IDCerAuthenticate(),未检测到卡, nRet=%d, SecDeviceNum=%d", nRet, SecDeviceNum);
+         return Error_Unexpect;
+     }
+     else if (IDDIGITALCOPIER_STATUS_PASSAGE_JAM == nRet)
+     {
+         char err[MAX_DEV_ERROR_MSG_LEN] = {0};
+         sprintf(err, "塞卡%d", nRet);
+         SaveErrorInfo(err, Error_Unexpect);
+         m_cBS_ID81IDCImpl.ResetWithAction(SecDeviceNum, 3);
+         LogE("IDCerAuthenticate(),塞卡后软复位,nRet=%d, SecDeviceNum=%d,line=%d", nRet, SecDeviceNum, __LINE__);
+         return Error_Unexpect;
+     }
+     else if (IDDIGITALCOPIER_NO_ERROR != nRet)
+     {
+         char err[MAX_DEV_ERROR_MSG_LEN] = {0};
+         sprintf(err, "通讯失败%d", nRet);
+         SaveErrorInfo(err, Error_DevConnFailed);
+         LogE("IDCerAuthenticate(),通讯失败,nRet=%d, SecDeviceNum=%d,line=%d", nRet, SecDeviceNum, __LINE__);
+         return Error_DevConnFailed;
+     }
+     return Error_Succeed;
+}

+ 4 - 1
DevAdapter/keba/IDCertificate.keba.1.1/idcertificate.h

@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
 #ifndef IDCERTIFICATE_H
 #define IDCERTIFICATE_H
 //#pragma pack(push,1)
@@ -75,9 +75,12 @@ public:
 
 private:
     bool m_bDevOpen;
+    WORD m_wDevStatus;
     CHAR m_szErrMsg[MAX_DEV_ERROR_MSG_LEN];
     void SaveErrorInfo(CHAR* errMsg, int errCode=95555);
     bool SH_DeleteFileOrDirectory(char *strFileName);
+public:
+    ErrorCodeEnum OnCheckCard();
 
     /*std::string m_LogFileNamePath;
     int m_nLogLevel;*/

+ 0 - 12
DevAdapter/keba/IDCertificate.keba.1.1/idcertificate_global.h

@@ -1,12 +0,0 @@
-#ifndef IDCERTIFICATE_GLOBAL_H
-#define IDCERTIFICATE_GLOBAL_H
-
-#include <QtCore/qglobal.h>
-
-#if defined(IDCERTIFICATE_LIBRARY)
-#  define IDCERTIFICATESHARED_EXPORT Q_DECL_EXPORT
-#else
-#  define IDCERTIFICATESHARED_EXPORT Q_DECL_IMPORT
-#endif
-
-#endif // IDCERTIFICATE_GLOBAL_H

+ 1 - 2
DevAdapter/keba/IDCertificate.keba.1.1/libID81_SO.cpp

@@ -1,4 +1,4 @@
-#include "libID81_SO.h"
+#include "libID81_SO.h"
 #include "unistd.h"
 #include "stdio.h"
 #include "string.h"
@@ -65,7 +65,6 @@ bool load_so(char *cErrorInfo)
     char *pLastSlath=strrchr(str_FilePath,'/');
     *pLastSlath=0;
     char *a="/keba/libBS-ID81M.keba.so.2.0.1";
-    //char *a="/keba/lib/libBS-ID81M.so.2.0.0";
     strncat(str_FilePath,a,strlen(a));
     printf("Second_str_FilePath=%s\n",str_FilePath);
     hlibID81 = dlopen(str_FilePath, RTLD_LAZY);

+ 0 - 1
DevAdapter/keba/ThermalPrint.keba.1.1/CMakeLists.txt

@@ -57,7 +57,6 @@ target_link_directories(${MODULE_FULL_NAME} PUBLIC  ${VENDOR_CURRENT_LIB_DIR}/ke
 #链接招行日志库
 target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
 #链接keba依赖库
-#target_link_libraries(${MODULE_FULL_NAME} DevComm.keba Algorithm.keba DataConvert.keba winfunc.keba FileDir.keba INIAccess.keba FileAccess.keba TraceManager.keba SerialComm.keba)
 target_link_libraries(${MODULE_FULL_NAME} Common.keba)
 #设置动态库输出路径:/data/home/keba/DevAdapter/cmbsz/lib/gcc_aarch64或者gcc_x64
 #链接OpenCV

+ 98 - 110
DevAdapter/keba/WatchDog.keba.1.1/WatchDogClassImpl.cpp

@@ -186,7 +186,7 @@ ErrorCodeEnum WatchDogClassImpl::DevOpen()
 ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
 {
     LOG_FUNCTION();
-    LogE("StartWatch dwDelay=%d,dwTimeout=%d",dwDelay,dwTimeout);
+    LogE("StartWatch dwDelay=%d,dwTimeout=%d,line=%d",dwDelay,dwTimeout,__LINE__);
     if (!m_bDevOpen)
     {
         SaveErrorInfo("StartWatch m_bDevOpen is null!");
@@ -199,69 +199,69 @@ ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
         LogE("StartWatch m_pMB330CRM is null! Error_DevNotAvailable=%d line=%d",Error_DevNotAvailable,__LINE__);
         return Error_DevNotAvailable;
     }
-    if (dwDelay == 0 && dwTimeout == 0)
-    {
-        //SaveErrorInfo("StartWatch Check Param fail!");
-        LogE("StartWatch Check two Param are 0! line=%d",__LINE__);
-        int flag=WDIOS_ENABLECARD;
-        if(-1== ioctl(m_wfd, WDIOC_SETOPTIONS, &flag))
-        {
-            LogW("-1==ioctl(m_wfd, WDIOC_SETOPTIONS, &flag=WDIOS_ENABLECARD); line=%d",__LINE__);
-        }
-        ioctl(m_wfd,WDIOC_SETTIMEOUT,&dwTimeout);
-        return Error_Param;
-    }
-    //Initiate variable
+    //初始化全局静态变量
     dwWDTTime = 0 ;
     dwDelayTime = 0;
     if (dwTimeout > 178)
     {
-        m_dwTimeOut = dwTimeout % 178;
-        m_dwWDTDelayTime = (dwTimeout - m_dwTimeOut) / 178;
+        m_dwTimeOut = dwTimeout % 178;//设置看门狗的超时时间
+        m_dwWDTDelayTime = (dwTimeout - m_dwTimeOut) / 178;//超过178秒后确定要延迟几次
         LogW("m_dwTimeOut=%d,m_dwWDTDelayTime=%d line=%d,",m_dwTimeOut,m_dwWDTDelayTime,__LINE__);
     }
-    else
+    else if (dwTimeout > 0 && dwTimeout < 178)
     {
         m_dwTimeOut = dwTimeout;
     }
     m_dwRealTimeOut = dwTimeout;
     LogE("m_dwRealTimeOut=%d line=%d" ,m_dwRealTimeOut , __LINE__);
-
     //Start DelayTimer
     if ( dwDelay != 0 )
     {
+        LogW("dwDelay != 0! line=%d",__LINE__);
         if (m_bDelayTimer)
         {
             m_TimerCtrl->EndTimer_ptr(m_mmDelayTimerID);
-            LogW("line=%d StartWatch(dwDelay=%d, dwTimeout=%d) StartWatch Delay timeKillEvent m_mmDelayTimerID = %d !",
-             __LINE__,dwDelay, dwTimeout,m_mmDelayTimerID);
-        }
-
-        if (dwDelay > 178)
-        {
-            m_dwDelayRemain = dwDelay % 178;
-            LogW(" m_dwDelayRemain = %d !line=%d ",m_dwDelayRemain, __LINE__);
-            m_dwDelayTime = (dwDelay - m_dwDelayRemain) / 178;
-            LogW("m_dwDelayTime = %d  line=%d !",m_dwDelayTime, __LINE__);
-            m_TimerCtrl->SetTimerFunction(DelayTimer);
-            m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this,_TIMER_DELAY,FALSE);
-            LogW("WatchDogClassImpl::StartWatch->StartWatch Delay timeSetEvent m_mmDelayTimerID = %d  line=%d !",m_mmDelayTimerID, __LINE__);
+            LogW("StartWatch(dwDelay=%d, dwTimeout=%d) StartWatch Delay timeKillEvent m_mmDelayTimerID = %d line=%d ",dwDelay, dwTimeout,m_mmDelayTimerID, __LINE__);
         }
-        else
-        {
-            m_dwDelayTime = 0;
-            LogW("m_dwDelayTime = %d line=%d !", m_dwDelayTime,__LINE__);
-            m_TimerCtrl->SetTimerFunction(DelayTimer);
-            m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this,dwDelay*1000,TRUE);
-            LogW("WatchDogClassImpl::StartWatch->StartWatch Delay timeSetEvent m_mmDelayTimerID = %d line=%d !", m_mmDelayTimerID,__LINE__);
-        }
-
+        m_dwDelayTime = dwDelay;
+        LogW("m_dwDelayTime = %d line=%d !", m_dwDelayTime,__LINE__);
+        m_TimerCtrl->SetTimerFunction(DelayTimer);
+        m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this,dwDelay*1000,FALSE);
+        LogW("WatchDogClassImpl::StartWatch->StartWatch Delay timeSetEvent m_mmDelayTimerID = %d line=%d !", m_mmDelayTimerID,__LINE__);
         m_bDelayTimer = true;
         m_dwDelay = dwDelay;
     }
-    else
+    //处理延时为0的情况,dwTimeout >178的时候定时器调用WDTTimer函数
+    else if(dwDelay==0)
     {
-        if (dwTimeout > 178)
+        LogW("dwDelay==0! line=%d",__LINE__);
+        if ( dwTimeout == 0)
+        {
+            //SaveErrorInfo("StartWatch Check Param fail!");
+            LogW("StartWatch Check two Param are 0! line=%d",__LINE__);
+            int flag=WDIOS_ENABLECARD;
+            if(-1== ioctl(m_wfd, WDIOC_SETOPTIONS, &flag))
+            {
+                LogW("-1==ioctl(m_wfd, WDIOC_SETOPTIONS, &flag=WDIOS_ENABLECARD); line=%d",__LINE__);
+            }
+            dwTimeout=1;
+            LogW("dwTimeout=%d, line=%d",dwTimeout,__LINE__);
+            ioctl(m_wfd,WDIOC_SETTIMEOUT,&dwTimeout);
+            return Error_Succeed;
+        }
+        else if (dwTimeout > 0 && dwTimeout < 178)
+        {
+            LogW("StartWatch Check dwDelay == 0 && dwTimeout =%d 0! line=%d",dwTimeout,__LINE__);
+            int flag=WDIOS_ENABLECARD;
+            if(-1== ioctl(m_wfd, WDIOC_SETOPTIONS, &flag))
+            {
+                LogW("-1==ioctl(m_wfd, WDIOC_SETOPTIONS, &flag=WDIOS_ENABLECARD); line=%d",__LINE__);
+            }
+            LogW("dwTimeout=%d, line=%d",dwTimeout,__LINE__);
+            ioctl(m_wfd,WDIOC_SETTIMEOUT,&dwTimeout);
+            return Error_Succeed;
+        }
+        else if (dwTimeout > 178)
         {
             //Start WDTTimer
             if (m_bWDTTimer)
@@ -275,18 +275,6 @@ ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
             LogW(" m_TimerCtrl->StartTimer_ptr(m_mmWDTTimerID,this,dwDelay*1000=%d,TRUE) ! line=%d", dwDelay*1000,__LINE__);
             m_bWDTTimer = true;
         }
-        else
-        {
-            //设置没有喂看门狗超时重启时间
-            int flag=WDIOS_ENABLECARD;
-            if(-1== ioctl(m_wfd, WDIOC_SETOPTIONS, &flag))
-            {
-                LogW("-1==ioctl(m_wfd, WDIOC_SETOPTIONS, &flag=WDIOS_ENABLECARD); line=%d",__LINE__);
-            }
-            ioctl(m_wfd,WDIOC_SETTIMEOUT,&dwTimeout);
-            //m_pMB330CRM->SetWDT(true, (BYTE)(dwTimeout));
-            LogW(" WatchDogClassImpl::StartWatch->StartWatch no Delay SetWDT dwTimeout = %d ! line=%d", dwTimeout,__LINE__);
-        }
     }
     LogW(" WatchDogClassImpl::StartWatch->StartWatch is Execute success!,line=%d",__LINE__);
 
@@ -339,52 +327,39 @@ ErrorCodeEnum WatchDogClassImpl::RefreshDog()
     if (!m_bDevOpen)
     {
         SaveErrorInfo("RefreshDog m_bDevOpen is null!");
-        LogW("WatchDogClassImpl::RefreshDog()->RefreshDog m_bDevOpen is false!");
+        LogW("WatchDogClassImpl::RefreshDog()->RefreshDog m_bDevOpen is false! line=%d",__LINE__);
         return Error_DevNotAvailable;
     }
 
     if(m_wfd == NULL)
     {
         SaveErrorInfo("RefreshDog m_pMB330CRM is null!");
-        LogE(" WatchDogClassImpl::RefreshDog()->RefreshDog m_wfd is null!");
+        LogE(" WatchDogClassImpl::RefreshDog()->RefreshDog m_wfd is null! line=%d",__LINE__);
         return Error_DevNotAvailable;
     }
     if ( m_bDelayTimer)
     {
-        //timeKillEvent(m_mmDelayTimerID);
         m_TimerCtrl->EndTimer_ptr(m_mmDelayTimerID);
-        LogW("WatchDogClassImpl::RefreshDog()->RefreshDog m_bDelayTimer timeKillEvent m_mmDelayTimerID = %d !", m_mmDelayTimerID);
-        if (m_dwDelay > 178)
-        {
-            //m_mmDelayTimerID = timeSetEvent( _TIMER_DELAY, 1, &DelayTimer, (DWORD)this, TIME_PERIODIC );
-            m_TimerCtrl->SetTimerFunction(DelayTimer);
-            m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this,_TIMER_DELAY,FALSE);
-            LogW("WatchDogClassImpl::RefreshDog()->RefreshDog Delay > 178 timeSetEvent m_mmDelayTimerID = %d !", m_mmDelayTimerID);
-        }
-        else
-        {
-            //m_mmDelayTimerID = timeSetEvent( m_dwDelay*1000, 1, &DelayTimer, (DWORD)this, TIME_ONESHOT );
-            m_TimerCtrl->SetTimerFunction(DelayTimer);
-            m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this, m_dwDelay*1000,TRUE);
-            LogW("WatchDogClassImpl::RefreshDog()->RefreshDog Delay < 178 timeSetEvent m_mmDelayTimerID = %d !", m_mmDelayTimerID );
-        }
+        LogW("WatchDogClassImpl::RefreshDog()->RefreshDog m_bDelayTimer timeKillEvent m_mmDelayTimerID = %d !", m_mmDelayTimerID);          
+        m_TimerCtrl->SetTimerFunction(DelayTimer);
+        m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this, m_dwDelay*1000,TRUE);
+        LogW("WatchDogClassImpl::RefreshDog()->RefreshDog Delay < 178 timeSetEvent m_mmDelayTimerID = %d !", m_mmDelayTimerID );
+
         m_bDelayTimer = true;
         dwDelayTime = 0;
-
         return Error_Succeed;
     }
-
     //TimeOut > 178
     if (m_dwRealTimeOut > 178)
     {
         //m_pMB330CRM->StopWDT();
-        ioctl(m_wfd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD);
         if (m_bWDTTimer)
         {
             //timeKillEvent(m_mmWDTTimerID);
             m_TimerCtrl->EndTimer_ptr(m_mmWDTTimerID);
             LogW("WatchDogClassImpl::RefreshDog()->RefreshDog  Kill m_mmWDTTimerID = %d !", m_mmWDTTimerID );
         }
+        ioctl(m_wfd, WDIOC_KEEPALIVE, 0);
         m_TimerCtrl->SetTimerFunction(WDTTimer);
         m_TimerCtrl->StartTimer_ptr(m_mmDelayTimerID,this, _TIMER_DELAY,TRUE);
         LogW("WatchDogClassImpl::RefreshDog()->RefreshDog  timeSetEvent m_mmWDTTimerID = %d !", m_mmWDTTimerID );
@@ -416,51 +391,63 @@ void WatchDogClassImpl::DelayTimer(sigval_t ptr)
 
     static bool bTimeSet = false;
 
-    if (pThis->m_dwDelayTime > 0 && !bTimeSet)
-    {
-        dwDelayTime++ ;
-        if (dwDelayTime < pThis->m_dwDelayTime)
-        {
-            return;
-        }
-        //timeKillEvent(pThis->m_mmDelayTimerID);
-        pThis->m_TimerCtrl->EndTimer_ptr(pThis->m_mmDelayTimerID);
-
-        if (pThis->m_dwDelayRemain > 0 && !bTimeSet)
-        {
-            //pThis->m_mmDelayTimerID = timeSetEvent( pThis->m_dwDelayRemain*1000, 1, &DelayTimer, (DWORD)pThis, TIME_ONESHOT );
-            pThis->m_TimerCtrl->SetTimerFunction(DelayTimer);
-            pThis->m_TimerCtrl->StartTimer_ptr(pThis->m_mmDelayTimerID,pThis,pThis->m_dwDelayRemain*1000,FALSE);
-            LogW("WatchDogClassImpl::DelayTimer->DelayTimer TimeOut timeSetEvent  m_mmWDTTimerID = %d !  TIME_ONESHOT line=%d ", pThis->m_mmWDTTimerID ,__LINE__);
-            pThis->m_bDelayTimer = true;
-            bTimeSet = true;
-            if (bTimeSet)
-            {
-                return;
-            }
-        }
-    }
+//    if (pThis->m_dwDelayTime > 0 && !bTimeSet)
+//    {
+//        dwDelayTime++ ;
+//        if (dwDelayTime < pThis->m_dwDelayTime)
+//        {
+//            return;
+//        }
+//        //timeKillEvent(pThis->m_mmDelayTimerID);
+//        pThis->m_TimerCtrl->EndTimer_ptr(pThis->m_mmDelayTimerID);
+
+//        if (pThis->m_dwDelayRemain > 0 && !bTimeSet)
+//        {
+//            //pThis->m_mmDelayTimerID = timeSetEvent( pThis->m_dwDelayRemain*1000, 1, &DelayTimer, (DWORD)pThis, TIME_ONESHOT );
+//            pThis->m_TimerCtrl->SetTimerFunction(DelayTimer);
+//            pThis->m_TimerCtrl->StartTimer_ptr(pThis->m_mmDelayTimerID,pThis,pThis->m_dwDelayRemain*1000,FALSE);
+//            LogW("WatchDogClassImpl::DelayTimer->DelayTimer TimeOut timeSetEvent  m_mmWDTTimerID = %d !  TIME_ONESHOT line=%d ", pThis->m_mmWDTTimerID ,__LINE__);
+//            pThis->m_bDelayTimer = true;
+//            bTimeSet = true;
+//            if (bTimeSet)
+//            {
+//                return;
+//            }
+//        }
+//    }
 
     //Start WDTTimer
-    if (pThis->m_dwRealTimeOut > 178)
+    if(0==pThis->m_dwRealTimeOut)
     {
-        //pThis->m_mmWDTTimerID = timeSetEvent( _TIMER_DELAY, 1, &WDTTimer, (DWORD)pThis, TIME_PERIODIC );
-        pThis->m_TimerCtrl->SetTimerFunction(WDTTimer);
-        pThis->m_TimerCtrl->StartTimer_ptr(pThis->m_mmWDTTimerID,pThis,_TIMER_DELAY,TRUE);
-        LogW("WatchDogClassImpl::DelayTimer->DelayTimer TimeOut timeSetEvent  m_mmWDTTimerID = %d !  TIME_PERIODIC line=%d ", pThis->m_mmWDTTimerID ,__LINE__);
-        pThis->m_bWDTTimer = true;
+        LogW("pThis->m_dwRealTimeOut==0 line=%d",__LINE__);
+        int flag=WDIOS_ENABLECARD;
+        if(-1== ioctl(pThis->m_wfd, WDIOC_SETOPTIONS, &flag))
+        {
+            LogW("-1==ioctl(m_wfd, WDIOC_SETOPTIONS, &flag=WDIOS_ENABLECARD); line=%d",__LINE__);
+        }
+        pThis->m_dwRealTimeOut=1;
+        LogW("pThis->m_dwRealTimeOut=%d, line=%d",pThis->m_dwRealTimeOut,__LINE__);
+        ioctl(pThis->m_wfd,WDIOC_SETTIMEOUT,&pThis->m_dwRealTimeOut);
+        //pThis->m_bWDTTimer = true;
     }
-    else
+    else if (pThis->m_dwRealTimeOut >0 && pThis->m_dwRealTimeOut <178)
     {
-        //pThis->m_pMB330CRM->SetWDT(true, (BYTE)(pThis->m_dwTimeOut));
+        LogW("pThis->m_dwRealTimeOut==0 line=%d",__LINE__);
         int flag = WDIOS_ENABLECARD;
         ioctl(pThis->m_wfd,WDIOC_SETOPTIONS,&flag);
         LogW(" ioctl(pThis->m_wfd,WDIOC_SETOPTIONS,&flag=WDIOS_ENABLECARD) line=%d", __LINE__ );
         ioctl(pThis->m_wfd,WDIOC_SETTIMEOUT,&pThis->m_dwTimeOut);
         LogW("ioctl(pThis->m_wfd,WDIOC_SETTIMEOUT,&pThis->m_dwTimeOut= %d line=%d!) ",pThis->m_dwTimeOut ,__LINE__);
-    }
 
-    //timeKillEvent(pThis->m_mmDelayTimerID);
+    }
+    else if (pThis->m_dwRealTimeOut > 178)
+    {
+        LogW("pThis->m_dwRealTimeOut==0 line=%d",__LINE__);
+        pThis->m_TimerCtrl->SetTimerFunction(WDTTimer);
+        pThis->m_TimerCtrl->StartTimer_ptr(pThis->m_mmWDTTimerID,pThis,_TIMER_DELAY,TRUE);
+        LogW("WatchDogClassImpl::DelayTimer->DelayTimer TimeOut timeSetEvent  m_mmWDTTimerID = %d !  TIME_PERIODIC line=%d ", pThis->m_mmWDTTimerID ,__LINE__);
+        pThis->m_bWDTTimer = true;
+    }
     pThis->m_TimerCtrl->EndTimer_ptr(pThis->m_mmDelayTimerID);
     LogW(" WatchDogClassImpl::DelayTimer->DelayTimer  Kill m_mmDelayTimerID = %d line=%d!", pThis->m_mmDelayTimerID ,__LINE__);
     pThis->m_bDelayTimer = false;
@@ -484,10 +471,11 @@ void WatchDogClassImpl::WDTTimer(sigval_t ptr)
     int flag = WDIOS_ENABLECARD;
     ioctl(pThis->m_wfd,WDIOC_SETOPTIONS,&flag);
     LogW(" ioctl(pThis->m_wfd,WDIOC_SETOPTIONS,&flag=WDIOS_ENABLECARD) line=%d", __LINE__ );
-    ioctl(pThis->m_wfd,WDIOC_SETTIMEOUT,&(pThis->m_dwTimeOut));
+    ioctl(pThis->m_wfd,WDIOC_SETTIMEOUT,&(pThis->m_dwRealTimeOut));
     LogW(" ioctl(pThis->m_wfd,WDIOC_SETTIMEOUT,pThis->m_dwTimeOut=%d) line=%d", pThis->m_mmDelayTimerID,__LINE__ );
     //timeKillEvent(pThis->m_mmWDTTimerID);
     pThis->m_TimerCtrl->EndTimer_ptr(pThis->m_mmWDTTimerID);
+    LogW("pThis->m_TimerCtrl->EndTimer_ptr(pThis->m_mmWDTTimerID); line=%d",__LINE__ );
     pThis->m_bWDTTimer = false;
     dwWDTTime = 0;
 }

+ 1 - 1
DevAdapter/keba/WatchDog.keba.1.1/WatchDogClassImpl.h

@@ -37,7 +37,7 @@ typedef unsigned int   MMRESULT;
 #define WATCHDOG1 "/dev/watchdog1"
 
 //编译版本
-#define  FILE_VERSION  2
+#define  FILE_VERSION  1
 
 #pragma pack(push,1)
 class WatchDogClassImpl:public WatchDogClass