Pārlūkot izejas kodu

Z991239-1475 #comment 更新gwi源码 gwi/2021.0119.01

ITC\80296915 4 gadi atpakaļ
vecāks
revīzija
788da6cc9c
49 mainītis faili ar 7502 papildinājumiem un 1 dzēšanām
  1. 1 1
      DevAdapter/CMakeLists.txt
  2. 27 0
      DevAdapter/gwi/Gpio.1.1/CMakeLists.txt
  3. 29 0
      DevAdapter/gwi/Gpio.1.1/ErrorDefine.h
  4. 230 0
      DevAdapter/gwi/Gpio.1.1/GpioDriverGWI.cpp
  5. 62 0
      DevAdapter/gwi/Gpio.1.1/GpioDriverGWI.h
  6. 66 0
      DevAdapter/gwi/Gpio.1.1/GpioGWI.cpp
  7. 305 0
      DevAdapter/gwi/Gpio.1.1/GpioSP.cpp
  8. 64 0
      DevAdapter/gwi/Gpio.1.1/GpioSP.h
  9. 295 0
      DevAdapter/gwi/Gpio.1.1/simple_ini_tool.cpp
  10. 26 0
      DevAdapter/gwi/Gpio.1.1/simple_ini_tool.h
  11. 27 0
      DevAdapter/gwi/HSPScanner.1.1/CMakeLists.txt
  12. 27 0
      DevAdapter/gwi/HSPScanner.1.1/ErrorDefine.h
  13. 519 0
      DevAdapter/gwi/HSPScanner.1.1/HSPScannerDriverGWI.cpp
  14. 119 0
      DevAdapter/gwi/HSPScanner.1.1/HSPScannerDriverGWI.h
  15. 66 0
      DevAdapter/gwi/HSPScanner.1.1/HSPScannerGWI.cpp
  16. 343 0
      DevAdapter/gwi/HSPScanner.1.1/HSPScannerSP.cpp
  17. 66 0
      DevAdapter/gwi/HSPScanner.1.1/HSPScannerSP.h
  18. 295 0
      DevAdapter/gwi/HSPScanner.1.1/simple_ini_tool.cpp
  19. 26 0
      DevAdapter/gwi/HSPScanner.1.1/simple_ini_tool.h
  20. 27 0
      DevAdapter/gwi/ThermalPrint1.1/CMakeLists.txt
  21. 26 0
      DevAdapter/gwi/ThermalPrint1.1/ErrorDefine.h
  22. 682 0
      DevAdapter/gwi/ThermalPrint1.1/ThermalPrintDriverGWI.cpp
  23. 116 0
      DevAdapter/gwi/ThermalPrint1.1/ThermalPrintDriverGWI.h
  24. 66 0
      DevAdapter/gwi/ThermalPrint1.1/ThermalPrintGWI.cpp
  25. 511 0
      DevAdapter/gwi/ThermalPrint1.1/ThermalPrintSP.cpp
  26. 72 0
      DevAdapter/gwi/ThermalPrint1.1/ThermalPrintSP.h
  27. 295 0
      DevAdapter/gwi/ThermalPrint1.1/simple_ini_tool.cpp
  28. 26 0
      DevAdapter/gwi/ThermalPrint1.1/simple_ini_tool.h
  29. 27 0
      DevAdapter/gwi/Ups.1.1/CMakeLists.txt
  30. 29 0
      DevAdapter/gwi/Ups.1.1/ErrorDefine.h
  31. 204 0
      DevAdapter/gwi/Ups.1.1/UpsDriverGWI.cpp
  32. 56 0
      DevAdapter/gwi/Ups.1.1/UpsDriverGWI.h
  33. 66 0
      DevAdapter/gwi/Ups.1.1/UpsGWI.cpp
  34. 308 0
      DevAdapter/gwi/Ups.1.1/UpsSP.cpp
  35. 64 0
      DevAdapter/gwi/Ups.1.1/UpsSP.h
  36. 295 0
      DevAdapter/gwi/Ups.1.1/simple_ini_tool.cpp
  37. 26 0
      DevAdapter/gwi/Ups.1.1/simple_ini_tool.h
  38. 32 0
      DevAdapter/gwi/rfic.1.1/CMakeLists.txt
  39. 802 0
      DevAdapter/gwi/rfic.1.1/ContactlessCardDriverGWI.cpp
  40. 46 0
      DevAdapter/gwi/rfic.1.1/ContactlessCardDriverGWI.h
  41. 66 0
      DevAdapter/gwi/rfic.1.1/ContactlessCardGWI.cpp
  42. 153 0
      DevAdapter/gwi/rfic.1.1/Loadmt32so.cpp
  43. 153 0
      DevAdapter/gwi/rfic.1.1/Loadmt32so.h
  44. 5 0
      DevAdapter/gwi/rfic.1.1/contactless_cmb.ini
  45. 295 0
      DevAdapter/gwi/rfic.1.1/simple_ini_tool.cpp
  46. 26 0
      DevAdapter/gwi/rfic.1.1/simple_ini_tool.h
  47. 24 0
      DevAdapter/gwi/watchdog.1.1/CMakeLists.txt
  48. 351 0
      DevAdapter/gwi/watchdog.1.1/watchdog_impl.cpp
  49. 60 0
      DevAdapter/gwi/watchdog.1.1/watchdog_impl.h

+ 1 - 1
DevAdapter/CMakeLists.txt

@@ -143,7 +143,7 @@ if(DEVADAPTER_USING_CONAN)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2021.0119.01@LR04.02_VendorLib/testing)
 	set(GRG_CONAN_LIB_NAME grg/2021.0111.01@LR04.02_VendorLib/testing)
 	set(CW_CONAN_LIB_NAME cw/2020.1222.01@LR04.02_VendorLib/testing)
-    set(GWI_CONAN_LIB_NAME gwi/2021.0104.01@LR04.02_VendorLib/testing)
+    set(GWI_CONAN_LIB_NAME gwi/2021.0119.01@LR04.02_VendorLib/testing)
 endif(DEVADAPTER_USING_CONAN)
 
     file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt")

+ 27 - 0
DevAdapter/gwi/Gpio.1.1/CMakeLists.txt

@@ -0,0 +1,27 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("Gpio")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "gwi")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        GpioSP.cpp 
+        GpioGWI.cpp 
+        GpioDriverGWI.cpp 
+        simple_ini_tool.cpp
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+# ${MODULE_FULL_NAME} 是 TAGET 名称,在 rvc_dev_config_library 中定义
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}")
+
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 29 - 0
DevAdapter/gwi/Gpio.1.1/ErrorDefine.h

@@ -0,0 +1,29 @@
+#ifndef ERROR_DEFINE_H
+#define ERROR_DEFINE_H
+
+#include "ErrorCode.h"
+#include "DevErrorCode.h"
+#include "Xfssiu.h"
+
+typedef struct _DevErrcode
+{
+	long lErr;
+	char szErrDes[1024];
+	long lDevErr;
+	long lReturn;
+}DevErrCode;
+
+DevErrCode m_DevErrArray[] =
+{
+    0,"成功",DEC_SUCCESS,Error_Succeed,
+    WFS_ERR_TIMEOUT, "Excute Time Out", DEC_TIMEOUT, Error_TimeOut,
+    WFS_ERR_HARDWARE_ERROR, "Hardware Error", DEC_HARDWARE, Error_Hardware,
+    WFS_ERR_INTERNAL_ERROR, "Internal Error", DEC_NO_E_GPIO + 1, Error_Process,
+    WFS_ERR_CANCELED, "User Canceled", DEC_NO_E_GPIO + 2, Error_Cancel,
+	WFS_ERR_INVALID_DATA, "Invalid Data", DEC_NO_E_CARDISSUER + 3, Error_Param,
+	WFS_ERR_SIU_INVALID_PORT, "Invalid Port", DEC_NO_E_GPIO + 4, Error_Param,
+	WFS_ERR_SIU_PORT_ERROR, "Port Error", DEC_NO_E_GPIO + 5, Error_Param,
+	WFS_ERR_SIU_POWERSAVETOOSHORT, "Invalid Data", DEC_NO_E_GPIO + 6, Error_Param,
+};
+
+#endif

+ 230 - 0
DevAdapter/gwi/Gpio.1.1/GpioDriverGWI.cpp

@@ -0,0 +1,230 @@
+#include "GpioDriverGWI.h"
+#include "GpioSP.h"
+#include "GwiLogFile.h"
+#include "ErrorDefine.h"
+#include "Xfssiu.h"
+
+CLogFile *g_pLogFile = NULL;
+CGpioSP *g_pGpioSP = NULL;
+
+CGpio::CGpio()
+{
+	memset(&m_DevErrorInfo,0,sizeof(m_DevErrorInfo));
+
+	if(NULL == g_pLogFile)
+	{
+		g_pLogFile = new CLogFile(LAYER);
+		g_pLogFile->init();
+
+		LogARG(g_pLogFile, Log_Debug, "CGpio", "CLogFile Init success!");
+	}
+
+	if(NULL == g_pGpioSP)
+	{
+		g_pGpioSP = new CGpioSP(g_pLogFile);
+	}
+
+}
+
+CGpio::~CGpio()
+{
+	if(NULL != g_pGpioSP)
+	{
+		delete g_pGpioSP;
+		g_pGpioSP = NULL;
+	}
+}
+
+ErrorCodeEnum CGpio::DevOpen(GpioInitParam initParam)
+{
+	LogARG(g_pLogFile, Log_Infor, "DevOpen", "Enter");
+	long lResult = 0;
+
+	lResult = g_pGpioSP->SIUSPOpen();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "DevOpen", "open failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "DevOpen", "Exitl,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CGpio::WritePort(DWORD dwPort,BYTE btData)
+{
+	LogARG(g_pLogFile, Log_Infor, "WritePort", "Enter, dwPort[%d], btData[%02X]",dwPort, btData);
+	long lResult = 0;
+
+	DWORD fwCommand[8];
+	//初始化指示灯状态
+	for (int i = 0; i < 8; i ++)
+	{
+		fwCommand[i] = WFS_SIU_OFF;
+	}
+
+	//赋值
+	if (btData & 0x01) fwCommand[0] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x02) fwCommand[1] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x04) fwCommand[2] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x08) fwCommand[3] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x10) fwCommand[4] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x20) fwCommand[5] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x40) fwCommand[6] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+	if (btData & 0x80) fwCommand[7] = WFS_SIU_CONTINUOUS;//0x0002打开指示灯
+
+	WORD wGuidLights = 32;
+	for (int i = 0; i < 8; i ++)
+	{
+		switch(dwPort * 8 + i)
+		{
+		case 0:	//读卡器指示灯
+			wGuidLights = WFS_SIU_CARDUNIT;		//(GL_CardUnit_000)
+			break;
+		case 2: //身份证扫描指示灯
+			wGuidLights = WFS_SIU_NOTESDISPENSER;	//(GL_NotesDispenser_002)
+			break;
+		case 6:	//读卡发卡器维护指示灯
+			wGuidLights = 13;						//(GL_CardUnit_013)
+			break;
+		case 7:	//USB引出端指示灯
+			wGuidLights = WFS_SIU_COINDISPENSER;	//(GL_CoinDispenser_003)
+			break;
+		case 8: //非接IC读卡器指示灯
+			wGuidLights = WFS_SIU_ENVDISPENSER;	//(GL_EnvDispenser_009)
+			break;
+		case 10: //指纹仪指示灯
+			wGuidLights = 14;						//(GL_FingerScanner_014)
+			break;
+		default:
+			wGuidLights = 32;
+			break;
+		}
+
+		if (wGuidLights < 32)
+		{
+			lResult = g_pGpioSP->SetGuidLights(wGuidLights, fwCommand[i]);
+			if(RET_SUCCESS != lResult)
+			{
+				LogARG(g_pLogFile, Log_Error, "WritePort", "Set wGuidLights[%d] Failed, lResult[%d]", wGuidLights, lResult);
+			}
+		}
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "WritePort", "Exitl, lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CGpio::ReadPort(DWORD dwPort,BYTE &btStatus)
+{
+	LogARG(g_pLogFile, Log_Infor, "ReadPort", "Enter, dwPort[%d]", dwPort);
+	long lResult = 0;
+
+	char szVersionBuf[256] = {0};
+	int nStatus = 0;
+	lResult = g_pGpioSP->SIUGetStatus(nStatus, szVersionBuf, btStatus);
+
+	LogARG(g_pLogFile, Log_Infor, "ReadPort", "Exitl,lResult[%d], btStatus[%02X]",lResult, btStatus);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CGpio::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LogARG(g_pLogFile, Log_Infor, "GetDevCategory", "Enter");
+
+	long lResult = 0;
+	char szVersionBuf[256] = {0};
+	int nStatus = 0;
+	BYTE bSensorStatus = 0;
+	lResult = g_pGpioSP->SIUGetStatus(nStatus, szVersionBuf, bSensorStatus);
+
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "GetDevCategory", "GetVersion failed, lResult[%d]",lResult);
+		devCategory.eState = DEVICE_STATUS_FAULT;
+	}
+	else
+	{
+		devCategory.eState = DEVICE_STATUS_NORMAL;
+	}
+
+	sprintf(devCategory.szModel,"SIU");    
+	sprintf(devCategory.szType,"JUST E6020-K");
+	sprintf(devCategory.szVendor,"GWI_mellisa");
+
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 1;
+	devCategory.version.wBuild = 1;
+
+	LogARG(g_pLogFile, Log_Infor, "GetDevCategory", "Exit, lResult[%d]",lResult);
+	return ErrParse(lResult);
+}
+
+ErrorCodeEnum CGpio::Reset()
+{
+	LogARG(g_pLogFile, Log_Infor, "Reset", "Enter...");
+	long lResult = 0;
+
+	lResult = g_pGpioSP->Reset();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "Reset", "Reset failed, lResult[%d]",lResult);
+		return ErrParse(lResult); 
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "Reset", "Exit,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CGpio::DevClose()
+{
+	LogARG(g_pLogFile, Log_Infor, "DevClose", "Enter...");
+	long lResult = 0;
+
+	lResult = g_pGpioSP->SIUSPClose();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "DevClose", "Close failed, lResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "DevClose", "Exitl,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CGpio::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	LogARG(g_pLogFile, Log_Infor, "GetLastErr", "Enter...");
+
+	memset(&devErrInfo,0,sizeof(DevErrorInfo));
+	memcpy(&devErrInfo,&m_DevErrorInfo,sizeof(DevErrorInfo));
+
+	LogARG(g_pLogFile, Log_Infor, "GetLastErr", "Exit...");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CGpio::ErrParse(long lResult)
+{
+	bool bFind = false;
+	for(int n = 0; n < sizeof(m_DevErrArray)/sizeof(DevErrCode); n++)
+	{
+		if(lResult == m_DevErrArray[n].lErr)
+		{
+			bFind = true;
+			ErrorCodeEnum ErrTmp = (ErrorCodeEnum)m_DevErrArray[n].lReturn;
+			memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+			strcpy(m_DevErrorInfo.szErrMsg,m_DevErrArray[n].szErrDes);
+			m_DevErrorInfo.dwErrMsgLen = (m_DevErrArray[n].lDevErr << 16) +strlen(m_DevErrArray[n].szErrDes);
+			return ErrTmp;
+		}
+	}
+	if(!bFind)
+	{
+		memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+		strcpy(m_DevErrorInfo.szErrMsg,"未定义错误!");
+		m_DevErrorInfo.dwErrMsgLen =strlen(m_DevErrorInfo.szErrMsg);
+		return Error_Hardware;
+	}
+	return Error_Succeed;
+}

+ 62 - 0
DevAdapter/gwi/Gpio.1.1/GpioDriverGWI.h

@@ -0,0 +1,62 @@
+#ifndef LIBFRAMEWORK_GPIO_H
+#define LIBFRAMEWORK_GPIO_H
+
+#include "GpioClass.h"
+
+class CGpio : public GpioClass
+{
+public:
+	CGpio(void);
+	~CGpio(void);
+
+	//
+	//	Device initialization.
+	//	Configure port input/output direction.
+	//
+	virtual ErrorCodeEnum DevOpen(GpioInitParam initParam);
+
+	//
+	//	Set ports output.
+	//	Arguments:
+	//	- dwPort:port serial number,0~MAX_PORT_NUM-1
+	//	- btData:output value
+	//	  bit value 1/0 means voltage high or low
+	//	  ex.dwPort=0 btData=10001010 means set port 0's the 2nd,4th,8th pin output high
+	//
+	virtual ErrorCodeEnum WritePort(DWORD dwPort,BYTE btData);
+	//
+	//	Get port input.
+	//	Arguments:
+	//	- dwPort:port serial number,0~MAX_PORT_NUM-1
+	//	- btStatus:input value
+	//	  ex.dwPort=0 btStatus=10001010 means port 0's the 2nd,4th,8th pin with high level
+	//
+	virtual ErrorCodeEnum ReadPort(DWORD dwPort,BYTE &btStatus);
+
+	//	
+	//	Get category infomation about device.
+	//
+	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);
+
+private:
+	ErrorCodeEnum ErrParse(long lResult);
+
+	DevErrorInfo m_DevErrorInfo;
+};
+
+
+#endif //LIBFRAMEWORK_CARDSWIPER_IMPL_H

+ 66 - 0
DevAdapter/gwi/Gpio.1.1/GpioGWI.cpp

@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include "GpioDriverGWI.h"
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pOutDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+#endif
+{
+    pOutDevAptObj = new CGpio();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+    return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pInDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+#endif
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(CGpio* pTmp = dynamic_cast<CGpio*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+}
+
+#ifdef _WINDOWS
+
+char g_myDllPath[MAX_PATH]={0};
+char g_myDllName[MAX_PATH]={0};			//我的名字
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	    case DLL_PROCESS_ATTACH:
+		{
+			GetModuleFileName(hModule,g_myDllPath,MAX_PATH);	//取当前模块全路径(动态库,并非执行文件)
+			strcpy(g_myDllName,strrchr(g_myDllPath,'\\')+1);
+			strcpy(strrchr(g_myDllPath,'\\'),"\\");
+			char *p=strchr(g_myDllName,'.');
+			if(p!=NULL)
+				*p=0;
+		}break;
+	    case DLL_THREAD_ATTACH:
+	    case DLL_THREAD_DETACH:
+	    case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
+#endif

+ 305 - 0
DevAdapter/gwi/Gpio.1.1/GpioSP.cpp

@@ -0,0 +1,305 @@
+#include "GpioSP.h"
+#include "Xfssiu.h"
+#include "simple_ini_tool.h"
+#include "pcquicklib.h"
+
+#define CONF_FILE_NAME			"DevAdapter.ini"
+#define DEFAULT_TIMEOUT         5000
+#define RECV_TIMEOUT		    12000
+
+#ifdef _WINDOWS
+extern char g_myDllPath[MAX_PATH];
+#define OCXBASEDLL_DEFAULE_PATH		"C:\\KIOSK\\GwiXfs\\ocxbase.dll"   //默认路径,可通过配置文件配置
+#else
+#include <dlfcn.h>
+#define OCXBASEDLL_DEFAULE_PATH		"/usr/KIOSK/Pisa/libPISAOcxBase.so"     //默认路径,可通过配置文件配置
+#endif
+
+ #define setbitgpio(x,y) x|=(1<<y) //将X的第Y位置1
+ #define clrbitgpio(x,y) x&=~(1<<y) //将X的第Y位清0
+
+void GetDllLoadPath(char *pOutDllPath)
+{
+	if(NULL == pOutDllPath)
+		return;
+
+#ifdef  _WINDOWS
+	strcpy(pOutDllPath,g_myDllPath);
+#else
+	Dl_info dl_info;	//dladdr获取某个地址的符号信息
+	int rc = dladdr((void*)GetDllLoadPath, &dl_info);  
+	strcpy(pOutDllPath,dl_info.dli_fname);
+	char *pName = strrchr(pOutDllPath, '/');
+	*pName = '\0'; 
+#endif
+}
+
+CGpioSP::CGpioSP(CLogFile *plogFile): m_plogFile(plogFile)
+{
+	m_pSIUOcxBase = NULL;
+	m_bSIUOpen = false;
+
+	memset(m_pSIULogicName,0,sizeof(m_pSIULogicName));
+	memset(m_OCXDllPath,0,sizeof(m_OCXDllPath));
+	ReadConf();
+}
+
+CGpioSP::~CGpioSP(void)
+{
+	if(m_bSIUOpen)
+		SIUSPClose();
+
+	if(NULL != m_pSIUOcxBase)
+	{
+		delete m_pSIUOcxBase;
+		m_pSIUOcxBase = NULL;
+	}
+}
+
+HRESULT CGpioSP::EventCallBack(long EventType,void* lpResults)
+{
+
+	return WFS_SUCCESS;
+}
+
+long CGpioSP::SIUSPOpen(void)
+{
+	LogARG(m_plogFile, Log_Infor, "SIUSPOpen","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+
+	if(m_bSIUOpen)
+		return WFS_SUCCESS;
+
+	if(!LoadDll())
+	{
+		LogARG(m_plogFile, Log_Error, "SIUSPOpen","Load ocxbase Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	if(!InitSP())
+	{
+		LogARG(m_plogFile, Log_Error, "SIUSPOpen","Init SP Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+
+	if(NULL != m_pSIUOcxBase)
+	{
+		lhResult = m_pSIUOcxBase->WFSOpen();
+		LogARG(m_plogFile, Log_Debug, "SIUSPOpen","WFSOpen[%d]",lhResult);
+		if(WFS_SUCCESS == lhResult)
+		{
+			lhResult = m_pSIUOcxBase->WFSRegister();
+		}
+	}
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "SIUSPOpen","Init Gpio Failed!");
+		return lhResult;
+	}
+
+	m_bSIUOpen = true;
+
+	LogARG(m_plogFile, Log_Infor, "SIUSPOpen","Exit, Open Success!");
+	return lhResult;
+}
+
+long CGpioSP::SIUSPClose(void)
+{
+	LogARG(m_plogFile, Log_Infor, "SIUSPClose","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(m_bSIUOpen && NULL != m_pSIUOcxBase)
+	{
+		m_pSIUOcxBase->WFSClose();
+		m_bSIUOpen = false;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "SIUSPClose","Exit, Close Success!");
+	return lhResult;
+}
+
+long CGpioSP::Reset()
+{
+	LogARG(m_plogFile, Log_Infor, "Reset","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bSIUOpen && NULL == m_pSIUOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pSIUOcxBase->WFSExecute(WFS_CMD_SIU_RESET,NULL,DEFAULT_TIMEOUT,&lpwfsResult);
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset","Reset Failed,lhResult[%d]",lhResult);
+	}
+
+	m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "Reset","Exit, Reset Success!");
+	return lhResult;
+}
+
+long CGpioSP::SIUGetStatus(int& nStatus, char *pszVersion, BYTE &btStatus)
+{
+	LogARG(m_plogFile, Log_Infor, "SIUGetStatus","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bSIUOpen && NULL == m_pSIUOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "SIUGetStatus","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT		lpwfsResult		= NULL;
+	LPWFSSIUSTATUS	lpWfsSiuStatus	= NULL;
+
+	lhResult = m_pSIUOcxBase->WFSGetInfo(WFS_INF_SIU_STATUS, NULL, DEFAULT_TIMEOUT, &lpwfsResult); 
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SIUGetStatus","WFS_INF_SIU_STATUS Failed hResult[%d]", lhResult);
+		m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+		return lhResult;
+	}
+
+	lhResult = lpwfsResult->hResult;
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SIUGetStatus","WFS_INF_SIU_STATUS Failed hResult[%d]", lhResult);
+		m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+		return lhResult;
+	}
+
+	lpWfsSiuStatus = (LPWFSSIUSTATUS)lpwfsResult->lpBuffer;
+	if(lpWfsSiuStatus == NULL )
+	{
+		LogARG(m_plogFile, Log_Error,"SIUGetStatus","WFS_INF_SIU_STATUS Failed lpWfsSiuStatus = NULL");
+		m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+		return WFS_ERR_INVALID_POINTER;
+	}
+
+	nStatus = lpWfsSiuStatus->fwDevice;
+
+	for (int i = 0; i < 8; i ++)
+	{
+		if (lpWfsSiuStatus->fwSensors[i] == WFS_SIU_OPEN)
+		{
+			setbitgpio(btStatus, i);
+		}
+		else 
+		{
+			clrbitgpio(btStatus, i);
+		}
+	}
+
+	m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "SIUGetStatus","Exit, nStatus[%d], pszVersion[%s], btStatus[%02X]", nStatus, pszVersion, btStatus);
+
+	return lhResult;
+}
+
+long CGpioSP::SetGuidLights(WORD wGuidLight, DWORD fwCommand)
+{
+	LogARG(m_plogFile, Log_Infor, "SetGuidLights","Enter, fwGuidLight[%d], fwCommand[%d]", wGuidLight, fwCommand);
+
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bSIUOpen && NULL == m_pSIUOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "SetGuidLights","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	WFSSIUSETGUIDLIGHT  lpSetGuidLight;
+	lpSetGuidLight.wGuidLight = wGuidLight;
+	lpSetGuidLight.fwCommand = fwCommand;
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pSIUOcxBase->WFSExecute(WFS_CMD_SIU_SET_GUIDLIGHT, &lpSetGuidLight, 30000, &lpwfsResult);
+
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SetGuidLights","SetGuidLights WFSExecute failed hResult[%d]", lhResult);
+	    return lhResult;
+	}
+
+	m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "SetGuidLights","Exit, lhResult[%d]", lhResult);
+	return lhResult;
+}
+
+void CGpioSP::ReadConf(void)
+{
+	char szConfPath[260] = {0};
+	char szDllPath[260] = {0};
+	 char ocxBasePath[260] = {0};
+	GetDllLoadPath(szDllPath);
+	sprintf(szConfPath, "%s/%s", szDllPath, CONF_FILE_NAME);
+	sprintf(ocxBasePath, "%s/gwi/libgwiPISAOcxBase.so",szDllPath);
+	//读取逻辑名
+	strcpy(m_pSIULogicName,IniFileRead(szConfPath,"SP","SIU_LOGICAL_SERVICES","SensorsAndIndicators").c_str());
+	strcpy(m_OCXDllPath,IniFileRead(szConfPath,"SP","OCXBASE_PATH",ocxBasePath).c_str());
+
+	LogARG(m_plogFile, Log_Debug,"ReadConf","readConfINI m_pSIULogicName[%s], m_OCXDllPath[%s]!",m_pSIULogicName,m_OCXDllPath);
+}
+
+bool CGpioSP::LoadDll(void)
+{
+#ifdef _WINDOWS
+    m_hOCXHandle = LoadLibrary(m_OCXDllPath);
+    if(!m_hOCXHandle)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load m_OCXDllPath[%s] Failed!", m_OCXDllPath);
+		return false; 
+    }
+
+    m_pCallCreateInstance = (CreateInstanceEx)GetProcAddress(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)GetProcAddress(m_hOCXHandle,"FreeInstance");
+#else
+    m_hOCXHandle = dlopen(m_OCXDllPath, RTLD_NOW);
+    if(!m_hOCXHandle)
+    {
+        const char* error = dlerror();
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load [%s] Failed,error msg[%s]!",m_OCXDllPath,error);
+		return false; 
+    }
+
+    LogARG(m_plogFile, Log_Debug, "LoadDll","Load [%s] Successed!",m_OCXDllPath);
+    m_pCallCreateInstance = (CreateInstance)dlsym(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)dlsym(m_hOCXHandle,"FreeInstance");
+#endif
+
+    if(NULL == m_pCallCreateInstance || NULL == m_pCallFreeInstance)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load OCXBASE CreateInstance or FreeInstance Failed!");
+        return false;
+    }
+
+    return true;
+}
+
+
+bool CGpioSP::InitSP(void)
+{
+	//初始化SP
+	CEventCallBack* pEvent = (CEventCallBack*)this;
+	if(NULL == m_pSIUOcxBase)
+	{
+		m_pSIUOcxBase = (OcxBase *)m_pCallCreateInstance((LPVOID)"SIU", m_pSIULogicName, NULL, pEvent);
+
+		if(NULL == m_pSIUOcxBase)
+		{
+			LogARG(m_plogFile, Log_Error, "InitSP","new Finger CDeviceOcxBase failed!");
+			return false;
+		}
+
+		LogARG(m_plogFile, Log_Debug, "InitSP","new Finger CDeviceOcxBase sussces!");
+	}
+
+	return true;
+}

+ 64 - 0
DevAdapter/gwi/Gpio.1.1/GpioSP.h

@@ -0,0 +1,64 @@
+#ifndef GPIO_SP_H
+#define GPIO_SP_H
+
+#include "OcxBase.h"
+#include "GwiLogFile.h"
+
+#define RET_SUCCESS     0
+#define LAYER ("Gpio")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+
+struct WFSAsyncExecuteInfo 
+{
+    long lhResult;
+    unsigned long ulReqID;
+    unsigned char Info[2048];
+	int m_infolen;
+};
+
+#ifndef _WINDOWS
+#define WINAPI
+#endif
+
+typedef LPVOID (WINAPI *CreateInstance)(LPVOID attatchparam,LPVOID reServed,LPVOID tools,LPVOID spInter);
+typedef void (WINAPI* FreeInstance)(LPVOID p);
+
+class CLogFile;
+class CGpioSP : public CEventCallBack
+{
+public:
+	CGpioSP(CLogFile *plogFile);
+	~CGpioSP(void);
+
+	virtual long EventCallBack(long EventType,void* lpResult);
+
+	long SIUSPOpen(void); 
+	long SIUSPClose(void);
+	long Reset(void);
+	long SIUGetStatus(int& nStatus, char *pszVersion, BYTE &btStatus);
+	long SetGuidLights(WORD wGuidLight, DWORD fwCommand);
+
+private:
+	void ReadConf(void);
+	bool LoadDll(void);
+	bool InitSP(void);
+
+	OcxBase *m_pSIUOcxBase;        /// 设备对象指针
+	char     m_pSIULogicName[260];
+	bool     m_bSIUOpen;
+	char     m_OCXDllPath[260];
+	CLogFile *m_plogFile;
+	unsigned long m_ulReqID;
+
+    CreateInstance m_pCallCreateInstance;
+    FreeInstance m_pCallFreeInstance;
+#ifdef _WINDOWS
+	  HMODULE m_hOCXHandle; 
+#else
+	  void* m_hOCXHandle;
+#endif
+
+};
+
+#endif

+ 295 - 0
DevAdapter/gwi/Gpio.1.1/simple_ini_tool.cpp

