ソースを参照

#IQRV #comment [DevAdapter] keba/2021.0916.01

gifur 4 年 前
コミット
23b69faf32

+ 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.0625.01@LR04.02_VendorLib/testing)
+    set(KEBA_CONAN_LIB_NAME keba/2021.0916.01@LR04.02_VendorLib/testing)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2021.0924.01@LR04.02_VendorLib/testing)
 	set(GRG_CONAN_LIB_NAME grg/2021.0826.01@LR04.02_VendorLib/testing)
 	set(CW_CONAN_LIB_NAME cw/2021.0701.01@LR04.02_VendorLib/testing)

+ 1 - 0
DevAdapter/keba/CMakeLists.txt

@@ -19,6 +19,7 @@ add_subdirectory(ContactlessCard.keba.1.1)
 add_subdirectory(FingerPrint.keba.1.1)
 add_subdirectory(Gpio.keba.1.1)
 add_subdirectory(HSPScanner.keba.1.1)
+add_subdirectory(HSPScanner.keba.1.2)
 add_subdirectory(IDCertificate.keba.1.1)
 add_subdirectory(PinPad.keba.1.1)
 #add_subdirectory(ThermalPrint.keba.1.1)

+ 52 - 0
DevAdapter/keba/HSPScanner.keba.1.2/CMakeLists.txt

@@ -0,0 +1,52 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("HSPScanner")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "keba")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "2")
+
+
+#设置编译的一些参数
+if(NOT RVC_INTEGRATE_BUILD)
+    set(CMAKE_CXX_FLAGS "-std=c++11")
+    set(CMAKE_BUILD_TYPE "Release")#Release Debug
+endif()
+#设置头文件查找路径的变量
+set( INCLUDE_KEBA       ${DEVADAPTER_CURRENT_INCLUDES_DIR}
+                        ${VENDOR_CURRENT_INCLUDE_DIR}
+                        ${VENDOR_CURRENT_INCLUDE_DIR}/SDK
+                    )
+message(STATUS "include_directories: ${INCLUDE_KEBA}")
+
+#收录当前目录下的所有* . cpp文件
+aux_source_directory(. SRC_LIST)
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+     ${SRC_LIST}
+)
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+#设置头文件查找路径变量
+target_include_directories(${MODULE_FULL_NAME} PUBLIC  ${INCLUDE_KEBA})
+
+#设置日志依赖库文件的路径变量路径
+target_link_directories(${MODULE_FULL_NAME} PUBLIC  ${DEVADAPTER_CURRENT_LIB_DIR})
+
+#86下依赖的库连接这个文件路径:/data/home/keba/DevAdapter/keba/lib/gcc_x64?gcc_aarch64
+#target_link_directories(${MODULE_FULL_NAME} PUBLIC  ${VENDOR_CURRENT_LIB_DIR})
+target_link_directories(${MODULE_FULL_NAME} PUBLIC  ${VENDOR_CURRENT_LIB_DIR}/keba)
+#链接日志库
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+#链接keba日志库
+target_link_libraries(${MODULE_FULL_NAME} Common.keba)
+
+#设置动态库输出路径:/data/home/keba/DevAdapter/cmbsz/lib/gcc_aarch64或者gcc_x64
+SET(LIBRARY_OUTPUT_PATH ${VENDOR_CURRENT_LIB_DIR})
+message(STATUS "LIBRARY_OUTPUT_PATH: ${VENDOR_CURRENT_LIB_DIR}")
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 146 - 0
DevAdapter/keba/HSPScanner.keba.1.2/CkLog.cpp

@@ -0,0 +1,146 @@
+// CkLog.cpp: implementation of the CkLog class.
+#include "CkLog.h"
+
+#if defined(CKLOG)
+extern CTraceManager *pLOG;
+#endif
+
+//获取完整路径中的文件名称
+std::string GetFileName(char* pstrFullPath)
+{
+    std::string strRet = "";
+    if(nullptr == pstrFullPath) return strRet;
+
+    char* pLastSlash = strrchr(pstrFullPath, '/'); //find last slash
+    if(nullptr == pLastSlash)
+        strRet = pstrFullPath;
+    else
+        strRet = pLastSlash + 1;
+
+    return strRet;
+}
+
+bool GetCurModulePath(char* pstrLibPath, char* pstrLibName)
+{
+    Dl_info path_info;
+    char sPath[256];
+    memset(sPath, 0x00, sizeof(sPath));
+
+    dladdr((void*)GetCurModulePath, &path_info); //根据内存空间所在地址 获取当前模块完整路径
+    strcpy(sPath, path_info.dli_fname);
+
+    char *pLastSlash=strrchr(sPath, '/'); //find last slash
+    if(nullptr != pLastSlash)
+    {
+        *pLastSlash=0;
+        if(nullptr != pstrLibPath)
+            strcpy(pstrLibPath, sPath);
+
+        if(nullptr != pstrLibName)
+            strcpy(pstrLibName, pLastSlash + 1);
+
+        return true;
+    }
+    return false;
+}
+
+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;
+
+        pTemp = pFind - 1;
+        while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
+        if(*pTemp == '.')
+            ch2 = atoi(pTemp + 1);
+
+        pTemp--;
+        while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
+        if(*pTemp == '.')
+            ch1 = atoi(pTemp + 1);
+
+        return 1;
+}
+
+//加载SO
+void* LoadSO(char* pstrSOName)
+{
+    void* pSO = nullptr;
+    char sPath[256];
+    char sFullPath[256];
+    memset(sPath, 0x00, sizeof(sPath));
+    memset(sFullPath, 0x00, sizeof(sFullPath));
+
+    bool bRet = GetCurModulePath(sPath, nullptr);
+    if(bRet)
+    {
+        sprintf(sFullPath, "%s/%s", sPath, pstrSOName); //拼出so完整路径
+        pSO = dlopen(sFullPath, RTLD_LAZY); //RTLD_NOW
+        if (nullptr == pSO)
+            printf("LoadSO()->dlopen(%s, RTLD_LAZY) fail, dlerror=[%s]", sFullPath, dlerror());
+        else
+            printf("LoadSO()->dlopen(%s, RTLD_LAZY) OK!!!", sFullPath);
+    }
+    return pSO;
+}
+
+
+void* GetPtr(void* pVoid)
+{
+    void* ptrTmp = pVoid;
+    return ptrTmp;
+}
+
+
+
+bool CkLog_FuncTracer::m_bCkLogExtendInf = false;
+
+//==> Enter {GetEncryptFunc}, file: {PinPadClassImpl_ZT598M.cpp}, line: {1001}.
+//根据整型变量占空间的大小判断类型
+CkLog_FuncTracer::CkLog_FuncTracer(const char* pszFunc, const char* pszFile, int nLine, void* pfRet, int iSize)
+{
+    memset(m_pszFunc, 0x00, sizeof(m_pszFunc));
+    memset(m_pszFile, 0x00, sizeof(m_pszFile));
+
+    snprintf(m_pszFunc,sizeof(m_pszFunc), "%s", pszFunc);
+    snprintf(m_pszFile,sizeof(m_pszFile), "%s", pszFile);
+    m_nLine = nLine;
+
+    m_psfRet = nullptr; //INT16
+    m_pifRet = nullptr; //INT32
+    m_plfRet = nullptr; //INT64
+    if(sizeof(short) == iSize)
+        m_psfRet =(short*)pfRet;
+    else if(sizeof(int) == iSize)
+        m_pifRet =(int*)pfRet;
+    else if(sizeof(long) == iSize)
+        m_plfRet =(long*)pfRet;
+
+#if defined(CKLOG)
+    pLOG->TraceInFormat(TRM_INT, TRM_LV_COMMN, "==> Enter {%s}, file: {%s}, line: {%d}.", m_pszFunc, m_pszFile, m_nLine);
+#endif
+}
+
+//<== Leave {DevOpen}, file: {PinPadClassImpl_ZT598M.cpp}, line: {171}.
+CkLog_FuncTracer::~CkLog_FuncTracer()
+{
+#if defined(CKLOG)
+    if(nullptr != m_psfRet)
+        pLOG->TraceInFormat(TRM_INT, TRM_LV_COMMN, "<== Leave {%s}, file: {%s}, line: {%d} , short RetCode=[%d].", m_pszFunc, m_pszFile, m_nLine, *m_psfRet);
+    else if(nullptr != m_pifRet)
+        pLOG->TraceInFormat(TRM_INT, TRM_LV_COMMN, "<== Leave {%s}, file: {%s}, line: {%d} , int RetCode=[%d].", m_pszFunc, m_pszFile, m_nLine, *m_pifRet);
+    else if(nullptr != m_plfRet)
+        pLOG->TraceInFormat(TRM_INT, TRM_LV_COMMN, "<== Leave {%s}, file: {%s}, line: {%d} , long RetCode=[%ld].", m_pszFunc, m_pszFile, m_nLine, *m_plfRet);
+    else
+        pLOG->TraceInFormat(TRM_INT, TRM_LV_COMMN, "<== Leave {%s}, file: {%s}, line: {%d}.", m_pszFunc, m_pszFile, m_nLine);
+#endif
+}
+

+ 426 - 0
DevAdapter/keba/HSPScanner.keba.1.2/CkLog.h