@@ -0,0 +1,295 @@
+#include "simple_ini_tool.h"
+
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+
+#include <list>
+#include <string>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+static inline bool IsSpace(char c)
+{
+    return isspace(c) != 0 ; // !=0 消除VS的C4800警告
+}
+
+/** 将int转换成字符串,替代itoa函数,android中没有该函数 */
+static char* IntToStr(int v, char* str)
+{
+    sprintf(str, "%d", v);
+    return str;
+}
+
+/** 将文件以行的形式加载到内存中 */
+static list<string> LoadLines(const string& filename)
+{
+    list<string> lines;
+    FILE* file = fopen(filename.c_str(), "rt");
+    if (file != NULL)
+    {
+        char line[1024];
+        while(fgets(line, sizeof(line), file) != NULL)
+        {
+            lines.push_back(line);
+        }
+        fclose(file);
+    }
+    return lines;
+}
+
+/** 内存的数据写入文件 */
+static void SaveLines(const string& filename, const list<string>& lines)
+{
+#ifndef _WINDOWS
+	printf("SaveLines =%s\n",filename.c_str());
+#endif
+    FILE* file = fopen(filename.c_str(), "wt");
+    if (file != NULL)
+    {
+        for (list<string>::const_iterator iter = lines.begin();
+             iter != lines.end(); ++iter)
+        {
+            fputs(iter->c_str(), file);
+        }
+        fclose(file);
+    }
+}
+
+template<typename T, typename F>
+static void Strip(T rawb, T rawe, T& b, T& e, F isStrip)
+{
+    b = rawb;
+    e = rawe;
+
+    while (b != rawe)
+    {
+         if (!isStrip(*b))   break;
+         ++b;
+    }
+
+    while (b != e)
+    {
+        /* 进入该分支,则表明b为!isStrip,当--e后,要么跳出循环,要么不为b */
+        --e;
+        if (!isStrip(*e))
+        {
+            ++e;
+            break;
+        }
+    }
+}
+
+/** 判断是否是[xxx]结构 */
+static bool IsSection(const string& line, const string* section=NULL)
+{
+    string::const_iterator b = line.begin();
+    string::const_iterator e = line.end();
+
+    Strip(line.begin(), line.end(), b, e, IsSpace);
+
+    return e != b && *b == '[' && *(--e) == ']' && (section==NULL || string(++b, e) == *section);
+}
+
+class ListIter
+{
+public:
+    typedef list<string> List;
+    typedef list<string>::iterator Iter;
+};
+
+class ListCIter
+{
+public:
+    typedef const list<string> List;
+    typedef list<string>::const_iterator Iter;
+};
+
+template<typename T>
+static void FindSection(typename T::List& lines, const string& section, typename T::Iter& begin, typename T::Iter& end)
+{
+    for (begin = lines.begin(); begin != lines.end(); ++begin)
+    {
+        if (IsSection(*begin, &section)) break;
+    }
+
+    end = begin;
+    if (end != lines.end())
+    {
+        for (++end; end != lines.end(); ++end)
+        {
+            if (IsSection(*end))    break;
+        }
+    }
+}
+
+
+bool GetKeyValue(const string& line, string& key, string& value)
+{
+    string::size_type m = line.find("=");
+    if (m != string::npos)
+    {
+        string::const_iterator b = line.begin();
+        string::const_iterator s = line.begin()+m;
+        Strip(line.begin(), line.begin()+m, b, s, IsSpace);
+        key = string(b, s);
+
+        Strip(line.begin()+m+1, line.end(), b, s, IsSpace);
+        value = string(b, s);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+string IniFileRead(const string& filename, const string& section, const string& key, const string& defaultValue)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+        string k, v;
+        if (GetKeyValue(*iter, k, v) && key == k) return v;
+    }
+
+    return defaultValue;
+}
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value)
+{
+	int Count = 0;
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+		string k, v;
+        if (GetKeyValue(*iter, k, v))
+		{
+			Count++;
+			key.insert(key.end(), k);
+			value.insert(value.end(), v);
+		}
+    }
+
+    return Count;
+}
+
+
+#define MAKE_SECTION_LINE(s)        ("[" + (s) + "]\n")
+#define MAKE_KEY_VALUE_LINE(k,v)    ((k) + " = " + (v) + "\n")
+
+void IniFileWrite(const string& filename, const string& section, const string& key, const string& value)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::iterator begin;
+    list<string>::iterator end;
+
+    FindSection<ListIter>(lines, section, begin, end);
+
+    if (begin != end)
+    {
+        list<string>::iterator iter=begin;
+        for (; iter != end; ++iter)
+        {
+            string k, v;
+            if (GetKeyValue(*iter, k, v) && key == k) 
+            {
+                *iter = MAKE_KEY_VALUE_LINE(key, value);
+                break;
+            }
+        }
+
+        if (iter == end)
+        {
+            lines.insert(iter, MAKE_KEY_VALUE_LINE(key, value));
+        }
+    }
+    else
+    {
+        lines.push_back(MAKE_SECTION_LINE(section));
+        lines.push_back(MAKE_KEY_VALUE_LINE(key, value));
+    }
+
+    SaveLines(filename, lines);
+}
+
+
+int IniFileRead(const string& filename, const string& section, const string& key, int defaultValue)
+{
+    char str[48];
+    return atoi(IniFileRead(filename, section, key, IntToStr(defaultValue, str)).c_str());
+}
+
+void IniFileWrite(const string& filename, const string& section, const string& key, int value)
+{
+    char str[48];
+    IniFileWrite(filename, section, key, IntToStr(value, str));
+}
+
+
+#ifdef TEST_SIMPLE_INI_TOOL
+
+#define CheckEqaul(a, b) ((a)!=(b))?(printf("CheckFailed %s == %s\n", #a, #b)):0
+int main()
+{
+    const char* testFile = "test_simple_ini_tool.ini";
+
+    // 清空文件
+    fclose(fopen(testFile, "w"));
+
+    // 写入数据
+    IniFileWrite(testFile, "section0", "key0", "value0");
+    IniFileWrite(testFile, "section0", "key1", 1);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value0");
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", "valuee"), "1");
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", 0), 1);
+
+    // 读取未有的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", 1), 1);
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", 1), 1);
+
+    // 写入的二个section
+    IniFileWrite(testFile, "section1", "key0", "value10");
+    IniFileWrite(testFile, "section1", "key1", 11);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", "valuee"), "value10");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", "valuee"), "11");
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 11);
+
+    // 改写数据
+    IniFileWrite(testFile, "section0", "key0", "value00");
+    IniFileWrite(testFile, "section1", "key1", 111);
+
+    // 检查数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value00");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 111);
+
+    return 0;
+}
+
+#endif // 

+ 26 - 0
DevAdapter/gwi/Gpio.1.1/simple_ini_tool.h

@@ -0,0 +1,26 @@
+/**
+ * @file simple_ini_tool.h
+ * @brief 简单的ini文件读写工具,仅支持多字节和一次读写,并不考虑性能
+ */
+#ifndef SIMPLE_INI_TOOL_H
+#define SIMPLE_INI_TOOL_H
+
+#include <string>
+#include <list>
+
+std::string IniFileRead(const std::string& filename, const std::string& section, const std::string& key, const std::string& defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, const std::string& key, int defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, const std::string& value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, int value);
+
+#endif /* SIMPLE_INI_TOOL_H */
+

+ 27 - 0
DevAdapter/gwi/HSPScanner.1.1/CMakeLists.txt

@@ -0,0 +1,27 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("HSPScanner")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "gwi")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        HSPScannerSP.cpp 
+        HSPScannerGWI.cpp 
+        HSPScannerDriverGWI.cpp 
+        simple_ini_tool.cpp
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+# ${MODULE_FULL_NAME} 是 TAGET 名称,在 rvc_dev_config_library 中定义
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}")
+
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 27 - 0
DevAdapter/gwi/HSPScanner.1.1/ErrorDefine.h

@@ -0,0 +1,27 @@
+#ifndef ERROR_DEFINE_H
+#define ERROR_DEFINE_H
+
+#include "ErrorCode.h"
+#include "DevErrorCode.h"
+#include "Xfscam320.h"
+
+typedef struct _DevErrcode
+{
+	long lErr;
+	char szErrDes[1024];
+	long lDevErr;
+	long lReturn;
+}DevErrCode;
+
+DevErrCode m_DevErrArray[] =
+{
+    0,"成功",DEC_SUCCESS,Error_Succeed,
+    WFS_ERR_TIMEOUT, "Excute Time Out", DEC_TIMEOUT, Error_TimeOut,
+    WFS_ERR_HARDWARE_ERROR, "Hardware Error", DEC_HARDWARE, Error_Hardware,
+    WFS_ERR_INTERNAL_ERROR, "Internal Error", DEC_NO_E_HSPSCANNER + 1, Error_Process,
+    WFS_ERR_CANCELED, "User Canceled", DEC_NO_E_HSPSCANNER + 2, Error_Cancel,
+    WFS_ERR_INVALID_DATA, "Invalid Data", DEC_NO_E_HSPSCANNER + 3, Error_Param,
+    WFS_ERR_CAM_CAMNOTSUPP, "Invalid Data", DEC_NO_E_HSPSCANNER + 3, Error_Param,
+};
+
+#endif

+ 519 - 0
DevAdapter/gwi/HSPScanner.1.1/HSPScannerDriverGWI.cpp

@@ -0,0 +1,519 @@
+#include "HSPScannerDriverGWI.h"
+#include "HSPScannerSP.h"
+#include "GwiLogFile.h"
+#include "ErrorDefine.h"
+
+CLogFile *m_plogFile = NULL;
+CHSPScannerSP *m_pHSPScannerSP = NULL;
+
+CHSPScanner::CHSPScanner()
+{
+	memset(&m_DevErrorInfo,0,sizeof(m_DevErrorInfo));
+
+	if(NULL == m_plogFile)
+	{
+		m_plogFile = new CLogFile(LAYER);
+		m_plogFile->init();
+
+		LogARG(m_plogFile, Log_Debug, "CHSPScanner", "Init HSPScanner LOG success!");
+	}
+
+	if(NULL == m_pHSPScannerSP)
+	{
+		m_pHSPScannerSP = new CHSPScannerSP(m_plogFile);
+	}
+
+	m_ScanSize = 0;
+	m_ViewType = 0;
+	m_ShowType = 0;
+	m_ColorModel = 0;
+	m_RotateModel = 0;
+	m_xPix = 0;
+	m_yPix = 0;
+	m_width = 200;
+	m_high = 200;
+	m_waitTime0 = 0;
+	m_saveConnected = 0;
+}
+
+CHSPScanner::~CHSPScanner()
+{
+	if(NULL != m_pHSPScannerSP)
+	{
+		delete m_pHSPScannerSP;
+		m_pHSPScannerSP = NULL;
+	}
+}
+
+ErrorCodeEnum CHSPScanner::DevOpen()
+{
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "Enter");
+	long lResult = 0;
+
+	lResult = m_pHSPScannerSP->HSPScannerSPOpen();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "DevOpen", "open failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "Exitl,Result[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::SetParam(ParamType type, ParamTypeValue value)
+{
+	LogARG(m_plogFile, Log_Infor, "SetParam", "Enter, type[%d], value[%d]", type, value);
+	long lResult = 0;
+
+	switch(type)
+	{
+	case HSPS_MODEL_SCANSIZE:
+		switch (value)
+		{
+		case HSPS_SCAN_FULL:
+			m_ScanSize = 0;
+			break;
+		case HSPS_SCAN_A4:
+			m_ScanSize = 1;
+			break;
+		case HSPS_SCAN_IDCARD:
+			m_ScanSize = 6;;
+			break;
+		default:
+			m_ScanSize = 0;
+			break;
+		}
+
+		if(m_ViewType == 1 && m_ShowType ==1 )
+ 		{		
+			lResult = m_pHSPScannerSP->HSStartDisplay(0, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+			LogARG(m_plogFile, Log_Debug, "SetParam", "HSStartDisplay, lResult[%d]",lResult);
+ 			if(lResult != 0)
+			{
+				LogARG(m_plogFile, Log_Error, "SetParam", "Exitl,lResult[%d]",lResult);
+				return ErrParse(lResult); 
+ 			}
+ 		}
+		break;
+	case HSPS_MODEL_COLOR:/**设置色彩*/
+		switch (value)
+		{
+		case HSPS_COLOR_FULL:
+			m_ColorModel = 0;
+			break;
+		case HSPS_COLOR_GREY:
+			m_ColorModel = 1;
+			break;
+		default:
+			m_ColorModel = 0;
+			break;
+		}
+
+		if(m_ViewType == 1 && m_ShowType ==1 )
+		{		
+			lResult = m_pHSPScannerSP->HSStartDisplay(0, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+			LogARG(m_plogFile, Log_Debug, "SetParam", "HSStartDisplay, lResult[%d]",lResult);
+			if(lResult != 0)
+			{
+				LogARG(m_plogFile, Log_Error, "SetParam", "Exitl,lResult[%d]",lResult);
+				return ErrParse(lResult); 
+			}
+		}
+		break;
+	case HSPS_MODEL_ROTATE:/**设置拍摄角度,不带持续旋转的意义*/
+		switch (value)
+		{
+		case HSPS_ROTATE_NOANGLE:// 物理环境的上方为预览窗口的上方 Positive direction.
+			m_RotateModel = 0;
+			break;
+		case HSPS_ROTATE_LEFT:	// 物理环境的左侧为预览窗口的上方
+			m_RotateModel = 1;
+			break;
+		case HSPS_ROTATE_MIRROR:// 物理环境的下方为预览窗口的上方 Opposite/Nagative direction.
+			m_RotateModel = 2;
+			break;
+		case HSPS_ROTATE_RIGHT:	// 物理环境的右侧为预览窗口的上方
+			m_RotateModel = 3;
+			break;
+		default:
+			m_RotateModel = 0;
+			break;
+		}
+
+		if(m_ViewType == 1 && m_ShowType ==1 )
+		{		
+			lResult = m_pHSPScannerSP->HSStartDisplay(0, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+			LogARG(m_plogFile, Log_Debug, "SetParam", "HSStartDisplay, lResult[%d]",lResult);
+			if(lResult != 0)
+			{
+				LogARG(m_plogFile, Log_Error, "SetParam", "Exitl,lResult[%d]",lResult);
+				return ErrParse(lResult); 
+			}
+		}
+		break;
+	case HSPS_MODEL_VIEW:
+		switch (value)
+		{
+		case HSPS_VIEW_HIDE:	
+
+			if(m_ViewType == 1  &&  m_ShowType == 1)			//已经打开
+			{		
+				lResult = m_pHSPScannerSP->HSStartDisplay(1, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+				LogARG(m_plogFile, Log_Debug, "SetParam", "HSStartDisplay, lResult[%d]",lResult);
+				if(lResult != 0)
+				{
+					LogARG(m_plogFile, Log_Error, "SetParam", "Exitl,lResult[%d]",lResult);
+					return ErrParse(lResult); 
+				}
+				m_ViewType = 0;
+			}
+			break;
+		case HSPS_VIEW_SHOW:			// 显示预览窗口
+ 			if(m_ViewType == 1 && m_ShowType == 1)
+			{
+				lResult = WFS_SUCCESS;
+				LogARG(m_plogFile, Log_Warning, "SetParam", "Exitl, Is already Show,lResult[%d]",lResult);
+ 			}
+ 			else 
+			{
+				lResult = m_pHSPScannerSP->HSStartDisplay(0, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+				LogARG(m_plogFile, Log_Debug, "SetParam", "HSStartDisplay, lResult[%d]",lResult);
+				if(lResult != 0)
+				{
+					LogARG(m_plogFile, Log_Error, "SetParam", "Exitl,lResult[%d]",lResult);
+					return ErrParse(lResult); 
+				}
+
+				m_ViewType = 1;
+				m_ShowType = 1;
+ 			}
+			break;
+		default:
+			break;
+		}
+		break;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "SetParam", "Exitl,Result[%d], m_ScanSize[%d], m_ColorModel[%d], m_RotateModel[%d], m_ViewType[%d], m_ShowType[%d]",
+	lResult, m_ScanSize, m_ColorModel, m_RotateModel, m_ViewType, m_ShowType);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::SetPreview(short nValue)
+{
+	LogARG(m_plogFile, Log_Infor, "SetPreview", "Enter, nValue[%d]", nValue);
+	long lResult = 0;
+
+	if (nValue == 1)	//< 开始预览
+	{
+		lResult = m_pHSPScannerSP->HSStartDisplay(0, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+		if (lResult == WFS_SUCCESS)
+		{
+			m_ViewType = 1;
+			m_ShowType = 1;
+		}
+	}
+	else //< 停止预览
+	{
+		lResult = m_pHSPScannerSP->HSStartDisplay(1, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+		if (lResult == WFS_SUCCESS)
+		{
+			m_ViewType = 0;
+			m_ShowType = 0;
+		}
+	}
+
+	if (lResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error, "SetPreview", "Exitl,Result[%d]",lResult);
+	}
+	else 
+	{
+		LogARG(m_plogFile, Log_Infor, "SetPreview", "Exitl,Result[%d]",lResult);
+	}
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::ScanImage(const char* pszFileName)
+{
+	LogARG(m_plogFile, Log_Infor, "ScanImage", "Enter");
+	long lResult = 0;
+
+	if (pszFileName == NULL || strlen(pszFileName) == 0)
+	{
+		LogARG(m_plogFile, Log_Debug, "ScanImage", "pszFileName is Invalid");
+		return Error_Param;
+	}
+
+	LogARG(m_plogFile, Log_Debug, "ScanImage", "pszFileName[%s]", pszFileName);
+
+	lResult = m_pHSPScannerSP->HSTakePicture(pszFileName, m_ScanSize);
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "ScanImage", "SetParam failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(m_plogFile, Log_Infor, "ScanImage", "Exitl,Result[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum  CHSPScanner::ScanImageEx(BYTE* pBtImg,  int& nBtLen, const char* pszFileName)
+{
+	LogARG(m_plogFile, Log_Infor, "ScanImageEx", "Enter");
+	long lResult = 0;
+
+	if (pszFileName == NULL || pBtImg == NULL)
+	{
+		lResult = WFS_ERR_INVALID_DATA;
+		LogARG(m_plogFile, Log_Debug, "ScanImageEx", "pszFileName or pBtImg is Invalid");
+		return ErrParse(lResult);
+	}
+
+	LogARG(m_plogFile, Log_Debug, "ScanImageEx", "pBtImage[%s], nBtLen[%d], pszFileName[%s]", pBtImg, nBtLen, pszFileName);
+
+	lResult = m_pHSPScannerSP->HSTakePicture(pszFileName, m_ScanSize);
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "ScanImageEx", "SetParam failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	FILE * pFile = fopen (pszFileName, "rb" ); 
+	if (pFile == NULL)  
+	{  
+		lResult = WFS_ERR_INTERNAL_ERROR;
+		LogARG(m_plogFile, Log_Error, "ScanImageEx", "SetParam failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	} 
+
+	/* 获取文件大小 */  
+	fseek (pFile , 0 , SEEK_END);  
+	long lSize = ftell (pFile);  
+
+	LogARG(m_plogFile, Log_Debug, "ScanImageEx", "lSize[%d]",lSize);
+	if(nBtLen < lSize)
+	{
+		fclose (pFile);
+		nBtLen = lSize;
+
+		LogARG(m_plogFile, Log_Error, "ScanImageEx", "out nBtLen[%d]",nBtLen);
+
+		memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+		strcpy(m_DevErrorInfo.szErrMsg,"buffer too small!");
+		m_DevErrorInfo.dwErrMsgLen =strlen(m_DevErrorInfo.szErrMsg);
+
+		return Error_TooSmallBuffer;
+	}
+
+	fseek (pFile , 0 , SEEK_SET);   
+	long readLen=0;
+	while(1)
+	{
+		int result = fread (&pBtImg[readLen],1,1024,pFile);  
+		readLen += result;
+		if (result < 1024)break;//结束
+	}
+
+	fclose (pFile);
+	nBtLen = readLen;
+	LogARG(m_plogFile, Log_Infor, "ScanImageEx", "Exitl, nBtLen[%d], lResult[%d]", nBtLen, lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::SetViewPos(int nX, int nY, int nWidth)
+{
+	LogARG(m_plogFile, Log_Infor, "SetViewPos", "Enter, nX[%d], nY[%d], nWidth[%d]", nX, nY, nWidth);
+	long lResult = 0;	
+	
+	m_xPix = nX;
+	m_yPix = nY;
+	m_width = nWidth;
+	m_high = (nWidth * 9) / 16;
+
+	if(m_ViewType == 1 && m_ShowType == 1)
+	{		
+		lResult = m_pHSPScannerSP->HSStartDisplay(0, m_width, m_high, m_xPix, m_yPix, m_RotateModel, m_ColorModel, 0, m_ScanSize);
+		LogARG(m_plogFile, Log_Debug, "SetViewPos", "HSStartDisplay, lResult[%d]",lResult);
+		if(lResult != 0)
+		{
+			LogARG(m_plogFile, Log_Error, "SetViewPos", "Exitl,lResult[%d]",lResult);
+			return ErrParse(lResult); 
+		}
+	}
+
+	LogARG(m_plogFile, Log_Infor, "SetViewPos", "Exitl,Result[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::SetProperty()
+{
+	LogARG(m_plogFile, Log_Infor, "SetProperty", "Enter");
+	long lResult = 0;
+
+	LogARG(m_plogFile, Log_Infor, "SetProperty", "Exitl,Result[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::GetDevStatus(HspsDevStatus& status)
+{
+	LogARG(m_plogFile, Log_Infor, "GetDevStatus", "Enter");
+	long lResult = 0;
+	if (!m_pHSPScannerSP->IsScannerOpen())
+	{
+		status.isConnected = 0;
+		status.inPreview = 0;
+		status.inShow = 0;
+	}
+	else 
+	{
+		struct timespec ts;  
+		clock_gettime(CLOCK_MONOTONIC, &ts);
+		long lCurtime = (ts.tv_sec * 1000 + ts.tv_nsec / 1000000); 
+
+		if( (lCurtime - m_waitTime0) > 2000)
+		{
+			m_waitTime0 = lCurtime;
+
+			char szVersionBuf[256] = {0};
+			int nStatus = 0;
+			long lResult = m_pHSPScannerSP->HSGetStatus(nStatus, szVersionBuf);
+
+			if(lResult ==0)
+			{
+				if (nStatus == WFS_CAM_DEVONLINE || nStatus == WFS_CAM_DEVBUSY)
+				{
+					status.isConnected = 1;
+				}
+				else
+				{
+					status.isConnected = 0;
+				}
+			}
+			else //取状态失败
+			{
+				m_saveConnected = 0;
+			}
+
+			m_saveConnected = status.isConnected;
+		}
+		else//间隔小于2秒,取上次的状态
+		{
+			status.isConnected = m_saveConnected;
+		}
+		if(0==status.isConnected )
+		{
+			status.inPreview = 0;
+			status.inShow = 0;
+		}
+		else 
+		{
+			status.inPreview = m_ViewType;
+			status.inShow = m_ShowType;
+		}
+	}
+
+	LogARG(m_plogFile, Log_Infor, "GetDevStatus", "Exit, lResult[%d], status.isConnected[%d], status.inPreview[%d], status.inShow[%d]", lResult, status.isConnected, status.inPreview, status.inShow);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LogARG(m_plogFile, Log_Infor, "GetDevCategory", "Enter");
+
+	long lResult = 0;
+	char szVersionBuf[256] = {0};
+	int nStatus = 0;
+	lResult = m_pHSPScannerSP->HSGetStatus(nStatus, szVersionBuf);
+
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevCategory", "GetVersion failed,nResult[%d]",lResult);
+		devCategory.eState = DEVICE_STATUS_FAULT;
+	}
+	else
+	{
+		devCategory.eState = DEVICE_STATUS_NORMAL;
+	}
+
+	sprintf(devCategory.szModel,"Camera");    
+	sprintf(devCategory.szType,"USB Camera");
+	sprintf(devCategory.szVendor,"00");
+
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 1;
+	devCategory.version.wBuild = 1;
+
+	LogARG(m_plogFile, Log_Infor, "GetDevCategory", "Exit, lResult[%d]",lResult);
+	return ErrParse(lResult);
+}
+
+ErrorCodeEnum CHSPScanner::Reset()
+{
+	LogARG(m_plogFile, Log_Infor, "Reset", "Enter...");
+	long lResult = 0;
+
+	lResult = m_pHSPScannerSP->Reset();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset", "Reset failed,nResult[%d]",lResult);
+		return ErrParse(lResult); 
+	}
+
+	LogARG(m_plogFile, Log_Infor, "Reset", "Exit,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::DevClose()
+{
+	LogARG(m_plogFile, Log_Infor, "DevClose", "Enter...");
+	long lResult = 0;
+
+	lResult = m_pHSPScannerSP->HSPScannerSPClose();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "DevClose", "Close failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(m_plogFile, Log_Infor, "DevClose", "Exitl,Result[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CHSPScanner::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	LogARG(m_plogFile, Log_Infor, "GetLastErr", "Enter...");
+
+	memset(&devErrInfo,0,sizeof(DevErrorInfo));
+	memcpy(&devErrInfo,&m_DevErrorInfo,sizeof(DevErrorInfo));
+
+	LogARG(m_plogFile, Log_Infor, "GetLastErr", "Exit...");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CHSPScanner::ErrParse(long lResult)
+{
+	bool bFind = false;
+	for(int n = 0; n < sizeof(m_DevErrArray)/sizeof(DevErrCode); n++)
+	{
+		if(lResult == m_DevErrArray[n].lErr)
+		{
+			bFind = true;
+			ErrorCodeEnum ErrTmp = (ErrorCodeEnum)m_DevErrArray[n].lReturn;
+			memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+			strcpy(m_DevErrorInfo.szErrMsg,m_DevErrArray[n].szErrDes);
+			m_DevErrorInfo.dwErrMsgLen = (m_DevErrArray[n].lDevErr << 16) +strlen(m_DevErrArray[n].szErrDes);
+			return ErrTmp;
+		}
+	}
+	if(!bFind)
+	{
+		memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+		strcpy(m_DevErrorInfo.szErrMsg,"未定义错误!");
+		m_DevErrorInfo.dwErrMsgLen =strlen(m_DevErrorInfo.szErrMsg);
+		return Error_Hardware;
+	}
+	return Error_Succeed;
+}

+ 119 - 0
DevAdapter/gwi/HSPScanner.1.1/HSPScannerDriverGWI.h

@@ -0,0 +1,119 @@
+#ifndef LIBFRAMEWORK_HPSCANNER_H
+#define LIBFRAMEWORK_HPSCANNER_H
+
+#include "HSPScannerClass.h"
+
+class CHSPScanner : public CHSPSClass
+{
+public:
+	CHSPScanner(void);
+	~CHSPScanner(void);
+
+	//
+	//	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);
+
+	//	
+	//	Get category infomation about device.
+	//
+	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);
+
+private:
+	ErrorCodeEnum ErrParse(long lResult);
+
+	DevErrorInfo m_DevErrorInfo;
+
+	int m_ScanSize;		/**设置扫描图片尺寸*/
+	int m_ViewType;		/**窗口预览状态:1 表示处于预览状态,0 表示预览关闭状态*/
+	int m_ShowType;	/**窗口显示状态:1 表示窗口处于显示状态,0表示窗口处于隐藏状态*/
+	int m_ColorModel;	/**设置色彩*/
+	int m_RotateModel;	/**设置拍摄角度,不带持续旋转的意义*/
+	int m_xPix;
+	int m_yPix;
+	int m_width;
+	int m_high;
+	long m_waitTime0;
+	int m_saveConnected;
+};
+
+
+#endif //LIBFRAMEWORK_CARDSWIPER_IMPL_H

+ 66 - 0
DevAdapter/gwi/HSPScanner.1.1/HSPScannerGWI.cpp

@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include "HSPScannerDriverGWI.h"
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pOutDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+#endif
+{
+    pOutDevAptObj = new CHSPScanner();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+    return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pInDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+#endif
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(CHSPScanner* pTmp = dynamic_cast<CHSPScanner*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+}
+
+#ifdef _WINDOWS
+
+char g_myDllPath[MAX_PATH]={0};
+char g_myDllName[MAX_PATH]={0};			//我的名字
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	    case DLL_PROCESS_ATTACH:
+		{
+			GetModuleFileName(hModule,g_myDllPath,MAX_PATH);	//取当前模块全路径(动态库,并非执行文件)
+			strcpy(g_myDllName,strrchr(g_myDllPath,'\\')+1);
+			strcpy(strrchr(g_myDllPath,'\\'),"\\");
+			char *p=strchr(g_myDllName,'.');
+			if(p!=NULL)
+				*p=0;
+		}break;
+	    case DLL_THREAD_ATTACH:
+	    case DLL_THREAD_DETACH:
+	    case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
+#endif

+ 343 - 0
DevAdapter/gwi/HSPScanner.1.1/HSPScannerSP.cpp

@@ -0,0 +1,343 @@
+#include "HSPScannerSP.h"
+#include "Xfscam320.h"
+#include "simple_ini_tool.h"
+#include "pcquicklib.h"
+
+#define CONF_FILE_NAME			"DevAdapter.ini"
+#define DEFAULT_TIMEOUT         5000
+#define RECV_TIMEOUT		    12000
+
+#ifdef _WINDOWS
+extern char g_myDllPath[MAX_PATH];
+#define OCXBASEDLL_DEFAULE_PATH		"C:\\KIOSK\\GwiXfs\\ocxbase.dll"   //默认路径,可通过配置文件配置
+#else
+#include <dlfcn.h>
+#define OCXBASEDLL_DEFAULE_PATH		"/usr/KIOSK/Pisa/libPISAOcxBase.so"     //默认路径,可通过配置文件配置
+#endif
+
+void GetDllLoadPath(char *pOutDllPath)
+{
+	if(NULL == pOutDllPath)
+		return;
+
+#ifdef  _WINDOWS
+	strcpy(pOutDllPath,g_myDllPath);
+#else
+	Dl_info dl_info;	//dladdr获取某个地址的符号信息
+	int rc = dladdr((void*)GetDllLoadPath, &dl_info);  
+	strcpy(pOutDllPath,dl_info.dli_fname);
+	char *pName = strrchr(pOutDllPath, '/');
+	*pName = '\0'; 
+#endif
+}
+
+CHSPScannerSP::CHSPScannerSP(CLogFile *plogFile): m_plogFile(plogFile)
+{
+	m_pHSPScannerOcxBase = NULL;
+	m_bHSPScannerOpen = false;
+
+	memset(m_HSPScannerLogicName,0,sizeof(m_HSPScannerLogicName));
+	memset(m_OCXDllPath,0,sizeof(m_OCXDllPath));
+	ReadConf();
+}
+
+CHSPScannerSP::~CHSPScannerSP(void)
+{
+	if(m_bHSPScannerOpen)
+		HSPScannerSPClose();
+
+	if(NULL != m_pHSPScannerOcxBase)
+	{
+		delete m_pHSPScannerOcxBase;
+		m_pHSPScannerOcxBase = NULL;
+	}
+}
+
+HRESULT CHSPScannerSP::EventCallBack(long EventType,void* lpResults)
+{
+
+	return WFS_SUCCESS;
+}
+
+long CHSPScannerSP::HSPScannerSPOpen(void)
+{
+	LogARG(m_plogFile, Log_Infor, "HSPScannerSPOpen","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+
+	if(m_bHSPScannerOpen)
+		return WFS_SUCCESS;
+
+	if(!LoadDll())
+	{
+		LogARG(m_plogFile, Log_Error, "HSPScannerSPOpen","Load ocxbase Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	if(!InitSP())
+	{
+		LogARG(m_plogFile, Log_Error, "HSPScannerSPOpen","Init SP Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+
+	if(NULL != m_pHSPScannerOcxBase)
+	{
+		lhResult = m_pHSPScannerOcxBase->WFSOpen();
+		LogARG(m_plogFile, Log_Debug, "HSPScannerSPOpen","WFSOpen = %d",lhResult);
+		if(WFS_SUCCESS == lhResult)
+		{
+			lhResult = m_pHSPScannerOcxBase->WFSRegister();
+		}
+	}
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "HSPScannerSPOpen","Init HSPScanner Failed!");
+		return lhResult;
+	}
+
+	m_bHSPScannerOpen = true;
+
+	LogARG(m_plogFile, Log_Infor, "HSPScannerSPOpen","Exit, Open Success!");
+	return lhResult;
+}
+
+long CHSPScannerSP::HSPScannerSPClose(void)
+{
+	LogARG(m_plogFile, Log_Infor, "HSPScannerSPClose","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(m_bHSPScannerOpen && NULL != m_pHSPScannerOcxBase)
+	{
+		m_pHSPScannerOcxBase->WFSClose();
+		m_bHSPScannerOpen = false;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "HSPScannerSPClose","Exit, Close Success!");
+	return lhResult;
+}
+
+long CHSPScannerSP::Reset()
+{
+	LogARG(m_plogFile, Log_Infor, "Reset","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bHSPScannerOpen && NULL == m_pHSPScannerOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pHSPScannerOcxBase->WFSExecute(WFS_CMD_CAM_RESET,NULL,DEFAULT_TIMEOUT,&lpwfsResult);
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset","Reset Failed,lhResult = <%d>",lhResult);
+	}
+
+	m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "Reset","Exit, Reset Success!");
+	return lhResult;
+}
+
+long CHSPScannerSP::HSGetStatus(int& nStatus, char *pszVersion)
+{
+	LogARG(m_plogFile, Log_Infor, "HSGetStatus","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bHSPScannerOpen && NULL == m_pHSPScannerOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "HSGetStatus","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT		lpwfsResult		= NULL;
+	LPWFSCAMSTATUS	lpWfsCamStatus	= NULL;
+
+	lhResult = m_pHSPScannerOcxBase->WFSGetInfo(WFS_INF_CAM_STATUS, NULL, DEFAULT_TIMEOUT, &lpwfsResult); 
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"HSGetStatus","WFS_INF_CAM_STATUS Failed hResult = %d", lhResult);
+		m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+		return lhResult;
+	}
+
+	lhResult = lpwfsResult->hResult;
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"HSGetStatus","WFS_INF_CAM_STATUS Failed hResult = %d", lhResult);
+		m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+		return lhResult;
+	}
+
+	lpWfsCamStatus = (LPWFSCAMSTATUS)lpwfsResult->lpBuffer;
+	if(lpWfsCamStatus == NULL )
+	{
+		LogARG(m_plogFile, Log_Error,"HSGetStatus","WFS_INF_CAM_STATUS lpWfsCamStatus = NULL");
+		m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+		return WFS_ERR_INVALID_POINTER;
+	}
+
+	nStatus = lpWfsCamStatus->fwDevice;
+
+	m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "Reset","Exit, HSGetStatus Success!");
+
+	return lhResult;
+}
+
+long CHSPScannerSP::HSStartDisplay(int nAction, int nWidth, int nHeight, int nX, int nY, int nRotateAngle, int nColorType, int nCropType, int nCropSize)
+{
+	LogARG(m_plogFile, Log_Infor, "HSStartDisplay","Enter!");
+
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bHSPScannerOpen && NULL == m_pHSPScannerOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "HSStartDisplay","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	WFSCAMDISPB  lpDisplayB;
+	char lpszFrontImageFile[1024];
+	lpDisplayB.wCamera = WFS_CAM_EXTRA;
+	lpDisplayB.wAction = nAction;
+	lpDisplayB.wWidth = nWidth;
+	lpDisplayB.wHeight = nHeight;
+	lpDisplayB.wX =  nX;
+	lpDisplayB.wY = nY;
+	lpDisplayB.wHpixel = 1920;
+	lpDisplayB.wVpixel = 1080;
+	lpDisplayB.wRotateAngle =  nRotateAngle;
+	lpDisplayB.wColorType = nColorType;
+	lpDisplayB.wCropType = nCropType;
+	lpDisplayB.wCropSize = nCropSize;
+	lpDisplayB.lpszTexData = NULL;
+	lpDisplayB.wReserved1 = 0;
+	lpDisplayB.wReserved2 = 0;
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pHSPScannerOcxBase->WFSExecute(WFS_CMD_CAM_DISPLAY_B,&lpDisplayB,30000,&lpwfsResult);
+
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"HSStartDisplay","StartDisplay WFSExecute failed hResult = <%d>", lhResult);
+	    return lhResult;
+	}
+
+	m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "HSStartDisplay","Exit, lhResult= <%d>", lhResult);
+	return lhResult;
+}
+
+long CHSPScannerSP::HSTakePicture(const char* pPicPath, int nScanSize)
+{
+	LogARG(m_plogFile, Log_Infor, "HSTakePicture","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bHSPScannerOpen && NULL == m_pHSPScannerOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "HSTakePicture","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	WFSCAMTAKEPICTA  liTakePicA;
+	char lpszPictureFile[2048];
+	liTakePicA.wCamera = WFS_CAM_EXTRA;
+	liTakePicA.lpszCamData = NULL;
+	liTakePicA.lpszUNICODECamData = NULL;
+	liTakePicA.lpszPictureFile = lpszPictureFile;
+	liTakePicA.wScanSize = nScanSize;
+	strcpy(liTakePicA.lpszPictureFile, pPicPath);
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pHSPScannerOcxBase->WFSExecute(WFS_CMD_CAM_TAKE_PICTURE_A,&liTakePicA, 30000, &lpwfsResult);
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"HSTakePicture","HSTakePicture WFSExecute failed hResult = <%d>", lhResult);
+		return lhResult;
+	}
+
+	m_pHSPScannerOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Debug,"HSTakePicture","Exit, lhResult= <%d>", lhResult);
+	return lhResult;
+}
+
+bool CHSPScannerSP::IsScannerOpen()
+{
+	return m_bHSPScannerOpen;
+}
+
+void CHSPScannerSP::ReadConf(void)
+{
+	char szConfPath[260] = {0};
+	char szDllPath[260] = {0};
+	char ocxBasePath[260] = {0};
+	GetDllLoadPath(szDllPath);
+	sprintf(szConfPath, "%s/%s", szDllPath, CONF_FILE_NAME);
+	sprintf(ocxBasePath, "%s/gwi/libgwiPISAOcxBase.so",szDllPath);
+	//读取逻辑名
+	strcpy(m_HSPScannerLogicName,IniFileRead(szConfPath,"SP","HIGH_LOGICAL_SERVICES","HighCamera").c_str());
+	strcpy(m_OCXDllPath,IniFileRead(szConfPath,"SP","OCXBASE_PATH",ocxBasePath).c_str());
+
+	LogARG(m_plogFile, Log_Debug,"ReadConf","readConfINI m_HSPScannerLogicName = <%s>, m_OCXDllPath = <%s>!",m_HSPScannerLogicName,m_OCXDllPath);
+}
+
+bool CHSPScannerSP::LoadDll(void)
+{
+#ifdef _WINDOWS
+    m_hOCXHandle = LoadLibrary(m_OCXDllPath);
+    if(!m_hOCXHandle)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load <%s> Failed!",m_OCXDllPath);
+		return false; 
+    }
+
+    m_pCallCreateInstance = (CreateInstanceEx)GetProcAddress(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)GetProcAddress(m_hOCXHandle,"FreeInstance");
+#else
+    m_hOCXHandle = dlopen(m_OCXDllPath, RTLD_NOW);
+    if(!m_hOCXHandle)
+    {
+        const char* error = dlerror();
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load <%s> Failed,error msg = <%s>!",m_OCXDllPath,error);
+		return false; 
+    }
+
+    LogARG(m_plogFile, Log_Debug, "LoadDll","Load <%s> Successed!",m_OCXDllPath);
+    m_pCallCreateInstance = (CreateInstance)dlsym(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)dlsym(m_hOCXHandle,"FreeInstance");
+#endif
+
+    if(NULL == m_pCallCreateInstance || NULL == m_pCallFreeInstance)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load OCXBASE CreateInstance or FreeInstance Failed!");
+        return false;
+    }
+
+    return true;
+}
+
+
+bool CHSPScannerSP::InitSP(void)
+{
+	//初始化SP
+	CEventCallBack* pEvent = (CEventCallBack*)this;
+	if(NULL == m_pHSPScannerOcxBase)
+	{
+		m_pHSPScannerOcxBase = (OcxBase *)m_pCallCreateInstance((LPVOID)"CAM",m_HSPScannerLogicName,NULL,pEvent);
+
+		if(NULL == m_pHSPScannerOcxBase)
+		{
+			LogARG(m_plogFile, Log_Error, "InitSP","new Finger CDeviceOcxBase failed!");
+			return false;
+		}
+		LogARG(m_plogFile, Log_Debug, "InitSP","new Finger CDeviceOcxBase sussces!");
+	}
+
+	return true;
+}

+ 66 - 0
DevAdapter/gwi/HSPScanner.1.1/HSPScannerSP.h

@@ -0,0 +1,66 @@
+#ifndef HSPSCANNER_SP_H
+#define HSPSCANNER_SP_H
+
+#include "OcxBase.h"
+#include "GwiLogFile.h"
+
+#define RET_SUCCESS     0
+#define LAYER ("HSPScanner")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+
+struct WFSAsyncExecuteInfo 
+{
+    long lhResult;
+    unsigned long ulReqID;
+    unsigned char Info[2048];
+	int m_infolen;
+};
+
+#ifndef _WINDOWS
+#define WINAPI
+#endif
+
+typedef LPVOID (WINAPI *CreateInstance)(LPVOID attatchparam,LPVOID reServed,LPVOID tools,LPVOID spInter);
+typedef void (WINAPI* FreeInstance)(LPVOID p);
+
+class CLogFile;
+class CHSPScannerSP : public CEventCallBack
+{
+public:
+	CHSPScannerSP(CLogFile *plogFile);
+	~CHSPScannerSP(void);
+
+	virtual long EventCallBack(long EventType,void* lpResult);
+
+	long HSPScannerSPOpen(void); 
+	long HSPScannerSPClose(void);
+	long Reset(void);
+	long HSGetStatus(int& nStatus, char *pszVersion);
+	long HSStartDisplay(int nAction, int nWidth, int nHeight, int nX, int nY, int nRotateAngle, int nColorType, int nCropType, int nCropSize);
+	long HSTakePicture(const char* pPicPath, int nScanSize);
+	bool IsScannerOpen();
+
+private:
+	void ReadConf(void);
+	bool LoadDll(void);
+	bool InitSP(void);
+
+	OcxBase *m_pHSPScannerOcxBase;        /// 设备对象指针
+	char     m_HSPScannerLogicName[260];
+	bool     m_bHSPScannerOpen;
+	char     m_OCXDllPath[260];
+	CLogFile *m_plogFile;
+	unsigned long m_ulReqID;
+
+    CreateInstance m_pCallCreateInstance;
+    FreeInstance m_pCallFreeInstance;
+#ifdef _WINDOWS
+	  HMODULE m_hOCXHandle; 
+#else
+	  void* m_hOCXHandle;
+#endif
+
+};
+
+#endif

+ 295 - 0
DevAdapter/gwi/HSPScanner.1.1/simple_ini_tool.cpp

@@ -0,0 +1,295 @@
+#include "simple_ini_tool.h"
+
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+
+#include <list>
+#include <string>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+static inline bool IsSpace(char c)
+{
+    return isspace(c) != 0 ; // !=0 消除VS的C4800警告
+}
+
+/** 将int转换成字符串,替代itoa函数,android中没有该函数 */
+static char* IntToStr(int v, char* str)
+{
+    sprintf(str, "%d", v);
+    return str;
+}
+
+/** 将文件以行的形式加载到内存中 */
+static list<string> LoadLines(const string& filename)
+{
+    list<string> lines;
+    FILE* file = fopen(filename.c_str(), "rt");
+    if (file != NULL)
+    {
+        char line[1024];
+        while(fgets(line, sizeof(line), file) != NULL)
+        {
+            lines.push_back(line);
+        }
+        fclose(file);
+    }
+    return lines;
+}
+
+/** 内存的数据写入文件 */
+static void SaveLines(const string& filename, const list<string>& lines)
+{
+#ifndef _WINDOWS
+	printf("SaveLines =%s\n",filename.c_str());
+#endif
+    FILE* file = fopen(filename.c_str(), "wt");
+    if (file != NULL)
+    {
+        for (list<string>::const_iterator iter = lines.begin();
+             iter != lines.end(); ++iter)
+        {
+            fputs(iter->c_str(), file);
+        }
+        fclose(file);
+    }
+}
+
+template<typename T, typename F>
+static void Strip(T rawb, T rawe, T& b, T& e, F isStrip)
+{
+    b = rawb;
+    e = rawe;
+
+    while (b != rawe)
+    {
+         if (!isStrip(*b))   break;
+         ++b;
+    }
+
+    while (b != e)
+    {
+        /* 进入该分支,则表明b为!isStrip,当--e后,要么跳出循环,要么不为b */
+        --e;
+        if (!isStrip(*e))
+        {
+            ++e;
+            break;
+        }
+    }
+}
+
+/** 判断是否是[xxx]结构 */
+static bool IsSection(const string& line, const string* section=NULL)
+{
+    string::const_iterator b = line.begin();
+    string::const_iterator e = line.end();
+
+    Strip(line.begin(), line.end(), b, e, IsSpace);
+
+    return e != b && *b == '[' && *(--e) == ']' && (section==NULL || string(++b, e) == *section);
+}
+
+class ListIter
+{
+public:
+    typedef list<string> List;
+    typedef list<string>::iterator Iter;
+};
+
+class ListCIter
+{
+public:
+    typedef const list<string> List;
+    typedef list<string>::const_iterator Iter;
+};
+
+template<typename T>
+static void FindSection(typename T::List& lines, const string& section, typename T::Iter& begin, typename T::Iter& end)
+{
+    for (begin = lines.begin(); begin != lines.end(); ++begin)
+    {
+        if (IsSection(*begin, &section)) break;
+    }
+
+    end = begin;
+    if (end != lines.end())
+    {
+        for (++end; end != lines.end(); ++end)
+        {
+            if (IsSection(*end))    break;
+        }
+    }
+}
+
+
+bool GetKeyValue(const string& line, string& key, string& value)
+{
+    string::size_type m = line.find("=");
+    if (m != string::npos)
+    {
+        string::const_iterator b = line.begin();
+        string::const_iterator s = line.begin()+m;
+        Strip(line.begin(), line.begin()+m, b, s, IsSpace);
+        key = string(b, s);
+
+        Strip(line.begin()+m+1, line.end(), b, s, IsSpace);
+        value = string(b, s);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+string IniFileRead(const string& filename, const string& section, const string& key, const string& defaultValue)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+        string k, v;
+        if (GetKeyValue(*iter, k, v) && key == k) return v;
+    }
+
+    return defaultValue;
+}
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value)
+{
+	int Count = 0;
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+		string k, v;
+        if (GetKeyValue(*iter, k, v))
+		{
+			Count++;
+			key.insert(key.end(), k);
+			value.insert(value.end(), v);
+		}
+    }
+
+    return Count;
+}
+
+
+#define MAKE_SECTION_LINE(s)        ("[" + (s) + "]\n")
+#define MAKE_KEY_VALUE_LINE(k,v)    ((k) + " = " + (v) + "\n")
+
+void IniFileWrite(const string& filename, const string& section, const string& key, const string& value)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::iterator begin;
+    list<string>::iterator end;
+
+    FindSection<ListIter>(lines, section, begin, end);
+
+    if (begin != end)
+    {
+        list<string>::iterator iter=begin;
+        for (; iter != end; ++iter)
+        {
+            string k, v;
+            if (GetKeyValue(*iter, k, v) && key == k) 
+            {
+                *iter = MAKE_KEY_VALUE_LINE(key, value);
+                break;
+            }
+        }
+
+        if (iter == end)
+        {
+            lines.insert(iter, MAKE_KEY_VALUE_LINE(key, value));
+        }
+    }
+    else
+    {
+        lines.push_back(MAKE_SECTION_LINE(section));
+        lines.push_back(MAKE_KEY_VALUE_LINE(key, value));
+    }
+
+    SaveLines(filename, lines);
+}
+
+
+int IniFileRead(const string& filename, const string& section, const string& key, int defaultValue)
+{
+    char str[48];
+    return atoi(IniFileRead(filename, section, key, IntToStr(defaultValue, str)).c_str());
+}
+
+void IniFileWrite(const string& filename, const string& section, const string& key, int value)
+{
+    char str[48];
+    IniFileWrite(filename, section, key, IntToStr(value, str));
+}
+
+
+#ifdef TEST_SIMPLE_INI_TOOL
+
+#define CheckEqaul(a, b) ((a)!=(b))?(printf("CheckFailed %s == %s\n", #a, #b)):0
+int main()
+{
+    const char* testFile = "test_simple_ini_tool.ini";
+
+    // 清空文件
+    fclose(fopen(testFile, "w"));
+
+    // 写入数据
+    IniFileWrite(testFile, "section0", "key0", "value0");
+    IniFileWrite(testFile, "section0", "key1", 1);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value0");
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", "valuee"), "1");
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", 0), 1);
+
+    // 读取未有的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", 1), 1);
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", 1), 1);
+
+    // 写入的二个section
+    IniFileWrite(testFile, "section1", "key0", "value10");
+    IniFileWrite(testFile, "section1", "key1", 11);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", "valuee"), "value10");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", "valuee"), "11");
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 11);
+
+    // 改写数据
+    IniFileWrite(testFile, "section0", "key0", "value00");
+    IniFileWrite(testFile, "section1", "key1", 111);
+
+    // 检查数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value00");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 111);
+
+    return 0;
+}
+
+#endif // 

+ 26 - 0
DevAdapter/gwi/HSPScanner.1.1/simple_ini_tool.h

@@ -0,0 +1,26 @@
+/**
+ * @file simple_ini_tool.h
+ * @brief 简单的ini文件读写工具,仅支持多字节和一次读写,并不考虑性能
+ */
+#ifndef SIMPLE_INI_TOOL_H
+#define SIMPLE_INI_TOOL_H
+
+#include <string>
+#include <list>
+
+std::string IniFileRead(const std::string& filename, const std::string& section, const std::string& key, const std::string& defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, const std::string& key, int defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, const std::string& value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, int value);
+
+#endif /* SIMPLE_INI_TOOL_H */
+

+ 27 - 0
DevAdapter/gwi/ThermalPrint1.1/CMakeLists.txt

@@ -0,0 +1,27 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("ThermalPrint")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "gwi")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        ThermalPrintSP.cpp 
+        ThermalPrintGWI.cpp 
+        ThermalPrintDriverGWI.cpp 
+        simple_ini_tool.cpp
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+# ${MODULE_FULL_NAME} 是 TAGET 名称,在 rvc_dev_config_library 中定义
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}")
+
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 26 - 0
DevAdapter/gwi/ThermalPrint1.1/ErrorDefine.h

@@ -0,0 +1,26 @@
+#ifndef ERROR_DEFINE_H
+#define ERROR_DEFINE_H
+
+#include "ErrorCode.h"
+#include "DevErrorCode.h"
+#include "Xfsptr.h"
+
+typedef struct _DevErrcode
+{
+	long lErr;
+	char szErrDes[1024];
+	long lDevErr;
+	long lReturn;
+}DevErrCode;
+
+DevErrCode m_DevErrArray[] =
+{
+    0,"成功",DEC_SUCCESS,Error_Succeed,
+    WFS_ERR_TIMEOUT,"指令执行超时",DEC_TIMEOUT,Error_TimeOut,
+    WFS_ERR_HARDWARE_ERROR,"硬件错误",DEC_HARDWARE,Error_Hardware,
+    WFS_ERR_INTERNAL_ERROR,"内部错误",DEC_NO_E_CARDISSUER+1,Error_Process,
+    WFS_ERR_CANCELED,"用户取消操作",DEC_NO_E_CARDISSUER+2,Error_Cancel,
+    WFS_ERR_INVALID_DATA,"无效的数据",DEC_NO_E_CARDISSUER+3,Error_Param,
+};
+
+#endif

+ 682 - 0
DevAdapter/gwi/ThermalPrint1.1/ThermalPrintDriverGWI.cpp

@@ -0,0 +1,682 @@
+#include "ThermalPrintDriverGWI.h"
+#include "ThermalPrintSP.h"
+#include "GwiLogFile.h"
+#include "ErrorDefine.h"
+
+char textBuff[4096]={0};
+static int textLen=0;
+static int lpszPathAllNum=0;
+static long waitTime0;
+int devColseFlag=false;
+
+static char gDllModuleHelper = 0;
+CLogFile *m_plogFile = NULL;
+CThermalPrintSP *m_pThermalPrintSP = NULL;
+
+
+CThermalPrint::CThermalPrint()
+{
+	memset(&m_DevErrorInfo,0,sizeof(m_DevErrorInfo));
+	ResetParam();
+	if(NULL == m_plogFile)
+	{
+		m_plogFile = new CLogFile(LAYER);
+		m_plogFile->init();
+
+		LogARG(m_plogFile, Log_Debug, "CThermalPrint", "Init ThermalPrint LOG success!");
+	}
+
+	if(NULL == m_pThermalPrintSP)
+	{
+		m_pThermalPrintSP = new CThermalPrintSP(m_plogFile);
+	}
+}
+
+CThermalPrint::~CThermalPrint()
+{
+	if(NULL != m_pThermalPrintSP)
+	{
+		delete m_pThermalPrintSP;
+		m_pThermalPrintSP = NULL;
+	}
+}
+
+void CThermalPrint::ResetParam(void)
+{
+	m_RowSpace=0;//行间距 单位mm
+	m_Align=0;//字符对齐模式 单位是"AlignStyle"的值
+	m_Reverse=0;//颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
+	m_LeftMargin=0;//左边距 单位mm
+	m_PrintArea=80;//可打印区域 单位mm
+
+	m_Font_UnderLine=0;//下划线 取值(0:否 1:是)
+	m_Font_Bold=0;//粗体 取值(0:否 1:是)
+	m_Font_Inverse=0;//反白 取值(0:否 1:是)
+	m_Font_DoubleHeight=0;//纵翻倍放大 取值(0:否 1:是)FONT_UNDERLINE = 0,//下划线 取值(0:否 1:是)
+	m_Font_DoubleWide=0;//横翻倍向放大 取值(0:否 1:是)
+	m_Font_SizeH=0;//字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
+	m_Font_SizeW=0;//字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
+	m_Font_Rotate=0;//字体旋转 取值(0,90,180,270)
+	m_Font_SpaceL=0;//字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
+	m_Font_SpaceR=0;//字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
+}
+
+ErrorCodeEnum CThermalPrint::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LogARG(m_plogFile, Log_Infor, "GetDevCategory", "Enter...");
+
+	long lResult = 0;
+	int nstatus = 0;
+	char DevFirmware[1024]={0};
+	memset(DevFirmware,0x00,sizeof(DevFirmware));
+	lResult = m_pThermalPrintSP->ThermalPrint_GetStatus(nstatus,DevFirmware);
+
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevCategory", "ThermalPrint_GetStatus failed,nResult = <%d>",lResult);
+		devCategory.eState = DEVICE_STATUS_FAULT;
+	}
+	else
+	{
+		devCategory.eState = DEVICE_STATUS_NORMAL;
+	}
+
+	sprintf(devCategory.szModel,"FWID=%s",DevFirmware);    
+	strcpy(devCategory.szType,"PVER=GWI#MID=JUST E6020-K");
+	strcpy(devCategory.szVendor,"GWI");
+
+	devCategory.version.wMajor = 1;
+	devCategory.version.wBuild = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 1;
+
+	LogARG(m_plogFile, Log_Infor, "GetDevCategory", "Exit, lResult = <%d>",lResult);
+	return ErrParse(lResult); 
+}
+
+
+
+ErrorCodeEnum CThermalPrint::Reset()
+{
+	LogARG(m_plogFile, Log_Infor, "Reset", "Enter...");
+	long lResult = 0;
+
+	lResult = m_pThermalPrintSP->ThermalPrint_Reset();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset", "Reset failed,nResult = <%d>",lResult);
+		return ErrParse(lResult); 
+	}
+
+	LogARG(m_plogFile, Log_Infor, "Reset", "Exit,lResult = <%d>",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CThermalPrint::DevClose()
+{
+	LogARG(m_plogFile, Log_Infor, "DevClose", "Enter...");
+	long lResult = 0;
+
+	lResult = m_pThermalPrintSP->ThermalPrint_CloseDevice();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "DevClose", "Close failed,nResult = <%d>",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(m_plogFile, Log_Infor, "DevClose", "Exitl,Result = <%d>",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CThermalPrint::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	LogARG(m_plogFile, Log_Infor, "GetLastErr", "Enter...");
+
+	memset(&devErrInfo,0,sizeof(DevErrorInfo));
+	memcpy(&devErrInfo,&m_DevErrorInfo,sizeof(DevErrorInfo));
+
+	LogARG(m_plogFile, Log_Infor, "GetLastErr", "Exit...");
+	return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+ErrorCodeEnum CThermalPrint::DevOpen(int argNum, char* argArray)
+#else
+ErrorCodeEnum CThermalPrint::DevOpen(BYTE btPort,DWORD dwBaudRate)
+{
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "Enter,dwPort = <%d> dwBaudRate = <%d>",btPort,dwBaudRate);
+	long lResult = 0;
+
+	lResult = m_pThermalPrintSP->ThermalPrint_OpenDevice();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "DevOpen", "open failed,nResult = <%d>",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "Exitl,Result = <%d>",lResult);
+	return ErrParse(lResult); 
+}
+#endif
+
+
+
+
+//	获取打印机实时状态
+ErrorCodeEnum CThermalPrint::GetDevState(ThermalState &devState)
+{
+	int iStatus;
+	int iPaperStatus;
+
+	LogARG(m_plogFile, Log_Infor, "GetDevState", "Enter...");
+	long lResult = 0;
+	char DevFirmware[1024]={0};
+	memset(DevFirmware,0x00,sizeof(DevFirmware));
+	lResult = m_pThermalPrintSP->ThermalPrint_GetStatus(iStatus,DevFirmware);
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevState", "ThermalPrint_GetStatus failed,nResult = <%d>",lResult);
+		devState.hardwareState = STATE_OTHER_ERROR;
+	}
+	else
+	{
+		if(iStatus==WFS_PTR_DEVONLINE ||iStatus==WFS_PTR_DEVBUSY)
+			devState.hardwareState = STATE_OK;
+		else
+			devState.hardwareState = STATE_OTHER_ERROR;
+		LogARG(m_plogFile,Log_Debug, "GetDevState","OutVaule: devState.hardwareState= %d",devState.hardwareState);
+		
+		usleep(100*1000);
+		lResult = m_pThermalPrintSP->ThermalPrint_GetPaperStatus(iPaperStatus);
+
+		LogARG(m_plogFile,Log_Debug, "GetDevState","ThermalPrint_GetPaperStatus failed lResult = %d",lResult);
+		if(RET_SUCCESS != lResult)
+		{
+			LogARG(m_plogFile, Log_Error, "GetDevState", "ThermalPrint_GetStatus failed,nResult = <%d>",lResult);
+			devState.hardwareState = STATE_OTHER_ERROR;
+		}
+		else
+		{
+			if(iPaperStatus==WFS_PTR_PAPERFULL)
+				devState.paperState = PAPER_FULL;
+			else if(iPaperStatus==WFS_PTR_PAPERLOW)
+				devState.paperState = PAPER_LOW;
+			else if(iPaperStatus==WFS_PTR_PAPERLOW)
+				devState.paperState = PAPER_EMPTY;
+			else if(iPaperStatus==WFS_PTR_PAPERLOW)
+				devState.paperState = PAPER_JAMMED;
+			else
+				devState.paperState = PAPER_EMPTY;
+		}
+	}
+
+	LogARG(m_plogFile,Log_Debug, "GetDevState","Exit: lResult = %d",lResult);
+	return ErrParse(lResult); 
+}
+
+//开始打印初始设置:paperWidth一般为80mm和57mm
+ErrorCodeEnum CThermalPrint::BeginPrint(ThermalPaperType eType,int paperWidth)
+{
+	LogARG(m_plogFile,Log_Infor, "BeginPrint","Enter eType = %d, paperWidth = %d",eType,paperWidth);
+
+	m_gwiErrorCode = WFS_SUCCESS;
+	m_deviceStatus = DEVICE_STATUS_NORMAL;
+	
+	ResetParam();
+
+	m_PaperType = eType;
+	m_PaperWidth = paperWidth;
+	LogARG(m_plogFile,Log_Infor,"BeginPrint","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
+	return ErrParse(m_gwiErrorCode);
+}
+
+//打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
+//第三个参数是预留参数 暂时无用到
+ErrorCodeEnum CThermalPrint::ControlAction(PrintAction eAction,DWORD dwValue1,DWORD dwValue2)
+{	
+	LogARG(m_plogFile,Log_Infor,"ControlAction","Enter eAction = %d, dwValue1 = %d, dwValue2 = %d",eAction,dwValue1,dwValue2);
+
+	long ret=0;
+	int iAction;
+	int iRightMove = 0;
+	char newLine[32]={0};
+	char moveInLine[32]={0};
+	m_gwiErrorCode = WFS_SUCCESS;
+	m_deviceStatus = DEVICE_STATUS_NORMAL;
+	/*chr20180503修改  解决右移问题*/
+	if(eAction == ACTION_MOVE_TO_POSITION_RELATIVE)
+	{
+		iRightMove = dwValue1;
+	}
+	/*end*/
+	sprintf(newLine,"0|0|%d|%d|%d|%d|%d|111000000|\x0a",m_LeftMargin,m_PrintArea,m_RowSpace,m_Font_SpaceL,m_Font_SpaceR);
+	//sprintf(moveInLine,"0|0|%d|%d|%d|%d|%d|111000000| ",m_LeftMargin,m_PrintArea,m_RowSpace,0,0);/*chr20180503修改  解决右移问题*/
+	sprintf(moveInLine,"%d|0|%d|%d|%d|%d|%d|111000000|",iRightMove,m_LeftMargin,m_PrintArea,m_RowSpace,0,0);
+	
+	switch(eAction)
+	{
+	case ACTION_PRINT_ONE_LINE://打印走纸一行
+	case ACTION_PRINT_MOVEFORWRAD_LINES://打印并走纸n行(单位:字符行)//TODO
+		iAction = 0x0010;
+		break;
+	
+	case ACTION_PRINT_MOVEBACKWRAD_LINES://回纸n行(单位:字符行)
+		iAction = 0x0001;
+		break;
+
+	case ACTION_CUT_ALL://全切纸
+
+		if(textLen>0)
+		{
+			//if(logFile) logFile->Log_Infor(myName, __FILE__, __LINE__, __FUNCDNAME__,"PrintRawData =[%d]%s",textLen,textBuff);
+			printf("=======textBuff=[%s],textLen=[%d]===========\n",textBuff,textLen);
+			ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
+			if(ret == -14)
+			{
+				usleep(1000*1000);
+				LogARG(m_plogFile,Log_Infor,"ControlAction","reprint!!!");
+				ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
+			}
+			textLen = 0;
+			//lpszPathAllNum=0;	//切纸不值0, 避免文件重复
+			memset(textBuff,0,sizeof(textBuff));
+		}
+		if(ret != 0)
+		{
+			LogARG(m_plogFile,Log_Infor,"ControlAction","XFS_PrintRawData ret=%d",ret);
+			goto exit;
+		}
+
+		iAction = 0x0004;
+		break;
+	case ACTION_CUT_HALF://半切纸
+
+		if(textLen>0)
+		{
+			ret = m_pThermalPrintSP->ThermalPrint_PrintRawData((LPBYTE)textBuff,textLen);
+			textLen = 0;
+			//lpszPathAllNum=0; //切纸不值0
+			memset(textBuff,0,sizeof(textBuff));
+		}
+
+		iAction = 0x0080;
+		break;
+
+	//case ACTION_MOVE_TO_POSITION_RELATIVE://把打印光标移动相对当前位置一段距离(横向),单位mm
+	//case ACTION_MOVE_TO_FORWRAD_LENGTH://移动向前走纸一段距离(距离包括本行高度在内) 单位:mm
+	case ACTION_MOVE_TO_BLACKMARK://移动到黑标位置,把打印位置设置在行首(标记纸有效)
+		iAction = 0x0008;
+		break;
+	//case ACTION_PRINT_MOVEBACK_TO_LINE://设置起始位置在行首,取值(0:打印内容返回行首,1:清空要打印的内容返回行首)
+	default :
+		iAction = 0x0010;
+		break;
+	}
+
+	LogARG(m_plogFile,Log_Infor,"ControlAction","eAction = %d, iAction = %d",eAction,iAction);
+	//控制介质动作
+	if(eAction == ACTION_PRINT_ONE_LINE)
+	{
+		if(textLen>0)
+		{
+			textBuff[textLen]= '&';
+			textLen++;
+		}
+		memcpy(&textBuff[textLen],newLine,strlen(newLine));
+		textLen += strlen(newLine);
+	}
+	else if(eAction == ACTION_PRINT_MOVEFORWRAD_LINES)
+	{
+		for(int i=0;i<dwValue1;i++)
+		{
+			if(textLen>0)
+			{
+				textBuff[textLen]= '&';
+				textLen++;
+			}
+			memcpy(&textBuff[textLen],newLine,strlen(newLine));
+			textLen += strlen(newLine);
+		}
+	}
+	
+	else if(eAction == ACTION_MOVE_TO_POSITION_RELATIVE)
+	{
+	/*chr20180503修改  解决右移问题
+		for(int i=0;i<dwValue1/2;i++)
+		{
+			strcat(moveInLine," ");
+			if(i>=80)break;
+		}
+	*/	
+		if(textLen>0)
+		{
+			textBuff[textLen]= '&';
+			textLen++;
+		}
+		memcpy(&textBuff[textLen],moveInLine,strlen(moveInLine));
+		textLen += strlen(moveInLine);
+	}
+	
+	else 
+	{
+		ret = m_pThermalPrintSP->ThermalPrint_ControlMedia(iAction);
+	}
+
+exit:
+	LogARG(m_plogFile,Log_Infor,"ControlAction","ret = %d",ret);
+
+	if(ret !=0)
+	{
+		m_deviceStatus = DEVICE_STATUS_FAULT;
+	}
+	LogARG(m_plogFile,Log_Infor,"ControlAction","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
+	return ErrParse(ret);
+}
+
+//打印参数指令函数:
+//第三个参数是预留参数 暂时无用到
+ErrorCodeEnum CThermalPrint::SetParam(CommandType eType,DWORD dwValue1,DWORD dwValue2)
+{
+	LogARG(m_plogFile,Log_Infor,"SetParam","Enter eType = %d, dwValue1 = %d, dwValue2 = %d",eType,dwValue1,dwValue2);
+	m_gwiErrorCode =Error_Succeed;
+
+	switch(eType)
+	{
+	case COMMON_ROW_SPACE://行间距 单位mm
+		m_RowSpace = dwValue1;
+		break;
+	case COMMON_ALIGN:	//字符对齐模式 单位是"AlignStyle"的值
+		m_Align = dwValue1;
+		break;
+	case COMMON_REVERSE://颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
+		m_Reverse = dwValue1;
+		break;
+	case COMMON_LEFT_MARGIN://左边距 单位mm
+		m_LeftMargin = dwValue1;
+		break;
+	case COMMON_PRINTABLE_AREA://可打印区域 单位mm
+		m_PrintArea = dwValue1;
+		break;
+	default:
+		break;
+	}
+	LogARG(m_plogFile,Log_Infor,"SetParam","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
+	return ErrParse(m_gwiErrorCode);
+}
+
+//打印字体指令函数:主要是字体相关饿指令函数
+//第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
+//					设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
+ErrorCodeEnum CThermalPrint::SetFont(FontStyle eType,DWORD dwValue1,DWORD dwValue2)
+{
+	LogARG(m_plogFile,Log_Infor,"SetFont","Enter");
+	LogARG(m_plogFile,Log_Infor,"SetFont","eType=%d,dwValue1=%d,dwValue2=%d",eType,dwValue1,dwValue2);
+	m_gwiErrorCode = Error_Succeed;
+
+	switch(eType)
+	{
+		case FONT_UNDERLINE://粗体 取值(0:否 1:是)
+			m_Font_UnderLine = dwValue1;
+			break;
+		case FONT_BOLD://粗体 取值(0:否 1:是)
+			m_Font_Bold = dwValue1;
+			break;
+		case FONT_INVERSE:	//反白 取值(0:否 1:是)
+			m_Font_Inverse = dwValue1;
+			break;
+		case FONT_DOUBLEHEIGHT://纵翻倍放大 取值(0:否 1:是)
+			m_Font_DoubleHeight = dwValue1;
+			m_Font_SizeH=0;
+			break;
+		case FONT_DOUBLEWIDE://横翻倍向放大 取值(0:否 1:是)
+			m_Font_DoubleWide = dwValue1;
+			m_Font_SizeW=0;
+			break;
+		case FONT_CUSTOM_SIZE://字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
+			m_Font_SizeH = dwValue2;
+			m_Font_SizeW = dwValue1;
+			break;
+		case FONT_ROTATE://字体旋转 取值(0,90,180,270)
+			m_Font_Rotate = dwValue1;
+			break;
+		case FONT_LEFT_RIGHT_SPACE://字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
+			m_Font_SpaceL = dwValue1;
+			m_Font_SpaceR = dwValue2;
+			break;
+		default:
+			break;
+	}
+	LogARG(m_plogFile,Log_Infor,"SetFont","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
+	return Error_Succeed;
+}
+
+//打印文本数据函数
+ErrorCodeEnum CThermalPrint::PrintText(BYTE *pData,DWORD dwDataLen)
+{
+	int ret=0;
+	char formatBuff1[32]={0};
+	char formatBuff2[32]={0};
+	BYTE *buffer,*byData;
+	int len,iDataLen;
+	
+	LogARG(m_plogFile,Log_Infor,"PrintText","Enter");
+	//if(logFile) logFile->Log_Infor(myName, __FILE__, __LINE__, __FUNCDNAME__,"pData=[%s]dwDataLen=%d",pData,dwDataLen);
+
+	byData=new BYTE[dwDataLen+256];
+	buffer=new BYTE[dwDataLen+512];
+	memset(buffer,0,dwDataLen+512);
+	memset(byData,0,dwDataLen+256);
+
+	memset(formatBuff1,0,sizeof(formatBuff1));
+	memset(formatBuff2,0,sizeof(formatBuff2));
+	
+	sprintf(formatBuff1,"0|0|%d|%d|%d|%d|%d|",m_LeftMargin,m_PrintArea,m_RowSpace,m_Font_SpaceL,m_Font_SpaceR);
+
+	if( m_Font_SizeH ==0 || m_Font_SizeH>6)
+		sprintf(formatBuff2,"%d%d%d%d%d0%d%d%d|",m_Align+1,m_Font_DoubleWide+1,m_Font_DoubleHeight+1,m_Font_Bold,0,
+					m_Font_UnderLine,m_Font_Inverse,m_Font_Rotate/90);
+	else
+		sprintf(formatBuff2,"%d%d%d%d%d0%d%d%d|",m_Align+1,m_Font_SizeW,m_Font_SizeH,m_Font_Bold,0,
+					m_Font_UnderLine,m_Font_Inverse,m_Font_Rotate/90);
+
+	
+	strcat((char *)buffer,formatBuff1);
+	strcat((char *)buffer,formatBuff2);
+	
+	len=strlen((char *)buffer);
+/*chr20180329修改,增加对特殊字符判断*/
+	int i=0;
+	iDataLen = 0;
+	for (i=0; i<dwDataLen;i++)
+	{
+		if(pData[i]=='&' || pData[i]=='/'||pData[i]=='|')
+		{
+			byData[iDataLen++]='/';
+		}
+		byData[iDataLen++]=pData[i];
+	}
+	memcpy(&buffer[len],byData,iDataLen);
+	len +=iDataLen;
+	//memcpy(&buffer[len],pData,dwDataLen);
+	//len +=dwDataLen;
+
+	m_gwiErrorCode = Error_Succeed;
+	m_deviceStatus = DEVICE_STATUS_NORMAL;
+	
+	
+	//打印数据
+	//if(logFile) logFile->Log_Infor(myName, __FILE__, __LINE__, __FUNCDNAME__,"buffer=[%s],len=[%d]",buffer,len);
+	//ret =XFS_PrintRawData(buffer,len);
+	if(textLen==0)
+	{
+		memcpy(textBuff,buffer,len);
+		textLen += len;
+	}
+	else 
+	{
+		textBuff[textLen]='&';
+		textLen +=1;
+		memcpy(&textBuff[textLen],buffer,len);
+		textLen +=len;
+	}
+	delete buffer;
+
+	/*if(logFile) logFile->Log_Infor(myName, __FILE__, __LINE__, __FUNCDNAME__,"pData=[%s] dwDataLen=[%d]",pData,dwDataLen);
+	ret =XFS_PrintRawData(pData,dwDataLen);*/
+
+	LogARG(m_plogFile,Log_Infor,"PrintText","PrintRawData ret = %d",ret);
+
+	if(ret !=0)
+	{
+		m_deviceStatus = DEVICE_STATUS_FAULT;
+		m_gwiErrorCode = Error_Param;
+	}
+	printf("=======textBuff=[%s],m_gwiErrorCode=[%d]===========\n",textBuff,m_gwiErrorCode);
+	LogARG(m_plogFile,Log_Infor,"PrintText","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
+	return ErrParse(m_gwiErrorCode);
+}
+
+//打印条形码函数
+//dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
+//dwHeight 条形码高度 单位mm
+//iHRIPosition hri字符打印位置 见枚举类型HriPosition
+ErrorCodeEnum CThermalPrint::PrintBarCode(BarCodeType eType, BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth,DWORD dwHeight,HriPosition eHRIPosition)
+{
+	LogARG(m_plogFile,Log_Infor,"PrintBarCode","Enter");
+
+
+	long lResult = 0;
+	char szBarCode[512]={0};
+	memset(szBarCode,0x00,sizeof(szBarCode));
+	sprintf(szBarCode,"BarCode=%s\0",pData);
+
+	lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szBarCode);
+
+	LogARG(m_plogFile,Log_Infor,"PrintBarCode","Exit: lResult = %d",lResult);
+	return ErrParse(lResult);
+}
+
+//打印二维码QRCode函数
+//dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
+ErrorCodeEnum CThermalPrint::PrintQRCode(BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth)
+{	
+	LogARG(m_plogFile,Log_Infor,"PrintQRCode","Enter");
+
+
+	long lResult = 0;
+	char szQRCode[512]={0};
+	memset(szQRCode,0x00,sizeof(szQRCode));
+	sprintf(szQRCode,"BarCode=%s\0",pData);
+
+	lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szQRCode);
+
+	LogARG(m_plogFile,Log_Infor,"PrintQRCode","Exit: lResult = %d",lResult);
+	return ErrParse(lResult);
+}
+
+//打印二维码QRCode函数
+//dwWidth 二维码长度 ,单位mm
+ErrorCodeEnum CThermalPrint::PrintQRCodeByArea(BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth,DWORD dwWidth)
+{
+	LogARG(m_plogFile,Log_Infor,"PrintQRCodeByArea","Enter");
+
+
+	long lResult = 0;
+	char szQRCode[512]={0};
+	memset(szQRCode,0x00,sizeof(szQRCode));
+	sprintf(szQRCode,"BarCode=%s\0",pData);
+
+	lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szQRCode);
+
+	LogARG(m_plogFile,Log_Infor,"PrintQRCodeByArea","Exit: lResult = %d",lResult);
+	return ErrParse(lResult);
+}
+
+//打印二维码PDF417函数
+//errorLevel pdf417纠错级别 取值{0..8}
+//dwUnitWidth  基本元素宽度 取值{3..90}
+//dwUnitHeight 基本元素长度 取值{1..30}
+//row  pdf417 行数 取值{1..7}
+//lines pdf417 列数 取值{2..25}
+ErrorCodeEnum CThermalPrint::PrintPDF417code(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwUnitWidth,DWORD dwUnitHeight,int rows,int lines)
+{
+	LogARG(m_plogFile,Log_Infor,"PrintPDF417code","Enter");
+
+
+	long lResult = 0;
+	char szPDF417code[512]={0};
+	memset(szPDF417code,0x00,sizeof(szPDF417code));
+	sprintf(szPDF417code,"PDF417code=%s\0",szPDF417code);
+
+	lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szPDF417code);
+
+	LogARG(m_plogFile,Log_Infor,"PrintPDF417code","Exit: lResult = %d",lResult);
+	return ErrParse(lResult);
+}
+
+//打印二维码PDF417函数
+//errorLevel pdf417纠错级别 取值{0..8}
+//dwWidth  pdf417宽度 单位mm
+//dwHeight pdf417长度 单位mm
+ErrorCodeEnum CThermalPrint::PrintPDF417codeByArea(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwWidth,DWORD dwHeight)
+{
+	LogARG(m_plogFile,Log_Infor,"PrintPDF417codeByArea","Enter");
+
+
+	long lResult = 0;
+	char szPDF417code[512]={0};
+	memset(szPDF417code,0x00,sizeof(szPDF417code));
+	sprintf(szPDF417code,"PDF417code=%s\0",szPDF417code);
+
+	lResult = m_pThermalPrintSP->ThermalPrint_Printform(0x0000,"TestReceiptForm","TestReceiptMedia",(LPSTR)szPDF417code);
+
+	LogARG(m_plogFile,Log_Infor,"PrintPDF417codeByArea","Exit: lResult = %d",lResult);
+	return ErrParse(lResult);
+}
+
+
+//打印图像函数:pData是base64编码的数据
+ErrorCodeEnum CThermalPrint::PrintImage(BYTE *pData,DWORD dwDataLen)
+{
+	LogARG(m_plogFile,Log_Infor,"PrintImage","Enter");
+
+	long lResult = 0;
+
+
+	LogARG(m_plogFile,Log_Infor,"PrintImage","Exit: lResult = %d",lResult);
+	return ErrParse(lResult);
+}
+
+//获取打印失败后错误信息和错误状态
+ErrorCodeEnum CThermalPrint::GetLastErrState(ThermalState &devState , DevErrorInfo &devErrInfo)
+{
+	LogARG(m_plogFile,Log_Infor,"GetLastErrState","Enter");
+	m_gwiErrorCode = Error_Succeed;
+	LogARG(m_plogFile,Log_Infor,"GetLastErrState","Exit: m_gwiErrorCode = %d",m_gwiErrorCode);
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CThermalPrint::ErrParse(long lResult)
+{
+	bool bFind = false;
+	for(int n = 0; n < sizeof(m_DevErrArray)/sizeof(DevErrCode); n++)
+	{
+		if(lResult == m_DevErrArray[n].lErr)
+		{
+			bFind = true;
+			ErrorCodeEnum ErrTmp = (ErrorCodeEnum)m_DevErrArray[n].lReturn;
+			memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+			strcpy(m_DevErrorInfo.szErrMsg,m_DevErrArray[n].szErrDes);
+			m_DevErrorInfo.dwErrMsgLen = (m_DevErrArray[n].lDevErr << 16) +strlen(m_DevErrArray[n].szErrDes);
+			return ErrTmp;
+		}
+	}
+	if(!bFind)
+	{
+		memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+		strcpy(m_DevErrorInfo.szErrMsg,"未定义错误");
+		m_DevErrorInfo.dwErrMsgLen =strlen(m_DevErrorInfo.szErrMsg);
+		return Error_Hardware;
+	}
+	return Error_Succeed;
+}

+ 116 - 0
DevAdapter/gwi/ThermalPrint1.1/ThermalPrintDriverGWI.h

@@ -0,0 +1,116 @@
+#ifndef _CMBC_THERMALPRINT_H
+#define _CMBC_THERMALPRINT_H
+
+#include "ThermalPrintClass.h"
+
+class CThermalPrint : public ThermalPrintClass
+{
+public:
+	CThermalPrint(void);
+	~CThermalPrint(void);
+	//	
+	//	Get category infomation about device.
+	//
+	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);
+
+	//	打开打印机
+	virtual ErrorCodeEnum DevOpen(BYTE btPort,DWORD dwBaudRate);
+	//	获取打印机实时状态
+	virtual ErrorCodeEnum GetDevState(ThermalState &devState);
+
+	//开始打印初始设置:paperWidth一般为80mm和57mm
+	virtual ErrorCodeEnum BeginPrint(ThermalPaperType eType,int paperWidth);
+
+	//打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
+	//第三个参数是预留参数 暂时无用到
+	virtual ErrorCodeEnum ControlAction(PrintAction eAction,DWORD dwValue1,DWORD dwValue2=0);
+
+	//打印参数指令函数:
+	//第三个参数是预留参数 暂时无用到
+	virtual ErrorCodeEnum SetParam(CommandType eType,DWORD dwValue1,DWORD dwValue2=0);
+
+	//打印字体指令函数:主要是字体相关饿指令函数
+	//第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
+	//					设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
+	virtual ErrorCodeEnum SetFont(FontStyle eType,DWORD dwValue1,DWORD dwValue2);
+
+	//打印文本数据函数
+	virtual ErrorCodeEnum PrintText(BYTE *pData,DWORD dwDataLen);
+
+	//打印条形码函数
+	//dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
+	//dwHeight 条形码高度 单位mm
+	//iHRIPosition hri字符打印位置 见枚举类型HriPosition
+	virtual ErrorCodeEnum PrintBarCode(BarCodeType eType, BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth,DWORD dwHeight,HriPosition eHRIPosition);
+
+	//打印二维码QRCode函数
+	//dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
+	virtual ErrorCodeEnum PrintQRCode(BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth);
+
+	//打印二维码QRCode函数
+	//dwWidth 二维码长度 ,单位mm
+	virtual ErrorCodeEnum PrintQRCodeByArea(BYTE *pData,DWORD dwDataLen,DWORD dwUnitWidth,DWORD dwWidth);
+
+	//打印二维码PDF417函数
+	//errorLevel pdf417纠错级别 取值{0..8}
+	//dwUnitWidth  基本元素宽度 取值{3..90}
+	//dwUnitHeight 基本元素长度 取值{1..30}
+	//row  pdf417 行数 取值{1..7}
+	//lines pdf417 列数 取值{2..25}
+	virtual ErrorCodeEnum PrintPDF417code(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwUnitWidth,DWORD dwUnitHeight,int rows,int lines);
+
+	//打印二维码PDF417函数
+	//errorLevel pdf417纠错级别 取值{0..8}
+	//dwWidth  pdf417宽度 单位mm
+	//dwHeight pdf417长度 单位mm
+	virtual ErrorCodeEnum PrintPDF417codeByArea(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwWidth,DWORD dwHeight);
+
+	//打印图像函数:pData是base64编码的数据
+	virtual ErrorCodeEnum PrintImage(BYTE *pData,DWORD dwDataLen);
+
+	//获取打印失败后错误信息和错误状态
+	virtual ErrorCodeEnum GetLastErrState(ThermalState &devState , DevErrorInfo &devErrInfo);
+
+private:
+	int m_gwiErrorCode;
+	DevStateEnum m_deviceStatus;
+	ThermalPaperType m_PaperType;
+	int m_PaperWidth;
+	int m_RowSpace;//行间距 单位mm
+	int m_Align;//字符对齐模式 单位是"AlignStyle"的值
+	int m_Reverse;//颠倒打印(注意需要设置退出或者切纸才行,并在行首) 取值(0:正常打印 1:颠倒打印)
+	int m_LeftMargin;//左边距 单位mm
+	int m_PrintArea;//可打印区域 单位mm
+	//字体
+	int m_Font_UnderLine;//下划线 取值(0:否 1:是)
+	int m_Font_Bold;//粗体 取值(0:否 1:是)
+	int m_Font_Inverse;//反白 取值(0:否 1:是)
+	int m_Font_DoubleHeight;//纵翻倍放大 取值(0:否 1:是)FONT_UNDERLINE = 0,//下划线 取值(0:否 1:是)
+	int m_Font_DoubleWide;//横翻倍向放大 取值(0:否 1:是)
+	int m_Font_SizeH;//字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
+	int m_Font_SizeW;//字体宽高自定义,取值(宽 {1..6} ,长 {1..6})
+	int m_Font_Rotate;//字体旋转 取值(0,90,180,270)
+	int m_Font_SpaceL;//字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
+	int m_Font_SpaceR;//字符左右边距设置 单位mm 取值(左边距 {0..36},右边距 {0..36})
+
+
+private:
+	ErrorCodeEnum ErrParse(long lResult);
+
+	DevErrorInfo m_DevErrorInfo;
+	void ResetParam();
+};
+
+#endif

+ 66 - 0
DevAdapter/gwi/ThermalPrint1.1/ThermalPrintGWI.cpp

@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include "ThermalPrintDriverGWI.h"
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pOutDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+#endif
+{
+    pOutDevAptObj = new CThermalPrint();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+    return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pInDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+#endif
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(CThermalPrint* pTmp = dynamic_cast<CThermalPrint*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+}
+
+#ifdef _WINDOWS
+
+char g_myDllPath[MAX_PATH]={0};
+char g_myDllName[MAX_PATH]={0};			//我的名字
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	    case DLL_PROCESS_ATTACH:
+		{
+			GetModuleFileName(hModule,g_myDllPath,MAX_PATH);	//取当前模块全路径(动态库,并非执行文件)
+			strcpy(g_myDllName,strrchr(g_myDllPath,'\\')+1);
+			strcpy(strrchr(g_myDllPath,'\\'),"\\");
+			char *p=strchr(g_myDllName,'.');
+			if(p!=NULL)
+				*p=0;
+		}break;
+	    case DLL_THREAD_ATTACH:
+	    case DLL_THREAD_DETACH:
+	    case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
+#endif

+ 511 - 0
DevAdapter/gwi/ThermalPrint1.1/ThermalPrintSP.cpp

@@ -0,0 +1,511 @@
+#include "ThermalPrintSP.h"
+#include "Xfsptr.h"
+#include "simple_ini_tool.h"
+#include "pcquicklib.h"
+
+#define CONF_FILE_NAME			"DevAdapter.ini"
+#define DEFAULT_TIMEOUT         5000
+#define RECV_TIMEOUT		    12000
+#define LEN_STATUS_BUFFER 1024
+
+#ifdef _WINDOWS
+extern char g_myDllPath[MAX_PATH];
+#define OCXBASEDLL_DEFAULE_PATH		"C:\\KIOSK\\GwiXfs\\ocxbase.dll"   //默认路径,可通过配置文件配置
+#else
+#include <dlfcn.h>
+#define OCXBASEDLL_DEFAULE_PATH		"/usr/KIOSK/Pisa/libPISAOcxBase.so"     //默认路径,可通过配置文件配置
+#endif
+bool m_GetFirmware = false;
+
+void GetDllLoadPath(char *pOutDllPath)
+{
+	if(NULL == pOutDllPath)
+		return;
+
+#ifdef  _WINDOWS
+	strcpy(pOutDllPath,g_myDllPath);
+#else
+	Dl_info dl_info;	//dladdr获取某个地址的符号信息
+	int rc = dladdr((void*)GetDllLoadPath, &dl_info);  
+	strcpy(pOutDllPath,dl_info.dli_fname);
+	char *pName = strrchr(pOutDllPath, '/');
+	*pName = '\0'; 
+#endif
+}
+
+CThermalPrintSP::CThermalPrintSP(CLogFile *plogFile): m_plogFile(plogFile)
+{
+	m_pThermalPrintOcxBase = NULL;
+	m_bThermalPrintOpen = false;
+
+	m_Image2Feature.lhResult = 1;
+	m_Image2Feature.ulReqID = 0;
+	m_Image2Feature.m_infolen = 0;
+	memset(m_Image2Feature.Info, 0, sizeof(m_Image2Feature.Info));
+
+	memset(m_ThermalPrintLogicName,0,sizeof(m_ThermalPrintLogicName));
+	memset(m_OCXDllPath,0,sizeof(m_OCXDllPath));
+	ReadConf();
+}
+
+CThermalPrintSP::~CThermalPrintSP(void)
+{
+	if(m_bThermalPrintOpen)
+		ThermalPrint_CloseDevice();
+
+	if(NULL != m_pThermalPrintOcxBase)
+	{
+		delete m_pThermalPrintOcxBase;
+		m_pThermalPrintOcxBase = NULL;
+	}
+}
+
+HRESULT CThermalPrintSP::EventCallBack(long EventType,void* lpResults)
+{
+	LogARG(m_plogFile, Log_Infor,"EventCallBack","EventCallBack Enter.EventType = <%d>",EventType);
+
+	LPWFSRESULT lpwfsResult = (LPWFSRESULT)lpResults;
+
+	if(WFS_EXECUTE_COMPLETE == EventType)
+	{
+		LogARG(m_plogFile, Log_Debug,"EventCallBack","dwCommandCode = %d, RequestID = %d",(lpwfsResult->u).dwCommandCode,lpwfsResult->RequestID);
+		LogARG(m_plogFile, Log_Debug,"EventCallBack","m_ulReqID = <%d> RequestID=<%d>",m_Image2Feature.ulReqID, lpwfsResult->RequestID);
+
+		if(m_Image2Feature.ulReqID == lpwfsResult->RequestID)
+		{
+			LogARG(m_plogFile, Log_Debug,"EventCallBack","lpwfsResult->hResult=<%d>",lpwfsResult->hResult);
+			m_Image2Feature.lhResult = lpwfsResult->hResult;
+			if(lpwfsResult->hResult == WFS_SUCCESS)
+			{
+				LPWFSPTRIMAGE * lppImgData= (LPWFSPTRIMAGE*)(lpwfsResult->lpBuffer);
+				if(lppImgData != NULL )
+				{
+					LPWFSPTRIMAGE lpdatas=*lppImgData;
+					memcpy(m_Image2Feature.Info,lpdatas->lpbData,lpdatas->ulDataLength);
+					m_Image2Feature.m_infolen = lpdatas->ulDataLength;
+					LogARG(m_plogFile, Log_Debug,"EventCallBack","lpdatas->lpbData= <%s>", lpdatas->lpbData);
+					LogARG(m_plogFile, Log_Debug,"EventCallBack","lpdatas->ulDataLength= <%d>", lpdatas->ulDataLength);
+				}
+				else
+				{
+					memset(m_Image2Feature.Info, 0, sizeof(m_Image2Feature.Info));
+				}
+			}
+			m_Image2Feature.ulReqID = 0;
+		}
+	}
+
+	if(NULL != lpwfsResult)
+	{
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		lpwfsResult = NULL;
+	}
+
+	return WFS_SUCCESS;
+}
+
+long CThermalPrintSP::ThermalPrint_OpenDevice(void)
+{
+	HRESULT lhResult = WFS_SUCCESS;
+
+	if(m_bThermalPrintOpen)
+		return WFS_SUCCESS;
+
+	if(!LoadDll())
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_OpenDevice","Load ocxbase Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	if(!InitSP())
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_OpenDevice","Init SP Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+
+	if(NULL != m_pThermalPrintOcxBase)
+	{
+		lhResult = m_pThermalPrintOcxBase->WFSOpen();
+		LogARG(m_plogFile, Log_Debug, "ThermalPrint_OpenDevice","WFSOpen = %d",lhResult);
+		if(WFS_SUCCESS == lhResult)
+		{
+			lhResult = m_pThermalPrintOcxBase->WFSRegister();
+		}
+	}
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_OpenDevice","Init ThermalPrint Failed!");
+		return lhResult;
+	}
+
+	m_bThermalPrintOpen = true;
+
+	return lhResult;
+}
+
+long CThermalPrintSP::ThermalPrint_CloseDevice(void)
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(m_bThermalPrintOpen && NULL != m_pThermalPrintOcxBase)
+	{
+		m_pThermalPrintOcxBase->WFSClose();
+		m_bThermalPrintOpen = false;
+	}
+	return lhResult;
+}
+
+long CThermalPrintSP::ThermalPrint_Reset()
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_Reset","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	WORD wResetMode = 0;
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pThermalPrintOcxBase->WFSExecute(WFS_CMD_PTR_RESET,&wResetMode,DEFAULT_TIMEOUT,&lpwfsResult);
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_Reset","Reset Failed,lhResult = <%d>",lhResult);
+	}
+
+	m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	return lhResult;
+}
+
+int CThermalPrintSP::GetExtendedStatusField(LPSTR lpszExtra,LPSTR ExtraFileName,std::string& pszParam)
+{	
+	if (NULL != lpszExtra)
+	{
+		int	inum = 0;
+		char chExtraField[LEN_STATUS_BUFFER]={0};
+		while(lpszExtra[inum]!=0x00 && lpszExtra[inum+1]!=0x00 && inum < LEN_STATUS_BUFFER-1)
+		{
+			memset(chExtraField,0x00,sizeof(chExtraField));
+			strcpy(chExtraField,lpszExtra+inum);
+			if (strstr(chExtraField,(char*)ExtraFileName)!=NULL)
+			{
+				char stemp[LEN_STATUS_BUFFER]={0};
+				int len=strlen(ExtraFileName)+1;
+				if (len < strlen(chExtraField))
+				{
+					strcpy(stemp,chExtraField+len);
+				}
+				pszParam = stemp;
+				return WFS_SUCCESS;
+			}
+			inum = inum + strlen(chExtraField)+1;
+		}
+	}
+	else
+	{
+		pszParam = "";
+	}
+	return WFS_SUCCESS;
+}
+
+long CThermalPrintSP::ThermalPrint_GetStatus(int &status,char * DRVVersion)
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_GetStatus","SP not Init!");
+		status = WFS_PTR_DEVHWERROR;
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT		lpwfsResult		= NULL;
+	LPWFSPTRSTATUS	lpWFSstatus	= NULL;
+
+	lhResult = m_pThermalPrintOcxBase->WFSGetInfo(WFS_INF_PTR_STATUS,NULL,DEFAULT_TIMEOUT,&lpwfsResult); 
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_GetStatus","GetStatus Failed hResult = %d", lhResult);
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		status = WFS_PTR_DEVHWERROR;
+		return lhResult;
+	}
+
+	lhResult = lpwfsResult->hResult;
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_GetStatus","GetStatus Failed hResult = %d", lhResult);
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		status = WFS_PTR_DEVHWERROR;
+		return lhResult;
+	}
+
+	lpWFSstatus = (LPWFSPTRSTATUS)lpwfsResult->lpBuffer;
+	if(lpWFSstatus == NULL )
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_GetStatus","GetStatus lpWFSfingerstatus = NULL");
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		status = WFS_PTR_DEVHWERROR;
+		return WFS_ERR_INVALID_POINTER;
+	}
+	status = (int)lpWFSstatus->fwDevice;
+	if (m_GetFirmware==false)
+	{
+		m_GetFirmware=true;
+		LPSTR lpszExtra =NULL;
+		lpszExtra=(LPSTR)malloc(LEN_STATUS_BUFFER);
+		memset(lpszExtra,0,LEN_STATUS_BUFFER);
+		memcpy(lpszExtra,lpWFSstatus->lpszExtra,LEN_STATUS_BUFFER);
+		std::string m_FirmwareVersion="";
+		std::string m_DriverDllVersion="";
+		GetExtendedStatusField(lpszExtra,"FirmwareVersion",m_FirmwareVersion);
+		sprintf(DRVVersion,"%s",m_FirmwareVersion.c_str());
+		free(lpszExtra);
+	}
+	m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+	return lhResult;
+}
+
+long CThermalPrintSP::ThermalPrint_GetPaperStatus(int &status)
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_GetPaperStatus","SP not Init!");
+		status = WFS_PTR_PAPERUNKNOWN;
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT		lpwfsResult		= NULL;
+	LPWFSPTRSTATUS	lpWFSstatus	= NULL;
+
+	lhResult = m_pThermalPrintOcxBase->WFSGetInfo(WFS_INF_PTR_STATUS,NULL,DEFAULT_TIMEOUT,&lpwfsResult); 
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_GetPaperStatus","GetStatus Failed hResult = %d", lhResult);
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		status = WFS_PTR_PAPERUNKNOWN;
+		return lhResult;
+	}
+
+	lhResult = lpwfsResult->hResult;
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_GetPaperStatus","GetStatus Failed hResult = %d", lhResult);
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		status = WFS_PTR_PAPERUNKNOWN;
+		return lhResult;
+	}
+
+	lpWFSstatus = (LPWFSPTRSTATUS)lpwfsResult->lpBuffer;
+	if(lpWFSstatus == NULL )
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_GetPaperStatus","GetStatus lpWFSfingerstatus = NULL");
+		m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+		status = WFS_PTR_PAPERUNKNOWN;
+		return WFS_ERR_INVALID_POINTER;
+	}
+	status = (int)lpWFSstatus->fwPaper[WFS_PTR_SUPPLYUPPER];
+	m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+	return lhResult;
+}
+
+
+long CThermalPrintSP::ThermalPrint_ControlMedia(int dwControl)
+{
+	HRESULT m_hResult = WFS_SUCCESS;
+	LPWFSRESULT		lpResult	= NULL;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_ControlMedia","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	DWORD dwControlMedia	= dwControl;
+	m_hResult = m_pThermalPrintOcxBase->WFSExecute(WFS_CMD_PTR_CONTROL_MEDIA,&dwControlMedia,30000,&lpResult); 
+
+	if(m_hResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_ControlMedia","ThermalPrint_ControlMedia Failed m_hResult = %d", m_hResult);
+		return m_hResult;
+	}
+
+	if(NULL != lpResult)          // 需要释放结构体
+	{
+		m_pThermalPrintOcxBase->WFSFreeResult(lpResult);
+		lpResult = NULL;
+	}
+	LogARG(m_plogFile, Log_Debug,"ThermalPrint_ControlMedia","lhResult = <%d>", m_hResult);
+
+	return m_hResult;
+}
+
+
+
+long CThermalPrintSP::ThermalPrint_Printform(DWORD dwMediaControl, LPSTR lpszFormName, LPSTR lpszMediaName,LPSTR lpszFields)
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_Printform","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Debug, "ThermalPrint_Printform","dwMediaControl = <%d>,lpszFormName = <%s>,lpszMediaName=<%s>,lpszFields=<%s>",dwMediaControl,lpszFormName,lpszMediaName,lpszFields);
+
+	WFSPTRPRINTFORM lpPrintForm;
+
+	lpPrintForm.lpszUNICODEFields = NULL;
+	lpPrintForm.wAlignment = 1;
+	lpPrintForm.wOffsetX = 0;
+	lpPrintForm.wOffsetY = 0;
+	lpPrintForm.wResolution = 1;
+	lpPrintForm.dwMediaControl = dwMediaControl;
+	lpPrintForm.wPaperSource = WFS_PTR_PAPERANY;
+	strcpy((char *)lpPrintForm.lpszFormName, (char *)lpszFormName);
+	strcpy((char *)lpPrintForm.lpszMediaName, (char *)lpszMediaName);
+	strcpy((char *)lpPrintForm.lpszFields, (char *)lpszFields);
+	lhResult = m_pThermalPrintOcxBase->WFSExecute(WFS_CMD_PTR_PRINT_FORM,&lpPrintForm,30000,&lpwfsResult);
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_Printform","Printform WFSExecute failed hResult = <%d>", lhResult);
+	}
+	else
+	{
+		lhResult= lpwfsResult->hResult;
+		if(lhResult != WFS_SUCCESS)
+		{
+			LogARG(m_plogFile, Log_Error,"ThermalPrint_Printform","Printform WFSExecute failed lpwfsResult->hResult = <%d>", lhResult);
+		}
+	}
+	m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+	LogARG(m_plogFile, Log_Debug,"ThermalPrint_Printform","lhResult = <%d>", lhResult);
+	return lhResult;
+}
+
+long CThermalPrintSP::ThermalPrint_PrintRawData(LPBYTE lpbData,ULONG ulSize)
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_PrintRawData","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Debug, "ThermalPrint_PrintRawData","LPBYTE = <%s>,ulSize = <%d>",lpbData,ulSize);
+	WFSPTRRAWDATA lpRawData;
+	lpRawData.wInputData = WFS_PTR_INPUTDATA;
+	lpRawData.ulSize = ulSize;
+	lpRawData.lpbData = lpbData;
+	lhResult = m_pThermalPrintOcxBase->WFSExecute(WFS_CMD_PTR_RAW_DATA,&lpRawData,30000,&lpwfsResult);
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"ThermalPrint_PrintRawData","PrintRawData WFSExecute failed hResult = <%d>", lhResult);
+	}
+	else
+	{
+		lhResult= lpwfsResult->hResult;
+		if(lhResult != WFS_SUCCESS)
+		{
+			LogARG(m_plogFile, Log_Error,"ThermalPrint_PrintRawData","PrintRawData WFSExecute failed lpwfsResult->hResult = <%d>", lhResult);
+		}
+	}
+	m_pThermalPrintOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+	LogARG(m_plogFile, Log_Debug,"ThermalPrint_PrintRawData","lhResult = <%d>", lhResult);
+	return lhResult;
+}
+
+
+long CThermalPrintSP::ThermalPrint_CancelWait()
+{
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bThermalPrintOpen && NULL == m_pThermalPrintOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_CancelWait","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	lhResult = m_pThermalPrintOcxBase->WFSCancelAsyncRequest(0);
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "ThermalPrint_CancelWait","Cance Failed,lhResult = <%d>",lhResult);
+	}
+
+	return lhResult;
+}
+
+
+
+void CThermalPrintSP::ReadConf(void)
+{
+	char szConfPath[260] = {0};
+	char szDllPath[260] = {0};
+	char ocxBasePath[260] = {0};
+	GetDllLoadPath(szDllPath);
+	sprintf(szConfPath, "%s/%s", szDllPath, CONF_FILE_NAME);
+	sprintf(ocxBasePath, "%s/gwi/libgwiPISAOcxBase.so",szDllPath);
+	//读取逻辑名
+	strcpy(m_ThermalPrintLogicName,IniFileRead(szConfPath,"SP","Thermal_LOGICAL_SERVICES","ReceiptPrinter").c_str());
+	strcpy(m_OCXDllPath,IniFileRead(szConfPath,"SP","OCXBASE_PATH",ocxBasePath).c_str());
+
+	LogARG(m_plogFile, Log_Debug,"ReadConf","readConfINI m_ThermalPrintLogicName = <%s>, m_OCXDllPath = <%s>!",m_ThermalPrintLogicName,m_OCXDllPath);
+}
+
+bool CThermalPrintSP::LoadDll(void)
+{
+#if (defined _WIN32) || (defined __WINDOWS__) || (defined __WXMSW__)
+    m_hOCXHandle = LoadLibrary(m_OCXDllPath);
+    if(!m_hOCXHandle)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load <%s> Failed!",m_OCXDllPath);
+		return false; 
+    }
+
+    m_pCallCreateInstance = (CreateInstance)GetProcAddress(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)GetProcAddress(m_hOCXHandle,"FreeInstance");
+#else
+    m_hOCXHandle = dlopen(m_OCXDllPath, RTLD_NOW);
+    if(!m_hOCXHandle)
+    {
+        const char* error = dlerror();
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load <%s> Failed,error msg = <%s>!",m_OCXDllPath,error);
+		return false; 
+    }
+
+    LogARG(m_plogFile, Log_Debug, "LoadDll","Load <%s> Successed!",m_OCXDllPath);
+    m_pCallCreateInstance = (CreateInstance)dlsym(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)dlsym(m_hOCXHandle,"FreeInstance");
+#endif
+
+    if(NULL == m_pCallCreateInstance || NULL == m_pCallFreeInstance)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load OCXBASE CreateInstance or FreeInstance Failed!");
+        return false;
+    }
+
+    return true;
+}
+
+
+bool CThermalPrintSP::InitSP(void)
+{
+	//初始化SP
+	CEventCallBack* pEvent = (CEventCallBack*)this;
+	if(NULL == m_pThermalPrintOcxBase)
+	{
+		m_pThermalPrintOcxBase = (OcxBase *)m_pCallCreateInstance((LPVOID)"PTR",m_ThermalPrintLogicName,NULL,pEvent);
+
+		if(NULL == m_pThermalPrintOcxBase)
+		{
+			LogARG(m_plogFile, Log_Error, "InitSP","new Finger CDeviceOcxBase failed!");
+			return false;
+		}
+		LogARG(m_plogFile, Log_Debug, "InitSP","new Finger CDeviceOcxBase sussces!");
+	}
+
+	return true;
+}