@@ -0,0 +1,426 @@
+// CkLog.h: interface for the CkLog class.
+#ifndef CKLOG_H
+#define CKLOG_H
+
+#define CMBLOG4            //是否使用招行日志库开关
+//#define CKLOG              //是否使用公司日志库开关
+
+#include <stdio.h>
+#include <fstream>
+#include <string>
+#include <iostream>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+//#include <thread>
+#include <stdarg.h>
+#include <ctime>
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+#include <sys/prctl.h>
+#include <sys/syscall.h>
+#include <dlfcn.h>
+#include "wintypes.h"
+
+
+#if defined(CMBLOG4)
+#include "log4vendor.h"
+#endif
+
+#if defined(CKLOG)
+#include "CommDef.h"
+#include "TraceManager.h"
+#endif
+
+using namespace std;
+
+//#ifdef __cplusplus
+//extern "C" {
+//#endif
+
+/* 字节对齐设置为1 */
+//#pragma pack(push,1)
+#define TRACE_LEN			(MAXWORD / 2)
+
+
+#ifndef __linux__
+#include "windows.h"
+#define GetProcessId()  GetCurrentProcessId()
+#define GetThreadId()  GetCurrentThreadId()
+#else
+//名字的长度最大为15字节,且应该以'\0'结尾  prctl(PR_SET_NAME, (char*)arg);
+#define set_thread_name(name)   prctl(PR_SET_NAME, (char*)name)
+//prctl(PR_GET_NAME, (unsigned long)name);
+#define get_thread_name(name)   prctl(PR_GET_NAME, (unsigned long)name)
+//或者使用  PID= syscall(__NR_getpid)
+#define GetProcessId()  getpid()
+//或者使用  TID= syscall(SYS_gettid)
+#define GetThreadId()   syscall(__NR_gettid)
+#endif
+
+//获取完整路径中的文件名称
+std::string GetFileName(char* pstrFullPath);
+//获取当前程序所在路径和文件名
+bool GetCurModulePath(char* pstrLibPath, char* pstrLibName);
+int getFileVer(char* sFile, short &ch1, short &ch2);
+//加载so动态库
+void* LoadSO(char* pstrSOName);
+//获取指针
+void* GetPtr(void* pVoid=nullptr);
+
+//利用构造和析构记录函数进出类
+class CkLog_FuncTracer
+{
+public:
+    static bool m_bCkLogExtendInf;
+
+    CkLog_FuncTracer(const char* pszFunc, const char* pszFile, int nLine, void* pfRet, int iSize);
+    ~CkLog_FuncTracer();
+private:
+        char m_pszFunc[256];
+        char m_pszFile[256];
+        int m_nLine;
+        short* m_psfRet; //INT16
+        int* m_pifRet;   //INT32
+        long* m_plfRet;  //INT64
+};
+
+//declare
+//CMB日志声明,暂未用到
+#if defined(CMBLOG4)
+#define CMBLOG4_DECLARE()
+#else
+#define CMBLOG4_DECLARE()
+#endif
+
+//CK日志声明
+#if defined(CKLOG)
+#define CKLOG_DECLARE()   \
+        CTraceManager *pLOG;
+#else
+#define CKLOG_DECLARE()
+#endif
+
+//initialize
+//CMB日志初始化
+#if defined(CMBLOG4)
+#define CMBLOG4_INIT(modName, logPath, fileName) \
+    do {   \
+    std::string err_msg=""; \
+    cmb::log4vendor::instance(); \
+    cmb::log_init_config config_mod; \
+    config_mod.dev_name = modName; \
+    config_mod.log_type = CMB_LOG_TYPE_FILE; \
+    config_mod.log_dir = logPath; \
+    cmb::log4vendor::init(config_mod, err_msg); \
+    } while (0);
+#else
+#define CMBLOG4_INIT(modName, logPath, fileName)
+#endif
+
+//CMB日志初始化2
+#if defined(CMBLOG4)
+#define CMBLOG4_INIT_P(modName, logPath, fileName) \
+    do {   \
+    char err_msg[VENDOR_BUFF_SIZE] = { '\0' }; \
+    cmb::log4vendor::instance(); \
+    cmb::log_init_config_c config_mod; \
+    strcpy(config_mod.dev_name, modName); \
+    config_mod.log_type = CMB_LOG_TYPE_FILE; \
+    strcpy(config_mod.log_dir, logPath);    \
+    cmb::log4vendor::initp(&config_mod, err_msg); \
+    } while (0);
+#else
+#define CMBLOG4_INIT_P(modName, logPath, fileName)
+#endif
+
+//CK日志初始化
+#if defined(CKLOG)
+#define CKLOG_INIT(modName, logPath, fileName)   \
+        pLOG = new CTraceManager(); \
+        pLOG->Register(fileName);
+#else
+#define CKLOG_INIT(modName, logPath, fileName)
+#endif
+
+//EXTERN
+//CK日志扩展声明
+#if defined(CKLOG)
+#define CKLOG_EXTERN()   \
+        extern CTraceManager *pLOG;
+#else
+#define CKLOG_EXTERN()
+#endif
+
+//CMB 的函数进出记录功能
+#if defined(CMBLOG4)
+#define CMBLOG4_FUNCTION()   \
+        LOG4VTM_FUNCTION();
+#else
+#define CMBLOG4_FUNCTION()
+#endif
+
+//CMB的函数进出和INT32返回值记录功能
+#if defined(CMBLOG4)
+#define CMBLOG4_FUNCTION_INT32(RetVar)   \
+        cmb::log4vendor_tracer _FunctionLoggerCMB(__FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (int*)GetPtr(RetVar));
+#else
+#define CMBLOG4_FUNCTION_INT32(RetVar)
+#endif
+
+//CMB的函数进出和INT64返回值记录功能
+#if defined(CMBLOG4)
+#define CMBLOG4_FUNCTION_INT64(RetVar)   \
+        cmb::log4vendor_tracer _FunctionLoggerCMB(__FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (long*)GetPtr(RetVar));
+#else
+#define CMBLOG4_FUNCTION_INT64(RetVar)
+#endif
+
+//CK的函数进出记录功能
+#if defined(CKLOG)
+#define CKLOG_FUNCTION()  \
+            CkLog_FuncTracer _FunctionLoggerCK(__FUNCTION__, GetFileName(__FILE__).c_str(), __LINE__, nullptr, 0);
+#else
+#define CKLOG_FUNCTION()
+#endif
+
+//CK的函数进出和INT返回值记录功能
+#if defined(CKLOG)
+#define CKLOG_FUNCTION_INT(RetVar)  \
+            CkLog_FuncTracer _FunctionLoggerCK(__FUNCTION__, GetFileName(__FILE__).c_str(), __LINE__, GetPtr(&RetVar), sizeof(RetVar));
+#else
+#define CKLOG_FUNCTION_INT(RetVar)
+#endif
+
+//CMB 记录普通日志
+#if defined(CMBLOG4)
+#define LOG_CMBLOG4(logLevel, ...)  \
+    do {   \
+            int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__);  \
+            char CkLog_Buf[512 + iCkLog_BufLen];         \
+             memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf));      \
+            if(CkLog_FuncTracer::m_bCkLogExtendInf)         \
+                snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__);  \
+            else \
+                snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : ");  \
+            snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__);  \
+            LOG4VTM(logLevel, CkLog_Buf);      \
+    } while (0);
+#else
+#define LOG_CMBLOG4(logLevel, ...)
+#endif
+
+//CMB 记录bin日志
+#if defined(CMBLOG4)
+#define LOGX_CMBLOG4(logLevel, pData, Len, ...)  \
+    do {   \
+            std::string strCkLog_Data=""; \
+            std::string strCkLog_Tmp="";  \
+            int iCkLog_useLen=0, iCkLog_restLen=(int)Len; \
+            int iCkLog_printLen, iCkLog_i;  \
+            unsigned char* CkLog_p = nullptr; \
+            char CkLog_TmpBuf[256]; \
+            int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__);  \
+            char CkLog_Buf[512 + iCkLog_BufLen];         \
+            memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf));      \
+            if(CkLog_FuncTracer::m_bCkLogExtendInf)         \
+                snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>:Len=[%d] ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__, (int)Len);  \
+            else \
+                snprintf(CkLog_Buf, sizeof(CkLog_Buf), " :Len=[%d] ", (int)Len);  \
+            snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__);  \
+            sprintf(CkLog_Buf + strlen(CkLog_Buf), "\n");  \
+            strCkLog_Data = CkLog_Buf; \
+          if((int)Len > 0) \
+          { \
+                memset(CkLog_TmpBuf, 0x00, sizeof(CkLog_TmpBuf));      \
+                for(iCkLog_i = 0; iCkLog_i <= 0xF; iCkLog_i++) sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "-%X-", iCkLog_i); \
+                sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "\n"); \
+                strCkLog_Tmp = CkLog_TmpBuf;  \
+                strCkLog_Data = strCkLog_Data + strCkLog_Tmp; \
+               while( iCkLog_restLen > 0 ) \
+               { \
+                   CkLog_p = (unsigned char*)pData + iCkLog_useLen; \
+                   iCkLog_printLen = iCkLog_restLen<16 ? iCkLog_restLen : 16; \
+                    memset(CkLog_TmpBuf, 0x00, sizeof(CkLog_TmpBuf));      \
+                   for(iCkLog_i=0; iCkLog_i < iCkLog_printLen; iCkLog_i++) sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "%02x ", *(CkLog_p + iCkLog_i)); \
+                    sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "\n"); \
+                    strCkLog_Tmp = CkLog_TmpBuf;  \
+                    strCkLog_Data = strCkLog_Data + strCkLog_Tmp; \
+                   iCkLog_useLen  += iCkLog_printLen; \
+                   iCkLog_restLen -= iCkLog_printLen; \
+               } \
+           } \
+                LOG4VTM(logLevel, strCkLog_Data.c_str()); \
+        } while (0);
+#else
+#define LOGX_CMBLOG4(logLevel, pData, Len, ...)
+#endif
+
+//CK 记录普通日志功能
+//bool TraceInFormat( int nType, int nLevel, char* lpszTraceData, ... );
+#if defined(CKLOG)
+#define LOG_CKLOG(logLevel, ...)  \
+    do {   \
+        int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__);  \
+        char CkLog_Buf[512 + iCkLog_BufLen];         \
+        memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf));      \
+        if(CkLog_FuncTracer::m_bCkLogExtendInf)         \
+            snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__);  \
+        else \
+            snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : ");  \
+        snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__);  \
+        pLOG->TraceInFormat(TRM_INT, logLevel, "%s", CkLog_Buf);  \
+        } while (0);
+#else
+#define LOG_CKLOG(logLevel, ...)
+#endif
+
+//CK 记录bin日志功能
+//bool TraceInBuffer( int nType, int nLevel, unsigned char* lpbyTraceData, unsigned int uDataLen, char* lpszMsg = NULL,
+//unsigned int* lpuMaskOffsetArray = NULL, unsigned int* lpuMaskLenArray = NULL, unsigned int uMaskCnt = 0 );
+#if defined(CKLOG)
+#define LOGX_CKLOG(logLevel, pData, Len, ...)  \
+    do {   \
+    int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__);  \
+    char CkLog_Buf[512 + iCkLog_BufLen];         \
+    memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf));      \
+    if(CkLog_FuncTracer::m_bCkLogExtendInf)         \
+        snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__);  \
+    else \
+        snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : ");  \
+    snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__);  \
+    pLOG->TraceInBuffer(TRM_INT, logLevel, (unsigned char*)pData, (unsigned int)Len, CkLog_Buf);  \
+    } while (0);
+#else
+#define LOGX_CKLOG(logLevel, pData, Len, ...)
+#endif
+
+/*
+#define CMB_LOG_TRACE   1
+#define CMB_LOG_DEBUG   2
+#define CMB_LOG_INFO    3
+#define CMB_LOG_WARN    4
+#define CMB_LOG_ERROR   5
+#define CMB_LOG_FATAL   6
+*/
+/*
+#define TRM_LV_COMMN            (0x0001)
+#define TRM_LV_WARNG            (0x0002)
+#define TRM_LV_ERROR            (0x0004)
+#define TRM_LV_DEBUG            (0x0008)
+*/
+
+/*记录日志入口函数 Start*/
+//declare
+//CMB和CK 日志声明入口
+#define LOG_DECLARE()   \
+        CMBLOG4_DECLARE() \
+        CKLOG_DECLARE()
+
+//initialize
+//CMB和CK 日志初始化入口
+#define LOG_INIT(modName, logPath, fileName) \
+    CMBLOG4_INIT(modName, logPath, fileName) \
+    CKLOG_INIT(modName, logPath, fileName)
+
+//CMB和CK 日志初始化入口2
+#define LOG_INIT_P(modName, logPath, fileName) \
+    CMBLOG4_INIT_P(modName, logPath, fileName) \
+    CKLOG_INIT(modName, logPath, fileName)
+
+//CMB和CK 日志扩展声明
+#define LOG_EXTERN() \
+    CKLOG_EXTERN()
+
+//CMB和CK 记录进出函数信息日志入口
+#define LOG_FUNCTION()  \
+    CMBLOG4_FUNCTION()  \
+    CKLOG_FUNCTION()
+
+//CK 记录进出函数信息和short返回值 日志入口
+#define LOG_FUNCTION_INT16(RetVar)  \
+    CKLOG_FUNCTION_INT(RetVar)
+
+//CMB和CK 记录进出函数信息和int返回值 日志入口
+#define LOG_FUNCTION_INT32(RetVar)  \
+    CMBLOG4_FUNCTION_INT32(&RetVar)  \
+    CKLOG_FUNCTION_INT(RetVar)
+
+//CMB和CK 记录进出函数信息和long返回值 日志入口
+#define LOG_FUNCTION_INT64(RetVar)  \
+    CMBLOG4_FUNCTION_INT64(&RetVar)  \
+    CKLOG_FUNCTION_INT(RetVar)
+
+//CMB和CK 记录普通错误日志入口
+#define LogE(...) \
+    do {   \
+    LOG_CMBLOG4(ERROR, ## __VA_ARGS__)     \
+    LOG_CKLOG(TRM_LV_ERROR, ## __VA_ARGS__)   \
+    } while (0);
+
+//CMB和CK 记录普通警告日志入口
+#define LogW(...) \
+    do {   \
+    LOG_CMBLOG4(WARN, ## __VA_ARGS__)     \
+    LOG_CKLOG(TRM_LV_WARNG, ## __VA_ARGS__)   \
+    } while (0);
+
+//CMB和CK 记录普通一般信息日志入口
+#define LogM(...) \
+    do {   \
+    LOG_CMBLOG4(INFO, ## __VA_ARGS__)     \
+    LOG_CKLOG(TRM_LV_COMMN, ## __VA_ARGS__)   \
+    } while (0);
+
+//CMB和CK 记录普通调试信息日志入口
+#define LogD(...) \
+    do {   \
+    LOG_CMBLOG4(DEBUG, ## __VA_ARGS__)     \
+    LOG_CKLOG(TRM_LV_DEBUG, ## __VA_ARGS__)   \
+    } while (0);
+
+/*
+#define TRM_LV_COMMN            (0x0001)
+#define TRM_LV_WARNG            (0x0002)
+#define TRM_LV_ERROR            (0x0004)
+#define TRM_LV_DEBUG            (0x0008)
+*/
+//CMB和CK  记录bin(HEX表示)数据 错误级别 日志入口
+#define LogXE(pData, Len, ...) \
+    do {   \
+    LOGX_CMBLOG4(ERROR, pData, Len, ## __VA_ARGS__) \
+    LOGX_CKLOG(TRM_LV_ERROR, pData, Len, ## __VA_ARGS__) \
+    } while (0);
+
+//CMB和CK  记录bin(HEX表示)数据 警告级别 日志入口
+#define LogXW(pData, Len, ...) \
+    do {   \
+    LOGX_CMBLOG4(WARN, pData, Len, ## __VA_ARGS__) \
+    LOGX_CKLOG(TRM_LV_WARNG, pData, Len, ## __VA_ARGS__) \
+    } while (0);
+
+//CMB和CK  记录bin(HEX表示)数据 一般信息级别 日志入口
+#define LogXM(pData, Len, ...) \
+    do {   \
+    LOGX_CMBLOG4(INFO, pData, Len, ## __VA_ARGS__) \
+    LOGX_CKLOG(TRM_LV_COMMN, pData, Len, ## __VA_ARGS__) \
+    } while (0);
+
+//CMB和CK  记录bin(HEX表示)数据 调试信息级别 日志入口
+#define LogXD(pData, Len, ...) \
+    do {   \
+    LOGX_CMBLOG4(DEBUG, pData, Len, ## __VA_ARGS__) \
+    LOGX_CKLOG(TRM_LV_DEBUG, pData, Len, ## __VA_ARGS__) \
+    } while (0);
+
+/*记录日志入口函数 End*/
+
+/*   恢复字节对齐方式   */
+//#pragma pack(pop)
+
+//#ifdef __cplusplus
+//}       /*extern "C"*/
+//#endif
+
+#endif

+ 234 - 0
DevAdapter/keba/HSPScanner.keba.1.2/devlibrary.cpp

@@ -0,0 +1,234 @@
+
+#include "stdafx.h"
+#include "devlibrary.h"
+
+
+CDevDllLoad::CDevDllLoad(char * dllpath)
+{
+    /**********************************************************************/
+
+    Dl_info path_info;
+    dladdr("CDevDllLoad",&path_info);
+    char str_FilePath[256]{0};
+    memcpy(str_FilePath,path_info.dli_fname,strlen(path_info.dli_fname));
+    //printf("first_str_FilePath=%s\n",str_FilePath);
+    char *pLastSlath=strrchr(str_FilePath,'/');
+    *pLastSlath=0;
+    memset(m_dllpath,0x00,sizeof(m_dllpath));
+    strcpy(m_dllpath,str_FilePath);
+    //strncpy(m_dllpath, dllpath, sizeof(m_dllpath));
+    char *a="/keba/";
+    strncat(m_dllpath,a,strlen(a));
+    strncat(m_dllpath, dllpath, strlen(dllpath));
+   // LOG4VTM(INFO,("CDevDllLoad creat function()!"));
+    if(!InitDLL())
+    {
+        //记日志
+        return;
+    }
+}
+
+CDevDllLoad::~CDevDllLoad()
+{
+    FreeDLL();
+}
+
+int CDevDllLoad::InitDLL()
+{
+    if(nullptr != dp_dev)
+        {
+            FreeDLL();
+        }
+    dp_dev = dlopen(m_dllpath, RTLD_LAZY);
+    if (nullptr == dp_dev)
+        {
+            //记日志
+            return false;
+        }
+    apiHIGH_StartCamera =  	(lpHIGH_StartCamera)dlsym(dp_dev, "HIGH_StartCamera");
+    apiHIGH_GetFirmwareVersion =  	(lpHIGH_GetFirmwareVersion)dlsym(dp_dev, "HIGH_GetFirmwareVersion");
+    apiHIGH_GetStatus =  	(lpHIGH_GetStatus)dlsym(dp_dev, "HIGH_GetStatus");
+    apiHIGH_StopCamera =  	(lpHIGH_StopCamera)dlsym(dp_dev, "HIGH_StopCamera");
+    apiHIGH_SetAutoCrop =  	(lpHIGH_SetAutoCrop)dlsym(dp_dev, "HIGH_SetAutoCrop");
+    apiHIGH_SetCameraPixel =  	(lpHIGH_SetCameraPixel)dlsym(dp_dev, "HIGH_SetCameraPixel");
+
+    apiHIGH_SetRotateSize =  	(lpHIGH_SetRotateSize)dlsym(dp_dev, "HIGH_SetRotateSize");
+    apiHIGH_SetColorType =  	(lpHIGH_SetColorType)dlsym(dp_dev, "HIGH_SetColorType");
+    apiHIGH_SetJPGQuality =  	(lpHIGH_SetJPGQuality)dlsym(dp_dev, "HIGH_SetJPGQuality");
+    apiHIGH_GetPixelNum =  	(lpHIGH_GetPixelNum)dlsym(dp_dev, "HIGH_GetPixelNum");
+    apiHIGH_GetHPixelByIndex =  	(lpHIGH_GetHPixelByIndex)dlsym(dp_dev, "HIGH_GetHPixelByIndex");
+    apiHIGH_GetVPixelByIndex =  	(lpHIGH_GetVPixelByIndex)dlsym(dp_dev, "HIGH_GetVPixelByIndex");
+    apiHIGH_CreateWindow =  	(lpHIGH_CreateWindow)dlsym(dp_dev, "HIGH_CreateWindow");
+    apiHIGH_HideWindow =  	(lpHIGH_HideWindow)dlsym(dp_dev, "HIGH_HideWindow");
+    apiHIGH_CloseWindow =  	(lpHIGH_CloseWindow)dlsym(dp_dev, "HIGH_CloseWindow");
+    apiHIGH_PauseAndPlay =  	(lpHIGH_PauseAndPlay)dlsym(dp_dev, "HIGH_PauseAndPlay");
+    apiHIGH_TakePicture =  	(lpHIGH_TakePicture)dlsym(dp_dev, "HIGH_TakePicture");
+
+    if (nullptr == apiHIGH_StartCamera || nullptr == apiHIGH_GetFirmwareVersion || nullptr == apiHIGH_GetStatus || nullptr == apiHIGH_StopCamera ||
+            nullptr == apiHIGH_SetAutoCrop || nullptr == apiHIGH_SetCameraPixel || nullptr == apiHIGH_SetRotateSize || nullptr == apiHIGH_SetColorType ||
+            nullptr == apiHIGH_SetJPGQuality || nullptr == apiHIGH_GetPixelNum || nullptr == apiHIGH_GetHPixelByIndex || nullptr == apiHIGH_GetVPixelByIndex ||
+            nullptr == apiHIGH_CreateWindow || nullptr == apiHIGH_CloseWindow || nullptr == apiHIGH_PauseAndPlay || nullptr == apiHIGH_TakePicture || nullptr == apiHIGH_HideWindow)
+        {
+            //记日志
+            return false;
+        }
+
+    return true;
+}
+int CDevDllLoad::FreeDLL()
+{
+    dlclose(dp_dev);
+    return true;
+}
+int CDevDllLoad::HIGH_StartCamera()
+{
+    if (apiHIGH_StartCamera==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_StartCamera();
+}
+
+int CDevDllLoad::HIGH_GetFirmwareVersion(char szVersion[64])
+{
+    if (apiHIGH_GetFirmwareVersion==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_GetFirmwareVersion(szVersion);
+}
+
+void CDevDllLoad::HIGH_GetStatus(int* piStatus)
+{
+    if (apiHIGH_GetStatus==nullptr)
+    {
+        return;
+    }
+    return apiHIGH_GetStatus(piStatus);
+}
+
+int CDevDllLoad::HIGH_StopCamera()
+{
+    if (apiHIGH_StopCamera==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_StopCamera();
+}
+
+int CDevDllLoad::HIGH_SetAutoCrop(bool bAuto)
+{
+    if (apiHIGH_SetAutoCrop==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_SetAutoCrop(bAuto);
+}
+
+int CDevDllLoad::HIGH_SetCameraPixel(int nHPixel, int nVPixel)
+{
+    if (apiHIGH_SetCameraPixel==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_SetCameraPixel(nHPixel, nVPixel);
+}
+
+int CDevDllLoad::HIGH_SetRotateSize(int nRotateSize)
+{
+    if (apiHIGH_SetRotateSize==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_SetRotateSize(nRotateSize);
+}
+
+int CDevDllLoad::HIGH_SetColorType(int nColorType)
+{
+    if (apiHIGH_SetColorType==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_SetColorType(nColorType);
+}
+
+int CDevDllLoad::HIGH_SetJPGQuality(int nJPGQuality)
+{
+    if (apiHIGH_SetJPGQuality==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_SetJPGQuality(nJPGQuality);
+}
+
+int CDevDllLoad::HIGH_GetPixelNum()
+{
+    if (apiHIGH_GetPixelNum==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_GetPixelNum();
+}
+
+int CDevDllLoad::HIGH_GetHPixelByIndex(int nIndex)
+{
+    if (apiHIGH_GetHPixelByIndex==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_GetHPixelByIndex(nIndex);
+}
+
+int CDevDllLoad::HIGH_GetVPixelByIndex(int nIndex)
+{
+    if (apiHIGH_GetVPixelByIndex==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_GetVPixelByIndex(nIndex);
+}
+
+int CDevDllLoad::HIGH_CreateWindow(int iX, int iY, int iWidth, int iHeight)
+{
+    if (apiHIGH_CreateWindow==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_CreateWindow(iX, iY, iWidth, iHeight);
+}
+
+int CDevDllLoad::HIGH_CloseWindow()
+{
+    if (apiHIGH_CloseWindow==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_CloseWindow();
+}
+
+int CDevDllLoad::HIGH_HideWindow(bool isPause)
+{
+    if (apiHIGH_HideWindow==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_HideWindow(isPause);
+}
+
+int CDevDllLoad::HIGH_PauseAndPlay(bool isPause)
+{
+    if (apiHIGH_PauseAndPlay==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_PauseAndPlay(isPause);
+}
+
+int CDevDllLoad::HIGH_TakePicture(const char* strFilePath)
+{
+    if (apiHIGH_TakePicture==nullptr)
+    {
+        return -3;
+    }
+    return apiHIGH_TakePicture(strFilePath);
+}

+ 267 - 0
DevAdapter/keba/HSPScanner.keba.1.2/devlibrary.h

@@ -0,0 +1,267 @@
+#ifndef _BHCAMBASE_h_
+#define _BHCAMBASE_h_
+
+
+//设备状态
+#define FR_DS_ONLINE           0 //设备在线
+#define FR_DS_OFFLINE          1 //设备掉线
+#define FR_DS_BUSY             2 //设备忙
+#define FR_DS_HARDWAREERROR    3 //设备硬件故障
+#define FR_DS_UNKNOW           4 //未知错误
+
+// 错误码
+#define		FR_RET_SUCC	0		// 成功
+#define		FR_RET_FAIL	-1		// 失败
+#define		FR_RET_PARA	-2		// 参数错误
+#define		FR_RET_NDEV	-3		// 打开设备失败
+#define		FR_RET_NINI	-4		// 未打开设备
+#define		FR_RET_BUSY	-5		// 设备繁忙
+#define		FR_RET_DATA	-6		// 图像数据不正确
+#define		FR_RET_NLNK	-7		// 设备断开
+#define		FR_RET_NMEM	-10		// 内存分配失败
+#define		FR_RET_ARDY	-11		// 已经打开设备
+
+/**
+ *@brief 打开高拍仪(只能打开自己厂商的高拍仪类型, 不能打开其他厂商的摄像头 也不能打开自己厂商的其他摄像头)
+ *@param[in] 无
+ *@param[out] 无
+ *@return 成功返回0,失败返回其他
+**/
+int  HIGH_StartCamera();
+
+/**
+ * @brief 获得固件版本,在初始化资源HIGH_StartCamera后调用
+ * @param[out] szVersion 固件版本,格式:厂商+高拍仪型号+PIDVID(彩色高拍仪)+固件版本号/固件修改日期
+ * @return 成功返回0,失败返回其他
+ **/
+int  HIGH_GetFirmwareVersion(char szVersion[64]);
+
+/**
+ *@brief 获取设备状态
+ *@param[in][out]piStatus设备状态:参考设备状态宏定义
+ *@return 无
+ **/
+void  HIGH_GetStatus(int* piStatus);
+
+/**
+ * @brief 关闭高拍仪
+ * @param[in] 无
+ * @param[out] 无
+ * @return 成功返回0,失败返回其他
+ **/
+int  HIGH_StopCamera();
+
+/**
+ * @brief 设置拍照自动纠编 设置为自动纠编时 预览HIGH_CreateWindow时需要实时画出红框框住目标 拍照HIGH_TakePicture时图片为自动获取目标后裁剪的图片
+ * @param[in] bAuto
+ * 是否自动纠编 0:否 1:是
+ * @param[out] 无
+ * @return 成功返回0,失败返回其他
+ **/
+int  HIGH_SetAutoCrop(bool bAuto);
+
+/**
+ *@brief 设置高拍仪分辨率
+ * @param[in] nHPixel
+ * 水平分辨率
+ * @param[in] nVPixel
+ * 垂直分辨率
+ *@param[out] 无
+ *@return 成功返回0,失败返回其他
+**/
+int  HIGH_SetCameraPixel(int nHPixel, int nVPixel);
+
+/**
+ *@brief 设置高拍仪旋转角度
+ * @param[in] nRotateSize
+ * 旋转角度,0:不旋转 1:90度 2:180度 3:270度
+ *@param[out] 无
+ *@return 成功返回0,失败返回其他
+**/
+int  HIGH_SetRotateSize(int nRotateSize);
+
+/**
+ *@brief 设置高拍仪色彩类型
+ * @param[in] nColorType
+ * 色彩类型,0:彩色(24bpp) 1:灰度(黑白) 2:黑白(素描)
+ *@param[out] 无
+ *@return 成功返回0,失败返回其他
+**/
+int  HIGH_SetColorType(int nColorType);
+
+/**
+ *@brief 设置高拍仪图片质量
+ * @param[in] nJPGQuality
+ * 图片质量
+ *@param[out] 无
+ *@return 成功返回0,失败返回其他
+**/
+int  HIGH_SetJPGQuality(int nJPGQuality);
+
+/**
+ *@brief 获取高拍仪像素个数
+ *@param[in] 无
+ *@param[out] 无
+ *@return 成功返回像素个数,失败返回其他
+**/
+int  HIGH_GetPixelNum();
+
+/**
+ *@brief 根据像素获取高拍仪像素宽度
+ *@param[in] nIndex
+ * 像素索引
+ *@param[out] 无
+ *@return 成功返回像素索引对应的宽度,失败返回其他
+**/
+int  HIGH_GetHPixelByIndex(int nIndex);
+
+/**
+ *@brief 根据像素获取高拍仪像素高度
+ *@param[in] nIndex
+ * 像素索引
+ *@param[out] 无
+ *@return 成功返回像素索引对应的高度,失败返回其他
+**/
+int  HIGH_GetVPixelByIndex(int nIndex);
+
+/**
+ * @brief 创建预览窗口,并开始预览。调用此函数表示需要驱动库实现窗口显示
+ *        该接口为非阻塞接口,上层可随时调用HIGH_CloseWindow函数来关闭窗口。
+ * @param[in] iX
+ * 窗口左上角X坐标,ulWndHandle为空表示X坐标相对于屏幕,否则X坐标相对于预览窗口;
+ * @param[in] iY
+ * 窗口左上角Y坐标,ulWndHandle为空表示Y坐标相对于屏幕,否则Y坐标相对于预览窗口;
+ * @param[in] iWidth
+ * 窗口宽度;
+ * @param[in] iHeight
+ * 窗口高度;
+ * @return 参考函数返回结果宏定义
+**/
+int  HIGH_CreateWindow(int iX, int iY, int iWidth, int iHeight);
+
+/**
+ * @brief 关闭预览窗口。
+ * @return 参考函数返回结果宏定义
+**/
+int  HIGH_CloseWindow();
+
+/**
+ * @brief 预览暂停/恢复
+ * @param[in] isPause true 暂停,false 恢复
+ * @param[out] 无
+ * @return 成功返回0,失败返回其他
+ **/
+int  HIGH_PauseAndPlay(bool isPause);
+
+/**
+ * @brief 拍照,如果在HIGH_PauseAndPlay之后调用,拍的是暂停时的那一帧照片
+ * @param[in] strFilePath 图片路径
+ * @param[out] 无
+ * @return 成功返回0,失败返回其他
+ **/
+int  HIGH_TakePicture(const char* strFilePath);
+
+
+// 设备
+typedef int (*lpHIGH_StartCamera)();
+typedef int (*lpHIGH_GetFirmwareVersion)(char szVersion[64]);
+typedef void (*lpHIGH_GetStatus)(int* piStatus);
+typedef int (*lpHIGH_StopCamera)();
+typedef int (*lpHIGH_SetAutoCrop)(bool bAuto);
+typedef int (*lpHIGH_SetCameraPixel)(int nHPixel, int nVPixel);
+typedef int (*lpHIGH_SetRotateSize)(int nRotateSize);
+typedef int (*lpHIGH_SetColorType)(int nColorType);
+typedef int (*lpHIGH_SetJPGQuality)(int nJPGQuality);
+typedef int (*lpHIGH_GetPixelNum)();
+typedef int (*lpHIGH_GetHPixelByIndex)(int nIndex);
+typedef int (*lpHIGH_GetVPixelByIndex)(int nIndex);
+typedef int (*lpHIGH_CreateWindow)(int iX, int iY, int iWidth, int iHeight);
+typedef int (*lpHIGH_HideWindow)(bool isPause);
+typedef int (*lpHIGH_CloseWindow)();
+typedef int (*lpHIGH_PauseAndPlay)(bool isPause);
+typedef int (*lpHIGH_TakePicture)(const char* strFilePath);
+
+class CDevDllLoad
+{
+public:
+    CDevDllLoad(char * dllpath);
+    virtual ~CDevDllLoad();
+public:
+    int InitDLL();
+    int FreeDLL();
+
+private:
+    char m_dllpath[260];
+    void *dp_dev=nullptr;
+
+    lpHIGH_StartCamera			apiHIGH_StartCamera;
+    lpHIGH_GetFirmwareVersion	apiHIGH_GetFirmwareVersion;
+    lpHIGH_GetStatus			apiHIGH_GetStatus;
+    lpHIGH_StopCamera           apiHIGH_StopCamera;
+    lpHIGH_SetAutoCrop          apiHIGH_SetAutoCrop;
+    lpHIGH_SetCameraPixel       apiHIGH_SetCameraPixel;
+    lpHIGH_SetRotateSize        apiHIGH_SetRotateSize;
+    lpHIGH_SetColorType         apiHIGH_SetColorType;
+    lpHIGH_SetJPGQuality        apiHIGH_SetJPGQuality;
+    lpHIGH_GetPixelNum          apiHIGH_GetPixelNum;
+    lpHIGH_GetHPixelByIndex     apiHIGH_GetHPixelByIndex;
+    lpHIGH_GetVPixelByIndex     apiHIGH_GetVPixelByIndex;
+    lpHIGH_CreateWindow         apiHIGH_CreateWindow;
+    lpHIGH_HideWindow           apiHIGH_HideWindow;
+    lpHIGH_CloseWindow          apiHIGH_CloseWindow;
+    lpHIGH_PauseAndPlay         apiHIGH_PauseAndPlay;
+    lpHIGH_TakePicture          apiHIGH_TakePicture;
+
+
+
+public:
+    int  HIGH_StartCamera();
+
+    int  HIGH_GetFirmwareVersion(char szVersion[64]);
+
+    void  HIGH_GetStatus(int* piStatus);
+
+    int  HIGH_StopCamera();
+
+    int  HIGH_SetAutoCrop(bool bAuto);
+
+    int  HIGH_SetCameraPixel(int nHPixel, int nVPixel);
+
+    int  HIGH_SetRotateSize(int nRotateSize);
+
+    int  HIGH_SetColorType(int nColorType);
+
+    int  HIGH_SetJPGQuality(int nJPGQuality);
+
+    int  HIGH_GetPixelNum();
+
+    int  HIGH_GetHPixelByIndex(int nIndex);
+
+    int  HIGH_GetVPixelByIndex(int nIndex);
+
+    int  HIGH_CreateWindow(int iX, int iY, int iWidth, int iHeight);
+
+    int  HIGH_HideWindow(bool isPause);
+
+    int  HIGH_CloseWindow();
+
+    int  HIGH_PauseAndPlay(bool isPause);
+
+    int  HIGH_TakePicture(const char* strFilePath);
+
+};
+
+#endif
+/**
+ * 主要方法调用顺序
+ *     方法名                   功能
+   HIGH_StartCamera             打开高拍仪
+   HIGH_GetFirmwareVersion      获取固件版本
+   HIGH_GetStatus    			获取设备状态
+   HIGH_SetAutoCrop				设置拍照自动纠编
+   HIGH_SetCameraPixel          设置高拍仪分辨率
+   HIGH_CreateWindow			创建预览窗口,并开始预览。
+   HIGH_TakePicture             拍照
+   HIGH_CloseWindow             关闭预览窗口
+   HIGH_StopCamera     			关闭高拍仪
+ **/

+ 60 - 0
DevAdapter/keba/HSPScanner.keba.1.2/dllmain.cpp

@@ -0,0 +1,60 @@
+#include "stdafx.h"
+#include "hspscannerimpl.h"
+//#include "CkDBus.h"
+//#include <QProcess>
+
+
+#define DEVICEBASE_EXPORTS
+
+ LOG_DECLARE()
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    LOG_INIT("HSPScanner", "/home/keba/", "/home/keba/keba-HSPScanner.log");
+
+//    //获取服务端的程序完整路径
+//    QString strPath = CkDBus::GetExePath(SERVICE_NAME);
+//    QProcess::startDetached(strPath); //分离式启动外部服务程序,外部程序启动后,当主程序退出时并不退出,而是继续运行
+//    sleep(2); //等待2秒后继续
+
+    pBaseObj = new HSPSClassImpl();
+    if (pBaseObj == nullptr)
+    {
+       LogM("CreateDevComponent HSPSClassImpl failed!");
+		return Error_Resource;
+    }
+
+    LogM("CreateDevComponent HSPSClassImpl scessufull!");
+    return Error_Succeed;
+}
+DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    LOG_FUNCTION();
+
+    if (pBaseObj == nullptr)
+		return Error_Param;
+
+    HSPSClassImpl* pTmp = (HSPSClassImpl*)(pBaseObj);
+
+	delete pTmp;
+    pTmp = nullptr;
+    pBaseObj = nullptr;
+
+    //CkSharedMemory ckMem(CkSharedMemoryKey);
+    //LPDBusRQInfo lpRQInf = (LPDBusRQInfo)ckMem.GetWritePtr(sizeof(DBusRQInfo));
+    //DBusInfo DBusInfs = CkDBus::GetDBusInfo_S("HSPScanner");
+
+//    memset(lpRQInf, 0x00, sizeof(DBusRQInfo));
+//    strcpy(lpRQInf->funcInf.sFuncName, "DevClose");
+//    lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
+//    long lRet = CkDBus::CallRemoteFunc_Send(&DBusInfs, (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__);
+    //主动关闭服务端
+//    memset(lpRQInf, 0x00, sizeof(DBusRQInfo));
+//    strcpy(lpRQInf->funcInf.sFuncName, "CloseServer");//关闭服务端
+//    lpRQInf->funcInf.pid_Client = CkDBus::m_pid_Client;
+//    CkDBus::CallRemoteFunc_Send(&DBusInfs, (long)CkDBus::m_pid_Client);
+    LogM("Entry->HSPS ReleaseDevComponent!");
+	return Error_Succeed;
+}
+

+ 683 - 0
DevAdapter/keba/HSPScanner.keba.1.2/hspscannerimpl.cpp

@@ -0,0 +1,683 @@
+#include "hspscannerimpl.h"
+//#include "CkDBus.h"
+LOG_EXTERN()
+
+void GetModulePath(char* lpStrPath)
+{
+   LOG_FUNCTION();
+   char szBuff[MAX_PATH];
+   Dl_info path_info;
+   std::string strLog = "";
+   memset(&path_info, 0x00, sizeof(path_info));
+   memset(szBuff, 0x00, sizeof(szBuff));
+   int iRet = dladdr((const void*)GetModulePath, &path_info);
+   if(!iRet)
+   {
+       return;
+   }
+   else
+   {
+       strcpy(szBuff, path_info.dli_fname);
+
+       char *pLast=strrchr(szBuff, '/'); //find last '/'
+
+       if(nullptr != pLast) *pLast = 0;  //cut
+
+
+       strcat(szBuff, "/"); //
+
+
+       if(nullptr != lpStrPath)
+       {
+           strcpy(lpStrPath, szBuff);
+       }
+   }
+}
+
+HSPSClassImpl::HSPSClassImpl():
+    m_pDll(nullptr)
+  ,m_bDevOpen(false)
+  ,m_bPreview(false)
+  ,m_bShow(false)
+  ,m_nPort(-1)
+  ,m_strIniPath("")
+  ,m_strDllPath("")
+{
+    LOG_FUNCTION();
+    memset(m_strModulePath, 0x00, sizeof(m_strModulePath));
+    GetModulePath(m_strModulePath); //获取so所在路径
+
+    m_strIniPath = m_strModulePath;
+    m_strIniPath += "CK-VTM-E1000.INI";
+    m_strDllPath = m_strModulePath;
+
+    m_nX = 1280;
+    m_nY = 0;
+    m_nWidth = 1920;
+
+}
+
+HSPSClassImpl::~HSPSClassImpl()
+{
+    LOG_FUNCTION();
+    DevClose();
+    if(m_pDll != nullptr)
+    {
+        delete m_pDll;
+    }
+    m_bDevOpen = false;
+    m_bPreview = false;
+    m_bShow = false;
+}
+
+ErrorCodeEnum HSPSClassImpl::DevOpen()
+{
+    LOG_FUNCTION();
+    //LogM("HSPSClassImpl::Entry->HSPS DevOpen()!");
+    int  iRet;
+    CHAR strDllPath[256] = {0};
+    char sDevInfo[64+1] = {0};
+    char sID[1024] = {0};
+    const char * tmpStr = "libBHCamBase.so";
+    strncat(strDllPath, "libBHCamBase.so",strlen(tmpStr));
+    m_pDll = new CDevDllLoad(strDllPath);
+    if (nullptr == m_pDll)
+    {
+        LogM("HSPSClassImpl::Entry->HSPS DevOpen() new object CDevDllLoad failed!");
+        SaveErrorInfo("对象创建失败", DEC_DEV_OBJECT_CREATE_FAILED);
+        return Error_DevNotAvailable;
+    }
+    iRet = m_pDll->HIGH_StartCamera();
+    //记日志
+    if(iRet != FR_RET_SUCC)
+    {
+        LogM("HSPSClassImpl::Entry->HSPS DevOpen()->m_pDll->HIGH_StartCamera() failed! <=> iRet = %d",iRet);
+        m_bDevOpen = false;
+        SaveErrorInfo("设备未打开", Error_DevNotAvailable);
+        return Error_DevNotAvailable;
+    }
+    LogM("HSPSClassImpl::Entry->HSPS DevOpen()->m_pDll->HIGH_StartCamera() success! <=> iRet = %d",iRet);
+    m_bDevOpen = true;
+    memset(sDevInfo, 0, sizeof(sDevInfo));
+    memset(sID, 0, sizeof(sID));
+    iRet = m_pDll->HIGH_GetFirmwareVersion(sDevInfo);
+    if (iRet == FR_RET_SUCC)
+    {
+        LogM("HSPSClassImpl::Leave->HSPS DevOpen()->m_pDll->HIGH_GetFirmwareVersion sucessfull!");
+    }
+    m_pDll->HIGH_SetCameraPixel(3264,2448);
+
+    return Error_Succeed;
+}
+
+
+
+ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::Entry->HSPS GetDevCategory()!");
+    int iRet = 0;
+    char szDevInfo[128] = {0};
+    char sID[1024] = {0};
+    //记日志
+    memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
+    memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
+    memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
+    memset(szDevInfo, 0, sizeof(szDevInfo));
+    memset(sID, 0, sizeof(sID));
+    iRet = m_pDll->HIGH_GetFirmwareVersion(szDevInfo);
+    if(iRet == FR_RET_SUCC)
+    {
+        snprintf(devCategory.szType,sizeof (devCategory.szType) ,"PVER=Kai-wang#MID=%s", szDevInfo);
+    }
+    else
+    {
+        //memcpy(devCategory.szType, "PVER=Wellcom#MID=JZT-998APB-V20_V1.0.4.1_SC_[20150320]", strlen("PVER=Wellcom#MID=JZT-998APB-V20_V1.0.4.1_SC_[20150320]"));
+        SaveErrorInfo(iRet);
+        return Error_DevConnFailed;
+    }
+    memcpy(devCategory.szVendor, "keba", strlen("keba"));
+    LogM("devCategory.szType = %s",devCategory.szType);
+    LogM("devCategory.szVendor = %s",devCategory.szVendor);
+    LogM("HSPSClassImpl::Leave->HSPS GetDevCategory() sucessfull!");
+    return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::Reset()
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::Entry->HSPS Reset()!");
+    DevClose();
+    LogM("HSPSClassImpl::Leave->HSPS Reset() sucessfull!");
+    return DevOpen();
+}
+
+ErrorCodeEnum HSPSClassImpl::DevClose()
+{
+    LOG_FUNCTION();
+    int iRet = -1;
+    LogM("HSPSClassImpl::Entry->HSPS DevClose()!");
+    if(!m_bDevOpen)
+    {
+        return Error_Succeed;
+    }
+    //CLOSEDEV();
+	iRet = m_pDll->HIGH_CloseWindow();
+	
+    iRet = m_pDll->HIGH_StopCamera();
+    
+    if(iRet == FR_RET_SUCC)
+        m_bPreview = false;
+
+    m_pDll->FreeDLL();
+    m_bDevOpen = false;
+    LogM("HSPSClassImpl::Leave->HSPS DevClose() sucessfull!");
+    return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::Entry->HSPS GetLastErr()!");
+    devErrInfo.dwErrMsgLen = 0;
+    memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
+
+    devErrInfo.dwErrMsgLen = (m_shErrCode << 16);
+    sprintf(devErrInfo.szErrMsg, m_szErrMsg);
+    devErrInfo.dwErrMsgLen += (strlen(devErrInfo.szErrMsg) & 0x0000FFFF);
+    LogM("devErrInfo.szErrMsg = %s",devErrInfo.szErrMsg);
+    LogM("HSPSClassImpl::Leave->HSPS GetLastErr() sucessfull!");
+    return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
+{
+    LOG_FUNCTION();
+    int iRet = -1;
+    if(!m_bDevOpen)
+    {
+        SaveErrorInfo("SetParam()->Dev is not open",Error_DevNotAvailable );
+        LogM("HSPSClassImpl::leave HSPS->SetParam() failed");
+        return Error_DevNotAvailable;
+    }
+	LogM("HSPSClassImpl::SetParam(type=%d,value=%d),line=%d",type,value,__LINE__);
+    if(type == HSPS_MODEL_COLOR)
+    {
+        if(value == HSPS_COLOR_FULL)
+        iRet = m_pDll->HIGH_SetColorType(0);
+
+        else if (value == HSPS_COLOR_GREY) {
+            iRet = m_pDll->HIGH_SetColorType(1);
+        }
+        else {
+            SaveErrorInfo("SetParam()->ParamType COLOR ParamTypeValue error",Error_Param );
+            LogM("HSPSClassImpl::leave HSPS->SetParam(COLOR) ParamTypeValue error(%d)", value);
+            return Error_Param;
+        }
+    }
+    else if (type == HSPS_MODEL_ROTATE)
+    {
+        if(value == HSPS_ROTATE_NOANGLE)
+            iRet = m_pDll->HIGH_SetRotateSize(0);
+
+        else if (value == HSPS_ROTATE_LEFT)
+            iRet = m_pDll->HIGH_SetRotateSize(1);
+
+        else if (value == HSPS_ROTATE_MIRROR)
+            iRet = m_pDll->HIGH_SetRotateSize(2);
+
+        else if (value == HSPS_ROTATE_RIGHT)
+            iRet = m_pDll->HIGH_SetRotateSize(3);
+
+        else {
+            SaveErrorInfo("SetParam()->ParamType ROTATE ParamTypeValue error",Error_Param );
+            LogM("HSPSClassImpl::leave HSPS->SetParam(ROTATE) ParamTypeValue error(%d)", value);
+            return Error_Param;
+        }
+    }
+    else if (type == HSPS_MODEL_SCANSIZE)
+    {
+        //自动纠偏
+        if(value == HSPS_SCAN_FULL){
+            iRet = m_pDll->HIGH_SetAutoCrop(false);
+        }
+            //
+
+        else if (value == HSPS_SCAN_A4){
+            iRet = m_pDll->HIGH_SetAutoCrop(true);
+        }
+            //
+
+        else if (value == HSPS_SCAN_IDCARD){
+            iRet = m_pDll->HIGH_SetAutoCrop(true);
+        }
+            //
+
+        else {
+            SaveErrorInfo("SetParam()->ParamType SCANSIZE ParamTypeValue error",Error_Param );
+            LogM("HSPSClassImpl::leave HSPS->SetParam(SCANSIZE) ParamTypeValue error(%d)", value);
+            return Error_Param;
+        }
+        if(iRet != FR_RET_SUCC)
+        {
+            SaveErrorInfo(iRet);
+            LogM("HSPSClassImpl::SetParam(type=%d,value=%d) = [%d] HIGH_SetAutoCrop error,line=%d",type,value,iRet,__LINE__);
+            return Error_DevMedia;
+        }
+    }
+    else if (type == HSPS_MODEL_VIEW)
+    {
+        if(value == HSPS_VIEW_HIDE)
+            iRet = m_pDll->HIGH_HideWindow(1);
+
+
+        else if (value == HSPS_VIEW_SHOW)
+            iRet = m_pDll->HIGH_HideWindow(0);
+
+        else {
+            SaveErrorInfo("SetParam()->ParamType VIEW ParamTypeValue error",Error_Param );
+            LogM("HSPSClassImpl::leave HSPS->SetParam(VIEW) ParamTypeValue error(%d)", value);
+            return Error_Param;
+        }
+
+    }
+    else
+    {
+        SaveErrorInfo("SetParam()->ParamType error",Error_Param );
+        LogM("HSPSClassImpl::leave HSPS->SetParam error(%d)", type);
+        return Error_Param;
+    }
+
+    if(iRet != FR_RET_SUCC)
+    {
+        SaveErrorInfo(iRet);
+        LogM("HSPSClassImpl::SetParam(type=%d,value=%d) = [%d] error,line=%d",type,value,iRet,__LINE__);
+        return Error_DevMedia;
+    }
+                return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
+{
+    LOG_FUNCTION();
+	LogM("HSPSClassImpl::SetPreview(nValue=%d),line=%d",nValue,__LINE__);
+    int iRet = -1;
+    if(!m_bDevOpen)
+    {
+        SaveErrorInfo("SetPreview()->Dev is not open",Error_DevNotAvailable );
+        LogM("HSPSClassImpl::leave HSPS->SetPreview() failed");
+        return Error_DevNotAvailable;
+    }
+    if(nValue == 1)
+    {
+        m_pDll->HIGH_GetStatus( &DevStatus);
+        if(FR_DS_ONLINE==DevStatus)
+        {
+                if(!DevWindow)
+                    iRet = m_pDll->HIGH_CreateWindow(m_nX, m_nY, m_nWidth, m_nHeight);
+                else {
+                    iRet = m_pDll->HIGH_HideWindow(FALSE);
+                }
+
+                if(iRet != FR_RET_SUCC)
+                {
+                    for (int var = 0; iRet&&(var < 8); ++var) {
+                        m_pDll->HIGH_CloseWindow();
+                        sleep(1000);
+                        iRet = m_pDll->HIGH_CreateWindow(m_nX, m_nY, m_nWidth, m_nHeight);
+                        }
+                    if(iRet != FR_RET_SUCC)
+                    {
+                        SaveErrorInfo(iRet);
+                        LogM("HSPSClassImpl::SetPreview() = [%d] error,line=%d",iRet,__LINE__);
+                        return Error_DevMedia;
+                    }
+                }
+
+                if(iRet == FR_RET_SUCC)
+                {
+                    m_bShow = 1;
+                    m_bPreview = true;
+                }
+        }
+        else {
+            LogM("HSPSClassImpl::SetPreview() DevStatus = [%d] DevError:1->OFFLIN,2->BUSY,3->HARDWAREERROR,4->UNKNOW,line=%d",DevStatus,__LINE__);
+            return Error_DevMedia;
+        }
+   }
+    else if (nValue == 0)
+    {
+        iRet = m_pDll->HIGH_HideWindow(TRUE);
+        if(iRet == FR_RET_SUCC)
+            m_bShow = 0;
+
+        iRet = m_pDll->HIGH_CloseWindow();
+        DevWindow = false;
+        if(iRet == FR_RET_SUCC)
+            m_bPreview = false;
+    }
+
+    else {
+        SaveErrorInfo("SetPreview()->nValue error",Error_Param );
+        LogM("HSPSClassImpl::leave HSPS->SetPreview(%d) error", nValue);
+        return Error_Param;
+    }
+    if(iRet != FR_RET_SUCC)
+    {
+        SaveErrorInfo(iRet);
+        LogM("HSPSClassImpl::SetPreview(value=%d) = [%d] error,line=%d",nValue,iRet,__LINE__);
+        return Error_DevMedia;
+    }
+
+    return Error_Succeed;
+}
+
+
+ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::ScanImage(pszFileName=%s),line=%d",pszFileName,__LINE__);
+    int iRet = -1;
+    if(!m_bDevOpen)
+    {
+        SaveErrorInfo("ScanImage()->Dev is not open",Error_DevNotAvailable );
+        LogM("HSPSClassImpl::leave HSPS->ScanImage() failed");
+        return Error_DevNotAvailable;
+    }
+    iRet = m_pDll->HIGH_TakePicture(pszFileName);
+
+    //iRet = m_pDll->HIGH_CreateWindow(m_nX, m_nY, 0, m_nWidth*9/16);
+    if(iRet != FR_RET_SUCC)
+    {
+        SaveErrorInfo(iRet);
+        LogM("HSPSClassImpl::ScanImage(pszFileName=%s) = [%d] error,line=%d",pszFileName,iRet,__LINE__);
+        return Error_DevMedia;
+    }
+    iRet = m_pDll->HIGH_HideWindow(TRUE);
+    m_bShow = 0;
+    return Error_Succeed;
+}
+
+
+ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg,  int& nBtLen, const char* pszFileName)
+{
+    LOG_FUNCTION();
+
+    LogM("HSPSClassImpl::ScanImageEx(pBtImg, nBtLen=[%d], pszFileName=[%s])", nBtLen, pszFileName);
+
+    int iRet = -1;
+    if(!m_bDevOpen)
+    {
+        SaveErrorInfo("ScanImageEx()->Dev is not open",Error_DevNotAvailable );
+        LogM("HSPSClassImpl::leave HSPS->ScanImageEx() failed");
+        return Error_DevNotAvailable;
+    }
+    iRet = m_pDll->HIGH_TakePicture("tmp.jpg");
+    if(iRet != FR_RET_SUCC)
+    {
+        SaveErrorInfo(iRet);
+        LogM("HSPSClassImpl::ScanImageEx HIGH_TakePicture = [%d] error,line=%d",iRet,__LINE__);
+        return Error_DevMedia;
+    }
+    iRet = m_pDll->HIGH_HideWindow(TRUE);
+    if(iRet != FR_RET_SUCC)
+    {
+        SaveErrorInfo(iRet);
+        LogM("HSPSClassImpl::ScanImageEx HIGH_HideWindow = [%d] error,line=%d",iRet,__LINE__);
+        return Error_DevMedia;
+    }
+    m_bShow = 0;
+    //读取tmp.jpg为字节流
+    FILE *fp = NULL;
+    char* pFileData = NULL;
+    int file_size = 0;
+    fp = fopen("tmp.jpg","rb");
+    if(fp != NULL)
+    {
+        fseek(fp, 0, SEEK_END);
+        file_size = ftell(fp);
+        fseek(fp, 0, SEEK_SET);
+        pFileData = new char[file_size+1];
+        fread(pFileData, 1, file_size, fp);
+        fclose(fp);
+    }
+    else {
+        SaveErrorInfo("ScanImageEx()->fopen tmp.jpg error",Error_NoTarget );
+        LogM("HSPSClassImpl::leave HSPS->ScanImageEx() failed");
+        return Error_NoTarget;
+    }
+    //memcpy(pBtImg, pFileData, file_size);
+    pBtImg = (BYTE*)pFileData;
+    nBtLen = file_size;
+
+    if(nullptr != pszFileName && strlen(pszFileName) > 0)
+    {
+        string command = "cp ";
+        command  += "tmp.jpg";
+        command  += " ";
+        command  += pszFileName;
+        system((char*)command.c_str());
+    }
+    remove("tmp.jpg");
+
+    if(nBtLen < file_size)
+    {
+        memcpy(pBtImg, pFileData, file_size);
+        nBtLen = file_size;
+        SaveErrorInfo(iRet);
+        LogM("ScanImageEx()->nBtLen[%d] < file_size[%d]",nBtLen,file_size);
+        return Error_TooSmallBuffer;
+    }
+    memcpy(pBtImg, pFileData, file_size);
+    nBtLen = file_size;
+    return Error_Succeed;
+}
+
+
+ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
+{
+    LOG_FUNCTION();
+	LogM("HSPSClassImpl::SetViewPos(nX=%d, nY=%d, nWidth=%d),line=%d",nX, nY, nWidth,__LINE__);
+
+    int iRet = -1;
+    if(!m_bDevOpen)
+    {
+        SaveErrorInfo("SetViewPos()->Dev is not open",Error_DevNotAvailable );
+        LogM("HSPSClassImpl::leave HSPS->SetViewPos() failed");
+        return Error_DevNotAvailable;
+    }
+    if(nX >= 0 && nY >= 0 )
+    {
+        m_nX = nX;
+        m_nY = nY;
+        if(nWidth > 0)
+        {
+            m_nWidth = nWidth;
+
+            if (m_nWidth*9/16 <= 1)
+                m_nHeight = 1;
+            else {
+            m_nHeight  = m_nWidth*9/16;
+            }
+        }
+
+    }
+    else
+    {
+        SaveErrorInfo("SetViewPos()->Param < 0",Error_Param );
+        LogM("HSPSClassImpl::leave HSPS->SetViewPos() failed");
+        return Error_Param;
+    }
+
+
+    //iRet = m_pDll->HIGH_PauseAndPlay(true);
+    if(m_bPreview)
+    {
+
+
+            if(nWidth > 0)
+            {
+                LogM("HSPSClassImpl::SetViewPos(nWidth) = [%d] error,line=%d",nWidth,__LINE__);
+                iRet = m_pDll->HIGH_CloseWindow();
+                iRet = m_pDll->HIGH_CreateWindow(m_nX, m_nY, m_nWidth, m_nHeight);
+            }
+            else if( nWidth == 0)
+            {
+                LogM("HSPSClassImpl::SetViewPos(nWidth) = [%d] error,line=%d",nWidth,__LINE__);
+                iRet = m_pDll->HIGH_CloseWindow();
+                iRet = m_pDll->HIGH_CreateWindow(m_nX, m_nY, 1, 1);
+            }
+
+            else
+            {
+
+                SaveErrorInfo("SetViewPos()->Param < 0",Error_Param );
+                LogM("HSPSClassImpl::leave HSPS->SetViewPos() failed");
+                return Error_Param;
+            }
+    }
+    else {
+        LogM("HSPSClassImpl::SetViewPos(nWidth) = [%d] error,line=%d",nWidth,__LINE__);
+        iRet = m_pDll->HIGH_CreateWindow(m_nX, m_nY, m_nWidth, m_nHeight);
+        DevWindow = true;
+        iRet = m_pDll->HIGH_PauseAndPlay(true);
+        //iRet = m_pDll->HIGH_HideWindow(TRUE);
+    }
+    if(iRet != FR_RET_SUCC)
+    {
+        SaveErrorInfo(iRet);
+        LogM("HSPSClassImpl::SetViewPos() = [%d] error,line=%d",iRet,__LINE__);
+        return Error_DevMedia;
+    }
+/*    m_bPreview = false;
+    m_nX = nX;
+    m_nY = nY;
+    m_nWidth = nWidth;*/
+    //iRet = m_pDll->HIGH_HideWindow(TRUE);
+    //iRet = c;
+
+
+    LogM("HSPSClassImpl::SetViewPos() = [%d] success!,line=%d",iRet,__LINE__);
+    return Error_Succeed;
+}
+
+
+ErrorCodeEnum HSPSClassImpl::SetProperty()
+{
+    return Error_Succeed;
+}
+
+
+ErrorCodeEnum HSPSClassImpl::GetDevStatus(HspsDevStatus& status)
+{
+    LOG_FUNCTION();
+
+    status.inPreview = (short)m_bPreview;
+    status.inShow = (short)m_bShow;
+    m_pDll->HIGH_GetStatus( &DevStatus);
+    LogM("HSPSClassImpl::HIGH_GetStatus() = [%d] success!,line=%d",DevStatus,__LINE__);
+    if(DevStatus == 1)
+    {
+        status.isConnected = 0;
+    }
+    else {
+        status.isConnected = 1;
+    }
+    LogM("HSPSClassImpl::GetDevStatus success! inPreview = [%d] inShow = [%d]  isConnected = [isConnected]",status.inPreview,status.inShow,status.isConnected);
+    return Error_Succeed;
+}
+
+void HSPSClassImpl::SaveErrorInfo(CHAR* errMsg, int errCode)
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::Entry->HSPS SaveErrorInfo(CHAR* errMsg, int errCode)! <=> errMsg = %s errCode = %d",errMsg,errCode);
+    memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+    snprintf(m_szErrMsg, sizeof (m_szErrMsg),"%s[%d]", errMsg, errCode);
+    LogM("HSPSClassImpl::Leave->HSPS DevOpen()->m_pDll->SaveErrorInfo(CHAR* errMsg, int errCode) sucessfull!");
+}
+
+void HSPSClassImpl::SaveErrorInfo(DevErrorInfo devErrorInfo)
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::Entry->HSPS SaveErrorInfo(DevErrorInfo devErrorInfo)! <=> devErrorInfo.szErrMsg = %s",devErrorInfo.szErrMsg);
+    memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+    snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%s",devErrorInfo.szErrMsg);
+    LogM("HSPSClassImpl::Leave->HSPS DevOpen()->m_pDll->SaveErrorInfo(DevErrorInfo devErrorInfo) sucessfull!");
+}
+void HSPSClassImpl::SaveErrorInfo(int nErrorCode)
+{
+    LOG_FUNCTION();
+    LogM("HSPSClassImpl::Entry->HSPS SaveErrorInfo(int nErrorCode)! <=> nErrorCode = %d",nErrorCode);
+    ErrorCodeEnum ret;
+    switch (nErrorCode)
+    {
+    case FR_RET_SUCC:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_SUCC, "成功");
+        m_shErrCode = DEC_SUCCESS;
+        ret = Error_Succeed;
+        break;
+    case FR_RET_FAIL:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_FAIL, "失败");
+        m_shErrCode = DEC_EXCEPTION;
+        ret = Error_Param;
+        break;
+    case FR_RET_PARA:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_PARA, "参数错误");
+        m_shErrCode = DEC_INVALID_PARAMETER;
+        ret = Error_Param;
+        break;
+    case FR_RET_NDEV:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_NDEV, "打开设备失败");
+        m_shErrCode = DEC_DEV_NOT_FOUND;
+        ret = Error_Param;
+        break;
+    case FR_RET_NINI:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FR_RET_NINI, "未打开设备");
+        m_shErrCode = DEC_DEV_NOT_OPENED;
+        ret = Error_DevConnFailed;
+        break;
+    case FR_RET_BUSY:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_BUSY, "设备繁忙");
+        m_shErrCode = DEC_DEV_NOT_OPENED;
+        ret = Error_NotInit;
+        break;
+    case FR_RET_DATA:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_DATA, "图像数据不正确");
+        m_shErrCode = DEC_INVALID_PARAMETER;
+        ret = Error_Param;
+        break;
+    case FR_RET_NLNK:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_NLNK, "设备断开");
+        m_shErrCode = DEC_DEV_NOT_OPENED;
+        ret = Error_Param;
+        break;
+    case FR_RET_NMEM:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",FR_RET_NMEM, "内存分配失败");
+        m_shErrCode = DEC_NULL_POINTER;
+        ret = Error_Param;
+        break;
+    case FR_RET_ARDY:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg,sizeof(m_szErrMsg), "%d:%s",FR_RET_ARDY, "已经打开设备");
+        m_shErrCode = DEC_RESET_FAILED;
+        ret = Error_Param;
+        break;
+    default:
+        memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
+        snprintf(m_szErrMsg, sizeof(m_szErrMsg),"%d:%s",nErrorCode, "其它未定义的错误");
+        m_shErrCode = DEC_ERROR_CODE_UNRECOGNIZABLE;
+        ret = Error_Param;
+        break;
+    }
+    LogM("HSPSClassImpl::Leave->HSPS DevOpen()->m_pDll->SaveErrorInfo(int nErrorCode) sucessfull!");
+}
+

+ 85 - 0
DevAdapter/keba/HSPScanner.keba.1.2/hspscannerimpl.h

@@ -0,0 +1,85 @@
+#ifndef HSPSCANNERIMPL_H
+#define HSPSCANNERIMPL_H
+
+#include "stdafx.h"
+//#include <QObject>
+
+#include "HSPScannerClass.h"
+//#include <QThread>
+#include "devlibrary.h"
+//#include "CkDBus.h"
+
+
+typedef struct
+{
+    int iCode;
+    char sInf[128];
+    ErrorCodeEnum iRet;
+    int iInf;
+} CmbErrorDef;
+
+
+class HSPSClassImpl : public CHSPSClass
+{
+    //Q_OBJECT
+
+public:
+    HSPSClassImpl();
+    virtual ~HSPSClassImpl();
+
+public:
+
+    virtual ErrorCodeEnum DevOpen();
+
+    virtual ErrorCodeEnum SetParam(ParamType type, ParamTypeValue value);
+
+    virtual ErrorCodeEnum SetPreview(short nValue);
+
+    virtual ErrorCodeEnum ScanImage(const char* pszFileName);
+
+    virtual ErrorCodeEnum ScanImageEx(BYTE* pBtImg,  int& nBtLen, const char* pszFileName = "");
+
+    virtual ErrorCodeEnum SetViewPos(int nX, int nY, int nWidth);
+
+    virtual ErrorCodeEnum SetProperty();
+
+    virtual ErrorCodeEnum GetDevStatus(HspsDevStatus& status);
+
+    virtual ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+
+    virtual ErrorCodeEnum Reset();
+
+    virtual ErrorCodeEnum DevClose();
+
+    virtual ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+private:
+
+    DevErrorInfo m_DevErrInfo;
+
+    //DBusInfo m_DBusInf_C;
+    //DBusInfo m_DBusInf_S;
+
+    //char m_sLibPath[256];
+    //LPDBusRQInfo m_lpRQInf;
+
+    //bool m_bOpen;
+    bool m_bPreview;
+    bool m_bShow;
+    CDevDllLoad *m_pDll;
+    bool m_bDevOpen;
+    int m_nPort;
+    std::string m_strIniPath;
+    std::string m_strDllPath;
+    char m_strModulePath[256];
+    short m_shErrCode;
+    CHAR m_szErrMsg[MAX_DEV_ERROR_MSG_LEN];
+    void SaveErrorInfo(CHAR* errMsg, int errCode=95555);
+    void SaveErrorInfo(DevErrorInfo devErrorInfo);
+    void SaveErrorInfo(int nErrorCode);
+    bool DevWindow;
+    int m_nX, m_nY, m_nWidth, m_nHeight,DevStatus;
+
+};
+
+#endif // HSPSCANNERIMPL_H

+ 25 - 0
DevAdapter/keba/HSPScanner.keba.1.2/stdafx.h

@@ -0,0 +1,25 @@
+// stdafx.h : 标准系统包含文件的包含文件,
+// 或是经常使用但不常更改的
+// 特定于项目的包含文件
+//
+#pragma once
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <iostream>
+#include <string>
+#include <map>
+#include <list>
+#include <vector>
+#include <deque>
+#include <queue>
+#include <dlfcn.h>
+#include "CommDef.h"
+#include "wintypes.h"
+
+#include "ErrorCode.h"
+#include "DevErrorCode.h"
+#include "HSPScannerClass.h"
+
+#include "CkLog.h"