+ 72 - 0
DevAdapter/gwi/ThermalPrint1.1/ThermalPrintSP.h

@@ -0,0 +1,72 @@
+#ifndef FINGERPRINT_SP_H
+#define FINGERPRINT_SP_H
+
+#include "OcxBase.h"
+#include "GwiLogFile.h"
+
+#define RET_SUCCESS     0
+#define LAYER ("ThermalPrint")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+
+struct WFSAsyncExecuteInfo 
+{
+    long lhResult;
+    unsigned long ulReqID;
+    unsigned char Info[2048];
+	int m_infolen;
+};
+
+#ifndef _WINDOWS
+#define WINAPI
+#endif
+
+typedef LPVOID (WINAPI *CreateInstance)(LPVOID attatchparam,LPVOID reServed,LPVOID tools,LPVOID spInter);
+typedef void (WINAPI* FreeInstance)(LPVOID p);
+
+class CLogFile;
+class CThermalPrintSP : public CEventCallBack
+{
+public:
+	CThermalPrintSP(CLogFile *plogFile);
+	~CThermalPrintSP(void);
+
+	virtual long EventCallBack(long EventType,void* lpResult);
+	WFSAsyncExecuteInfo m_Image2Feature;
+
+	long ThermalPrint_OpenDevice(void); 
+	long ThermalPrint_CloseDevice(void);
+	long ThermalPrint_Reset(void);
+	long ThermalPrint_GetStatus(int &status,char * DRVVersion);
+	long ThermalPrint_GetPaperStatus(int &status);
+	long ThermalPrint_ControlMedia(int dwControl);
+	long ThermalPrint_Printform(DWORD dwMediaControl, LPSTR lpszFormName, LPSTR lpszMediaName,LPSTR lpszFields);
+	long ThermalPrint_CancelWait();
+	long ThermalPrint_PrintRawData(LPBYTE lpbData,ULONG ulSize);
+	long ThermalPrint_PrintRawFile(LPSTR lpszFileName);
+
+
+private:
+	void ReadConf(void);
+	bool LoadDll(void);
+	bool InitSP(void);
+	int GetExtendedStatusField(LPSTR lpszExtra,LPSTR ExtraFileName,std::string& pszParam);
+
+	OcxBase *m_pThermalPrintOcxBase;        /// 设备对象指针
+	char     m_ThermalPrintLogicName[260];
+	bool     m_bThermalPrintOpen;
+	char     m_OCXDllPath[260];
+	CLogFile *m_plogFile;
+	unsigned long m_ulReqID;
+
+    CreateInstance m_pCallCreateInstance;
+    FreeInstance m_pCallFreeInstance;
+#if (defined _WIN32) || (defined __WINDOWS__) || (defined __WXMSW__)
+	  HMODULE m_hOCXHandle; 
+#else
+	  void* m_hOCXHandle;
+#endif
+
+};
+
+#endif

+ 295 - 0
DevAdapter/gwi/ThermalPrint1.1/simple_ini_tool.cpp

@@ -0,0 +1,295 @@
+#include "simple_ini_tool.h"
+
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+
+#include <list>
+#include <string>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+static inline bool IsSpace(char c)
+{
+    return isspace(c) != 0 ; // !=0 消除VS的C4800警告
+}
+
+/** 将int转换成字符串,替代itoa函数,android中没有该函数 */
+static char* IntToStr(int v, char* str)
+{
+    sprintf(str, "%d", v);
+    return str;
+}
+
+/** 将文件以行的形式加载到内存中 */
+static list<string> LoadLines(const string& filename)
+{
+    list<string> lines;
+    FILE* file = fopen(filename.c_str(), "rt");
+    if (file != NULL)
+    {
+        char line[1024];
+        while(fgets(line, sizeof(line), file) != NULL)
+        {
+            lines.push_back(line);
+        }
+        fclose(file);
+    }
+    return lines;
+}
+
+/** 内存的数据写入文件 */
+static void SaveLines(const string& filename, const list<string>& lines)
+{
+#ifndef _WINDOWS
+	printf("SaveLines =%s\n",filename.c_str());
+#endif
+    FILE* file = fopen(filename.c_str(), "wt");
+    if (file != NULL)
+    {
+        for (list<string>::const_iterator iter = lines.begin();
+             iter != lines.end(); ++iter)
+        {
+            fputs(iter->c_str(), file);
+        }
+        fclose(file);
+    }
+}
+
+template<typename T, typename F>
+static void Strip(T rawb, T rawe, T& b, T& e, F isStrip)
+{
+    b = rawb;
+    e = rawe;
+
+    while (b != rawe)
+    {
+         if (!isStrip(*b))   break;
+         ++b;
+    }
+
+    while (b != e)
+    {
+        /* 进入该分支,则表明b为!isStrip,当--e后,要么跳出循环,要么不为b */
+        --e;
+        if (!isStrip(*e))
+        {
+            ++e;
+            break;
+        }
+    }
+}
+
+/** 判断是否是[xxx]结构 */
+static bool IsSection(const string& line, const string* section=NULL)
+{
+    string::const_iterator b = line.begin();
+    string::const_iterator e = line.end();
+
+    Strip(line.begin(), line.end(), b, e, IsSpace);
+
+    return e != b && *b == '[' && *(--e) == ']' && (section==NULL || string(++b, e) == *section);
+}
+
+class ListIter
+{
+public:
+    typedef list<string> List;
+    typedef list<string>::iterator Iter;
+};
+
+class ListCIter
+{
+public:
+    typedef const list<string> List;
+    typedef list<string>::const_iterator Iter;
+};
+
+template<typename T>
+static void FindSection(typename T::List& lines, const string& section, typename T::Iter& begin, typename T::Iter& end)
+{
+    for (begin = lines.begin(); begin != lines.end(); ++begin)
+    {
+        if (IsSection(*begin, &section)) break;
+    }
+
+    end = begin;
+    if (end != lines.end())
+    {
+        for (++end; end != lines.end(); ++end)
+        {
+            if (IsSection(*end))    break;
+        }
+    }
+}
+
+
+bool GetKeyValue(const string& line, string& key, string& value)
+{
+    string::size_type m = line.find("=");
+    if (m != string::npos)
+    {
+        string::const_iterator b = line.begin();
+        string::const_iterator s = line.begin()+m;
+        Strip(line.begin(), line.begin()+m, b, s, IsSpace);
+        key = string(b, s);
+
+        Strip(line.begin()+m+1, line.end(), b, s, IsSpace);
+        value = string(b, s);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+string IniFileRead(const string& filename, const string& section, const string& key, const string& defaultValue)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+        string k, v;
+        if (GetKeyValue(*iter, k, v) && key == k) return v;
+    }
+
+    return defaultValue;
+}
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value)
+{
+	int Count = 0;
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+		string k, v;
+        if (GetKeyValue(*iter, k, v))
+		{
+			Count++;
+			key.insert(key.end(), k);
+			value.insert(value.end(), v);
+		}
+    }
+
+    return Count;
+}
+
+
+#define MAKE_SECTION_LINE(s)        ("[" + (s) + "]\n")
+#define MAKE_KEY_VALUE_LINE(k,v)    ((k) + " = " + (v) + "\n")
+
+void IniFileWrite(const string& filename, const string& section, const string& key, const string& value)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::iterator begin;
+    list<string>::iterator end;
+
+    FindSection<ListIter>(lines, section, begin, end);
+
+    if (begin != end)
+    {
+        list<string>::iterator iter=begin;
+        for (; iter != end; ++iter)
+        {
+            string k, v;
+            if (GetKeyValue(*iter, k, v) && key == k) 
+            {
+                *iter = MAKE_KEY_VALUE_LINE(key, value);
+                break;
+            }
+        }
+
+        if (iter == end)
+        {
+            lines.insert(iter, MAKE_KEY_VALUE_LINE(key, value));
+        }
+    }
+    else
+    {
+        lines.push_back(MAKE_SECTION_LINE(section));
+        lines.push_back(MAKE_KEY_VALUE_LINE(key, value));
+    }
+
+    SaveLines(filename, lines);
+}
+
+
+int IniFileRead(const string& filename, const string& section, const string& key, int defaultValue)
+{
+    char str[48];
+    return atoi(IniFileRead(filename, section, key, IntToStr(defaultValue, str)).c_str());
+}
+
+void IniFileWrite(const string& filename, const string& section, const string& key, int value)
+{
+    char str[48];
+    IniFileWrite(filename, section, key, IntToStr(value, str));
+}
+
+
+#ifdef TEST_SIMPLE_INI_TOOL
+
+#define CheckEqaul(a, b) ((a)!=(b))?(printf("CheckFailed %s == %s\n", #a, #b)):0
+int main()
+{
+    const char* testFile = "test_simple_ini_tool.ini";
+
+    // 清空文件
+    fclose(fopen(testFile, "w"));
+
+    // 写入数据
+    IniFileWrite(testFile, "section0", "key0", "value0");
+    IniFileWrite(testFile, "section0", "key1", 1);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value0");
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", "valuee"), "1");
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", 0), 1);
+
+    // 读取未有的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", 1), 1);
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", 1), 1);
+
+    // 写入的二个section
+    IniFileWrite(testFile, "section1", "key0", "value10");
+    IniFileWrite(testFile, "section1", "key1", 11);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", "valuee"), "value10");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", "valuee"), "11");
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 11);
+
+    // 改写数据
+    IniFileWrite(testFile, "section0", "key0", "value00");
+    IniFileWrite(testFile, "section1", "key1", 111);
+
+    // 检查数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value00");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 111);
+
+    return 0;
+}
+
+#endif // 

+ 26 - 0
DevAdapter/gwi/ThermalPrint1.1/simple_ini_tool.h

@@ -0,0 +1,26 @@
+/**
+ * @file simple_ini_tool.h
+ * @brief 简单的ini文件读写工具,仅支持多字节和一次读写,并不考虑性能
+ */
+#ifndef SIMPLE_INI_TOOL_H
+#define SIMPLE_INI_TOOL_H
+
+#include <string>
+#include <list>
+
+std::string IniFileRead(const std::string& filename, const std::string& section, const std::string& key, const std::string& defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, const std::string& key, int defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, const std::string& value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, int value);
+
+#endif /* SIMPLE_INI_TOOL_H */
+

+ 27 - 0
DevAdapter/gwi/Ups.1.1/CMakeLists.txt

@@ -0,0 +1,27 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("Ups")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "gwi")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        UpsSP.cpp 
+        UpsGWI.cpp 
+        UpsDriverGWI.cpp 
+        simple_ini_tool.cpp
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+# ${MODULE_FULL_NAME} 是 TAGET 名称,在 rvc_dev_config_library 中定义
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}")
+
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 29 - 0
DevAdapter/gwi/Ups.1.1/ErrorDefine.h

@@ -0,0 +1,29 @@
+#ifndef ERROR_DEFINE_H
+#define ERROR_DEFINE_H
+
+#include "ErrorCode.h"
+#include "DevErrorCode.h"
+#include "Xfssiu.h"
+
+typedef struct _DevErrcode
+{
+	long lErr;
+	char szErrDes[1024];
+	long lDevErr;
+	long lReturn;
+}DevErrCode;
+
+DevErrCode m_DevErrArray[] =
+{
+    0,"成功",DEC_SUCCESS,Error_Succeed,
+    WFS_ERR_TIMEOUT, "Excute Time Out", DEC_TIMEOUT, Error_TimeOut,
+    WFS_ERR_HARDWARE_ERROR, "Hardware Error", DEC_HARDWARE, Error_Hardware,
+    WFS_ERR_INTERNAL_ERROR, "Internal Error", DEC_NO_E_GPIO + 1, Error_Process,
+    WFS_ERR_CANCELED, "User Canceled", DEC_NO_E_GPIO + 2, Error_Cancel,
+	WFS_ERR_INVALID_DATA, "Invalid Data", DEC_NO_E_CARDISSUER + 3, Error_Param,
+	WFS_ERR_SIU_INVALID_PORT, "Invalid Port", DEC_NO_E_GPIO + 4, Error_Param,
+	WFS_ERR_SIU_PORT_ERROR, "Port Error", DEC_NO_E_GPIO + 5, Error_Param,
+	WFS_ERR_SIU_POWERSAVETOOSHORT, "Invalid Data", DEC_NO_E_GPIO + 6, Error_Param,
+};
+
+#endif

+ 204 - 0
DevAdapter/gwi/Ups.1.1/UpsDriverGWI.cpp

@@ -0,0 +1,204 @@
+#include "UpsDriverGWI.h"
+#include "UpsSP.h"
+#include "GwiLogFile.h"
+#include "ErrorDefine.h"
+#include "Xfssiu.h"
+
+CLogFile *g_pLogFile = NULL;
+CUPSSP *g_pUPSSP = NULL;
+
+CUps::CUps()
+{
+	memset(&m_DevErrorInfo,0,sizeof(m_DevErrorInfo));
+
+	if(NULL == g_pLogFile)
+	{
+		g_pLogFile = new CLogFile(LAYER);
+		g_pLogFile->init();
+
+		LogARG(g_pLogFile, Log_Debug, "CUps", "CLogFile Init success!");
+	}
+
+	if(NULL == g_pUPSSP)
+	{
+		g_pUPSSP = new CUPSSP(g_pLogFile);
+	}
+
+}
+
+CUps::~CUps()
+{
+	if(NULL != g_pUPSSP)
+	{
+		delete g_pUPSSP;
+		g_pUPSSP = NULL;
+	}
+}
+
+ErrorCodeEnum CUps::DevOpen(DWORD dwPort,DWORD dwBaudRate)
+{
+	LogARG(g_pLogFile, Log_Infor, "DevOpen", "Enter, dwPort[%d], dwBaudRate[%d]", dwPort, dwBaudRate);
+	long lResult = 0;
+
+	lResult = g_pUPSSP->SIUSPOpen();	//SANTAK_NEW
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "DevOpen", "open failed,nResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "DevOpen", "Exitl,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CUps::GetDevStatus(UpsStatusEnum &eStatus)
+{
+	LogARG(g_pLogFile, Log_Infor, "GetDevStatus", "Enter");
+
+	long lResult = 0;
+	char szVersionBuf[256] = {0};
+	int nStatus = 0;
+	int nUPSStatus = 0;
+	lResult = g_pUPSSP->SIUGetStatus(nStatus, szVersionBuf, nUPSStatus);
+
+	if(RET_SUCCESS != lResult || nUPSStatus == WFS_SIU_NOT_AVAILABLE)
+	{
+		LogARG(g_pLogFile, Log_Error, "GetDevStatus", "GetVersion failed, lResult[%d]",lResult);
+		eStatus = UPS_STATUS_ERROR_TO_GET_STATUS;
+	}
+	else if (nUPSStatus == WFS_SIU_AVAILABLE)	//< 有市电
+	{
+		eStatus = UPS_STATUS_NORMAL;
+	}
+	else //< UPS供电
+	{
+		eStatus = UPS_STATUS_NO_ELECTOR;
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "GetDevStatus", "Exit, lResult[%d]",lResult);
+	return ErrParse(lResult);
+}
+
+ErrorCodeEnum CUps::Shutdown(DWORD dwShutTime,DWORD dwRestartTime)
+{
+	LogARG(g_pLogFile, Log_Infor, "Shutdown", "Enter, dwShutTime[%d], dwRestartTime[%d]", dwShutTime, dwRestartTime);
+	long lResult = 0;
+
+	lResult = g_pUPSSP->SetPowerSaveChange(dwShutTime, 1);
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "Shutdown", "SetPowerSaveChange dwShutTime failed, lResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	lResult = g_pUPSSP->SetPowerSaveChange(dwRestartTime, 0);
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "Shutdown", "SetPowerSaveChange dwRestartTime failed, lResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	lResult = g_pUPSSP->SetAuxiliary(WFS_SIU_DISENGAGE);	//< 关机后重启
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "Shutdown", "SetAuxiliary failed, lResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "Shutdown", "Exit,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CUps::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LogARG(g_pLogFile, Log_Infor, "GetDevCategory", "Enter");
+
+	long lResult = 0;
+	char szVersionBuf[256] = {0};
+	int nStatus = 0;
+	int nUPSStatus = 0;
+	lResult = g_pUPSSP->SIUGetStatus(nStatus, szVersionBuf, nUPSStatus);
+
+	if(RET_SUCCESS != lResult || nUPSStatus == WFS_SIU_NOT_AVAILABLE)
+	{
+		LogARG(g_pLogFile, Log_Error, "GetDevCategory", "GetVersion failed, lResult[%d]",lResult);
+		devCategory.eState = DEVICE_STATUS_FAULT;
+	}
+	else
+	{
+		devCategory.eState = DEVICE_STATUS_NORMAL;
+	}
+
+	sprintf(devCategory.szModel,"UPS");    
+	sprintf(devCategory.szType,"SANTAK_NEW");
+	sprintf(devCategory.szVendor,"GWI_mellisa");
+
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 1;
+	devCategory.version.wBuild = 1;
+
+	LogARG(g_pLogFile, Log_Infor, "GetDevCategory", "Exit, lResult[%d]",lResult);
+	return ErrParse(lResult);
+}
+
+ErrorCodeEnum CUps::Reset()
+{
+	LogARG(g_pLogFile, Log_Infor, "Reset", "Enter...");
+	long lResult = 0;
+
+	LogARG(g_pLogFile, Log_Infor, "Reset", "Exit,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CUps::DevClose()
+{
+	LogARG(g_pLogFile, Log_Infor, "DevClose", "Enter...");
+	long lResult = 0;
+
+	lResult = g_pUPSSP->SIUSPClose();
+	if(RET_SUCCESS != lResult)
+	{
+		LogARG(g_pLogFile, Log_Error, "DevClose", "Close failed, lResult[%d]",lResult);
+		return ErrParse(lResult);  
+	}
+
+	LogARG(g_pLogFile, Log_Infor, "DevClose", "Exitl,lResult[%d]",lResult);
+	return ErrParse(lResult); 
+}
+
+ErrorCodeEnum CUps::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	LogARG(g_pLogFile, Log_Infor, "GetLastErr", "Enter...");
+
+	memset(&devErrInfo,0,sizeof(DevErrorInfo));
+	memcpy(&devErrInfo,&m_DevErrorInfo,sizeof(DevErrorInfo));
+
+	LogARG(g_pLogFile, Log_Infor, "GetLastErr", "Exit...");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CUps::ErrParse(long lResult)
+{
+	bool bFind = false;
+	for(int n = 0; n < sizeof(m_DevErrArray)/sizeof(DevErrCode); n++)
+	{
+		if(lResult == m_DevErrArray[n].lErr)
+		{
+			bFind = true;
+			ErrorCodeEnum ErrTmp = (ErrorCodeEnum)m_DevErrArray[n].lReturn;
+			memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+			strcpy(m_DevErrorInfo.szErrMsg,m_DevErrArray[n].szErrDes);
+			m_DevErrorInfo.dwErrMsgLen = (m_DevErrArray[n].lDevErr << 16) +strlen(m_DevErrArray[n].szErrDes);
+			return ErrTmp;
+		}
+	}
+	if(!bFind)
+	{
+		memset(m_DevErrorInfo.szErrMsg,0,sizeof(m_DevErrorInfo.szErrMsg));
+		strcpy(m_DevErrorInfo.szErrMsg,"未定义错误!");
+		m_DevErrorInfo.dwErrMsgLen =strlen(m_DevErrorInfo.szErrMsg);
+		return Error_Hardware;
+	}
+	return Error_Succeed;
+}

+ 56 - 0
DevAdapter/gwi/Ups.1.1/UpsDriverGWI.h

@@ -0,0 +1,56 @@
+#ifndef LIBFRAMEWORK_UPS_H
+#define LIBFRAMEWORK_UPS_H
+
+#include "UpsClass.h"
+
+class CUps : public UpsClass
+{
+public:
+	CUps(void);
+	~CUps(void);
+
+	//
+	//	Device initialization.
+	//	Configure port input/output direction.
+	//
+	virtual ErrorCodeEnum DevOpen(DWORD dwPort,DWORD dwBaudRate);
+
+	//
+	//	Get device status
+	//
+	virtual ErrorCodeEnum GetDevStatus(UpsStatusEnum &eStatus);
+	//
+	//	Shutdown ups and restart it in minutes.
+	//	Arguments:
+	//	- dwShutTime:time to shutdown (in minutes)
+	// 	- dwRestartTime:time to restart (in minutes)
+	//
+	virtual ErrorCodeEnum Shutdown(DWORD dwShutTime,DWORD dwRestartTime);
+
+	//	
+	//	Get category infomation about device.
+	//
+	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);
+
+private:
+	ErrorCodeEnum ErrParse(long lResult);
+
+	DevErrorInfo m_DevErrorInfo;
+};
+
+
+#endif //LIBFRAMEWORK_CARDSWIPER_IMPL_H

+ 66 - 0
DevAdapter/gwi/Ups.1.1/UpsGWI.cpp

@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include "UpsDriverGWI.h"
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pOutDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+#endif
+{
+    pOutDevAptObj = new CUps();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+    return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pInDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+#endif
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(CUps* pTmp = dynamic_cast<CUps*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+}
+
+#ifdef _WINDOWS
+
+char g_myDllPath[MAX_PATH]={0};
+char g_myDllName[MAX_PATH]={0};			//我的名字
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	    case DLL_PROCESS_ATTACH:
+		{
+			GetModuleFileName(hModule,g_myDllPath,MAX_PATH);	//取当前模块全路径(动态库,并非执行文件)
+			strcpy(g_myDllName,strrchr(g_myDllPath,'\\')+1);
+			strcpy(strrchr(g_myDllPath,'\\'),"\\");
+			char *p=strchr(g_myDllName,'.');
+			if(p!=NULL)
+				*p=0;
+		}break;
+	    case DLL_THREAD_ATTACH:
+	    case DLL_THREAD_DETACH:
+	    case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
+#endif

+ 308 - 0
DevAdapter/gwi/Ups.1.1/UpsSP.cpp

@@ -0,0 +1,308 @@
+#include "UpsSP.h"
+#include "Xfssiu.h"
+#include "simple_ini_tool.h"
+#include "pcquicklib.h"
+
+#define CONF_FILE_NAME			"DevAdapter.ini"
+#define DEFAULT_TIMEOUT         5000
+#define RECV_TIMEOUT		    12000
+
+#ifdef _WINDOWS
+extern char g_myDllPath[MAX_PATH];
+#define OCXBASEDLL_DEFAULE_PATH		"C:\\KIOSK\\GwiXfs\\ocxbase.dll"   //默认路径,可通过配置文件配置
+#else
+#include <dlfcn.h>
+#define OCXBASEDLL_DEFAULE_PATH		"/usr/KIOSK/Pisa/libPISAOcxBase.so"     //默认路径,可通过配置文件配置
+#endif
+
+#define SHUT_TIME	10000
+#define START_TIME	20000
+
+void GetDllLoadPath(char *pOutDllPath)
+{
+	if(NULL == pOutDllPath)
+		return;
+
+#ifdef  _WINDOWS
+	strcpy(pOutDllPath,g_myDllPath);
+#else
+	Dl_info dl_info;	//dladdr获取某个地址的符号信息
+	int rc = dladdr((void*)GetDllLoadPath, &dl_info);  
+	strcpy(pOutDllPath,dl_info.dli_fname);
+	char *pName = strrchr(pOutDllPath, '/');
+	*pName = '\0'; 
+#endif
+}
+
+CUPSSP::CUPSSP(CLogFile *plogFile): m_plogFile(plogFile)
+{
+	m_pSIUOcxBase = NULL;
+	m_bSIUOpen = false;
+
+	memset(m_pSIULogicName,0,sizeof(m_pSIULogicName));
+	memset(m_OCXDllPath,0,sizeof(m_OCXDllPath));
+	ReadConf();
+}
+
+CUPSSP::~CUPSSP(void)
+{
+	if(m_bSIUOpen)
+		SIUSPClose();
+
+	if(NULL != m_pSIUOcxBase)
+	{
+		delete m_pSIUOcxBase;
+		m_pSIUOcxBase = NULL;
+	}
+}
+
+HRESULT CUPSSP::EventCallBack(long EventType,void* lpResults)
+{
+
+	return WFS_SUCCESS;
+}
+
+long CUPSSP::SIUSPOpen(void)
+{
+	LogARG(m_plogFile, Log_Infor, "SIUSPOpen","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+
+	if(m_bSIUOpen)
+		return WFS_SUCCESS;
+
+	if(!LoadDll())
+	{
+		LogARG(m_plogFile, Log_Error, "SIUSPOpen","Load ocxbase Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	if(!InitSP())
+	{
+		LogARG(m_plogFile, Log_Error, "SIUSPOpen","Init SP Failed!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+
+	if(NULL != m_pSIUOcxBase)
+	{
+		lhResult = m_pSIUOcxBase->WFSOpen();
+		LogARG(m_plogFile, Log_Debug, "SIUSPOpen","WFSOpen[%d]",lhResult);
+		if(WFS_SUCCESS == lhResult)
+		{
+			lhResult = m_pSIUOcxBase->WFSRegister();
+		}
+	}
+	if(WFS_SUCCESS != lhResult)
+	{
+		LogARG(m_plogFile, Log_Error, "SIUSPOpen","Init Gpio Failed!");
+		return lhResult;
+	}
+
+	m_bSIUOpen = true;
+
+	LogARG(m_plogFile, Log_Infor, "SIUSPOpen","Exit, Open Success!");
+	return lhResult;
+}
+
+long CUPSSP::SIUSPClose(void)
+{
+	LogARG(m_plogFile, Log_Infor, "SIUSPClose","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(m_bSIUOpen && NULL != m_pSIUOcxBase)
+	{
+		m_pSIUOcxBase->WFSClose();
+		m_bSIUOpen = false;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "SIUSPClose","Exit, Close Success!");
+	return lhResult;
+}
+
+long CUPSSP::SIUGetStatus(int& nStatus, char *pszVersion, int& nUpsStatus)
+{
+	LogARG(m_plogFile, Log_Infor, "SIUGetStatus","Enter!");
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bSIUOpen && NULL == m_pSIUOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "SIUGetStatus","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	LPWFSRESULT		lpwfsResult		= NULL;
+	LPWFSSIUSTATUS	lpWfsSiuStatus	= NULL;
+
+	lhResult = m_pSIUOcxBase->WFSGetInfo(WFS_INF_SIU_STATUS, NULL, DEFAULT_TIMEOUT, &lpwfsResult); 
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SIUGetStatus","WFS_INF_SIU_STATUS Failed hResult[%d]", lhResult);
+		m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+		return lhResult;
+	}
+
+	lhResult = lpwfsResult->hResult;
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SIUGetStatus","WFS_INF_SIU_STATUS Failed hResult[%d]", lhResult);
+		m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+		return lhResult;
+	}
+
+	lpWfsSiuStatus = (LPWFSSIUSTATUS)lpwfsResult->lpBuffer;
+	if(lpWfsSiuStatus == NULL )
+	{
+		LogARG(m_plogFile, Log_Error,"SIUGetStatus","WFS_INF_SIU_STATUS Failed lpWfsSiuStatus = NULL");
+		m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+		return WFS_ERR_INVALID_POINTER;
+	}
+
+	nStatus = lpWfsSiuStatus->fwDevice;
+
+	nUpsStatus = lpWfsSiuStatus->fwAuxiliaries[WFS_SIU_UPS];
+
+	m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "SIUGetStatus","Exit, nStatus[%d], pszVersion[%s], nUpsStatus[%d]", nStatus, pszVersion, nUpsStatus);
+
+	return lhResult;
+}
+
+long CUPSSP::SetAuxiliary(DWORD fwCommand)
+{
+	LogARG(m_plogFile, Log_Infor, "SetAuxiliary","Enter, fwCommand[%d]", fwCommand);
+
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bSIUOpen && NULL == m_pSIUOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "SetAuxiliary","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+
+	WFSSIUSETAUXILIARY  lpSetAuxiliary;
+	lpSetAuxiliary.wAuxiliary = WFS_SIU_UPS;
+	lpSetAuxiliary.fwCommand = fwCommand;
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pSIUOcxBase->WFSExecute(WFS_CMD_SIU_SET_AUXILIARY, &lpSetAuxiliary, 30000, &lpwfsResult);
+
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SetAuxiliary","SetAuxiliary WFSExecute failed hResult[%d]", lhResult);
+	    return lhResult;
+	}
+
+	m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "SetAuxiliary","Exit, lhResult[%d]", lhResult);
+	return lhResult;
+}
+
+long CUPSSP::SetPowerSaveChange(USHORT usPowerSaveRecoveryTime, int nShutDown)
+{
+	LogARG(m_plogFile, Log_Infor, "SetPowerSaveChange","Enter, usPowerSaveRecoveryTime[%d], nShutDown[%d]", usPowerSaveRecoveryTime, nShutDown);
+
+	HRESULT lhResult = WFS_SUCCESS;
+	if(!m_bSIUOpen && NULL == m_pSIUOcxBase)
+	{
+		LogARG(m_plogFile, Log_Error, "SetPowerSaveChange","SP not Init!");
+		return WFS_ERR_INTERNAL_ERROR;
+	}
+	
+	WFSSIUPOWERSAVECHANGE  lpPowerSave;
+	if (nShutDown)
+	{
+		lpPowerSave.usPowerSaveRecoveryTime = SHUT_TIME + usPowerSaveRecoveryTime;
+	}
+	else 
+	{
+		lpPowerSave.usPowerSaveRecoveryTime = START_TIME + usPowerSaveRecoveryTime;
+	}
+
+	LPWFSRESULT lpwfsResult = NULL;
+
+	lhResult = m_pSIUOcxBase->WFSExecute(WFS_CMD_SIU_POWER_SAVE_CONTROL, &lpPowerSave, 30000, &lpwfsResult);
+
+	if(lhResult != WFS_SUCCESS)
+	{
+		LogARG(m_plogFile, Log_Error,"SetPowerSaveChange","SetAuxiliary WFSExecute failed hResult[%d]", lhResult);
+		return lhResult;
+	}
+
+	m_pSIUOcxBase->WFSFreeResult(lpwfsResult);
+	lpwfsResult = NULL;
+
+	LogARG(m_plogFile, Log_Infor, "SetPowerSaveChange","Exit, lhResult[%d]", lhResult);
+	return lhResult;
+}
+
+void CUPSSP::ReadConf(void)
+{
+	char szConfPath[260] = {0};
+	char szDllPath[260] = {0};
+	char ocxBasePath[260] = {0};
+	GetDllLoadPath(szDllPath);
+	sprintf(szConfPath, "%s/%s", szDllPath, CONF_FILE_NAME);
+	sprintf(ocxBasePath, "%s/gwi/libgwiPISAOcxBase.so",szDllPath);
+	//读取逻辑名
+	strcpy(m_pSIULogicName,IniFileRead(szConfPath,"SP","SIU_LOGICAL_SERVICES","SensorsAndIndicators").c_str());
+	strcpy(m_OCXDllPath,IniFileRead(szConfPath,"SP","OCXBASE_PATH",ocxBasePath).c_str());
+	
+	LogARG(m_plogFile, Log_Debug,"ReadConf","readConfINI m_pSIULogicName[%s], m_OCXDllPath[%s]!",m_pSIULogicName,m_OCXDllPath);
+}
+
+bool CUPSSP::LoadDll(void)
+{
+#ifdef _WINDOWS
+    m_hOCXHandle = LoadLibrary(m_OCXDllPath);
+    if(!m_hOCXHandle)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load m_OCXDllPath[%s] Failed!", m_OCXDllPath);
+		return false; 
+    }
+
+    m_pCallCreateInstance = (CreateInstanceEx)GetProcAddress(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)GetProcAddress(m_hOCXHandle,"FreeInstance");
+#else
+    m_hOCXHandle = dlopen(m_OCXDllPath, RTLD_NOW);
+    if(!m_hOCXHandle)
+    {
+        const char* error = dlerror();
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load [%s] Failed,error msg[%s]!",m_OCXDllPath,error);
+		return false; 
+    }
+
+    LogARG(m_plogFile, Log_Debug, "LoadDll","Load [%s] Successed!",m_OCXDllPath);
+    m_pCallCreateInstance = (CreateInstance)dlsym(m_hOCXHandle,"CreateInstance");
+    m_pCallFreeInstance = (FreeInstance)dlsym(m_hOCXHandle,"FreeInstance");
+#endif
+
+    if(NULL == m_pCallCreateInstance || NULL == m_pCallFreeInstance)
+    {
+        LogARG(m_plogFile, Log_Error, "LoadDll","Load OCXBASE CreateInstance or FreeInstance Failed!");
+        return false;
+    }
+
+    return true;
+}
+
+
+bool CUPSSP::InitSP(void)
+{
+	//初始化SP
+	CEventCallBack* pEvent = (CEventCallBack*)this;
+	if(NULL == m_pSIUOcxBase)
+	{
+		m_pSIUOcxBase = (OcxBase *)m_pCallCreateInstance((LPVOID)"SIU", m_pSIULogicName, NULL, pEvent);
+
+		if(NULL == m_pSIUOcxBase)
+		{
+			LogARG(m_plogFile, Log_Error, "InitSP","new Finger CDeviceOcxBase failed!");
+			return false;
+		}
+
+		LogARG(m_plogFile, Log_Debug, "InitSP","new Finger CDeviceOcxBase sussces!");
+	}
+
+	return true;
+}

+ 64 - 0
DevAdapter/gwi/Ups.1.1/UpsSP.h

@@ -0,0 +1,64 @@
+#ifndef UPS_SP_H
+#define UPS_SP_H
+
+#include "OcxBase.h"
+#include "GwiLogFile.h"
+
+#define RET_SUCCESS     0
+#define LAYER ("Gpio")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+
+struct WFSAsyncExecuteInfo 
+{
+    long lhResult;
+    unsigned long ulReqID;
+    unsigned char Info[2048];
+	int m_infolen;
+};
+
+#ifndef _WINDOWS
+#define WINAPI
+#endif
+
+typedef LPVOID (WINAPI *CreateInstance)(LPVOID attatchparam,LPVOID reServed,LPVOID tools,LPVOID spInter);
+typedef void (WINAPI* FreeInstance)(LPVOID p);
+
+class CLogFile;
+class CUPSSP : public CEventCallBack
+{
+public:
+	CUPSSP(CLogFile *plogFile);
+	~CUPSSP(void);
+
+	virtual long EventCallBack(long EventType,void* lpResult);
+
+	long SIUSPOpen(void); 
+	long SIUSPClose(void);
+	long SIUGetStatus(int& nStatus, char *pszVersion, int& nUpsStatus);
+	long SetAuxiliary(DWORD fwCommand);
+	long SetPowerSaveChange(USHORT usPowerSaveRecoveryTime, int nShutDown);
+
+private:
+	void ReadConf(void);
+	bool LoadDll(void);
+	bool InitSP(void);
+
+	OcxBase *m_pSIUOcxBase;        /// 设备对象指针
+	char     m_pSIULogicName[260];
+	bool     m_bSIUOpen;
+	char     m_OCXDllPath[260];
+	CLogFile *m_plogFile;
+	unsigned long m_ulReqID;
+
+    CreateInstance m_pCallCreateInstance;
+    FreeInstance m_pCallFreeInstance;
+#ifdef _WINDOWS
+	  HMODULE m_hOCXHandle; 
+#else
+	  void* m_hOCXHandle;
+#endif
+
+};
+
+#endif

+ 295 - 0
DevAdapter/gwi/Ups.1.1/simple_ini_tool.cpp

@@ -0,0 +1,295 @@
+#include "simple_ini_tool.h"
+
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+
+#include <list>
+#include <string>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+static inline bool IsSpace(char c)
+{
+    return isspace(c) != 0 ; // !=0 消除VS的C4800警告
+}
+
+/** 将int转换成字符串,替代itoa函数,android中没有该函数 */
+static char* IntToStr(int v, char* str)
+{
+    sprintf(str, "%d", v);
+    return str;
+}
+
+/** 将文件以行的形式加载到内存中 */
+static list<string> LoadLines(const string& filename)
+{
+    list<string> lines;
+    FILE* file = fopen(filename.c_str(), "rt");
+    if (file != NULL)
+    {
+        char line[1024];
+        while(fgets(line, sizeof(line), file) != NULL)
+        {
+            lines.push_back(line);
+        }
+        fclose(file);
+    }
+    return lines;
+}
+
+/** 内存的数据写入文件 */
+static void SaveLines(const string& filename, const list<string>& lines)
+{
+#ifndef _WINDOWS
+	printf("SaveLines =%s\n",filename.c_str());
+#endif
+    FILE* file = fopen(filename.c_str(), "wt");
+    if (file != NULL)
+    {
+        for (list<string>::const_iterator iter = lines.begin();
+             iter != lines.end(); ++iter)
+        {
+            fputs(iter->c_str(), file);
+        }
+        fclose(file);
+    }
+}
+
+template<typename T, typename F>
+static void Strip(T rawb, T rawe, T& b, T& e, F isStrip)
+{
+    b = rawb;
+    e = rawe;
+
+    while (b != rawe)
+    {
+         if (!isStrip(*b))   break;
+         ++b;
+    }
+
+    while (b != e)
+    {
+        /* 进入该分支,则表明b为!isStrip,当--e后,要么跳出循环,要么不为b */
+        --e;
+        if (!isStrip(*e))
+        {
+            ++e;
+            break;
+        }
+    }
+}
+
+/** 判断是否是[xxx]结构 */
+static bool IsSection(const string& line, const string* section=NULL)
+{
+    string::const_iterator b = line.begin();
+    string::const_iterator e = line.end();
+
+    Strip(line.begin(), line.end(), b, e, IsSpace);
+
+    return e != b && *b == '[' && *(--e) == ']' && (section==NULL || string(++b, e) == *section);
+}
+
+class ListIter
+{
+public:
+    typedef list<string> List;
+    typedef list<string>::iterator Iter;
+};
+
+class ListCIter
+{
+public:
+    typedef const list<string> List;
+    typedef list<string>::const_iterator Iter;
+};
+
+template<typename T>
+static void FindSection(typename T::List& lines, const string& section, typename T::Iter& begin, typename T::Iter& end)
+{
+    for (begin = lines.begin(); begin != lines.end(); ++begin)
+    {
+        if (IsSection(*begin, &section)) break;
+    }
+
+    end = begin;
+    if (end != lines.end())
+    {
+        for (++end; end != lines.end(); ++end)
+        {
+            if (IsSection(*end))    break;
+        }
+    }
+}
+
+
+bool GetKeyValue(const string& line, string& key, string& value)
+{
+    string::size_type m = line.find("=");
+    if (m != string::npos)
+    {
+        string::const_iterator b = line.begin();
+        string::const_iterator s = line.begin()+m;
+        Strip(line.begin(), line.begin()+m, b, s, IsSpace);
+        key = string(b, s);
+
+        Strip(line.begin()+m+1, line.end(), b, s, IsSpace);
+        value = string(b, s);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+string IniFileRead(const string& filename, const string& section, const string& key, const string& defaultValue)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+        string k, v;
+        if (GetKeyValue(*iter, k, v) && key == k) return v;
+    }
+
+    return defaultValue;
+}
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value)
+{
+	int Count = 0;
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+		string k, v;
+        if (GetKeyValue(*iter, k, v))
+		{
+			Count++;
+			key.insert(key.end(), k);
+			value.insert(value.end(), v);
+		}
+    }
+
+    return Count;
+}
+
+
+#define MAKE_SECTION_LINE(s)        ("[" + (s) + "]\n")
+#define MAKE_KEY_VALUE_LINE(k,v)    ((k) + " = " + (v) + "\n")
+
+void IniFileWrite(const string& filename, const string& section, const string& key, const string& value)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::iterator begin;
+    list<string>::iterator end;
+
+    FindSection<ListIter>(lines, section, begin, end);
+
+    if (begin != end)
+    {
+        list<string>::iterator iter=begin;
+        for (; iter != end; ++iter)
+        {
+            string k, v;
+            if (GetKeyValue(*iter, k, v) && key == k) 
+            {
+                *iter = MAKE_KEY_VALUE_LINE(key, value);
+                break;
+            }
+        }
+
+        if (iter == end)
+        {
+            lines.insert(iter, MAKE_KEY_VALUE_LINE(key, value));
+        }
+    }
+    else
+    {
+        lines.push_back(MAKE_SECTION_LINE(section));
+        lines.push_back(MAKE_KEY_VALUE_LINE(key, value));
+    }
+
+    SaveLines(filename, lines);
+}
+
+
+int IniFileRead(const string& filename, const string& section, const string& key, int defaultValue)
+{
+    char str[48];
+    return atoi(IniFileRead(filename, section, key, IntToStr(defaultValue, str)).c_str());
+}
+
+void IniFileWrite(const string& filename, const string& section, const string& key, int value)
+{
+    char str[48];
+    IniFileWrite(filename, section, key, IntToStr(value, str));
+}
+
+
+#ifdef TEST_SIMPLE_INI_TOOL
+
+#define CheckEqaul(a, b) ((a)!=(b))?(printf("CheckFailed %s == %s\n", #a, #b)):0
+int main()
+{
+    const char* testFile = "test_simple_ini_tool.ini";
+
+    // 清空文件
+    fclose(fopen(testFile, "w"));
+
+    // 写入数据
+    IniFileWrite(testFile, "section0", "key0", "value0");
+    IniFileWrite(testFile, "section0", "key1", 1);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value0");
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", "valuee"), "1");
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", 0), 1);
+
+    // 读取未有的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", 1), 1);
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", 1), 1);
+
+    // 写入的二个section
+    IniFileWrite(testFile, "section1", "key0", "value10");
+    IniFileWrite(testFile, "section1", "key1", 11);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", "valuee"), "value10");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", "valuee"), "11");
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 11);
+
+    // 改写数据
+    IniFileWrite(testFile, "section0", "key0", "value00");
+    IniFileWrite(testFile, "section1", "key1", 111);
+
+    // 检查数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value00");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 111);
+
+    return 0;
+}
+
+#endif // 

+ 26 - 0
DevAdapter/gwi/Ups.1.1/simple_ini_tool.h

@@ -0,0 +1,26 @@
+/**
+ * @file simple_ini_tool.h
+ * @brief 简单的ini文件读写工具,仅支持多字节和一次读写,并不考虑性能
+ */
+#ifndef SIMPLE_INI_TOOL_H
+#define SIMPLE_INI_TOOL_H
+
+#include <string>
+#include <list>
+
+std::string IniFileRead(const std::string& filename, const std::string& section, const std::string& key, const std::string& defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, const std::string& key, int defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, const std::string& value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, int value);
+
+#endif /* SIMPLE_INI_TOOL_H */
+

+ 32 - 0
DevAdapter/gwi/rfic.1.1/CMakeLists.txt

@@ -0,0 +1,32 @@
+# ����ģ�����Ƶ�ǰ׺������
+rvc_dev_define_module("ContactlessCard")
+
+# rvc_dev_config_library ����Ҫʹ������������������ƴ��������������ļ�����
+set(${MODULE_PREFIX}_VENDOR "gwi")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# �������
+if(CMAKE_COMPILER_IS_GNUCXX)
+    set(CMAKE_CXX_FLAGS "-w -fexceptions -fPIC -fpermissive -std=c++11")
+endif(CMAKE_COMPILER_IS_GNUCXX)
+
+# ����Ҫ�����ʵ���ļ���rvc_dev_config_library ��ʹ��
+set(${MODULE_PREFIX}_SRCS SHARED
+        ContactlessCardDriverGWI.cpp 
+        ContactlessCardGWI.cpp 
+		simple_ini_tool.cpp
+        Loadmt32so.cpp
+        )
+
+# ������������Ҫͨ���˺���� add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+# ${MODULE_FULL_NAME} �� TAGET ���ƣ��� rvc_dev_config_library �ж���
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}")
+
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {����������}/CMakeLists.txt �������������������=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 802 - 0
DevAdapter/gwi/rfic.1.1/ContactlessCardDriverGWI.cpp

@@ -0,0 +1,802 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ContactlessCardDriverGWI.h"
+#include "GwiLogFile.h"
+#include "simple_ini_tool.h"
+#include <dlfcn.h>
+
+#define CONFIG_CONTACTLESS		"gwiContactless.ini"
+
+CLogFile *m_plogFile = NULL;
+int icdev = NULL;
+int CommType = 0;	//0-USB,1-串口 chr20200320
+
+enum GWI_ErrorCodeEnum
+{
+	GWI_Error_Succeed=0,
+	GWI_Error_UnKnown,
+	//动态库加载
+	GWI_Error_Dll_Load = 1000,	//动态库加载失败
+	GWI_Error_Dll_Method,			//方法错
+	GWI_Error_Dll_Param,			//参数错
+	GWI_Error_Dll_Condition,		//条件错
+	GWI_Error_Dll_Config,
+	GWI_Error_Dll_RecvBuf,
+	GWI_Error_Dll_Thread,
+	GWI_Error_Dll_TimeOut,
+
+	//DEV错
+	GWI_Error_Dev_Busy = 1100,
+	GWI_Error_Dev_Offline,
+	GWI_Error_Dev_Error,
+	GWI_Error_System,
+	GWI_Error_Dev_Open,
+	GWI_Error_Dev_Close,
+	GWI_Error_Dev_Comm,
+	GWI_Error_Dev_Conn,
+	GWI_Error_Dev_TimeOut,
+	GWI_Error_Dev_Connect,
+	GWI_Error_Dev_Fault,
+	GWI_Error_Dev_Init,
+	GWI_Error_Dev_Reset,
+	GWI_Error_Dev_State,
+	GWI_Error_Dev_Ver,
+
+	//介质
+	GWI_Error_Media_NoCard = 1200,
+	GWI_Error_Media_State,
+	GWI_Error_Media_Read,
+	GWI_Error_Media_Type,
+	GWI_Error_Media_PowerOn,
+	GWI_Error_Media_PowerOff,
+	GWI_Error_Media_Inhale,
+	GWI_Error_Media_Eject,
+
+	//RF
+	GWI_Error_RF_ChipOn,
+	GWI_Error_RF_ChipOff,
+	GWI_Error_RF_Reset,
+	GWI_Error_RF_States,
+	GWI_Error_RF_Cmd,
+};
+
+
+typedef struct tagStErrorInfo
+{
+	int gwiErrorCode;
+	char description[MAX_DEV_ERROR_MSG_LEN];
+	ErrorCodeEnum errorcode;
+} StErrorInfo;
+
+
+
+StErrorInfo gstErrorInfo[] = 
+{
+	{GWI_Error_Dll_Load,		"Can not load dll",							Error_DevLoadFileFailed},
+	{GWI_Error_Dll_Method,		"Command or fun not supported",				Error_MethodNotFound},
+	{GWI_Error_Dll_Param,		"Param not supported",                      Error_Param},
+	{GWI_Error_Dll_Condition,	"Condition not contented",                  Error_InvalidState},
+	{GWI_Error_Dll_Config,		"Config error",                             Error_Hardware},
+	{GWI_Error_Dll_RecvBuf, "Receive data buffer overflow",                 Error_Hardware},
+	{GWI_Error_Dll_Thread, "Thread point is NULL",                          Error_Null},
+	{GWI_Error_Dll_TimeOut, "Function execute timeout",                     Error_TimeOut},
+
+	{GWI_Error_Dev_Busy, "Busy",											Error_Hardware},
+	{GWI_Error_Dev_Offline, "dev Offline",									Error_Hardware},
+	{GWI_Error_Dev_Error, "dev erro",										Error_Hardware},
+	{GWI_Error_Dev_Open, "Open dev error",									Error_DevConnFailed},
+	{GWI_Error_Dev_Close, "Close dev error",								Error_DevConnFailed},
+	{GWI_Error_Dev_Conn, "connect error",									Error_DevConnFailed},
+	{GWI_Error_Dev_Comm, "Communication error",								Error_DevCommFailed},
+	{GWI_Error_Dev_TimeOut, "Read data time over",							Error_TimeOut},
+	{GWI_Error_Dev_Connect, "Connect power error or other",                 Error_DevConnFailed},
+	{GWI_Error_Dev_Fault, "Device fault.",									Error_Hardware},
+	{GWI_Error_Dev_Init, "Dev Initialize error",							Error_NotInit},
+	{GWI_Error_Dev_Reset, "Dev Initialize error",							Error_NotInit},
+	{GWI_Error_Dev_State, "Dev State error",								Error_InvalidState},
+	{GWI_Error_Dev_Ver, "Dev Ver error",									Error_InvalidState},
+
+
+	{GWI_Error_Media_NoCard, "Not found Card",                              Error_Hardware},
+	{GWI_Error_Media_Read, "Failed to read card",                           Error_Hardware},
+	{GWI_Error_Media_State, "Failed to get card State",                     Error_Hardware},
+	{GWI_Error_Media_Type, "Incorrect card type.",                          Error_NoPrivilege},
+	{GWI_Error_Media_PowerOn, "Failed to PowerOn iccard",                   Error_NoPrivilege},
+	{GWI_Error_Media_PowerOff, "Failed to PowerOff iccard",                 Error_NoPrivilege},
+	{GWI_Error_Media_Inhale, "Failed to Inhale iccard",						Error_NoPrivilege},
+	{GWI_Error_Media_Eject, "Failed to Eject iccard",						Error_NoPrivilege},
+
+	//RF
+	{GWI_Error_RF_ChipOn, "Incorrect chip on RF",							Error_Hardware},
+	{GWI_Error_RF_ChipOff, "Failed to chip off RF",							Error_Hardware},
+	{GWI_Error_RF_Reset, "Failed to reset RF",								Error_Hardware},
+	{GWI_Error_RF_States, "Failed to get RF states",						Error_NoPrivilege},
+	{GWI_Error_RF_Cmd, "Failed to send apdu ",								Error_IO},	
+
+	{GWI_Error_System, "System error(exception)",							Error_Hardware},
+	{GWI_Error_UnKnown, "UnKnown",											Error_Succeed},
+	{GWI_Error_Succeed, "success",											Error_Succeed}
+};
+
+void GetDllLoadPath(char *pOutDllPath)
+{
+	if(NULL == pOutDllPath)
+		return;
+
+#ifdef  _WINDOWS
+	strcpy(pOutDllPath,g_myDllPath);
+#else
+	Dl_info dl_info;	//dladdr获取某个地址的符号信息
+	int rc = dladdr((void*)GetDllLoadPath, &dl_info);  
+	strcpy(pOutDllPath,dl_info.dli_fname);
+	char *pName = strrchr(pOutDllPath, '/');
+	*pName = '\0'; 
+#endif
+}
+
+CContactlessCard::CContactlessCard(void)
+{
+    if(NULL == m_plogFile)
+    {
+        m_plogFile = new CLogFile(LAYER);
+	    m_plogFile->init();
+
+        LogARG(m_plogFile, Log_Debug, "CContactlessCard", "Init CMB LOG success!");
+    }
+
+	//加载动态库
+	mt.Loadmt32so();
+	
+	LogARG(m_plogFile, Log_Debug, "CContactlessCard", "Loadmt32so success!");
+	
+	m_deviceStatus = DEVICE_STATUS_NOT_READY;
+	m_ErrorCode = GWI_Error_Succeed;
+
+	//打开设备
+	int AutoOpen = 0;
+	int Port = 0;
+	int Baud = 0;
+    char szConfPath[260] = {0};
+    char szDllPath[260] = {0};
+
+	GetDllLoadPath(szDllPath);
+    sprintf(szConfPath, "%s/gwi/%s", szDllPath, CONFIG_CONTACTLESS);      
+
+    CommType = IniFileRead(szConfPath, "DEVICE", "CommType", 0);
+	AutoOpen = IniFileRead(szConfPath, "DEVICE", "AutoOpen", 0);
+	LogARG(m_plogFile, Log_Debug, "CContactlessCard", "read conf CommType=[%d], AutoOpen=[%d], Port=[%d], Baud=[%d]", CommType, AutoOpen, Port, Baud);
+	if(AutoOpen == 1)
+	{	
+		Port = IniFileRead(szConfPath, "DEVICE", "Port", 3);
+		Baud = IniFileRead(szConfPath, "DEVICE", "Baud", 115200);
+		LogARG(m_plogFile, Log_Debug, "CContactlessCard", "read conf CommType=[%d], AutoOpen=[%d], Port=[%d], Baud=[%d]", CommType, AutoOpen, Port, Baud);
+		DevOpen(Port,Baud);
+	}
+
+ 	LogARG(m_plogFile, Log_Debug, "CContactlessCard", "read conf CommType=[%d], AutoOpen=[%d], Port=[%d], Baud=[%d]", CommType, AutoOpen, Port, Baud);
+}
+
+
+CContactlessCard::~CContactlessCard(void)
+{
+	LogARG(m_plogFile, Log_Infor, "~CContactlessCard", "Enter...析构");
+	mt.Freemt32so();
+
+	/*
+	if(NULL != h_dll)
+	{
+		FreeLibrary(h_dll);
+		h_dll = NULL;
+	}
+	*/
+}
+
+ErrorCodeEnum ConvertErrorCode(int gwiErrorCode)
+{
+	int i = 0;
+
+	for(; gstErrorInfo[i].errorcode != Error_Succeed; ++i)
+	{
+		if(gwiErrorCode==gstErrorInfo[i].gwiErrorCode)
+		{
+			return gstErrorInfo[i].errorcode;
+		}
+	}
+	return Error_Succeed;
+}
+
+/************************************
+ Method   : GetDevCategory
+ Function : Get category infomation about device.
+ Parameter: DevCategoryInfo & devCategory
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	//TODO
+	int ret = 0;
+    unsigned char verlen = 0;
+    unsigned char verdata[100];
+    memset(verdata,0,100);
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevCategory", "icdev=NULL");
+		m_ErrorCode = GWI_Error_Dev_Ver;
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	//取固件版本
+	ret = mt.dev_get_version(icdev, 1, &verlen, verdata);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevCategory", "Err: dev_get_version ret = %d",ret);
+		m_ErrorCode = GWI_Error_Dev_Ver;
+		return ConvertErrorCode(m_ErrorCode);
+	}
+	if(verlen == 0)
+	{
+		LogARG(m_plogFile, Log_Warning, "GetDevCategory", "Warn: dev_get_version verlen = 0");
+	}
+	else
+	{
+		LogARG(m_plogFile, Log_Debug, "GetDevCategory", "dev_get_version verlen = [%d], verdata = [%s]", verlen, &verdata[17]);
+	}
+	
+
+	memset(&devCategory, 0x00, sizeof(DevCategoryInfo));
+
+	//memcpy(devCategory.szType, "ACT-R2-420-nfc", sizeof("ACT-R2-420-nfc"));
+	//memcpy(devCategory.szVendor, "GWI_mellisa", sizeof("GWI_mellisa"));
+	memcpy(devCategory.szType, "PVER=ACT#MID=ACT-R2-420-nfc", sizeof("PVER=ACT#MID=ACT-R2-420-nfc"));
+	memcpy(devCategory.szVendor, "GWI", sizeof("GWI"));
+	sprintf(devCategory.szModel, "CM=#PM=#PID=#MID=#FWID=%.8s#SLYLE=#Funcution=#CID=", &verdata[verlen-8]);
+
+	devCategory.eState = m_deviceStatus;
+
+	//设置版本信息(可以通过WINAPI从版本资源中获取版本信息)
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 0;
+	devCategory.version.wRevision = 0;
+	devCategory.version.wBuild = 0;
+
+	return Error_Succeed;
+}
+
+/************************************
+ Method   : Reset
+ Function : Do the cleaning work and initialize device again in order to return to the normal condition.
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::Reset()
+{
+	int ret;
+
+	m_ErrorCode = GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, "Reset", "Enter");
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset", "icdev=NULL");
+		m_ErrorCode = GWI_Error_RF_Reset;
+		LogARG(m_plogFile, Log_Error, "Reset", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	//复位 Linux下没有复位函数,暂时借鉴驱动处理
+	unsigned char ContactStatus=0;
+	unsigned char NoContactStatus=0;
+	unsigned char MagCardStatus=0;
+	unsigned char IDCardStatus=0;
+	ret = mt.dev_getdevicestatus_bymodule(icdev, &ContactStatus, &NoContactStatus, &MagCardStatus, &IDCardStatus);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "Reset", "Err: dev_getdevicestatus_bymodule ret = %d",ret);
+		m_ErrorCode = GWI_Error_RF_Reset;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "Reset", "Exit: m_ErrorCode = %d", m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+/************************************
+ Method   : DevClose
+ Function : Close device and do the cleaning work.
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   : ex. close connection,close port,release memery and so on    
+************************************/
+ErrorCodeEnum CContactlessCard::DevClose()
+{
+	int ret;
+
+	m_ErrorCode = GWI_Error_Succeed;
+	m_deviceStatus = DEVICE_STATUS_NORMAL;
+	LogARG(m_plogFile, Log_Infor, "DevClose", "Enter");
+
+	if(icdev == 0)
+	{
+		LogARG(m_plogFile, Log_Warning, "DevClose", "icdev==NULL");
+		//m_ErrorCode = GWI_Error_Dev_Close;
+		LogARG(m_plogFile, Log_Warning, "DevClose", "Exit: m_ErrorCode = %d", m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	ret = mt.dev_close_device(icdev);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "DevClose", "Err: dev_close_device ret = %d",ret);
+		m_ErrorCode = GWI_Error_Dev_Close;
+	}
+
+	icdev = 0;
+	
+	LogARG(m_plogFile, Log_Infor, "DevClose", "Exit: m_ErrorCode = %d", m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+/************************************
+ Method   : GetLastErr
+ Function : Get last error the device issued.
+ Parameter: DevErrorInfo & devErrInfo
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   : Error message must include explanatory memorandum ,the original error   
+			code and anything in favour of location problem.
+************************************/
+ErrorCodeEnum CContactlessCard::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	int i = 0;
+	memset(&devErrInfo, 0x00, sizeof(DevErrorInfo));
+
+	//陈祖国 20190416 未初始化会越界,写法不规范
+	for(; gstErrorInfo[i].errorcode != Error_Succeed && i < sizeof(gstErrorInfo)/sizeof(StErrorInfo); ++i)
+	{
+		if(m_ErrorCode == gstErrorInfo[i].gwiErrorCode)
+		{
+			devErrInfo.dwErrMsgLen = strlen(gstErrorInfo[i].description);
+			memcpy(devErrInfo.szErrMsg, gstErrorInfo[i].description, devErrInfo.dwErrMsgLen);
+			break;
+		}
+	}
+
+	return Error_Succeed;
+}
+
+/************************************
+ Method   : DevOpen
+ Function : device initialization
+ Parameter: DWORD dwPort
+ Parameter: DWORD dwBaudRate
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::DevOpen(DWORD dwPort,DWORD dwBaudRate)
+{
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "Enter");
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "inputData: dwPort = %d, dwBaudRate = %d",dwPort,dwBaudRate);
+
+	//int ret;
+	m_ErrorCode = GWI_Error_Succeed;
+	
+	if(icdev > 0)
+	{
+		//mt.dev_close_device(icdev);
+		LogARG(m_plogFile, Log_Warning, "DevOpen", "icdev > NULL");
+		LogARG(m_plogFile, Log_Warning, "DevOpen", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+	if((CommType == 1) && (dwPort > 0))
+	{
+		char szport[8] = {0x00};
+		sprintf(szport,"COM%d", dwPort);
+		int m_port = dwPort - 1;
+		if(m_port <= 0)
+		{
+			m_port = 0;
+		}
+		LogARG(m_plogFile, Log_Debug, "DevOpen", "CommType=1, dwPort=[%d], dwBaudRate=[%d], oldsof=[%d]", dwPort, dwBaudRate, mt.oldsof);
+		if(mt.oldsof == 1)
+		{
+			icdev = mt.dev_open_device_serial(m_port, (int)dwBaudRate);
+		}
+		else
+		{
+			icdev = mt.dev_open_device_serial(szport, (int)dwBaudRate);
+		}
+		
+		LogARG(m_plogFile, Log_Debug, "DevOpen", "icdev=[%d]", icdev);
+	}
+	else
+	{
+		icdev = mt.dev_open_device((unsigned char *)"USB", 0);
+		//icdev = mt.dev_open_device(0, 0);
+		LogARG(m_plogFile, Log_Debug, "DevOpen", "icdev=[%d]", icdev);
+	}
+		
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "DevOpen", "Err: dev_open_device icdev = %d",icdev);
+		m_ErrorCode = GWI_Error_Dev_Open;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "DevOpen", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+/************************************
+ Method   : GetDevStatus
+ Function : Get card reader status
+ Parameter: RFICReaderStatus & devStatus
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::GetDevStatus(RFICReaderStatus &devStatus)
+{	
+	LogARG(m_plogFile, Log_Infor, "GetDevStatus", "Enter");
+
+	int ret;
+//	int status;
+	m_ErrorCode = GWI_Error_Succeed;
+
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevStatus", "icdev=NULL");
+		m_ErrorCode =  GWI_Error_Dev_State;;
+		LogARG(m_plogFile, Log_Error, "GetDevStatus", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+	
+	unsigned char ContactStatus = 0;		     
+	unsigned char NoContactStatus = 1;
+	unsigned char MagCardStatus = 0;
+	unsigned char IDCardStatus = 1;
+
+	//ret =XFS_GetMediaStatus(icdev,&ContactType,&NoContactType,&IDCardType);
+	//需要单独处理,暂无Linux下的接口
+	ret = mt.dev_getdevicestatus_bymodule(icdev, &ContactStatus,&NoContactStatus,&MagCardStatus,&IDCardStatus);
+	if(ret !=0)
+	{
+		LogARG(m_plogFile, Log_Error, "GetDevStatus", "Err: dev_getcardtype_bymodule ret = %d",ret);
+		devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
+		m_ErrorCode = GWI_Error_Dev_State;
+	}
+	else
+	{
+		LogARG(m_plogFile, Log_Infor, "GetDevStatus", "ContactStatus=%d,NoContactStatus=%d,MagCardStatus=%d, IDCardStatus=%d",ContactStatus,NoContactStatus,MagCardStatus, IDCardStatus);
+
+		if(IDCardStatus == 1)
+		{
+			devStatus.eMediaPos = CI_MEDIA_IDCARD;
+		}
+		else if(NoContactStatus == 1)
+		{
+			devStatus.eMediaPos = CI_MEDIA_RF;
+		}
+		else
+		{
+			devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
+		}
+
+		unsigned char ContactType = 0;
+		unsigned char NoContactType = 1;
+		unsigned char IDCardType = 1;
+
+		ret = mt.dev_getcardtype_bymodule(icdev, &ContactType, &NoContactType, &IDCardType);
+		LogARG(m_plogFile, Log_Infor, "GetDevStatus", "ContactType=%d,NoContactType=%d,IDCardType=%d",ContactType,NoContactType,IDCardType);
+
+		if(IDCardType == 1)
+		{
+			devStatus.eMediaPos = CI_MEDIA_IDCARD;
+		}
+		else if(NoContactType == 1)
+		{
+			devStatus.eMediaPos = CI_MEDIA_RF;
+		}
+		else
+		{
+			devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
+		}
+
+	}
+
+	LogARG(m_plogFile, Log_Infor, "GetDevStatus", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+/************************************
+ Method   : AbortRead
+ Function : Abort current operation.
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::AbortRead()
+{
+	LogARG(m_plogFile, Log_Infor, "AbortRead", "Enter");
+	//int ret;
+
+	m_ErrorCode = GWI_Error_Succeed;
+	
+/*
+	ret =XFS_ChipPowerOff();
+	if(ret !=0)
+	{
+		if(logFile) logFile->Log_Error(myName, __FILE__, __LINE__, __FUNCDNAME__,"Err: XFS_ChipPowerOff ret = %d",ret);
+		m_ErrorCode = GWI_Error_RF_ChipOff;
+	}
+*/
+	LogARG(m_plogFile, Log_Infor, "AbortRead", "Exit: m_ErrorCode = %d",m_ErrorCode);
+
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+//
+//	Active contactless card(Type A,B,Mifare)
+//	The first,second,third activation order decided by fstType,scdType,thdType respectively
+//	fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
+//	outType indicates the type of  activation result
+//
+/************************************
+ Method   : ActiveContactlessICCard
+ Function :
+ Parameter: char fstType
+ Parameter: char scdType
+ Parameter: char thdType
+ Parameter: char & outType
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+inline void HEX_2_DSP(unsigned char *hex,unsigned char *dsp,int count)
+{
+	unsigned  buf[3];
+	int i;
+	for(i=0;i<count;i++){
+		sprintf((char *)buf, "%02X", (char *)hex[i]);
+		memcpy(&dsp[i*2], buf, 2);
+	}
+	dsp[count*2]=0x0;
+
+}
+
+ErrorCodeEnum CContactlessCard::ActiveContactlessICCard(char fstType,char scdType,char thdType,char &outType)
+{
+	LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "Enter");
+	LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "inputData: fstType = %x, scdType = %x, thdType = %x",fstType,scdType,thdType);
+	
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "ActiveContactlessICCard", "icdev=NULL");
+		m_ErrorCode =  GWI_Error_RF_ChipOn;
+		LogARG(m_plogFile, Log_Error, "ActiveContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	int ret;
+	unsigned char pchInitData[256] = {0x00}, snr[32] = {0};
+	unsigned char snrlen = 0, rlen = 0;
+	unsigned char cardtype = 0x0A;
+	m_ErrorCode = GWI_Error_Succeed;
+
+	ret = mt.dev_open_card(icdev, 0, &cardtype, &snrlen, snr, (unsigned char*)&rlen, (unsigned char*)pchInitData);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "ActiveContactlessICCard", "Err: dev_open_card ret = %d, pchInitData = %s",ret,pchInitData);
+		m_ErrorCode = GWI_Error_RF_ChipOn;
+	}
+	else
+	{
+		char snrDispBuff[1024] = {0};
+		memset(snrDispBuff,0,sizeof(snrDispBuff));
+		HEX_2_DSP((unsigned char*)snr, (unsigned char *)snrDispBuff, snrlen);
+		char soutDispBuff[1024] = {0};
+		memset(soutDispBuff,0,sizeof(soutDispBuff));
+		HEX_2_DSP((unsigned char*)pchInitData, (unsigned char *)soutDispBuff, rlen);
+
+		LogARG(m_plogFile, Log_Debug, "ActiveContactlessICCard", "ret=[%d],cardtype=[%X],snrlen=[%d],snr=[%s],rlen=[%d],pchInitData=[%s]",ret,cardtype,snrlen,snrDispBuff,rlen,soutDispBuff);
+
+		outType = '0';
+		unsigned short DelayTime = 0x0500; 
+		unsigned char  BeepTimes = 1;
+		LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "dev_beep Entry");
+		int retB = mt.dev_beep(icdev, DelayTime, BeepTimes);
+		LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "dev_beep End ret=[%d]", ret);
+	}
+
+	LogARG(m_plogFile, Log_Infor, "ActiveContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+/************************************
+ Method   : DeactContactlessICCard
+ Function : Deactivate contactless IC card
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::DeactContactlessICCard()
+{
+	LogARG(m_plogFile, Log_Infor, "DeactContactlessICCard", "Enter");
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "DeactContactlessICCard", "icdev=NULL");
+		m_ErrorCode =  GWI_Error_RF_ChipOff;
+		LogARG(m_plogFile, Log_Error, "DeactContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	int ret;
+	m_ErrorCode = GWI_Error_Succeed;
+	
+	//ret =XFS_ChipPowerOff(icdev,0);
+	ret = mt.dev_rf_halt(icdev, 0);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "DeactContactlessICCard", "Err: dev_rf_halt ret = %d",ret);
+		m_ErrorCode = GWI_Error_RF_ChipOff;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "DeactContactlessICCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+/************************************
+ Method   : WarmReset
+ Function : Warm reset card(IC)
+ Returns  : ErrorCodeEnum
+ author   : CHR 2017/12/24 
+ Remark   :    
+************************************/
+ErrorCodeEnum CContactlessCard::WarmReset()
+{
+	LogARG(m_plogFile, Log_Infor, "WarmReset", "Enter");
+	
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "WarmReset", "icdev=NULL");
+		m_ErrorCode =  GWI_Error_RF_ChipOn;
+		LogARG(m_plogFile, Log_Error, "WarmReset", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	int ret;
+	unsigned char pchInitData[256] = {0x00}, snr[32]={0};
+	unsigned char snrlen = 0, rlen = 0;
+	unsigned char cardtype = 0x0A;
+	m_ErrorCode = GWI_Error_Succeed;
+
+	ret = mt.dev_open_card(icdev, 0, &cardtype, &snrlen, snr, (unsigned char*)&rlen, (unsigned char*)pchInitData);
+	LogARG(m_plogFile, Log_Debug, "ActiveContactlessICCard", "ret=[%d],cardtype=[%X],snrlen=[%d],snr=[%s],rlen=[%d],pchInitData=[%s]",ret,cardtype,snrlen,snr,rlen,pchInitData);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "WarmReset", "Err: dev_open_card ret = %d, pchInitData = %s",ret,pchInitData);
+		m_ErrorCode = GWI_Error_RF_ChipOn;
+	}
+	else
+	{
+		unsigned short DelayTime=0x0500; 
+		unsigned char  BeepTimes=1;
+		LogARG(m_plogFile, Log_Infor, "WarmReset", "dev_beep Entry");
+		//int retB = XFS_device_beep(icdev, DelayTime, BeepTimes);
+		int retB = mt.dev_beep(icdev, DelayTime, BeepTimes);
+		LogARG(m_plogFile, Log_Infor, "WarmReset", "dev_beep End ret=[%d]", ret);
+	}
+
+	LogARG(m_plogFile, Log_Infor, "WarmReset", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+//
+//	Mifare operation
+//	Arguments:
+//	- eFunType:function type as load key,authentication and so on
+//	- return/data(hex) byte order like BIG EDIAN. ex:0x12345678 --> data[i] = 0x12,data[i+1] = 0x34,data[i+2] = 0x56,data[i+3] = 0x78
+//	- sendBuf:[parameter(hex)][data(hex)]
+//	- recvBuf:[status(1byte)][return data(hex)]
+//		-- [eFunType],[parameter,data],[status(1byte),return data]
+//		-- [CI_MIFARE_LOAD_KEY],[key select(1byte),sector num(1byte),uncoded keys(6bytes)],[status(1byte)]
+//		-- [CI_MIFARE_AUTH],[key select(1byte),sector num(1byte)],[status(1byte)]
+//		-- [CI_MIFARE_READ],[block num(1byte)],[status(1byte),data(16bytes)]
+//		-- [CI_MIFARE_WRITE],[block num(1byte),data(16bytes)],[status(1byte)] 
+//		-- [CI_MIFARE_INC],[source block num(1byte),destination block num(1byte),inc value(4bytes)],[status(1byte)]
+//		-- [CI_MIFARE_DEC],[source block num(1byte),destination block num(1byte),dec value(4bytes)],[status(1byte)]
+//		-- key select(1byte):AKey(00h),BKey(01h)
+//		-- status(1byte):OK(00h),other error code(!00h)
+
+ErrorCodeEnum CContactlessCard::MifareCommand(MifareFuctionEnum eFunType,CmdInfo sendBuf,CmdInfo &recvBuf)
+{//TODO 
+	m_ErrorCode = GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, "MifareCommand", "Enter");
+	m_ErrorCode = GWI_Error_Dll_Method;
+	LogARG(m_plogFile, Log_Infor, "MifareCommand", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+//
+//	RF Type A,B command.
+//	APDU:Application Protocol Data Unit
+//	Arguments:
+// 	- CmdSend.lpCmd:Command-APDU
+// 	- CmdRecv.lpData:Response-APDU
+//
+ErrorCodeEnum CContactlessCard::RFTypeABCommand(CmdInfo sendBuf, CmdInfo &recvBuf)
+{
+	LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "Enter");
+	{
+		char sDispBuff[1024]={0};
+		memset(sDispBuff,0,sizeof(sDispBuff));
+		HEX_2_DSP((unsigned char*)sendBuf.data, (unsigned char *)sDispBuff, sendBuf.dwSize);
+		LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "DSP sendBuf.data = %s, sendBuf.dwSize = %d",(char*)sDispBuff,sendBuf.dwSize);
+	}
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "icdev=NULL");
+		m_ErrorCode =  GWI_Error_RF_Cmd;
+		LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	int ret;
+	unsigned char pchInitData[256] = {0x00}, snr[32] = {0};
+	unsigned char snrlen = 0, rlen = 0;
+	unsigned char cardtype = 0x0A;
+	m_ErrorCode = GWI_Error_Succeed;
+
+	ret = mt.dev_open_card(icdev, 0, &cardtype, &snrlen, snr, (unsigned char*)&rlen, (unsigned char*)pchInitData);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "Err: dev_open_card ret = %d, pchInitData = %s",ret,pchInitData);
+		m_ErrorCode = GWI_Error_RF_ChipOn;
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	int revlen = 0;
+	ret = mt.dev_card_APDU(icdev, 0xFF, sendBuf.dwSize, (unsigned char*)sendBuf.data, &revlen, recvBuf.data);
+	if(ret !=0)
+	{
+		LogARG(m_plogFile, Log_Error, "RFTypeABCommand", "Err: dev_card_APDU ret = %d",ret);
+		m_ErrorCode = GWI_Error_RF_Cmd;
+	}
+	else
+	{
+		recvBuf.dwSize = revlen;
+		char sDispBuff[1024]={0};
+		memset(sDispBuff,0,sizeof(sDispBuff));
+		HEX_2_DSP((unsigned char*)recvBuf.data, (unsigned char *)sDispBuff, recvBuf.dwSize);
+		LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "DSP recvBuf.data = %s, recvBuf.dwSize = %d",sDispBuff,recvBuf.dwSize);
+	}
+
+	LogARG(m_plogFile, Log_Infor, "RFTypeABCommand", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}
+
+//halt card
+//card have been halted must move from induction zone then can be found again
+ErrorCodeEnum CContactlessCard::HaltCard()
+{
+	LogARG(m_plogFile, Log_Infor, "HaltCard", "Enter");
+	if(icdev <= 0)
+	{
+		LogARG(m_plogFile, Log_Error, "HaltCard", "icdev=NULL");
+		m_ErrorCode =  GWI_Error_RF_Reset;
+		LogARG(m_plogFile, Log_Error, "HaltCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
+		return ConvertErrorCode(m_ErrorCode);
+	}
+
+	int ret;
+	m_ErrorCode = GWI_Error_Succeed;
+
+	ret = mt.dev_rf_halt(icdev, 0);
+	if(ret != 0)
+	{
+		LogARG(m_plogFile, Log_Error, "HaltCard", "Err: dev_rf_halt ret = %d",ret);
+		m_ErrorCode = GWI_Error_RF_Reset;
+	}
+
+	LogARG(m_plogFile, Log_Infor, "HaltCard", "Exit: m_ErrorCode = %d",m_ErrorCode);
+	return ConvertErrorCode(m_ErrorCode);
+}

+ 46 - 0
DevAdapter/gwi/rfic.1.1/ContactlessCardDriverGWI.h

@@ -0,0 +1,46 @@
+#ifndef LIBFRAMEWORK_RFIC_RFICT_H
+#define LIBFRAMEWORK_RFIC_RFICT_H
+
+#ifndef _WINDOWS
+#include "Loadmt32so.h"
+#endif
+
+#include "RFICClass.h"
+#include "GwiLogFile.h"
+
+#define RET_SUCCESS     0
+#define LAYER ("ContactlessCard")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+#ifndef MAX_PATH
+	#define MAX_PATH (261)
+#endif
+
+class CContactlessCard : public RFICClass
+{
+public:
+    CContactlessCard();
+    ~CContactlessCard();
+
+	ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+	ErrorCodeEnum DevOpen(DWORD dwPort,DWORD dwBaudRate);
+	ErrorCodeEnum GetDevStatus(RFICReaderStatus &devStatus);
+	ErrorCodeEnum AbortRead();
+	ErrorCodeEnum ActiveContactlessICCard(char fstType,char scdType,char thdType,char &outType);
+	ErrorCodeEnum DeactContactlessICCard();	
+	ErrorCodeEnum WarmReset();
+	ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType,CmdInfo sendBuf,CmdInfo &recvBuf);
+	ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf,CmdInfo &recvBuf);
+	ErrorCodeEnum HaltCard();
+	ErrorCodeEnum Reset();
+	ErrorCodeEnum DevClose();
+	ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+private:
+  	mt32so mt;
+	DevStateEnum m_deviceStatus;
+	int m_ErrorCode;
+
+};
+
+#endif

+ 66 - 0
DevAdapter/gwi/rfic.1.1/ContactlessCardGWI.cpp

@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include "ContactlessCardDriverGWI.h"
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pOutDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+#endif
+{
+    pOutDevAptObj = new CContactlessCard();
+    if(pOutDevAptObj == NULL)
+    {
+        return Error_Resource;
+    }
+    return Error_Succeed;
+}
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DWORD dwDevClassID, DeviceBaseClass*& pInDevAptObj)
+#else
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+#endif
+{
+    if(pInDevAptObj == NULL)
+    {
+        return Error_Param;
+    }
+    if(CContactlessCard* pTmp = dynamic_cast<CContactlessCard*>(pInDevAptObj))
+    {
+        delete pTmp;
+        pTmp = NULL;
+        return Error_Succeed;
+    }
+    return Error_Param;
+}
+
+#ifdef _WINDOWS
+
+char g_myDllPath[MAX_PATH]={0};
+char g_myDllName[MAX_PATH]={0};			//我的名字
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	    case DLL_PROCESS_ATTACH:
+		{
+			GetModuleFileName(hModule,g_myDllPath,MAX_PATH);	//取当前模块全路径(动态库,并非执行文件)
+			strcpy(g_myDllName,strrchr(g_myDllPath,'\\')+1);
+			strcpy(strrchr(g_myDllPath,'\\'),"\\");
+			char *p=strchr(g_myDllName,'.');
+			if(p!=NULL)
+				*p=0;
+		}break;
+	    case DLL_THREAD_ATTACH:
+	    case DLL_THREAD_DETACH:
+	    case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
+#endif

+ 153 - 0
DevAdapter/gwi/rfic.1.1/Loadmt32so.cpp

@@ -0,0 +1,153 @@
+#include "Loadmt32so.h"
+#include "stdio.h"
+#include "ContactlessCardDriverGWI.h"
+
+#ifndef _WINDOWS
+
+#include <dlfcn.h>
+#include<sys/stat.h>
+
+mt32so* mt32so::pmt32so = NULL;
+void* mt32so::hDevInst = NULL;
+
+extern CLogFile *m_plogFile;
+extern void GetDllLoadPath(char *pOutDllPath);
+
+mt32so::mt32so()
+{
+	hDevInst = NULL;
+	Openref = 0;
+	oldsof = 0;
+}
+
+mt32so* mt32so::GetInstance()
+{
+	if(pmt32so == NULL)
+		return new mt32so();
+	else
+		return pmt32so;
+}
+int mt32so::Loadmt32so()
+{
+	if(hDevInst)
+	{
+		LogARG(m_plogFile, Log_Debug, "Loadmt32so", "hDevInst is not 0");
+		return 0;
+	}
+	
+	char szPath[260] = {0};
+	char szCurPath[260] = {0};	
+
+	GetDllLoadPath(szCurPath);
+	//strcat(szPath, "/usr/KIOSK/Pisa/libmt3x32.so");
+    sprintf(szPath, "%s/gwi/libgwiMT3x32.so", szCurPath);      
+
+	printf("dlopen libgwiMT3x32.so: %s\n", szPath);
+	LogARG(m_plogFile, Log_Debug, "Loadmt32so", "szPath is:[%s]", szPath);
+	
+	//if((hDevInst = dlopen(szPath,RTLD_LAZY))  == NULL)
+	if((hDevInst = dlopen(szPath,RTLD_NOW))  == NULL)		
+	{
+		LogARG(m_plogFile, Log_Error, "Loadmt32so", "dlopen error");
+		memset(szPath, 0, sizeof(szPath));
+		strcpy(szPath, "/usr/KIOSK/Pisa/libmt3x32.so");
+		if((hDevInst = dlopen(szPath,RTLD_NOW))  == NULL)
+		{
+			LogARG(m_plogFile, Log_Error, "Loadmt32so", "dlopen error two");
+			return 1;
+		}
+	}
+
+	//�豸����������
+	dev_open_device				= (GWIopen_device)dlsym(hDevInst,"mt8_device_open");//�򿪶�����
+	dev_open_device_serial		= (GWIopen_device_serial)dlsym(hDevInst,"mt8_device_open_serial");//打开读卡器
+	dev_close_device			= (GWIclose_device)dlsym(hDevInst,"mt8_device_close");//�رն�����
+	dev_get_version				= (GWIget_version)dlsym(hDevInst,"mt8_device_version");//��ȡ��д���汾��Ϣ
+	dev_beep					= (GWIdev_beep)dlsym(hDevInst,"mt8_device_beep");//���ƶ�д���������ĵ��������ӳ�ʱ������д���
+	dev_setbaud					= (GWIdev_setbaud)dlsym(hDevInst,"mt8_device_setbaud");//���ô���ͨѶ������
+	dev_gettype					= (GWIdev_gettype)dlsym(hDevInst,"mt8_device_gettype");//��ȡ�豸�� PC ����ͨѶ��ʽ
+	dev_ledctrl					= (GWIdev_ledctrl)dlsym(hDevInst,"mt8_device_ledctrl");//���ƶ�д�� LED �ƿ���״̬
+	dev_readsnr					= (GWIdev_readsnr)dlsym(hDevInst,"mt8_device_readsnr");//��ȡ��д���������к�
+	dev_getdevicestatus_bymodule= (GWIdev_getdevicestatus_bymodule)dlsym(hDevInst,"mt8_Get_DeviceStatus_ByModule");//��ģ���ȡ�豸״̬ 
+	dev_getcardtype_bymodule	= (GWIdev_getcardtype_bymodule)dlsym(hDevInst,"mt8_Get_CardType_ByModule");//��ģ��ʶ���ѯ����֤�� �Ӵ� CPU ���� �ǽ� CPU ��(�˺���Ϊ����ũ����ר�ã�
+	//PSAM
+	dev_sam_slt_getstate		= (GWIdev_sam_slt_getstate)dlsym(hDevInst,"mt8_sam_slt_getstate");//�ж�ָ���������еĿ�Ƭ״̬�� �����Ӵ�ʽ�û����� PSAM ��
+	dev_sam_slt_reset			= (GWIdev_sam_slt_reset)dlsym(hDevInst,"mt8_sam_slt_reset");//��д����ָ��ʱ���ڶ�ָ����������Ѱ���� Ѱ�������Կ�Ƭ�ϵ縴λ
+	dev_sam_slt_reset_baud		= (GWIdev_sam_slt_reset_baud)dlsym(hDevInst,"mt8_sam_slt_reset_baud");//��д����ָ��ʱ���ڶ�ָ����������Ѱ���� Ѱ�������Կ�Ƭ�ϵ縴λ
+	dev_sam_slt_powerdown		= (GWIdev_sam_slt_powerdown)dlsym(hDevInst,"mt8_sam_slt_powerdown");//�ԽӴ�ʽ��Ƭ�����µ����	
+	//�Ӵ�ʽ�洢����������
+	dev_contact_settype			= (GWIdev_contact_settype)dlsym(hDevInst,"mt8_contact_settype");//���ý�������Ҫ�����Ĵ洢�������࣬ ��д������ʼ���Ĵ洢�������IJ���
+	dev_contact_identifytype	= (GWIdev_contact_identifytype)dlsym(hDevInst,"mt8_contact_identifytype");//ʶ��Ӵ�ʽ�洢������
+	dev_contact_passwordcheck	= (GWIdev_contact_passwordcheck)dlsym(hDevInst,"mt8_contact_passwordcheck");//У�������Ƿ���ȷ
+	dev_contact_read			= (GWIdev_contact_read)dlsym(hDevInst,"mt8_contact_read");//��ȡ�洢���ϵ�����
+	dev_contact_write			= (GWIdev_contact_write)dlsym(hDevInst,"mt8_contact_write");//���洢��д������
+	dev_contact_passwordinit	= (GWIdev_contact_passwordinit)dlsym(hDevInst,"mt8_contact_passwordinit");//��ʼ������Ŀ�Ƭ����
+	//�ǽӴ� CPU ������	
+	dev_open_card				= (GWIdev_open_card)dlsym(hDevInst,"mt8_open_card");//����ǽӴ�ʽ��
+	dev_rf_halt					= (GWIdev_rf_halt)dlsym(hDevInst,"mt8_rf_halt");//���÷ǽӴ�ʽ��ƬΪhalt״̬
+	dev_card_APDU				= (GWIdev_card_APDU)dlsym(hDevInst,"mt8_card_APDU");//Ӧ�ò������
+	//�ǽӴ�ʽ�洢����������
+	dev_rf_card					= (GWIdev_rf_card)dlsym(hDevInst,"mt8_rf_card");//����ǽӴ�ʽ�洢��
+	dev_rf_authentication		= (GWIdev_rf_authentication)dlsym(hDevInst,"mt8_rf_authentication");//�ǽӴ�ʽ�洢����֤����
+	dev_rf_read					= (GWIdev_rf_read)dlsym(hDevInst,"mt8_rf_read");//�ǽӴ�ʽ�洢������
+	dev_rf_write				= (GWIdev_rf_write)dlsym(hDevInst,"mt8_rf_write");//�ǽӴ�ʽ�洢��д��
+	dev_rf_readval				= (GWIdev_rf_readval)dlsym(hDevInst,"mt8_rf_readval");//�ǽӴ�ʽ�洢����ֵ��
+	dev_rf_initval				= (GWIdev_rf_initval)dlsym(hDevInst,"mt8_rf_initval");//�ǽӴ�ʽ�洢��дֵ��
+	dev_rf_increment			= (GWIdev_rf_increment)dlsym(hDevInst,"mt8_rf_increment");//�ǽӴ�ʽ�洢����ֵ
+	dev_rf_decrement			= (GWIdev_rf_decrement)dlsym(hDevInst,"mt8_rf_decrement");//�ǽӴ�ʽ�洢����ֵ
+	//��������֤��������
+	dev_IDCard_Read				= (GWIdev_IDCard_Read)dlsym(hDevInst,"mt8_IDCard_Read");//����֤��������ԭʼ����unicode
+	dev_IDCard_ReadCard			= (GWIdev_IDCard_ReadCard)dlsym(hDevInst,"mt8_IDCard_ReadCard");//����֤��������ԭʼ����ansi
+	dev_IDCard_GetCardInfo		= (GWIdev_IDCard_GetCardInfo)dlsym(hDevInst,"mt8_IDCard_GetCardInfo");//����������ȡ����֤���ݽṹ���и��±�����Ӧ������
+	dev_IDCard_Read_IDNUM		= (GWIdev_IDCard_Read_IDNUM)dlsym(hDevInst,"mt8_IDCard_Read_IDNUM");//��ȡ��ID��
+	dev_CLCard_Open				= (GWIdev_CLCard_Open)dlsym(hDevInst,"mt8_CLCard_Open");//��ȡ�ǽӴ�ʽ��Ƭ����
+	dev_IDCard_GetModeID		= (GWIdev_IDCard_GetModeID)dlsym(hDevInst,"mt8_IDCard_GetModeID");//��ȡ����֤ģ��ID
+	dev_WltToRGB				= (GWIdev_WltToRGB)dlsym(hDevInst,"mt8_WltToRGB");//����ȡ�Ķ���֤��Ƭ���ݣ� ����Ϊ RGB ���ݡ� ������ bmp �ļ�
+	dev_Deletepathfile			= (GWIdev_Deletepathfile)dlsym(hDevInst,"mt8_deletepathfile");//ɾ��ָ��λ�õ�ָ���ļ�
+	//��������������
+	dev_magnetic_read			= (GWIdev_magnetic_read)dlsym(hDevInst,"mt8_magnetic_read");//��ȡ������������
+	dev_set_magnetic_mode		= (GWIdev_set_magnetic_mode)dlsym(hDevInst,"set_magnetic_mode");//���ô��������������ʽ
+	//���ߺ���
+	dev_asc_hex					= (GWIdev_asc_hex)dlsym(hDevInst,"mt8_asc_hex");//��ʮ�����Ƶ���������ת��Ϊʮ�����Ƶ��ַ�����
+	dev_hex_asc					= (GWIdev_hex_asc)dlsym(hDevInst,"mt8_hex_asc");//��ʮ�����Ƶ��ַ�����ת��Ϊʮ�����Ƶ���������
+	dev_encrypt					= (GWIdev_encrypt)dlsym(hDevInst,"mt8_rf_encrypt");//��ԭ�ļ��ܳ�����DES
+	dev_decrypt					= (GWIdev_decrypt)dlsym(hDevInst,"mt8_rf_decrypt");//�����Ľ��ܻ�ԭΪԭ��DES
+	
+	if( NULL == dev_open_device || NULL == dev_close_device || NULL == dev_get_version || 
+		NULL == dev_beep || NULL == dev_setbaud || NULL == dev_gettype || NULL == dev_ledctrl || NULL == dev_readsnr ||
+		NULL == dev_sam_slt_getstate  || NULL == dev_sam_slt_reset || NULL == dev_sam_slt_reset_baud || NULL == dev_sam_slt_powerdown ||
+        NULL == dev_contact_settype || NULL == dev_contact_identifytype || NULL == dev_contact_passwordcheck ||
+		NULL == dev_contact_read || NULL == dev_contact_write || NULL == dev_contact_passwordinit ||
+		NULL == dev_open_card || NULL == dev_rf_halt || NULL == dev_card_APDU ||
+		NULL == dev_rf_card || NULL == dev_rf_authentication || NULL == dev_rf_read || NULL == dev_rf_write ||
+		NULL == dev_rf_readval || NULL == dev_rf_initval || NULL == dev_rf_increment || NULL == dev_rf_decrement ||
+		NULL == dev_IDCard_Read || NULL == dev_IDCard_ReadCard || NULL == dev_IDCard_GetCardInfo || NULL ==dev_IDCard_Read_IDNUM || NULL == dev_WltToRGB || NULL == dev_Deletepathfile ||
+		NULL == dev_CLCard_Open || NULL == dev_IDCard_GetModeID || 
+		NULL == dev_magnetic_read || NULL == dev_set_magnetic_mode ||
+		NULL == dev_asc_hex || NULL == dev_hex_asc || NULL == dev_encrypt || NULL == dev_decrypt)  
+    {
+		LogARG(m_plogFile, Log_Error, "Loadmt32so", "NULL and dlclose");
+        dlclose(hDevInst);
+        return -1;
+    }
+
+	if(NULL == dev_open_device_serial)
+	{
+		dev_open_device_serial = (GWIopen_device_serial)dlsym(hDevInst,"mt8_device_open");//打开读卡器
+		oldsof = 1;
+		LogARG(m_plogFile, Log_Warning, "Loadmt32so", "oldsof is 1");
+	}
+	LogARG(m_plogFile, Log_Debug, "Loadmt32so", "OK");
+    return 0;
+}
+
+void mt32so::Freemt32so()
+{
+    if (NULL != hDevInst)
+    {
+        dlclose(hDevInst);
+		hDevInst = NULL;
+    }
+}
+
+#endif

+ 153 - 0
DevAdapter/gwi/rfic.1.1/Loadmt32so.h

@@ -0,0 +1,153 @@
+#ifndef Loadmt32so_H
+#define Loadmt32so_H
+#include "GwiLogFile.h"
+
+#ifndef _WINDOWS
+
+//#include "Config.h"
+
+#define RET_SUCCESS     0
+#define LAYER ("ContactlessCard")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+//******************************* Device *****************************************//
+typedef int ( *GWIopen_device)(unsigned char *sPort,int nBaud);
+typedef int ( *GWIopen_device_serial)(char *sPort,int nBaud);
+typedef int ( *GWIclose_device)(int icdev);
+typedef int ( *GWIget_version)(int icdev,int module,unsigned char *nVerLen,unsigned char *sVerData);
+typedef int ( *GWIdev_beep)(int icdev, int delattime,int times );
+typedef int ( *GWIdev_setbaud)(int icdev,int module,unsigned long Baud);
+typedef int ( *GWIdev_gettype)(unsigned char* devicetype);
+typedef int ( *GWIdev_ledctrl)(int icdev, int ledctrl);
+typedef int ( *GWIdev_readsnr)(int icdev, unsigned char nSnrLen,char* sSnrData);
+typedef int ( *GWIdev_getdevicestatus_bymodule)(int icdev,unsigned char *ContactStatus,unsigned char *NoContactStatus,unsigned char *MagCardStatus,unsigned char *IDCardStatus);
+typedef int ( *GWIdev_getcardtype_bymodule)(int icdev,unsigned char *ContactType,unsigned char *NoContactType,unsigned char *IDCardType);
+
+//******************************* Contact card *****************************************//
+typedef int  (*GWIdev_sam_slt_getstate)(int icdev,int cardno,unsigned short* cardstate);
+typedef int  (*GWIdev_sam_slt_reset)(int icdev,int delaytime, int cardno,unsigned char* rlen,unsigned char* resetdata);
+typedef int  (*GWIdev_sam_slt_reset_baud)( int icdev, int cardno, int resetBaud, unsigned char* rlen,unsigned char* resetdata);
+typedef int  (*GWIdev_sam_slt_powerdown)(int icdev,int cardno);
+
+//******************************* Contact memory card *****************************************//
+typedef int  (*GWIdev_contact_settype)(int icdev,int cardno,int cardtype);
+typedef int  (*GWIdev_contact_identifytype)(int icdev,int cardno,unsigned char* cardtype);
+typedef int  (*GWIdev_contact_passwordcheck)(int icdev,int cardno,int pinlen,unsigned char* pinstr);
+typedef int  (*GWIdev_contact_read)(int icdev,int cardno,int address,int rlen,unsigned char* readdata);
+typedef int  (*GWIdev_contact_write)(int icdev,int cardno,int address,int wlen,unsigned char* writedata);
+typedef int  (*GWIdev_contact_passwordinit)(int icdev,int cardno,int pinlen,unsigned char* pinstr);
+
+
+//******************************* Contactless CPU card *****************************************//
+typedef int (*GWIdev_open_card)(int icdev,int delaytime,unsigned char* cardtype,unsigned char* snrlen,unsigned char* snr,unsigned char* rlen,unsigned char* recdata);
+typedef int (*GWIdev_rf_halt)(int icdev,unsigned short delaytime);
+typedef int (*GWIdev_card_APDU)(int icdev,int cardno,int slen,unsigned char *datasend,int* rlen,unsigned char* datareceive);
+
+//******************************* Contactless memory card *****************************************//
+typedef int  (*GWIdev_rf_card)(int icdev,int delaytime,unsigned char* cardtype,unsigned char* cardID);
+typedef int  (*GWIdev_rf_authentication)(int icdev,int mode,int addr, unsigned char *key);
+typedef int  (*GWIdev_rf_read)(int icdev,int addr,unsigned char* readdata);
+typedef int  (*GWIdev_rf_write)(int icdev,int addr,unsigned char* writedata);
+typedef int  (*GWIdev_rf_readval)(int icdev,int addr,unsigned long* readvalue);
+typedef int  (*GWIdev_rf_initval)(int icdev,int addr,unsigned long writevalue);
+typedef int  (*GWIdev_rf_increment)(int icdev,int addr,unsigned long incvalue);
+typedef int  (*GWIdev_rf_decrement)(int icdev,int addr,unsigned long decvalue);
+
+
+//******************************* 2nd ID card *****************************************//
+typedef int  (*GWIdev_IDCard_Read)(int icdev,int* rlen,unsigned char* receivedata);
+typedef int  (*GWIdev_IDCard_ReadCard)(int icdev,char* message);
+typedef int  (*GWIdev_IDCard_GetCardInfo)(int icdev,int index,char* infodata, int* infodatalen);
+typedef int  (*GWIdev_IDCard_GetModeID)(int icdev,unsigned char* nIDLen,unsigned char* sIDData);
+typedef int  (*GWIdev_IDCard_Read_IDNUM)( int icdev,unsigned char* rlen,unsigned char* receivedata );
+typedef int  (*GWIdev_CLCard_Open)( int icdev,int delaytime,unsigned char* cardtype,unsigned char* snrlen,unsigned char* snr,unsigned char* rlen,unsigned char* recdata );
+typedef int  (*GWIdev_WltToRGB)(char *wltData, char *RGB_Data, int ifSavePhoto, char *photoSavePath);
+typedef int  (*GWIdev_Deletepathfile)(char*photofilename);
+//******************************* magnetic card *****************************************//
+typedef int  (*GWIdev_magnetic_read)(int icdev, int timeout, int* track1_len, int* track2_len, int* track3_len, char* track1_data, char* track2_data, char* track3_data);
+typedef int  (*GWIdev_set_magnetic_mode)(int icdev,unsigned char mode);
+//******************************* Tools *****************************************//
+typedef int  (*GWIdev_asc_hex)(unsigned char *asc,unsigned char *hex,unsigned long length);
+typedef int  (*GWIdev_hex_asc)(unsigned char *hex,unsigned char *asc,unsigned long length);
+typedef int  (*GWIdev_encrypt)(unsigned char *Key,unsigned char *Source, unsigned int SrcLen,unsigned char *result);
+typedef int  (*GWIdev_decrypt)(unsigned char *Key,unsigned char *Source, unsigned int SrcLen, unsigned char  *result);
+
+
+class mt32so
+{
+public:
+		mt32so();
+		~mt32so(){}
+public:
+		int Loadmt32so();
+		void Freemt32so();
+		static mt32so* GetInstance();
+public:
+		GWIopen_device					dev_open_device; 
+		GWIopen_device_serial			dev_open_device_serial;
+		GWIclose_device					dev_close_device;
+		GWIget_version					dev_get_version;
+		GWIdev_beep						dev_beep;
+		GWIdev_setbaud					dev_setbaud;
+		GWIdev_gettype					dev_gettype;
+		GWIdev_ledctrl					dev_ledctrl;
+		GWIdev_readsnr					dev_readsnr;
+		GWIdev_getdevicestatus_bymodule	dev_getdevicestatus_bymodule;
+		GWIdev_getcardtype_bymodule		dev_getcardtype_bymodule;
+
+		GWIdev_sam_slt_getstate		dev_sam_slt_getstate;
+		GWIdev_sam_slt_reset		dev_sam_slt_reset;
+		GWIdev_sam_slt_reset_baud	dev_sam_slt_reset_baud;
+		GWIdev_sam_slt_powerdown	dev_sam_slt_powerdown;
+
+		GWIdev_contact_settype			dev_contact_settype;
+		GWIdev_contact_identifytype		dev_contact_identifytype;
+		GWIdev_contact_passwordcheck	dev_contact_passwordcheck;
+		GWIdev_contact_read				dev_contact_read;
+		GWIdev_contact_write			dev_contact_write;
+		GWIdev_contact_passwordinit		dev_contact_passwordinit;
+
+
+		GWIdev_open_card	dev_open_card;
+		GWIdev_rf_halt		dev_rf_halt;
+		GWIdev_card_APDU	dev_card_APDU;
+
+		GWIdev_rf_card				dev_rf_card;
+		GWIdev_rf_authentication	dev_rf_authentication;
+		GWIdev_rf_read				dev_rf_read;
+		GWIdev_rf_write				dev_rf_write; 
+		GWIdev_rf_readval			dev_rf_readval;
+		GWIdev_rf_initval			dev_rf_initval;
+		GWIdev_rf_increment			dev_rf_increment;
+		GWIdev_rf_decrement			dev_rf_decrement;
+
+
+		GWIdev_IDCard_Read			dev_IDCard_Read;
+		GWIdev_IDCard_ReadCard		dev_IDCard_ReadCard;
+		GWIdev_IDCard_GetCardInfo	dev_IDCard_GetCardInfo;
+		GWIdev_IDCard_GetModeID		dev_IDCard_GetModeID;
+		GWIdev_IDCard_Read_IDNUM	dev_IDCard_Read_IDNUM;
+		GWIdev_CLCard_Open			dev_CLCard_Open;
+		GWIdev_WltToRGB				dev_WltToRGB;
+		GWIdev_Deletepathfile		dev_Deletepathfile;
+
+		GWIdev_magnetic_read		dev_magnetic_read; 
+		GWIdev_set_magnetic_mode	dev_set_magnetic_mode;
+		
+		GWIdev_asc_hex				dev_asc_hex;
+		GWIdev_hex_asc				dev_hex_asc;
+		GWIdev_encrypt				dev_encrypt;
+		GWIdev_decrypt				dev_decrypt;
+
+private:
+		static mt32so *pmt32so;
+		static	void *hDevInst;
+
+public:
+		int Openref;
+		int oldsof;
+};
+
+#endif
+
+#endif

+ 5 - 0
DevAdapter/gwi/rfic.1.1/contactless_cmb.ini

@@ -0,0 +1,5 @@
+[DEVICE]
+CommType=1
+AutoOpen=1
+Port=4
+Baud=115200

+ 295 - 0
DevAdapter/gwi/rfic.1.1/simple_ini_tool.cpp

@@ -0,0 +1,295 @@
+#include "simple_ini_tool.h"
+
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+
+#include <list>
+#include <string>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+using namespace std;
+
+static inline bool IsSpace(char c)
+{
+    return isspace(c) != 0 ; // !=0 消除VS的C4800警告
+}
+
+/** 将int转换成字符串,替代itoa函数,android中没有该函数 */
+static char* IntToStr(int v, char* str)
+{
+    sprintf(str, "%d", v);
+    return str;
+}
+
+/** 将文件以行的形式加载到内存中 */
+static list<string> LoadLines(const string& filename)
+{
+    list<string> lines;
+    FILE* file = fopen(filename.c_str(), "rt");
+    if (file != NULL)
+    {
+        char line[1024];
+        while(fgets(line, sizeof(line), file) != NULL)
+        {
+            lines.push_back(line);
+        }
+        fclose(file);
+    }
+    return lines;
+}
+
+/** 内存的数据写入文件 */
+static void SaveLines(const string& filename, const list<string>& lines)
+{
+#ifndef _WINDOWS
+	printf("SaveLines =%s\n",filename.c_str());
+#endif
+    FILE* file = fopen(filename.c_str(), "wt");
+    if (file != NULL)
+    {
+        for (list<string>::const_iterator iter = lines.begin();
+             iter != lines.end(); ++iter)
+        {
+            fputs(iter->c_str(), file);
+        }
+        fclose(file);
+    }
+}
+
+template<typename T, typename F>
+static void Strip(T rawb, T rawe, T& b, T& e, F isStrip)
+{
+    b = rawb;
+    e = rawe;
+
+    while (b != rawe)
+    {
+         if (!isStrip(*b))   break;
+         ++b;
+    }
+
+    while (b != e)
+    {
+        /* 进入该分支,则表明b为!isStrip,当--e后,要么跳出循环,要么不为b */
+        --e;
+        if (!isStrip(*e))
+        {
+            ++e;
+            break;
+        }
+    }
+}
+
+/** 判断是否是[xxx]结构 */
+static bool IsSection(const string& line, const string* section=NULL)
+{
+    string::const_iterator b = line.begin();
+    string::const_iterator e = line.end();
+
+    Strip(line.begin(), line.end(), b, e, IsSpace);
+
+    return e != b && *b == '[' && *(--e) == ']' && (section==NULL || string(++b, e) == *section);
+}
+
+class ListIter
+{
+public:
+    typedef list<string> List;
+    typedef list<string>::iterator Iter;
+};
+
+class ListCIter
+{
+public:
+    typedef const list<string> List;
+    typedef list<string>::const_iterator Iter;
+};
+
+template<typename T>
+static void FindSection(typename T::List& lines, const string& section, typename T::Iter& begin, typename T::Iter& end)
+{
+    for (begin = lines.begin(); begin != lines.end(); ++begin)
+    {
+        if (IsSection(*begin, &section)) break;
+    }
+
+    end = begin;
+    if (end != lines.end())
+    {
+        for (++end; end != lines.end(); ++end)
+        {
+            if (IsSection(*end))    break;
+        }
+    }
+}
+
+
+bool GetKeyValue(const string& line, string& key, string& value)
+{
+    string::size_type m = line.find("=");
+    if (m != string::npos)
+    {
+        string::const_iterator b = line.begin();
+        string::const_iterator s = line.begin()+m;
+        Strip(line.begin(), line.begin()+m, b, s, IsSpace);
+        key = string(b, s);
+
+        Strip(line.begin()+m+1, line.end(), b, s, IsSpace);
+        value = string(b, s);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+string IniFileRead(const string& filename, const string& section, const string& key, const string& defaultValue)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+        string k, v;
+        if (GetKeyValue(*iter, k, v) && key == k) return v;
+    }
+
+    return defaultValue;
+}
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value)
+{
+	int Count = 0;
+    list<string> lines = LoadLines(filename);
+
+    list<string>::const_iterator begin;
+    list<string>::const_iterator end;
+
+    FindSection<ListCIter>(lines, section, begin, end);
+
+    for (list<string>::const_iterator iter=begin; iter != end; ++iter)
+    {
+		string k, v;
+        if (GetKeyValue(*iter, k, v))
+		{
+			Count++;
+			key.insert(key.end(), k);
+			value.insert(value.end(), v);
+		}
+    }
+
+    return Count;
+}
+
+
+#define MAKE_SECTION_LINE(s)        ("[" + (s) + "]\n")
+#define MAKE_KEY_VALUE_LINE(k,v)    ((k) + " = " + (v) + "\n")
+
+void IniFileWrite(const string& filename, const string& section, const string& key, const string& value)
+{
+    list<string> lines = LoadLines(filename);
+
+    list<string>::iterator begin;
+    list<string>::iterator end;
+
+    FindSection<ListIter>(lines, section, begin, end);
+
+    if (begin != end)
+    {
+        list<string>::iterator iter=begin;
+        for (; iter != end; ++iter)
+        {
+            string k, v;
+            if (GetKeyValue(*iter, k, v) && key == k) 
+            {
+                *iter = MAKE_KEY_VALUE_LINE(key, value);
+                break;
+            }
+        }
+
+        if (iter == end)
+        {
+            lines.insert(iter, MAKE_KEY_VALUE_LINE(key, value));
+        }
+    }
+    else
+    {
+        lines.push_back(MAKE_SECTION_LINE(section));
+        lines.push_back(MAKE_KEY_VALUE_LINE(key, value));
+    }
+
+    SaveLines(filename, lines);
+}
+
+
+int IniFileRead(const string& filename, const string& section, const string& key, int defaultValue)
+{
+    char str[48];
+    return atoi(IniFileRead(filename, section, key, IntToStr(defaultValue, str)).c_str());
+}
+
+void IniFileWrite(const string& filename, const string& section, const string& key, int value)
+{
+    char str[48];
+    IniFileWrite(filename, section, key, IntToStr(value, str));
+}
+
+
+#ifdef TEST_SIMPLE_INI_TOOL
+
+#define CheckEqaul(a, b) ((a)!=(b))?(printf("CheckFailed %s == %s\n", #a, #b)):0
+int main()
+{
+    const char* testFile = "test_simple_ini_tool.ini";
+
+    // 清空文件
+    fclose(fopen(testFile, "w"));
+
+    // 写入数据
+    IniFileWrite(testFile, "section0", "key0", "value0");
+    IniFileWrite(testFile, "section0", "key1", 1);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value0");
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", "valuee"), "1");
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section0", "key1", 0), 1);
+
+    // 读取未有的数据
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", "valuee"), "valuee");
+    CheckEqaul(IniFileRead(testFile, "section0", "keyx", 1), 1);
+    CheckEqaul(IniFileRead(testFile, "sectionx", "key0", 1), 1);
+
+    // 写入的二个section
+    IniFileWrite(testFile, "section1", "key0", "value10");
+    IniFileWrite(testFile, "section1", "key1", 11);
+
+    // 读取并检查写入的数据
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", "valuee"), "value10");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", "valuee"), "11");
+    CheckEqaul(IniFileRead(testFile, "section1", "key0", 1), 0);
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 11);
+
+    // 改写数据
+    IniFileWrite(testFile, "section0", "key0", "value00");
+    IniFileWrite(testFile, "section1", "key1", 111);
+
+    // 检查数据
+    CheckEqaul(IniFileRead(testFile, "section0", "key0", "valuee"), "value00");
+    CheckEqaul(IniFileRead(testFile, "section1", "key1", 0), 111);
+
+    return 0;
+}
+
+#endif // 

+ 26 - 0
DevAdapter/gwi/rfic.1.1/simple_ini_tool.h

@@ -0,0 +1,26 @@
+/**
+ * @file simple_ini_tool.h
+ * @brief 简单的ini文件读写工具,仅支持多字节和一次读写,并不考虑性能
+ */
+#ifndef SIMPLE_INI_TOOL_H
+#define SIMPLE_INI_TOOL_H
+
+#include <string>
+#include <list>
+
+std::string IniFileRead(const std::string& filename, const std::string& section, const std::string& key, const std::string& defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, const std::string& key, int defaultValue);
+
+
+int IniFileRead(const std::string& filename, const std::string& section, std::list<std::string> &key, std::list<std::string> &value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, const std::string& value);
+
+
+void IniFileWrite(const std::string& filename, const std::string& section, const std::string& key, int value);
+
+#endif /* SIMPLE_INI_TOOL_H */
+

+ 24 - 0
DevAdapter/gwi/watchdog.1.1/CMakeLists.txt

@@ -0,0 +1,24 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("WatchDog")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "gwi")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        watchdog_impl.cpp
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+# ${MODULE_FULL_NAME} 是 TAGET 名称,在 rvc_dev_config_library 中定义
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}")
+
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 351 - 0
DevAdapter/gwi/watchdog.1.1/watchdog_impl.cpp

@@ -0,0 +1,351 @@
+#include "watchdog_impl.h"
+#include<cstring>
+#include <cstdio>
+#include "GwiLogFile.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <linux/watchdog.h>
+
+#define mysleep(secs) usleep((secs) * 1000)
+
+#define LAYER ("WatchDog")
+#define LogARG(A,B,format, ...) if(A!=NULL) A->B(LAYER,__FILE__,__LINE__,(format),##__VA_ARGS__)
+
+CLogFile *m_plogFile = NULL;
+enum GWI_ErrorCodeEnum
+{
+	GWI_Error_Succeed = 0,
+	//DEV´í
+	GWI_Error_Dev_HaveOpen = 1100,
+	GWI_Error_Dev_NotOpen,
+	GWI_Error_Dev_NotExist,
+	GWI_Error_Dev_Denied,
+	GWI_Error_Dev_OpenError,
+	GWI_Error_Dev_Error,
+	GWI_Error_Param,
+	GWI_Error_Dev_Busy,
+};
+
+
+typedef struct tagStErrorInfo
+{
+	int gwiErrorCode;
+	char description[MAX_DEV_ERROR_MSG_LEN];
+	ErrorCodeEnum errorcode;
+} StErrorInfo;
+
+
+
+StErrorInfo gstErrorInfo[] =
+{
+	{ GWI_Error_Dev_Busy, "Busy", Error_Busy },
+	{ GWI_Error_Param, "illegal parameter ",  Error_Param },
+	{ GWI_Error_Dev_HaveOpen, "dev have opened ", Error_DevAlreadyConnected },
+	{ GWI_Error_Dev_NotOpen, "dev not  opened ", Error_DevNotAvailable },
+	{ GWI_Error_Dev_NotExist, "dev not exist ", Error_Hardware },
+	{ GWI_Error_Dev_Denied, "dev access denied ", Error_Hardware },
+	{ GWI_Error_Dev_OpenError, "dev open error", Error_Hardware },
+	{ GWI_Error_Dev_Error, "opreation error ", Error_Hardware },
+	{ GWI_Error_Succeed, "success", Error_Succeed },
+};
+
+ErrorCodeEnum WatchDogClassImpl::ConvertErrorCode(int gwiErrorCode)
+{
+	int i = 0;
+	for (; gstErrorInfo[i].errorcode != Error_Succeed; ++i)
+	{
+		if (gwiErrorCode == gstErrorInfo[i].gwiErrorCode)
+		{
+			strcpy(m_err.szErrMsg, gstErrorInfo[i].description);
+			return gstErrorInfo[i].errorcode;
+		}
+	}
+	strcpy(m_err.szErrMsg, "success");
+	return Error_Succeed;
+}
+
+WatchDogClassImpl::WatchDogClassImpl()
+:m_fd(-1)
+{
+	if (NULL == m_plogFile)
+	{
+		m_plogFile = new CLogFile(LAYER);
+		m_plogFile->init();
+
+		LogARG(m_plogFile, Log_Debug, "WatchDogClassImpl", "Init CWatchDog LOG success!");
+	}
+	m_deviceStatus = DEVICE_STATUS_NOT_READY;
+	memset(&m_err, 0, sizeof(m_err));
+	m_runstate = DOG_INIT;
+}
+
+WatchDogClassImpl::~WatchDogClassImpl()
+{
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	DevClose();
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit...");
+
+}
+
+ErrorCodeEnum WatchDogClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+   int err= GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+
+    //	devCategory.eState = DEVICE_STATUS_FAULT;
+    std::strcpy(devCategory.szModel, "gwi");
+    std::strcpy(devCategory.szType, "gwi");
+    std::strcpy(devCategory.szVendor, "gwi");
+
+	devCategory.eState = m_deviceStatus;
+	devCategory.version.wMajor = 1;
+	devCategory.version.wBuild = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 1;
+
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+
+	return  ConvertErrorCode(err);
+}
+
+ErrorCodeEnum WatchDogClassImpl::Reset()
+{
+	int err = GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	if (m_fd == -1)
+	{
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+		return ConvertErrorCode(err);
+	}
+
+	ErrorCodeEnum ZH_err = StopWatch();
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret ZH_err[%d]", ZH_err);
+
+	return ZH_err;
+}
+
+ErrorCodeEnum WatchDogClassImpl::DevClose()
+{
+
+   int err= GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	
+	if (m_fd == -1)
+	{
+		err = GWI_Error_Dev_NotOpen;
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+		return ConvertErrorCode(err);
+	}
+	
+	ErrorCodeEnum ZH_err = StopWatch();
+	close(m_fd);
+	m_fd = -1;
+ 
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret ZH_err[%d]", ZH_err);
+
+	return ZH_err;
+}
+
+ErrorCodeEnum WatchDogClassImpl::DevOpen()
+{
+	int err = GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+
+	if (m_fd != -1)
+	{
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+		return  ConvertErrorCode(err);
+	}
+
+	m_fd = open("/dev/watchdog", O_WRONLY);
+
+	if (m_fd == -1) {
+		if (errno == ENOENT)
+			err = GWI_Error_Dev_NotExist;
+		else if (errno == EACCES)
+			err = GWI_Error_Dev_Denied;
+		else if (errno == EBUSY)
+			err = GWI_Error_Dev_Busy;
+		else
+			err = GWI_Error_Dev_OpenError;
+	
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "open watchdog errno[%d],errmess[%s]", errno , strerror(errno));
+
+	 
+		m_deviceStatus = DEVICE_STATUS_NOT_READY;
+	}
+	else
+        {
+          StopWatch();
+	       m_deviceStatus = DEVICE_STATUS_NORMAL;
+        }
+
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+
+	return  ConvertErrorCode(err);
+}
+
+void * g_ThreadFunc(void *param)
+{
+	WatchDogClassImpl *p = (WatchDogClassImpl *)param;
+
+	p->StartWatchThreadFunc();
+	return 0;
+}
+
+void WatchDogClassImpl::StartWatchThreadFunc()
+{
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	DWORD count = m_dwDelay * 10;
+	int ret = 0;
+	int flags = 0;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "m_runstate[%d] count[%lu] ", m_runstate, count);
+	while (m_runstate == DOG_BEFORERUN   && count > 0)
+	{
+		mysleep(100);
+		count--;
+	}
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "m_runstate[%d] count[%lu] ", m_runstate, count);
+
+	if (m_runstate == DOG_BEFORERUN )
+	{
+		m_runstate = DOG_RUNNING;
+		flags = m_dwTimeout;
+		ret = ioctl(m_fd, WDIOC_SETTIMEOUT, &flags);
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "WDIOC_SETTIMEOUT ret[%d],errmess[%s]", ret, strerror(errno));
+
+		if (!ret)
+		{
+
+			flags = WDIOS_ENABLECARD;
+			ret = ioctl(m_fd, WDIOC_SETOPTIONS, &flags);
+			LogARG(m_plogFile, Log_Infor, __FUNCTION__, "WDIOS_ENABLECARD ret[%d],errmess[%s]", ret, strerror(errno));
+
+		}
+	}
+
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", ret);
+
+}
+
+ ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
+{
+
+	 int err = GWI_Error_Succeed;
+	 LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	 LogARG(m_plogFile, Log_Infor, __FUNCTION__, "dwDelay[%lu],dwTimeout[%lu]", dwDelay, dwTimeout);
+
+	 if (m_fd == -1)
+	 {
+		 err = GWI_Error_Dev_NotOpen;
+		 LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+		 return ConvertErrorCode(err);;
+	 }
+	 if (m_runstate != DOG_INIT)
+	 {
+		 m_runstate = DOG_INIT;
+		 mysleep(500);
+		 StopWatch();
+	 };
+	 m_runstate = DOG_BEFORERUN;
+	 m_dwDelay=dwDelay;  
+	 m_dwTimeout=dwTimeout;  
+	 pthread_t Thread;
+	 pthread_create(&Thread, NULL, g_ThreadFunc, (void *)this);
+	 LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+
+	 return  ConvertErrorCode(err);
+}
+//
+//	Stop watchdog.
+//
+ErrorCodeEnum WatchDogClassImpl::StopWatch()
+{
+	int err = GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	if (m_fd == -1)
+	{
+		err = GWI_Error_Dev_NotOpen;
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+		return  ConvertErrorCode(err);
+	}
+
+	m_runstate = DOG_INIT;
+	int flags = WDIOS_DISABLECARD;
+	int ret = ioctl(m_fd, WDIOC_SETOPTIONS, &flags);
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "WDIOS_ENABLECARD ret[%d],errmess[%s]", ret, strerror(errno));
+
+	if (ret)
+		err = GWI_Error_Dev_Error;
+
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+
+	return  ConvertErrorCode(err);
+}
+//
+//	Feed watchdog.
+//
+ErrorCodeEnum WatchDogClassImpl::RefreshDog()
+{
+	int err = GWI_Error_Succeed;
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Enter...");
+	if (m_fd == -1)
+	{
+		err = GWI_Error_Dev_NotOpen;
+		LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+		return  ConvertErrorCode(err);;
+	}
+	int dummy;
+	int ret;
+
+	ret = ioctl(m_fd, WDIOC_KEEPALIVE, &dummy);	
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "WDIOC_KEEPALIVE ret[%d],errmess[%s]", ret, strerror(errno));
+
+	if (ret)
+		err = GWI_Error_Dev_Error;
+
+	LogARG(m_plogFile, Log_Infor, __FUNCTION__, "Exit,ret[%d]", err);
+	return  ConvertErrorCode(err);
+}
+
+
+ErrorCodeEnum WatchDogClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+ //   static int times = 0;
+//    char szMessage[128];
+//    sprintf(szMessage, "this is the %d times error message", ++times);
+	strcpy(devErrInfo.szErrMsg, m_err.szErrMsg);
+	devErrInfo.dwErrMsgLen = strlen(devErrInfo.szErrMsg);
+ 
+    return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+    baseObj = new WatchDogClassImpl();
+    if(baseObj == NULL) {
+    return Error_Resource;
+    } else {
+    return Error_Succeed;
+    }
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+    if(pBaseObj == NULL) {
+    return Error_Param;
+    }
+    if(WatchDogClassImpl* pTmp = dynamic_cast<WatchDogClassImpl*>(pBaseObj))
+    {
+    delete pTmp;
+    pTmp = NULL;
+    return Error_Succeed;
+    }
+    return Error_Param;
+}

+ 60 - 0
DevAdapter/gwi/watchdog.1.1/watchdog_impl.h

@@ -0,0 +1,60 @@
+#ifndef LIBFRAMEWORK_WATCHDOG_IMPL_H
+#define LIBFRAMEWORK_WATCHDOG_IMPL_H
+
+#include "WatchDogClass.h"
+
+enum WatchDogState
+{
+	DOG_INIT,
+	DOG_BEFORERUN,
+	DOG_RUNNING,
+};
+
+class WatchDogClassImpl : public WatchDogClass
+{
+public:
+    WatchDogClassImpl();
+    ~WatchDogClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	Initialization,make preparation for working.
+    //
+	  ErrorCodeEnum DevOpen();
+    //
+    //	Conifgure watchdog.
+    //	Watchdog start to work in [dwDelay] second.It must be feed in every [dwTimeout]
+    //	period or it will restart the computer.
+    //	Arguments:
+    //	- dwDelay:time to start watching(in second)
+    // 	- dwTimeout:max time period to feed dog(in second)
+    //
+	  ErrorCodeEnum StartWatch(DWORD dwDelay, DWORD dwTimeout);
+    //
+    //	Stop watchdog.
+    //
+	  ErrorCodeEnum StopWatch();
+    //
+    //	Feed watchdog.
+    //
+	  ErrorCodeEnum RefreshDog();
+	  void StartWatchThreadFunc();
+private:
+	ErrorCodeEnum ConvertErrorCode(int gwiErrorCode);
+	int m_fd;
+	DevErrorInfo m_err;
+	DevStateEnum m_deviceStatus;
+	WatchDogState m_runstate;
+	DWORD m_dwDelay; 
+	DWORD m_dwTimeout;
+
+};
+
+
+#endif //LIBFRAMEWORK_WATCHDOG_IMPL_H