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

#IQRV #comment [DevAdapter] grg/2021.0311.01 二期ST首次版本

gifur преди 4 години
родител
ревизия
f5ed753942
променени са 28 файла, в които са добавени 4670 реда и са изтрити 48 реда
  1. 1 1
      DevAdapter/CMakeLists.txt
  2. 1 1
      DevAdapter/grg/CMakeLists.txt
  3. 4 2
      DevAdapter/grg/FingerPrint.1.1/FingerPrint_Impl.cpp
  4. 37 42
      DevAdapter/grg/cardissuer.1.1/cardissuer_impl.cpp
  5. 25 0
      DevAdapter/grg/contactlesscard.1.1/CMakeLists.txt
  6. 694 0
      DevAdapter/grg/contactlesscard.1.1/contactless_impl.cpp
  7. 98 0
      DevAdapter/grg/contactlesscard.1.1/contactless_impl.h
  8. 23 0
      DevAdapter/grg/gpio.1.1/CMakeLists.txt
  9. 559 0
      DevAdapter/grg/gpio.1.1/gpio_impl.cpp
  10. 62 0
      DevAdapter/grg/gpio.1.1/gpio_impl.h
  11. 18 0
      DevAdapter/grg/hspscanner.1.1/CMakeLists.txt
  12. 564 0
      DevAdapter/grg/hspscanner.1.1/hspscanner_impl.cpp
  13. 113 0
      DevAdapter/grg/hspscanner.1.1/hspscanner_impl.h
  14. 2 1
      DevAdapter/grg/idcer.1.1/idcer_impl.cpp
  15. 1 1
      DevAdapter/grg/pinpad.1.1/GrgPinPadImpl.cpp
  16. 25 0
      DevAdapter/grg/termalprint.1.1/CMakeLists.txt
  17. 81 0
      DevAdapter/grg/termalprint.1.1/GrgSp_Draw.h
  18. 107 0
      DevAdapter/grg/termalprint.1.1/base64.h
  19. 310 0
      DevAdapter/grg/termalprint.1.1/bitmap.cpp
  20. 90 0
      DevAdapter/grg/termalprint.1.1/bitmap.h
  21. 1152 0
      DevAdapter/grg/termalprint.1.1/termalprint_impl.cpp
  22. 124 0
      DevAdapter/grg/termalprint.1.1/termalprint_impl.h
  23. 17 0
      DevAdapter/grg/ups.1.1/CMakeLists.txt
  24. 210 0
      DevAdapter/grg/ups.1.1/ups_impl.cpp
  25. 48 0
      DevAdapter/grg/ups.1.1/ups_impl.h
  26. 15 0
      DevAdapter/grg/watchdog.1.1/CMakeLists.txt
  27. 239 0
      DevAdapter/grg/watchdog.1.1/watchdog_impl.cpp
  28. 50 0
      DevAdapter/grg/watchdog.1.1/watchdog_impl.h

+ 1 - 1
DevAdapter/CMakeLists.txt

@@ -141,7 +141,7 @@ message(STATUS "vendor log library: ${VENDOR_LOG_LIB_NAME}")
 if(DEVADAPTER_USING_CONAN)
     set(KEBA_CONAN_LIB_NAME keba/2021.0201.01@LR04.02_VendorLib/testing)
 	set(NANTIAN_CONAN_LIB_NAME nantian/2021.0310.01@LR04.02_VendorLib/testing)
-	set(GRG_CONAN_LIB_NAME grg/2021.0111.01@LR04.02_VendorLib/testing)
+	set(GRG_CONAN_LIB_NAME grg/2021.0311.01@LR04.02_VendorLib/testing)
 	set(CW_CONAN_LIB_NAME cw/2021.0310.01@LR04.02_VendorLib/testing)
     set(GWI_CONAN_LIB_NAME gwi/2021.0119.01@LR04.02_VendorLib/testing)
 endif(DEVADAPTER_USING_CONAN)

+ 1 - 1
DevAdapter/grg/CMakeLists.txt

@@ -4,7 +4,7 @@ project(grg C CXX)
 
 set(CMAKE_COLOR_MAKEFILE ON)
 
- # VENDOR_CURRENT_{DEPS|INCLUDE|ASSET|LIB|BIN}_DIR 等定义已集成到该宏内
+# VENDOR_CURRENT_{DEPS|INCLUDE|ASSET|LIB|BIN}_DIR 等定义已集成到该宏内
 rvc_define_dependen_dirs()
 
 # 遍历当前目录下带有CMakeLists.txt文件的文件夹

+ 4 - 2
DevAdapter/grg/FingerPrint.1.1/FingerPrint_Impl.cpp

@@ -50,7 +50,8 @@ DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
 
 FingerPrintImpl::FingerPrintImpl()
 {
-	m_sDllPath = GeSoFilePath((void*)&WELLDeviceInit);
+	//m_sDllPath = GeSoFilePath((void*)&WELLDeviceInit);
+	m_sDllPath = GeSoFilePath((void*)&CreateDevComponent);
 }
 
 FingerPrintImpl::~FingerPrintImpl()
@@ -86,7 +87,7 @@ ErrorCodeEnum FingerPrintImpl::GetDevCategory(DevCategoryInfo& devCategory)
 	strcat(devCategory.szType,"#MID=");
 	strcat(devCategory.szType,sDevInfo); 
 	strcpy(devCategory.szModel,"FWID=0");
-	strcpy(devCategory.szVendor,"GRG");
+	strcpy(devCategory.szVendor,"grg");
 
 	devCategory.version.wMajor = 1;
 	devCategory.version.wMinor = 1;
@@ -108,6 +109,7 @@ ErrorCodeEnum FingerPrintImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
 	LOG4VTM_FUNCTION();
 	LOG4VTM(INFO,__FUNCTION__);	
 	ErrorCodeEnum err = Error_Succeed;
+	WELLDeviceClose();
 	int iRet = WELLDeviceInit();
 	if(LS_ERROR_SUCCESS != iRet){
 			FormatDevErrorInfo(__FUNCTION__, __LINE__,iRet);

+ 37 - 42
DevAdapter/grg/cardissuer.1.1/cardissuer_impl.cpp

@@ -168,10 +168,7 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
 	{
 		l_iResult =  Error_DevConnFailed;
 	}
-	else
-	{
-		//p_OCardIssuer->m_log.info(_T("iSetCommPara success."));
-	}
+	
 
 	//打开设备,设备初始化,如果设备内有卡,吞卡操作
 	tryCnt =0;
@@ -207,6 +204,7 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
 		else
 		{
 			bl = true;
+			m_bDevIsOpen = true;
 			LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iInit success ");
 			break;
 		}
@@ -214,42 +212,39 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
 
 	if (!bl)
 	{
-		//l_iResult = Error_Hardware;
+		LOG4VTM(INFO," CardIssuer::DevOpen: Error_DevConnFailed ");
 		l_iResult = Error_DevConnFailed;
 	}
 
-	m_bDevIsOpen = true;
 	
-	//获取版本信息
-	tIDCVersionInfo tVersionInfo;
-	memset(&tReturnInfo, 0, sizeof(tReturnInfo));
-	memset(&tVersionInfo, 0, sizeof(tVersionInfo));
-	l_iResult = m_pCardIssuerDev->iGetVersionInfo(&tVersionInfo,&tReturnInfo);
-	if(SUCCESS != l_iResult) 
-	{
-		LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iGetVersionInfo failed ");	
-	}
+	////获取版本信息
+	//tIDCVersionInfo tVersionInfo;
+	//memset(&tReturnInfo, 0, sizeof(tReturnInfo));
+	//memset(&tVersionInfo, 0, sizeof(tVersionInfo));
+	//l_iResult = m_pCardIssuerDev->iGetVersionInfo(&tVersionInfo,&tReturnInfo);
+	//if(SUCCESS != l_iResult) 
+	//{
+	//	LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iGetVersionInfo failed ");	
+	//}
 	
 
 
-
-
-
 	if(!m_bDevIsOpen)
 	{
+		LOG4VTM(INFO," CardIssuer::DevOpen: m_bDevIsOpen  Error_DevConnFailed ");
 		return Error_DevConnFailed;
 	}
 
 	return Error_Succeed;
+	
+	
 }
 
 ErrorCodeEnum CardIssuerClassImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYTE btOpenType, const char *pDevSN, BYTE &btType)
 {
 	
 	//打开通讯
-	
 	btType = 2;
-	
 	int tryCnt =0;
 	bool bl = false;
 	tDevReturn tReturnInfo;
@@ -260,14 +255,14 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYT
 		l_iResult = m_pCardIssuerDev->iSetCommPara(&tReturnInfo);
 		if(SUCCESS != l_iResult) 
 		{
-			LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iSetCommPara failed ");		
+			LOG4VTM(INFO,"Enter CardIssuer::DevOpenEX: iSetCommPara failed ");		
 			++tryCnt;
 
 		}
 		else
 		{
 			bl =true;
-			LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iSetCommPara success ");
+			LOG4VTM(INFO,"Enter CardIssuer::DevOpenEX: iSetCommPara success ");
 			break;
 		}
 	}
@@ -275,12 +270,10 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYT
 
 	if (!bl)
 	{
-		l_iResult =  Error_DevConnFailed;
-	}
-	else
-	{
-		//p_OCardIssuer->m_log.info(_T("iSetCommPara success."));
+		return Error_DevConnFailed;
+		
 	}
+	
 
 	//打开设备,设备初始化,如果设备内有卡,吞卡操作
 	tryCnt =0;
@@ -310,41 +303,43 @@ ErrorCodeEnum CardIssuerClassImpl::DevOpenEx(DWORD dwPort, DWORD dwBaudRate, BYT
 			{
 				//p_OCardIssuer->ResetComm();
 			}
-			LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iInit failed ");
+			LOG4VTM(INFO,"Enter CardIssuer::DevOpenEX: iInit failed ");
 			++tryCnt;
 		}
 		else
 		{
 			bl = true;
-			LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iInit success ");
+			m_bDevIsOpen = true;
+			LOG4VTM(INFO,"Enter CardIssuer::DevOpenEX: iInit success ");
 			break;
 		}
 	}
 
 	if (!bl)
 	{
-		//l_iResult = Error_Hardware;
-		l_iResult = Error_DevConnFailed;
+		return Error_DevConnFailed;
+
 	}
 
-	m_bDevIsOpen = true;
 	
-	//获取版本信息
-	tIDCVersionInfo tVersionInfo;
-	memset(&tReturnInfo, 0, sizeof(tReturnInfo));
-	memset(&tVersionInfo, 0, sizeof(tVersionInfo));
-	l_iResult = m_pCardIssuerDev->iGetVersionInfo(&tVersionInfo,&tReturnInfo);
-	if(SUCCESS != l_iResult) 
-	{
-		LOG4VTM(INFO,"Enter CardIssuer::DevOpen: iGetVersionInfo failed ");	
-	}
+	
+	////获取版本信息
+	//tIDCVersionInfo tVersionInfo;
+	//memset(&tReturnInfo, 0, sizeof(tReturnInfo));
+	//memset(&tVersionInfo, 0, sizeof(tVersionInfo));
+	//l_iResult = m_pCardIssuerDev->iGetVersionInfo(&tVersionInfo,&tReturnInfo);
+	//if(SUCCESS != l_iResult) 
+	//{
+	//	LOG4VTM(INFO,"Enter CardIssuer::DevOpenEX: iGetVersionInfo failed ");	
+	//}
 	
 
 	if(!m_bDevIsOpen)
 	{
+		LOG4VTM(INFO," CardIssuer::DevOpenEX:m_bDevIsOpen Error_DevConnFailed");
 		return Error_DevConnFailed;
 	}
-
+	
 	return Error_Succeed;
 	
 	

+ 25 - 0
DevAdapter/grg/contactlesscard.1.1/CMakeLists.txt

@@ -0,0 +1,25 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("ContactlessCard")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "grg")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+	contactless_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_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}/grg")
+
+target_link_libraries(${MODULE_FULL_NAME} grgRFIDCDev dl ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 694 - 0
DevAdapter/grg/contactlesscard.1.1/contactless_impl.cpp

@@ -0,0 +1,694 @@
+#include "contactless_impl.h"
+#include <cstring>
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <stdio.h>
+#include "log4vendor.h"
+
+extern char ** environ;
+//using namespace std;
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+	
+	cmb::log_init_config config;
+    config.dev_name = "ContactlessCard";
+	config.log_level = CMB_LOG_LEVEL_TRACE;
+#if defined(_MSC_VER)
+    config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+    config.log_dir = ("/opt/rvc/dbg/");
+#endif //_MSC_VER
+    std::string str;
+    cmb::log4vendor::init(config, str);
+    printf("init after: %s\n", str.c_str());
+	
+	
+	baseObj = new ContactlessCardImpl();
+	if(baseObj == NULL) {
+		return Error_Resource;
+	} else {
+		return Error_Succeed;
+	}
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+	if(pBaseObj == NULL) {
+		return Error_Param;
+	}
+	if(ContactlessCardImpl* pTmp = dynamic_cast<ContactlessCardImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}
+
+
+
+ContactlessCardImpl::ContactlessCardImpl()
+        :m_mode(0)
+{
+	m_pCardRFIDCDev  = NULL;	
+	memset(&m_tDevErrorInfo,0,sizeof(m_tDevErrorInfo));
+
+	//char m_acLogicDevName[32] ={0};
+	//m_pCardRFIDCDev = new ORFReaderDev(m_acLogicDevName);
+}
+
+ContactlessCardImpl::~ContactlessCardImpl()
+{
+	
+ 	if(NULL != m_pCardRFIDCDev) 
+ 	{
+ 		m_pCardRFIDCDev->iCloseComm();//关闭通信
+ 		delete m_pCardRFIDCDev;
+ 		m_pCardRFIDCDev = NULL;
+	}
+}
+
+ErrorCodeEnum ContactlessCardImpl::DevOpen(DWORD dwPort,DWORD dwBaudRate)
+{
+	
+	char **var;
+    for(var = environ;*var != NULL;var++)
+	{
+		LOG4VTM(INFO,*var);
+		//cout<<*var<<endl;
+	}
+	
+	FILE *fp = NULL;
+	char data[150] = {'0'};
+	fp = popen("ldd -r /opt/run/version/0.0.3.45/dep/grg/libgrgRFIDCDev.so", "r");
+	if (fp == NULL)
+	{
+		printf("popen error!\n");
+	}
+	while (fgets(data, sizeof(data), fp) != NULL)
+	{
+		LOG4VTM(INFO,data);
+		//printf("%s", data);
+	}
+	pclose(fp);
+	
+	if(m_pCardRFIDCDev == NULL)
+	{
+		m_pCardRFIDCDev = new ORFReaderDev();
+	}
+	
+	LOG4VTM(INFO,"enter DevOpen ");
+	if(m_pCardRFIDCDev == NULL)
+	{
+
+		LOG4VTM(INFO,"m_pCardRFIDCDev == NULL");
+		return Error_NotInit;
+	}
+	tDevReturn tReturnInfo;
+	memset(&tReturnInfo, 0, sizeof(tReturnInfo));
+
+	int l_iResult = m_pCardRFIDCDev->iSetCommPara(&tReturnInfo);
+	if (l_iResult != 0)
+	{
+		LOG4VTM(INFO,"DevOpen - iSetCommPara fail");
+		
+		char szErrMsg[256]={0};
+		snprintf(szErrMsg, sizeof(szErrMsg), "iSetCommPara fail code: %d",tReturnInfo.iLogicCode);
+		LOG4VTM(INFO,szErrMsg);
+			
+		return Error_DevConnFailed;
+	}
+	l_iResult = m_pCardRFIDCDev->iInit(1, &tReturnInfo);
+	if (l_iResult != 0)
+	{
+		LOG4VTM(INFO,"DevOpen - iInit fail");
+		
+		char szErrMsg[256]={0};
+		snprintf(szErrMsg, sizeof(szErrMsg), "iInit fail code: %d",tReturnInfo.iLogicCode);
+		LOG4VTM(INFO,szErrMsg);
+
+		return Error_NotInit;
+	}
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::GetDevStatus(RFICReaderStatus &devStatus)
+{
+	
+	LOG4VTM(INFO,"enter  GetDevStatus ");
+	if(m_pCardRFIDCDev == NULL)
+	{
+		
+		return Error_NotInit;
+	}
+	tIDCStatusInfoEx l_srStatusInfo = {0};
+	l_srStatusInfo.byIssueCard = 0xFF;	// 不获取发卡器状态
+	tDevReturn l_asReturn[8] = {0};
+
+	//可先判断卡类型
+	int l_iResult = m_pCardRFIDCDev->iGetDevStatus(&l_srStatusInfo, l_asReturn);
+	if (l_iResult != 0)
+	{
+		
+		LOG4VTM(INFO,"iGetDevStatus : fail");
+		return Error_NotExist;
+	}
+	memset(&devStatus,0,sizeof(devStatus));
+	devStatus.eMediaPos = CI_MEDIA_NOT_IC;
+
+	if(l_srStatusInfo.byMedia == 4)
+	{
+		if(l_srStatusInfo.byICType =='A')
+		{
+			devStatus.eMediaPos = CI_MEDIA_RF;
+		}
+		else if(l_srStatusInfo.byICType =='B')
+		{
+			 devStatus.eMediaPos = CI_MEDIA_IDCARD;
+		}
+		else if(l_srStatusInfo.byICType =='M')
+		{
+			 devStatus.eMediaPos = CI_MEDIA_IC;
+		}
+		else
+		{
+			devStatus.eMediaPos = CI_MEDIA_NOT_IC;
+			
+		}
+	}
+	else
+	{
+		devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
+	}
+	
+
+  
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::AbortRead()
+{
+	if(m_pCardRFIDCDev == NULL)
+	{
+
+		return Error_NotInit;
+	}
+
+	return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType,char scdType,char thdType,char &outType)
+{
+	LOG4VTM(INFO,"enter : ActiveContactlessICCard");
+	outType = '0';
+    if(m_pCardRFIDCDev == NULL)
+    {
+        LOG4VTM(INFO,"ActiveContactlessICCard : fail");
+        return Error_NotInit;
+    }
+
+    int count = 0;
+    char loop[3] = {0};
+    loop[0] = fstType;
+    loop[1] = scdType;
+    loop[2] = thdType;
+    bool isSuccess = false;
+    ErrorCodeEnum retActivate = Error_NotImpl;
+    
+    unsigned char buf[128] = {0};
+   
+	short rr  =0;
+    while(count<3)
+    {
+        char thisType = loop[count];
+       // sleep(100);   //延迟100 ,不延迟第一次调用获取状态失败
+        if(thisType == 'A')
+        {
+			
+            retActivate = A_ActivateCard(outType);
+            if(retActivate == Error_Succeed)
+            {
+                isSuccess = true;
+                break;
+            }
+        }else if(thisType == 'B')
+        {
+            retActivate = B_ActivateCard(outType);
+            if(retActivate == Error_Succeed)
+            {
+                isSuccess = true;
+                break;
+            } 
+        }else if(thisType == 'M')
+        {
+            retActivate = M_ActivateCard(outType);
+            if(retActivate == Error_Succeed)
+            {
+                isSuccess = true;
+                break;
+            } 
+        }
+        count++;
+    }
+    if(!isSuccess)
+    {
+        return retActivate;
+    }
+    
+    return Error_Succeed;
+}
+ErrorCodeEnum ContactlessCardImpl::A_ActivateCard(char &outType)
+{
+	LOG4VTM(INFO,"enter : A_ActivateCard");
+
+	int l_iPowerMode = 7;	// 不论激活成功与否,操作完非接后,最好都释放非接卡片
+	int l_uiDataLen = 1024;
+	BYTE l_acData[1024] = {0};
+
+	tDevReturn l_asReturn[8] = {0};
+	int l_iResult = m_pCardRFIDCDev->iChipPower(l_iPowerMode,l_acData, &l_uiDataLen, l_asReturn);
+	if (SUCCESS != l_iResult)
+	{
+		LOG4VTM(INFO,"iChipPower 7: fail");
+	}
+	else
+	{
+		LOG4VTM(INFO,"iChipPower 7: success");
+	}
+
+	tIDCStatusInfoEx l_srStatusInfo = {0};
+	l_srStatusInfo.byIssueCard = 0xFF;	// 不获取发卡器状态
+
+	int l_iResult2 = m_pCardRFIDCDev->iGetDevStatus(&l_srStatusInfo, l_asReturn);
+	if (SUCCESS != l_iResult2)
+	{
+		LOG4VTM(INFO,"iGetDevStatus : fail");
+		return Error_Cancel;
+	}
+	if (l_srStatusInfo.byMedia == 4&&l_srStatusInfo.byICType =='A')
+	{
+		int l_iPowerMode = 5;	// 激活非接卡片
+		BYTE l_acData[1024] = {0};
+		int  l_uiDataLen = 1024;
+
+		tDevReturn l_asReturn2[8] = {0};
+
+		l_uiDataLen = sizeof(l_acData);
+		int l_iResult = m_pCardRFIDCDev->iChipPower(l_iPowerMode,l_acData, &l_uiDataLen, l_asReturn2);
+		if (SUCCESS == l_iResult)
+		{
+			outType = 'A';
+			
+		}else
+		{
+			LOG4VTM(INFO,"iChipPower 5: fail");
+			return Error_Cancel;
+
+		}
+	}
+	else
+	{
+
+
+		memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
+		snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "l_srStatusInfo.byMedia : %d  l_srStatusInfo.byICType :  %d", l_srStatusInfo.byMedia, l_srStatusInfo.byICType);
+		m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
+		LOG4VTM(INFO,m_DevErrorInfo.szErrMsg);
+
+		LOG4VTM(INFO,"l_srStatusInfo.byICType or l_srStatusInfo.byMedia not right");
+		return Error_Cancel;
+	}
+	return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::B_ActivateCard(char &outType)
+{
+	LOG4VTM(INFO,"enter : B_ActivateCard");
+
+	int l_iPowerMode = 7;	// 不论激活成功与否,操作完非接后,最好都释放非接卡片
+	int l_uiDataLen = 1024;
+	BYTE l_acData[1024] = {0};
+
+	tDevReturn l_asReturn[8] = {0};
+	int l_iResult = m_pCardRFIDCDev->iChipPower(l_iPowerMode,l_acData, &l_uiDataLen, l_asReturn);
+	if (SUCCESS != l_iResult)
+	{
+		LOG4VTM(INFO,"iChipPower 7 : fail");
+	}
+
+	tIDCStatusInfoEx l_srStatusInfo = {0};
+	l_srStatusInfo.byIssueCard = 0xFF;	// 不获取发卡器状态
+
+	int l_iResult2 = m_pCardRFIDCDev->iGetDevStatus(&l_srStatusInfo, l_asReturn);
+	if (SUCCESS != l_iResult2)
+	{
+		LOG4VTM(INFO,"iGetDevStatus : fail");
+		return Error_Cancel;
+	}
+	if (l_srStatusInfo.byMedia == 4&&l_srStatusInfo.byICType =='B')
+	{
+		int l_iPowerMode = 5;	// 激活非接卡片
+		BYTE l_acData[1024] = {0};
+		int  l_uiDataLen = 1024;
+
+		tDevReturn l_asReturn2[8] = {0};
+
+		l_uiDataLen = sizeof(l_acData);
+		int l_iResult = m_pCardRFIDCDev->iChipPower(l_iPowerMode,l_acData, &l_uiDataLen, l_asReturn2);
+		if (SUCCESS == l_iResult)
+		{
+			outType = 'B';
+		}else
+		{
+			
+			return Error_Cancel;
+		}
+	}
+	else
+	{
+
+		memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
+		snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "l_srStatusInfo.byMedia : %d  l_srStatusInfo.byICType :  %d", l_srStatusInfo.byMedia, l_srStatusInfo.byICType);
+		m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
+		LOG4VTM(INFO,m_DevErrorInfo.szErrMsg);
+		
+		LOG4VTM(INFO,"l_srStatusInfo.byICType or l_srStatusInfo.byMedia not right");
+		return Error_Cancel;
+	}
+
+	
+	return Error_Succeed;
+
+}
+
+ErrorCodeEnum ContactlessCardImpl::M_ActivateCard(char &outType)
+{
+	return Error_NotImpl;
+}
+////禁用非接触式IC卡
+ErrorCodeEnum ContactlessCardImpl::DeactContactlessICCard()
+{
+	LOG4VTM(INFO,"enter : DeactContactlessICCard");
+
+	if(m_pCardRFIDCDev == NULL)
+    {
+        
+        return Error_NotInit;
+    }
+    
+	int l_iPowerMode = 7;	// 不论激活成功与否,操作完非接后,最好都释放非接卡片
+	int l_uiDataLen = 1024;
+	BYTE l_acData[1024] = {0};
+		
+	tDevReturn l_asReturn[8] = {0};
+	int l_iResult = m_pCardRFIDCDev->iChipPower(l_iPowerMode,l_acData, &l_uiDataLen, l_asReturn);
+
+	if(l_iResult  != SUCCESS)
+	{	
+		LOG4VTM(INFO,"iChipPower 7: fail");
+		
+		return Error_DevCommFailed;
+				
+	}
+   
+    
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::WarmReset()
+{
+	LOG4VTM(INFO,"enter : WarmReset");
+    RFICReaderStatus devStatus;
+    if(GetDevStatus(devStatus)!=Error_Succeed)
+    {
+		LOG4VTM(INFO,"GetDevStatus : fail");
+        return Error_DevCommFailed;
+    }
+    if(devStatus.eMediaPos == CI_MEDIA_NOTPRESENT)
+    {
+        LOG4VTM(INFO,"GetDevStatus : devStatus.eMediaPos == CI_MEDIA_NOTPRESENT");
+        return Error_NoTarget;
+    }
+   
+    return Reset();
+}
+
+ErrorCodeEnum ContactlessCardImpl::MifareCommand(MifareFuctionEnum eFunType,CmdInfo sendBuf,CmdInfo &recvBuf)
+{
+//    
+//	memset(&recvBuf, 0, sizeof(recvBuf));
+//   
+//    short ret = -1;
+//
+//    switch(eFunType)
+//    {
+//    case CI_MIFARE_LOAD_KEY:
+//        {
+//            unsigned char buff[6] = {0};
+//            memcpy(buff,(char*)sendBuf.data[2],6);
+//           
+//        } 
+//        break;
+//    case CI_MIFARE_AUTH: //验证
+//        {
+//            
+//        }
+//        break;
+//    case CI_MIFARE_READ:
+//        {
+//            unsigned char buff[16] = {0};
+//         
+//            memcpy(recvBuf.data,buff,sizeof(buff));
+//            recvBuf.dwSize = sizeof(buff);
+//        }
+//        break;
+//    case CI_MIFARE_WRITE:
+//        {
+//            unsigned char buff[16] = {0};
+//            memcpy(buff,(char*)sendBuf.data[2],16);
+//          
+//        }
+//        break;
+//    case CI_MIFARE_INC:
+//        {
+//            return Error_NotImpl;
+//        }
+//        break;
+//    case CI_MIFARE_DEC:
+//        {
+//            return Error_NotImpl;
+//        }
+//        break;
+//    }
+//    if(ret<0)
+//    {
+//       
+//    }
+//   
+    return Error_Succeed;
+}
+//
+ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf,CmdInfo &recvBuf)
+{
+	
+	if(m_pCardRFIDCDev == NULL)
+   {
+     
+		
+       return Error_NotInit;
+   }
+	tIDCStatusInfoEx l_srStatusInfo = {0};
+	l_srStatusInfo.byIssueCard = 0xFF;	// 不获取发卡器状态
+	tDevReturn l_asReturn[8] = {0};
+
+	//可先判断卡类型
+	m_pCardRFIDCDev->iGetDevStatus(&l_srStatusInfo, l_asReturn);
+
+	//std::string dadf = ByteArray2String(sendBuf.data,sendBuf.dwSize);
+	
+	BYTE l_acData[1024] = {0};
+	UINT l_uiDataLen = 1024;
+	
+	// 与卡片交互
+	int l_iIndex = 0;
+	int CommLen = sendBuf.dwSize;
+	
+	int l_iResult = m_pCardRFIDCDev->iChipIO(l_iIndex, sendBuf.data,CommLen,l_acData,&l_uiDataLen, l_asReturn);
+	if(l_iResult  != SUCCESS)
+	{
+	
+		recvBuf.dwSize = 0;
+		memset(&recvBuf,0,sizeof(recvBuf));
+	
+		
+		return Error_DevCommFailed;
+	}
+	recvBuf.dwSize = l_uiDataLen;
+	memcpy(recvBuf.data,l_acData,l_uiDataLen);
+
+
+ 
+    return Error_Succeed;
+}
+//std::string ContactlessCardImpl::ByteArray2String(const BYTE* lpData,int nDataLen) 
+//{
+//	std::string strAscii;
+//	if( lpData == NULL || nDataLen <= 0 )
+//		return strAscii ;
+//
+//	TCHAR szBuf[3] = {0} ;
+//	for(int i=0; i<nDataLen; i++)
+//	{
+//		_stprintf(szBuf,L"%02X",*(lpData+i)) ;
+//		int iLen = WideCharToMultiByte(CP_ACP, 0, szBuf, -1, NULL, 0, NULL, NULL);
+//
+//		char* chRtn = new char[iLen * sizeof(char)];
+//
+//		WideCharToMultiByte(CP_ACP, 0, szBuf, -1, chRtn, iLen, NULL, NULL);
+//
+//		std::string m_strAscii(chRtn);
+//
+//		strAscii += m_strAscii;
+//
+//		delete chRtn;
+//	}
+//
+//	return strAscii;
+//}
+ErrorCodeEnum ContactlessCardImpl::HaltCard()
+{
+ 
+	LOG4VTM(INFO,"enter : HaltCard");
+	if(m_pCardRFIDCDev == NULL)
+    {
+       
+        return Error_NotInit;
+    }
+	int l_iPowerMode = 7;	// 不论激活成功与否,操作完非接后,最好都释放非接卡片
+	int l_uiDataLen = 1024;
+	BYTE l_acData[1024] = {0};
+
+	tDevReturn l_asReturn[8] = {0};
+	int l_iResult = m_pCardRFIDCDev->iChipPower(l_iPowerMode,l_acData, &l_uiDataLen, l_asReturn);
+
+	if(l_iResult  != SUCCESS)
+	{
+		
+		LOG4VTM(INFO,"iChipPower 7 : fail");
+		return Error_DevCommFailed;
+	}
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LOG4VTM(INFO,"enter : GetDevCategory");
+    if(m_pCardRFIDCDev == NULL)
+    {
+        LOG4VTM(INFO,"m_pCardRFIDCDev == NULL");
+        return Error_NotInit;
+    }
+	tIDCVersionInfo* m_ptIDCVersionInfo = new tIDCVersionInfo();
+
+	memset(m_ptIDCVersionInfo, 0, sizeof(m_ptIDCVersionInfo));
+
+	tDevReturn tReturnInfo;
+	int l_iResult = m_pCardRFIDCDev->iGetVersionInfo(m_ptIDCVersionInfo,&tReturnInfo);
+
+	if(l_iResult  != SUCCESS)
+	{
+		
+		LOG4VTM(INFO,"iGetVersionInfo : fail");
+		return Error_DevCommFailed;
+	}
+    unsigned char buf[128] = {0};
+   
+    short ret =0;
+    devCategory.eState = DEVICE_STATUS_NOT_READY;
+    
+	char pType[128] = {"PVER=grg#MID=CRT-603"};
+
+	char pMode[128]= {"STYLE=#FUNCTION=#FWID="};
+	char pVendor[10]= {"grg"};
+    memcpy(devCategory.szType,pType,strlen(pType));
+    memcpy(devCategory.szModel,pMode,strlen(pMode));
+	strcat(devCategory.szModel,m_ptIDCVersionInfo->acDevVer); //CRT591H
+    memcpy(devCategory.szVendor,pVendor,strlen(pVendor));
+
+
+	int l_iMajor=0, l_iMinor=1, l_iRevision=1, l_iBuild=65536;
+	//设备版本号 software version
+	
+	devCategory.version.wMajor = l_iMajor;
+	devCategory.version.wMinor = l_iMinor;
+	devCategory.version.wRevision = l_iRevision;
+	devCategory.version.wBuild = l_iBuild;
+
+	if(NULL != m_ptIDCVersionInfo)
+		delete m_ptIDCVersionInfo;
+	m_ptIDCVersionInfo = NULL;
+
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::Reset()
+{
+  
+	LOG4VTM(INFO,"enter : Reset");
+    if(m_pCardRFIDCDev==NULL)
+    {
+      
+        return Error_NotInit;
+    }
+    unsigned char len = 0;
+    unsigned char buff[128] = {0};
+
+	tDevReturn tReturnInfo;
+	memset(&tReturnInfo, 0, sizeof(tReturnInfo));
+
+	int l_iResult = m_pCardRFIDCDev->iInit(1, &tReturnInfo);
+	if(l_iResult  != SUCCESS)
+	{
+		LOG4VTM(INFO,"iInit : fail");
+		return Error_DevCommFailed;
+	}
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::DevClose()
+{
+	int l_iResult = m_pCardRFIDCDev->iCloseComm();//关闭通信
+    if(l_iResult  != SUCCESS)
+    {
+        LOG4VTM(INFO,"iCloseComm : fail");
+    }
+    return Error_Succeed;
+}
+
+ErrorCodeEnum ContactlessCardImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+    devErrInfo.dwErrMsgLen = m_tDevErrorInfo.dwErrMsgLen;
+    memcpy(devErrInfo.szErrMsg,m_tDevErrorInfo.szErrMsg,sizeof(m_tDevErrorInfo.szErrMsg));
+    memset(&m_tDevErrorInfo,0,sizeof(m_tDevErrorInfo));
+    return Error_Succeed;
+
+}
+
+void ContactlessCardImpl::UpdatalastErr(DWORD logicCode,DWORD phyCode,std::string msg)
+{
+    memset(&m_tDevErrorInfo,0,sizeof(m_tDevErrorInfo));
+	
+	std::string lCode ;//= int2str(logicCode);
+	std::string pCode ;//= int2str(phyCode);
+
+
+	std::string slCode =  "{lastErrorCode:(logicCode: ";
+	std::string spCode =  " PhyCode: ";
+	std::string strPhyCode = slCode + lCode + spCode + pCode+")}";
+	
+    std::string msgError = msg + strPhyCode;
+	m_tDevErrorInfo.dwErrMsgLen = phyCode << 16;
+    memcpy(m_tDevErrorInfo.szErrMsg,msgError.c_str(),msgError.length());
+	m_tDevErrorInfo.dwErrMsgLen += (msgError.length() & 0x0000FFFF); 
+
+}

+ 98 - 0
DevAdapter/grg/contactlesscard.1.1/contactless_impl.h

@@ -0,0 +1,98 @@
+#ifndef LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H
+#define LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H
+
+#include "RFICClass.h"
+#include "RFReaderDev.h"
+class ContactlessCardImpl : public RFICClass
+{
+public:
+    ContactlessCardImpl();
+    ~ContactlessCardImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //device initialization
+    virtual ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate);
+   
+
+    //
+//	Get card reader status
+//
+    virtual ErrorCodeEnum GetDevStatus(RFICReaderStatus& devStatus);
+    
+    //
+    //	Abort current operation.
+    //
+    virtual ErrorCodeEnum AbortRead();
+    
+    //
+    //	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
+    //
+    virtual ErrorCodeEnum ActiveContactlessICCard(char fstType, char scdType, char thdType, char& outType);
+	
+    //
+    //	Deactivate contactless IC card
+    //
+    virtual ErrorCodeEnum DeactContactlessICCard();
+    //
+    //	Warm reset card(IC)
+    //
+    virtual ErrorCodeEnum WarmReset();
+    
+    //
+    //	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)
+
+    virtual ErrorCodeEnum MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo& recvBuf);
+    
+    //
+    //	RF Type A,B command.
+    //	APDU:Application Protocol Data Unit
+    //	Arguments:
+    // 	- CmdSend.lpCmd:Command-APDU
+    // 	- CmdRecv.lpData:Response-APDU
+    //
+    virtual ErrorCodeEnum RFTypeABCommand(CmdInfo sendBuf, CmdInfo& recvBuf);
+    
+
+    //halt card
+    //card have been halted must move from induction zone then can be found again
+    virtual ErrorCodeEnum HaltCard();
+    
+	ErrorCodeEnum A_ActivateCard(char &outType);
+	ErrorCodeEnum B_ActivateCard(char &outType);
+	ErrorCodeEnum M_ActivateCard(char &outType);
+
+	
+	void UpdatalastErr(DWORD logicCode,DWORD phyCode,std::string msg);
+	DevErrorInfo m_tDevErrorInfo;
+	ORFReaderDev*	m_pCardRFIDCDev;
+	
+	DevErrorInfo m_DevErrorInfo;
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_CONTACTLESSCARD_IMPL_H

+ 23 - 0
DevAdapter/grg/gpio.1.1/CMakeLists.txt

@@ -0,0 +1,23 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("Gpio")
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR "grg")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+	gpio_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}/grg")
+
+target_link_libraries(${MODULE_FULL_NAME} grgIOSignalCtrBoardDev dl ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 559 - 0
DevAdapter/grg/gpio.1.1/gpio_impl.cpp

@@ -0,0 +1,559 @@
+#include <memory.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "gpio_impl.h"
+#include "log4vendor.h"
+#include "IOSignalCtrBoardDevDef.h"
+
+#define SIU_DEF_DEVNAME			"IOEXTENDDEV"
+#define SIGNAL_NUM				16
+
+GPIOClassImpl::GPIOClassImpl()
+	:m_mode(0)
+{
+	m_pHandle = NULL;
+	memset(&m_GpioParm,0,sizeof(m_GpioParm));
+}
+
+GPIOClassImpl::~GPIOClassImpl()
+{
+	DevClose();
+}
+
+ErrorCodeEnum GPIOClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	const char *pType = "PVER=GRG#MID=IOExtern";
+	const char *pMode = "FWID=0";
+	const char *pVendor = "grg";
+	strcpy(devCategory.szType, pType);
+	strcpy(devCategory.szModel, pMode);
+	strcpy(devCategory.szVendor, pVendor);
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 65535;
+	devCategory.version.wBuild = 1;
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::Reset()
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	tDevReturn l_tDevReturn[8] = { 0 };
+	iInit(m_pHandle,INIT_IO_STAUTS, l_tDevReturn);
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::DevClose()
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	if (m_pHandle) {
+		iCloseComm(m_pHandle);
+		vCloseLigicDevice(m_pHandle);
+		m_pHandle = NULL;
+	}
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	memset(&devErrInfo, 0, sizeof(devErrInfo));
+	memcpy(&devErrInfo, &m_DevErrorInfo, sizeof(devErrInfo));
+	return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::DevOpen(GpioInitParam initParam)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	int l_oDuniteResult = SUCCESS;
+	memcpy(&m_GpioParm,&initParam,sizeof(initParam));
+	tDevReturn l_tDevReturn[8] = { 0 };
+
+	m_pHandle = hOpenLogicDevice(SIU_DEF_DEVNAME);
+	if (m_pHandle == NULL) {
+		//Open Dev error
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,E_IOSignalCtrBoard_BASE,"Open logicDevice Failed,hOpenLogicDevice");
+		return Error_DevConnFailed;
+	}
+
+	l_oDuniteResult = iSetCommPara(m_pHandle,l_tDevReturn);
+
+	if (SUCCESS != l_oDuniteResult)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "Open logicDevice Failed,iSetCommPara");
+		return Error_DevConnFailed;
+	}
+
+	memset(l_tDevReturn, 0, sizeof(l_tDevReturn));
+	l_oDuniteResult = iInit(m_pHandle,INIT_IO_STAUTS, l_tDevReturn);
+	if (SUCCESS != l_oDuniteResult)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "Open logicDevice Failed,iInit");
+		return Error_NotInit;
+	}
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}
+
+ErrorCodeEnum GPIOClassImpl::WritePort(DWORD dwPort, BYTE btData)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	if (0>dwPort || dwPort >= MAX_PORT_NUM)
+	{
+		//LOG4VTM(ERROR,__FUNCTION__<<"0>dwPort || dwPort >= MAX_PORT_NUM"<<"dwPort = "<<dwPort);
+		char msg[1024]={0};
+		sprintf(msg,"invalid param dwPort = %d",dwPort);
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,E_IOSignalCtrBoard_INVALIDPARAM, msg);
+		return Error_Param;
+	}
+
+	ErrorCodeEnum l_ErrRlt = Error_Succeed;
+	tDevReturn l_tDevReturn[8] = { 0 };
+
+	int l_oDuniteResult = iSetCommPara(m_pHandle,l_tDevReturn);
+	if (SUCCESS != l_oDuniteResult)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "WritePort Failed,iSetCommPara");
+		return Error_DevConnFailed;
+		//return (ErrorCodeEnum)l_tDevReturn[0].iLogicCode;
+	}
+
+	l_oDuniteResult = iGetLightStatus(0, l_tDevReturn);
+	BYTE l_btStatus[2] = { 0 };
+	vGetLightStatus(l_btStatus, l_tDevReturn);
+	
+	//process hspscanner Tips light 26-6
+	if(dwPort == 3)
+	{
+		l_oDuniteResult = iSetLightStatus(m_pHandle,6, btData >> (2) & 1, l_tDevReturn);
+		if (SUCCESS != l_oDuniteResult)
+		{
+			FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "WritePort Failed,iSetLightStatus");
+			return Error_Unexpect;
+		}
+		return l_ErrRlt;
+	}
+	//process hspscanner Tips light
+	
+	//process other light
+	if (dwPort>1)	//12路扩展板只能支持dwPort=0,dwPort=1
+	{
+		return l_ErrRlt;
+	}
+
+	//先判断usb通断
+	if (dwPort == 0)
+	{
+		if (btData >> 1 & 1)
+		{
+			//usb 通
+			l_oDuniteResult = iUsbOnOffSetting(m_pHandle,1, 0, l_tDevReturn);
+		}
+		else
+		{
+			//usb 断
+			l_oDuniteResult = iUsbOnOffSetting(m_pHandle,0, 0, l_tDevReturn);
+		}
+	}
+
+	//BYTE l_byStatusChanged = l_btStatus[dwPort] ^ btData;
+
+	for (int i = 1; i <= 8; i++)
+	{
+		int l_iIoNum = dwPort * 8 + i;
+		if (l_iIoNum>SIGNAL_NUM)
+		{
+			break;
+		}
+
+		//if (l_byStatusChanged & (1 << (i - 1)))
+		{
+			memset(l_tDevReturn, 0, sizeof(l_tDevReturn));
+			int l_iGrg = -1;
+			//can't find no
+			if(!vChangeTable(l_iGrg, l_iIoNum, false))
+				continue;
+/*				
+			//jump usb control
+			if(l_iGrg == -1)
+				continue;
+*/				
+			//printf("l_iGrg = %d, on = %d\n",l_iGrg,btData >> (i - 1) & 1);
+			l_oDuniteResult = iSetLightStatus(m_pHandle,l_iGrg, btData >> (i - 1) & 1, l_tDevReturn);
+			if (SUCCESS != l_oDuniteResult)
+			{
+				FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "WritePort Failed,iSetLightStatus");
+				return Error_Unexpect;
+			}
+		}
+	}
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return l_ErrRlt;
+}
+
+ErrorCodeEnum GPIOClassImpl::ReadPort(DWORD dwPort, BYTE& btStatus)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	ErrorCodeEnum l_ErrRlt = Error_Succeed;
+	btStatus = 0;
+	if (0>dwPort || dwPort >= MAX_PORT_NUM)
+	{
+		//LOG4VTM(ERROR,__FUNCTION__<<"0>dwPort || dwPort >= MAX_PORT_NUM"<<"dwPort = "<<dwPort);
+		char msg[1024]={0};
+		sprintf(msg,"invalid param dwPort = %d",dwPort);
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,E_IOSignalCtrBoard_INVALIDPARAM, msg);
+		return Error_Param;
+	}
+/*	
+	if (0 > dwPort || dwPort >= MAX_PORT_NUM) //错误dwPort输入
+	{
+		return Error_Param;
+	}
+*/
+	//get IOIn status start
+	if(dwPort == 2)
+	{
+		BYTE l_btStatus[2] = { 0 };
+		tDevReturn l_tDevReturn[8] = { 0 };
+		int l_iStartus = iGetIOInStatus(0, l_tDevReturn);
+		vGetIOInStatus(l_btStatus, l_tDevReturn);
+		btStatus = l_btStatus[0];
+		LOG4VTM(INFO,__FUNCTION__<<" OK");
+		return l_ErrRlt;
+	}
+	//get IOIn status end
+	
+	//get hspscanner Tips light status
+	if(dwPort == 3)
+	{
+		tDevReturn l_tDevReturn[8] = { 0 };
+		int l_iStartus = iGetLightStatus(0, l_tDevReturn);
+		btStatus |= l_tDevReturn[5].iLogicCode << 5;
+		LOG4VTM(INFO,__FUNCTION__<<" OK");
+		return l_ErrRlt;
+	}
+	//get hspscanner Tips light status
+
+	//get other light status
+	if (dwPort > 1)	//12路扩展板只能支持dwPort=0,dwPort=1
+	{
+		return l_ErrRlt;
+	}
+
+	BYTE l_btStatus[2] = { 0 };
+	tDevReturn l_tDevReturn[8] = { 0 };
+	int l_iStartus = iGetLightStatus(0, l_tDevReturn);
+	vGetLightStatus(l_btStatus, l_tDevReturn);
+
+//	BYTE l_byMask[] = { 0x0F,0x03,0,0 };
+//	btStatus = l_btStatus[dwPort] & l_byMask[dwPort];
+	btStatus = l_btStatus[dwPort];
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return l_ErrRlt;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+	baseObj = new GPIOClassImpl();
+	if (baseObj == NULL) {
+		return Error_Resource;
+	}
+
+	cmb::log_init_config config;
+	config.dev_name = "Gpio";
+	config.log_level = CMB_LOG_LEVEL_TRACE;
+#if defined(_MSC_VER)
+	config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+	config.log_dir = ("/opt/rvc/dbg/");
+#endif //_MSC_VER
+	std::string str;
+	cmb::log4vendor::init(config, str);
+	printf("init after: %s\n", str.c_str());
+
+	return Error_Succeed;
+}
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+	if (pBaseObj == NULL) {
+		return Error_Param;
+	}
+
+	if (GPIOClassImpl* pTmp = dynamic_cast<GPIOClassImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}
+
+void GPIOClassImpl::ZeroDevErrorInfo()
+{
+	memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
+}
+
+void GPIOClassImpl::FormatDevErrorInfo(const char* funcname, int line, int errCode,const char* errStr)
+{
+	ZeroDevErrorInfo();
+	snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "ErrCode:0x%x,Description:Func:%s,Line:%d,Msg:%s", errCode, funcname, line, errStr);
+	m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
+	LOG4VTM(ERROR,m_DevErrorInfo.szErrMsg);
+}
+
+void GPIOClassImpl::vGetLightStatus(BYTE *p_pbtStatus, tDevReturn *p_ptDevReturn)
+{
+	int l_Grg_vaules[SIGNAL_NUM] = { 0 };
+	for (int i = 0; i < 8; i++)
+	{
+		l_Grg_vaules[i] = p_ptDevReturn[i].iLogicCode;
+		//p_pbtStatus[0] |= (p_ptDevReturn[i].iLogicCode << i);
+
+		if (i < 4)
+		{
+			l_Grg_vaules[i + 8] = p_ptDevReturn[i + 4].iPhyCode;
+			//	p_pbtStatus[1] |= (p_ptDevReturn[i+4].iPhyCode << i);
+		}
+	}
+	int l_iZS = 0, l_iGrg = 0;
+	int l_ZS_vaules[SIGNAL_NUM] = { 0 };
+	for (int j = 0; j < SIGNAL_NUM; j++)
+	{
+		printf("vGetLightStatus[%d] = %d\n",j+1,l_Grg_vaules[j]);
+		l_iGrg = j + 1;
+		if(vChangeTable(l_iGrg, l_iZS))
+		{
+			l_ZS_vaules[l_iZS - 1] = l_Grg_vaules[j];
+		}
+	}
+
+	p_pbtStatus[0] = 0;
+	p_pbtStatus[1] = 0;
+	for (int k = 0; k < SIGNAL_NUM; k++)
+	{
+		//printf("light state[%d] : %d\n",k,l_ZS_vaules[k]);
+		if (k < 8)
+		{
+			p_pbtStatus[0] |= l_ZS_vaules[k] << k;
+		}
+		else
+		{
+			p_pbtStatus[1] |= l_ZS_vaules[k] << (k - 8);
+		}
+	}
+
+}
+/*
+招行信号灯序号		公司信号灯编号
+1.读卡器			2.读/发卡指示灯
+2.USB通断控制	
+3.身份证灯			1.身份证指示灯
+4.键盘提示灯		5.键盘照明灯
+5.脸部照明灯		10.摄像头补光灯
+6.故障灯			12.故障指示灯
+7.发卡器维护灯		8.读/发卡器维护灯
+8.USB口提示灯		4.USB口提示灯
+9.非接IC提示		9.非接指示灯
+10.二维码提示灯	
+11.指纹仪提示灯		11.指纹仪指示灯
+12.凭条打印提示灯	7.凭条指示灯
+13.高拍仪照明灯		3.高拍仪照明灯
+14.打印盖章提示绿灯	
+15.纸槽提示绿灯	
+16.纸槽缺纸红灯	
+*/
+//信号灯编号转换
+bool GPIOClassImpl::vChangeTable(int &p_iGrg, int &p_iZS, bool p_bToZS)
+{
+	int l_iGrgs[]={2,1,5,10,12,8,4,9,11,7,3};
+	int l_iZSs[] ={1,3,4,5,6,7,8,9,11,12,13};
+
+	//grg转zs
+	if (p_bToZS)
+	{
+		for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
+		{
+			if (p_iGrg == l_iGrgs[i])
+			{
+				p_iZS = l_iZSs[i];
+				return true;
+			}
+		}
+	}
+	else
+	{
+		//zs转grg
+		for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
+		{
+			if (p_iZS == l_iZSs[i])
+			{
+				p_iGrg = l_iGrgs[i];
+				return true;
+			}
+		}
+	}
+	
+	return false;
+}
+
+#define IOEXTEND_ALLDOOR 0
+int GPIOClassImpl::iGetLightStatus(int p_piLightNum, tDevReturn *p_psStatus)
+{
+	tIOStatus l_stIOStatus;
+	int l_iReuslt = iGetIODevStatus(m_pHandle,&l_stIOStatus, p_psStatus);
+	if (l_iReuslt == SUCCESS)
+	{
+		char	l_acStatusData[0x20];
+		memset(l_acStatusData, 0x00, sizeof(l_acStatusData));
+		sprintf(l_acStatusData, "I%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+			l_stIOStatus.byLightStauts[0], l_stIOStatus.byLightStauts[1], l_stIOStatus.byLightStauts[2],
+			l_stIOStatus.byLightStauts[3], l_stIOStatus.byLightStauts[4], l_stIOStatus.byLightStauts[5],
+			l_stIOStatus.byLightStauts[6], l_stIOStatus.byLightStauts[7], l_stIOStatus.byLightStauts[8],
+			l_stIOStatus.byLightStauts[9], l_stIOStatus.byLightStauts[10], l_stIOStatus.byLightStauts[11]);
+		memcpy(p_psStatus[0].acReserve, l_acStatusData, strlen(l_acStatusData));
+
+		if (p_piLightNum == IOEXTEND_ALLDOOR)
+		{
+			int i = 0;
+			for (i = 0; i < 4; i++)
+			{
+				p_psStatus[i].iLogicCode = l_stIOStatus.byLightStauts[i];
+				p_psStatus[i].iPhyCode = l_stIOStatus.byLightStauts[i];
+			}
+			for (i = 4; i < 8; i++)
+			{
+				p_psStatus[i].iLogicCode = l_stIOStatus.byLightStauts[i];
+				p_psStatus[i].iPhyCode = l_stIOStatus.byLightStauts[i + 4];
+			}
+		}
+		else
+		{
+			p_psStatus[0].iLogicCode = l_stIOStatus.byLightStauts[p_piLightNum - 1];
+			p_psStatus[0].iPhyCode = l_stIOStatus.byLightStauts[p_piLightNum - 1];
+		}
+	}
+	return l_iReuslt;
+}
+
+int GPIOClassImpl::iGetIOInStatus(int p_piLightNum, tDevReturn *p_psStatus)
+{
+	tIOStatus l_stIOStatus;
+	int l_iReuslt = iGetIODevStatus(m_pHandle,&l_stIOStatus, p_psStatus);
+	if (l_iReuslt == SUCCESS)
+	{
+		char	l_acStatusData[0x20];
+		memset(l_acStatusData, 0x00, sizeof(l_acStatusData));
+		sprintf(l_acStatusData, "I%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+			l_stIOStatus.byDoorStauts[0], l_stIOStatus.byDoorStauts[1], l_stIOStatus.byDoorStauts[2],
+			l_stIOStatus.byDoorStauts[3], l_stIOStatus.byDoorStauts[4], l_stIOStatus.byDoorStauts[5],
+			l_stIOStatus.byDoorStauts[6], l_stIOStatus.byDoorStauts[7], l_stIOStatus.byDoorStauts[8],
+			l_stIOStatus.byDoorStauts[9], l_stIOStatus.byDoorStauts[10], l_stIOStatus.byDoorStauts[11]);
+		memcpy(p_psStatus[0].acReserve, l_acStatusData, strlen(l_acStatusData));
+
+		if (p_piLightNum == IOEXTEND_ALLDOOR)
+		{
+			int i = 0;
+			for (i = 0; i < 4; i++)
+			{
+				p_psStatus[i].iLogicCode = l_stIOStatus.byDoorStauts[i];
+				p_psStatus[i].iPhyCode = l_stIOStatus.byDoorStauts[i];
+			}
+			for (i = 4; i < 8; i++)
+			{
+				p_psStatus[i].iLogicCode = l_stIOStatus.byDoorStauts[i];
+				p_psStatus[i].iPhyCode = l_stIOStatus.byDoorStauts[i + 4];
+			}
+		}
+		else
+		{
+			p_psStatus[0].iLogicCode = l_stIOStatus.byDoorStauts[p_piLightNum - 1];
+			p_psStatus[0].iPhyCode = l_stIOStatus.byDoorStauts[p_piLightNum - 1];
+		}
+	}
+	return l_iReuslt;
+}
+
+void GPIOClassImpl::vGetIOInStatus(BYTE *p_pbtStatus, tDevReturn *p_ptDevReturn)
+{
+	int l_Grg_vaules[SIGNAL_NUM] = { 0 };
+	for (int i = 0; i < 8; i++)
+	{
+		l_Grg_vaules[i] = p_ptDevReturn[i].iLogicCode;
+
+		if (i < 4)
+		{
+			l_Grg_vaules[i + 8] = p_ptDevReturn[i + 4].iPhyCode;
+		}
+	}
+	int l_iZS = 0, l_iGrg = 0;
+	int l_ZS_vaules[SIGNAL_NUM] = { 0 };
+	for (int j = 0; j < SIGNAL_NUM; j++)
+	{
+		printf("vGetIOInStatus[%d] = %d\n",j+1,l_Grg_vaules[j]);
+		LOG4VTM(INFO,__FUNCTION__<<" org vGetIOInStatus["<<j+1<<"]"<<" = "<<l_Grg_vaules[j]);
+		l_iGrg = j + 1;
+		if(vChangeTableIOIn(l_iGrg, l_iZS))
+		{
+			//subtract start no 17
+			l_ZS_vaules[l_iZS - 17] = l_Grg_vaules[j];
+		}
+	}
+
+	p_pbtStatus[0] = 0;
+	p_pbtStatus[1] = 0;
+	for (int k = 0; k < SIGNAL_NUM; k++)
+	{
+		//printf("IOIn state[%d] : %d\n",k,l_ZS_vaules[k]);
+		LOG4VTM(INFO,__FUNCTION__<<" change state["<<k<<"]"<<" = "<<l_ZS_vaules[k]);
+		if (k < 8)
+		{
+			p_pbtStatus[0] |= l_ZS_vaules[k] << k;
+		}
+		else
+		{
+			p_pbtStatus[1] |= l_ZS_vaules[k] << (k - 8);
+		}
+	}
+}
+
+bool GPIOClassImpl::vChangeTableIOIn(int &p_iGrg, int &p_iZS, bool p_bToZS)
+{
+	int l_iGrgs[]={1,2,6,7,9};
+	int l_iZSs[] ={17,18,20,21,19};//zs no
+
+	//grg转zs
+	if (p_bToZS)
+	{
+		for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
+		{
+			if (p_iGrg == l_iGrgs[i])
+			{
+				p_iZS = l_iZSs[i];
+				return true;
+			}
+		}
+	}
+	else
+	{
+		//zs转grg
+		for (int i = 0; i < sizeof(l_iGrgs) / sizeof(int); i++)
+		{
+			if (p_iZS == l_iZSs[i])
+			{
+				p_iGrg = l_iGrgs[i];
+				return true;
+			}
+		}
+	}
+	return false;
+}

+ 62 - 0
DevAdapter/grg/gpio.1.1/gpio_impl.h

@@ -0,0 +1,62 @@
+#ifndef LIBFRAMEWORK_GPIO_IMPL_H
+#define LIBFRAMEWORK_GPIO_IMPL_H
+
+#include "GpioClass.h"
+#include "IOSignalCtrBoardDev.h"
+
+class GPIOClassImpl : public GpioClass
+{
+public:
+    GPIOClassImpl();
+    ~GPIOClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	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);
+
+private:
+    int m_mode;
+	void* m_pHandle;
+	DevErrorInfo m_DevErrorInfo;
+	GpioInitParam m_GpioParm;
+	void ZeroDevErrorInfo();
+	void FormatDevErrorInfo(const char* funcname, int line, int errCode,const char* errStr);
+	//light
+	bool vChangeTable(int &p_iGrg, int &p_iZS, bool p_bToZS = true);
+	void vGetLightStatus(BYTE *p_pbtStatus, tDevReturn *p_ptDevReturn);
+	int iGetLightStatus(int p_piLightNum, tDevReturn *p_psStatus);
+	//IO in
+	int iGetIOInStatus(int p_piLightNum, tDevReturn *p_psStatus);
+	void vGetIOInStatus(BYTE *p_pbtStatus, tDevReturn *p_ptDevReturn);
+	bool vChangeTableIOIn(int &p_iGrg, int &p_iZS, bool p_bToZS = true);
+};
+
+
+#endif //LIBFRAMEWORK_GPIO_IMPL_H

+ 18 - 0
DevAdapter/grg/hspscanner.1.1/CMakeLists.txt

@@ -0,0 +1,18 @@
+rvc_dev_define_module("HSPScanner")
+set(${MODULE_PREFIX}_VENDOR "grg")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        hspscanner_impl.cpp
+        )
+
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}/grg")
+
+target_link_libraries(${MODULE_FULL_NAME} dl ${VENDOR_LOG_LIB_NAME})
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 564 - 0
DevAdapter/grg/hspscanner.1.1/hspscanner_impl.cpp

@@ -0,0 +1,564 @@
+#include "hspscanner_impl.h"
+#include <cstring>
+#include <cstdio>
+#include <unistd.h>
+#include "log4vendor.h"
+#include "dlfcn.h"
+#include "BHCamBase.h"
+
+class Inner_Log{
+	public:
+		Inner_Log(const char* funcname){
+			memset(m_funcname,0,sizeof(m_funcname));
+			strcpy(m_funcname,funcname);
+			LOG4VTM(INFO,"========"<<m_funcname<<" entry");
+		}
+		~Inner_Log(){
+			LOG4VTM(INFO,"========"<<m_funcname<<" leave");
+		}
+	private:
+		char m_funcname[256];
+};
+
+#define DEFAULT_HPIXEL	3264
+#define DEFAULT_VPIXEL	2448
+#define IMAGEBUFF_SIZE	(DEFAULT_HPIXEL*DEFAULT_VPIXEL*3)
+
+#ifdef LOG4VTM_FUNCTION
+#undef LOG4VTM_FUNCTION
+#define LOG4VTM_FUNCTION()	\
+		Inner_Log log(__FUNCTION__);
+#endif 
+
+#define CHECK_FUNC_VALID(funcname)	\
+		if(funcname == NULL){\
+			FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Unexpect, #funcname" == NULL");\
+			return Error_Unexpect;\
+		}
+
+#define CHECK_RETURN_VALUE(funcname,ret,retvalue)	\
+		if(ret != FR_RET_SUCC)\
+		{\
+			FormatDevErrorInfo(__FUNCTION__, __LINE__,ret, #funcname" Failed");\
+			return retvalue;\
+		}
+
+HSPSClassImpl::HSPSClassImpl()
+	:m_mode(0)
+{
+	ResetParm();
+	//m_pBuffPic = (unsigned char*)malloc(IMAGEBUFF_SIZE);
+	m_hSo = NULL;
+	m_hSo = dlopen("libBHCamBase.grg.so", RTLD_LAZY);
+	if(m_hSo)
+	{
+		HIGH_StartCamera 			= (PHIGH_StartCamera)dlsym(m_hSo,"HIGH_StartCamera");
+		HIGH_GetFirmwareVersion 	= (PHIGH_GetFirmwareVersion)dlsym(m_hSo,"HIGH_GetFirmwareVersion");
+		HIGH_GetStatus 				= (PHIGH_GetStatus)dlsym(m_hSo,"HIGH_GetStatus");
+		HIGH_StopCamera 			= (PHIGH_StopCamera)dlsym(m_hSo,"HIGH_StopCamera");
+		HIGH_SetAutoCrop 			= (PHIGH_SetAutoCrop)dlsym(m_hSo,"HIGH_SetAutoCrop");
+		HIGH_SetCameraPixel 		= (PHIGH_SetCameraPixel)dlsym(m_hSo,"HIGH_SetCameraPixel");
+		HIGH_SetRotateSize 			= (PHIGH_SetRotateSize)dlsym(m_hSo,"HIGH_SetRotateSize");
+		HIGH_SetColorType 			= (PHIGH_SetColorType)dlsym(m_hSo,"HIGH_SetColorType");
+		HIGH_SetJPGQuality 			= (PHIGH_SetJPGQuality)dlsym(m_hSo,"HIGH_SetJPGQuality");
+		HIGH_GetPixelNum 			= (PHIGH_GetPixelNum)dlsym(m_hSo,"HIGH_GetPixelNum");
+		HIGH_GetHPixelByIndex 		= (PHIGH_GetHPixelByIndex)dlsym(m_hSo,"HIGH_GetHPixelByIndex");
+		HIGH_GetVPixelByIndex 		= (PHIGH_GetVPixelByIndex)dlsym(m_hSo,"HIGH_GetVPixelByIndex");
+		HIGH_CreateWindow 			= (PHIGH_CreateWindow)dlsym(m_hSo,"HIGH_CreateWindow");
+		HIGH_CloseWindow 			= (PHIGH_CloseWindow)dlsym(m_hSo,"HIGH_CloseWindow");
+		HIGH_PauseAndPlay 			= (PHIGH_PauseAndPlay)dlsym(m_hSo,"HIGH_PauseAndPlay");
+		HIGH_TakePicture 			= (PHIGH_TakePicture)dlsym(m_hSo,"HIGH_TakePicture");
+		HIGH_CameraData 			= (PHIGH_CameraData)dlsym(m_hSo,"HIGH_CameraData");
+		HIGH_HideWindow 			= (PHIGH_HideWindow)dlsym(m_hSo,"HIGH_HideWindow");
+	}else{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Unexpect, "dlopen Failed");
+	}
+}
+
+HSPSClassImpl::~HSPSClassImpl()
+{
+	if(m_hSo)
+	{
+		dlclose(m_hSo);
+		m_hSo = NULL;
+	}
+/*	
+	if(m_pBuffPic)
+	{
+		free(m_pBuffPic);
+	}
+*/	
+	DevClose();
+}
+
+void HSPSClassImpl::ResetParm()
+{
+	memset(&m_status,0,sizeof(m_status));
+	m_nX = 0;
+	m_nY = 0;
+	m_nWidth = DEFAULT_DIALOG_WIDTH;
+	m_bAutoCorp = true;
+	m_nColorType = 0;
+	m_nRotateSize = 0;
+}
+
+void HSPSClassImpl::ZeroDevErrorInfo()
+{
+	memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
+}
+
+void HSPSClassImpl::FormatDevErrorInfo(const char* funcname, int line, int errCode,const char* errStr)
+{
+	ZeroDevErrorInfo();
+	snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "ErrCode:0x%x,Description:Func:%s,Line:%d,Msg:%s", errCode, funcname, line, errStr);
+	m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
+	LOG4VTM(ERROR,m_DevErrorInfo.szErrMsg);
+}
+
+ErrorCodeEnum HSPSClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LOG4VTM_FUNCTION();
+	ErrorCodeEnum err = Error_Succeed;
+	const char *pType = "PVER=BH#MID=Q620E";
+	const char *pMode = "FWID=0";
+	const char *pVendor = "grg";
+	strcpy(devCategory.szType, pType);
+	strcpy(devCategory.szModel, pMode);
+	strcpy(devCategory.szVendor, pVendor);
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 65535;
+	devCategory.version.wBuild = 1;
+	
+	CHECK_FUNC_VALID(HIGH_GetFirmwareVersion);
+/*	
+	if(HIGH_GetFirmwareVersion == NULL){
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Unexpect, "HIGH_GetFirmwareVersion == NULL");
+		return Error_Unexpect;
+	}
+*/	
+	char szVersion[64] = {0};
+	int ret = HIGH_GetFirmwareVersion(szVersion);
+	CHECK_RETURN_VALUE(HIGH_GetFirmwareVersion,ret,Error_Unexpect);
+	printf("szVersion = %s\n",szVersion);
+	return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::DevOpen()
+{
+	LOG4VTM_FUNCTION();
+	ErrorCodeEnum err = Error_Succeed;
+	CHECK_FUNC_VALID(HIGH_StartCamera);
+	int ret = HIGH_StartCamera();
+	CHECK_RETURN_VALUE(HIGH_StartCamera,ret,Error_DevConnFailed);
+	m_status.isConnected = 1;
+	int hPixel = DEFAULT_HPIXEL;
+	int vPixel = DEFAULT_VPIXEL;
+	LOG4VTM(INFO,"========HIGH_SetCameraPixel entry");
+	CHECK_FUNC_VALID(HIGH_SetCameraPixel);
+	ret = HIGH_SetCameraPixel(hPixel,vPixel);
+	CHECK_RETURN_VALUE(HIGH_SetCameraPixel,ret,Error_Unexpect);
+	LOG4VTM(INFO,"========HIGH_SetCameraPixel leave");
+	return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::Reset()
+{
+	LOG4VTM_FUNCTION();
+	ErrorCodeEnum err = Error_Succeed;
+	DevClose();
+	ResetParm();
+	DevOpen();
+	return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::DevClose()
+{
+	LOG4VTM_FUNCTION();
+	ErrorCodeEnum err = Error_Succeed;
+	if(m_status.inPreview)
+	{
+		SetPreview(0);
+	}
+	CHECK_FUNC_VALID(HIGH_StopCamera);
+	if(m_status.isConnected)
+	{
+		int ret = HIGH_StopCamera();
+		printf("HIGH_StopCamera ret = %d\n",ret);
+	}
+	m_status.isConnected = 0;
+	m_status.inPreview = 0;
+	m_status.inShow = 0;
+	return err;
+}
+
+ErrorCodeEnum HSPSClassImpl::SetParam(ParamType type, ParamTypeValue value)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,"ParamType = "<<type<<" ParamTypeValue = "<<value);
+	switch(type){
+		case HSPS_MODEL_COLOR:
+			if(value == HSPS_COLOR_GREY)
+			{
+				m_nColorType = 1;
+			}else
+			{
+				m_nColorType = 0;
+			}
+		break;
+		case HSPS_MODEL_ROTATE:
+			if(value == HSPS_ROTATE_LEFT)
+			{
+				m_nRotateSize = 1;
+			}else if(value == HSPS_ROTATE_MIRROR)
+			{
+				m_nRotateSize = 2;
+			}else if(value == HSPS_ROTATE_RIGHT)
+			{
+				m_nRotateSize = 3;
+			}else{
+				m_nRotateSize = 0;
+			}
+		break;
+		case HSPS_MODEL_SCANSIZE:
+			if(value == HSPS_SCAN_FULL)
+			{
+				m_bAutoCorp = false;
+			}else{
+				m_bAutoCorp = true;
+			}
+		break;
+		case HSPS_MODEL_VIEW:
+			CHECK_FUNC_VALID(HIGH_HideWindow);
+			if(value == HSPS_VIEW_HIDE)
+			{
+				if(	m_status.inPreview)
+				{
+					if(m_status.inShow)
+					{
+						int ret = HIGH_HideWindow(true);
+						CHECK_RETURN_VALUE(HIGH_HideWindow,ret,Error_Unexpect);
+						m_status.inShow = 0;
+					}
+				}
+			}else{
+				if(	m_status.inPreview)
+				{
+					if(!m_status.inShow){
+						int ret = HIGH_HideWindow(false);
+						CHECK_RETURN_VALUE(HIGH_HideWindow,ret,Error_Unexpect);
+						m_status.inShow = 1;
+					}
+				}
+			}
+		break;
+	default:
+		break;
+	}
+
+	CHECK_FUNC_VALID(HIGH_SetAutoCrop);
+	int ret = HIGH_SetAutoCrop(m_bAutoCorp);
+	CHECK_RETURN_VALUE(HIGH_SetAutoCrop,ret,Error_Unexpect);
+
+	CHECK_FUNC_VALID(HIGH_SetColorType);
+	ret = HIGH_SetColorType(m_nColorType);
+	CHECK_RETURN_VALUE(HIGH_SetColorType,ret,Error_Unexpect);
+
+	CHECK_FUNC_VALID(HIGH_SetRotateSize);
+	ret = HIGH_SetRotateSize(m_nRotateSize);
+	CHECK_RETURN_VALUE(HIGH_SetRotateSize,ret,Error_Unexpect);
+
+	return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::SetPreview(short nValue)
+{
+	try{	
+		LOG4VTM_FUNCTION();
+		LOG4VTM(INFO,"nValue = "<<nValue);
+		int ret = 0;
+		if(nValue)
+		{
+			LOG4VTM(INFO,"========HIGH_SetAutoCrop entry");
+			CHECK_FUNC_VALID(HIGH_SetAutoCrop);
+			ret = HIGH_SetAutoCrop(m_bAutoCorp);
+			CHECK_RETURN_VALUE(HIGH_SetAutoCrop,ret,Error_Unexpect);
+			LOG4VTM(INFO,"========HIGH_SetAutoCrop leave");
+			
+			LOG4VTM(INFO,"========HIGH_SetColorType entry");
+			CHECK_FUNC_VALID(HIGH_SetColorType);
+			ret = HIGH_SetColorType(m_nColorType);
+			CHECK_RETURN_VALUE(HIGH_SetColorType,ret,Error_Unexpect);
+			LOG4VTM(INFO,"========HIGH_SetColorType leave");
+			
+			LOG4VTM(INFO,"========HIGH_SetRotateSize entry");
+			CHECK_FUNC_VALID(HIGH_SetRotateSize);
+			ret = HIGH_SetRotateSize(m_nRotateSize);
+			CHECK_RETURN_VALUE(HIGH_SetRotateSize,ret,Error_Unexpect);
+			LOG4VTM(INFO,"========HIGH_SetRotateSize leave");
+			
+	/*		
+			if(HIGH_GetPixelNum == NULL){
+				FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Unexpect, "HIGH_GetPixelNum == NULL");
+				return Error_Unexpect;
+			}
+			int num = HIGH_GetPixelNum();
+	*/		
+	/*		
+			if(HIGH_GetHPixelByIndex == NULL || HIGH_GetVPixelByIndex == NULL){
+				FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Unexpect, "HIGH_GetHPixelByIndex == NULL || HIGH_GetVPixelByIndex == NULL");
+				return Error_Unexpect;
+			}
+			
+			int hPixel = HIGH_GetHPixelByIndex(0);
+			int vPixel = HIGH_GetVPixelByIndex(0);
+			printf("hPixel = %d,vPixel = %d\n",hPixel,vPixel);
+	*/
+/*	
+			int hPixel = DEFAULT_HPIXEL;
+			int vPixel = DEFAULT_VPIXEL;
+
+			LOG4VTM(INFO,"========HIGH_SetCameraPixel entry");
+			CHECK_FUNC_VALID(HIGH_SetCameraPixel);
+			ret = HIGH_SetCameraPixel(hPixel,vPixel);
+			CHECK_RETURN_VALUE(HIGH_SetCameraPixel,ret,Error_Unexpect);
+			LOG4VTM(INFO,"========HIGH_SetCameraPixel leave");
+*/
+			LOG4VTM(INFO,"========HIGH_CreateWindow entry");
+			CHECK_FUNC_VALID(HIGH_CreateWindow);
+			ret = HIGH_CreateWindow(m_nX,m_nY,m_nWidth,m_nWidth*9/16);
+			CHECK_RETURN_VALUE(HIGH_CreateWindow,ret,Error_Unexpect);
+			LOG4VTM(INFO,"========HIGH_CreateWindow leave");
+		}else
+		{
+			LOG4VTM(INFO,"========HIGH_CloseWindow entry");
+			CHECK_FUNC_VALID(HIGH_CloseWindow);
+			ret = HIGH_CloseWindow();
+			CHECK_RETURN_VALUE(HIGH_CloseWindow,ret,Error_Unexpect);
+			LOG4VTM(INFO,"========HIGH_CloseWindow leave");
+		}
+	}catch(const std::exception& e)
+	{
+		LOG4VTM(ERROR,"========SetPreview coredump:"<<e.what());
+		return Error_Unexpect;
+	}
+	
+	m_status.inPreview = nValue;
+	m_status.inShow = nValue;
+	return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::ScanImage(const char* pszFileName)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,"pszFileName = "<<pszFileName);
+	CHECK_FUNC_VALID(HIGH_TakePicture);
+	DeleteOldPic(pszFileName);
+	int ret = HIGH_TakePicture(pszFileName);
+	CHECK_RETURN_VALUE(HIGH_TakePicture,ret,Error_Unexpect);
+	CheckSavePic(pszFileName);
+	return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::ScanImageEx(BYTE* pBtImg, int& nBtLen, const char* pszFileName)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,"input nBtLen = "<<nBtLen<<" pszFileName = "<<pszFileName);
+	const char* filename = "/tmp/HSPTempImage.jpg";
+	CHECK_FUNC_VALID(HIGH_TakePicture);
+	FILE* fp = NULL;
+	int ret = 0;
+	if(nBtLen == 0)
+	{
+		//get pic size
+		if(strlen(pszFileName) != 0)
+		{
+			ret = HIGH_TakePicture(pszFileName);
+			CHECK_RETURN_VALUE(HIGH_TakePicture,ret,Error_Unexpect);
+			fp = fopen(pszFileName,"rb");
+		}else{
+			ret = HIGH_TakePicture(filename);
+			CHECK_RETURN_VALUE(HIGH_TakePicture,ret,Error_Unexpect);
+			fp = fopen(filename,"rb");
+		}
+		
+		if(fp)
+		{
+			fseek(fp,0,SEEK_END);
+			nBtLen=ftell(fp);
+			LOG4VTM(INFO,"ScanImageEx get nBtLen = "<<nBtLen);
+			fclose(fp);
+			fp = NULL;
+		}
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_TooSmallBuffer, "ScanImageEx Error_TooSmallBuffer");
+		return Error_TooSmallBuffer;
+	}
+	
+	if(pBtImg == NULL)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Param, "pBtImg == NULL");
+		return Error_Param;
+	}
+	
+	if(strlen(pszFileName) != 0)
+	{
+		fp = fopen(pszFileName,"rb");
+		if(fp)
+		{
+			fread(pBtImg,1,nBtLen,fp);
+			fclose(fp);
+			fp = NULL;
+		}else{
+			LOG4VTM(ERROR,"get image data file fp == NULL,pszFileName = "<<pszFileName);
+		}
+	}else{
+		fp = fopen(filename,"rb");
+		if(fp)
+		{
+			fread(pBtImg,1,nBtLen,fp);
+			fclose(fp);
+			fp = NULL;
+		}else{
+			LOG4VTM(ERROR,"get image data file fp == NULL,filename = "<<filename);
+		}
+		remove(filename);
+	}
+	
+/*		
+	const int nSize = 1024*700;//DEFAULT_HPIXEL*DEFAULT_VPIXEL*3;
+	char* pTemp = (char*)malloc(DEFAULT_HPIXEL*DEFAULT_VPIXEL*3);
+	if(nBtLen < nSize)
+	{
+		nBtLen = nSize;
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_TooSmallBuffer, "ScanImageEx Error_TooSmallBuffer");
+		return Error_TooSmallBuffer;
+	}
+	
+	if(pBtImg == NULL)
+	{
+		//pBtImg = m_pBuffPic;
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Param, "pBtImg == NULL");
+		return Error_Param;
+	}
+		
+	CHECK_FUNC_VALID(HIGH_CameraData);
+	//int ret = HIGH_CameraData((char*)pBtImg);
+	int ret = HIGH_CameraData((char*)pTemp);
+	CHECK_RETURN_VALUE(HIGH_CameraData,ret,Error_Unexpect);
+	memcpy(pBtImg,pTemp,nSize);
+	free(pTemp);
+	
+	if(strlen(pszFileName) != 0)
+	{
+		CHECK_FUNC_VALID(HIGH_TakePicture);
+		DeleteOldPic(pszFileName);
+		ret = HIGH_TakePicture(pszFileName);
+		CHECK_RETURN_VALUE(HIGH_TakePicture,ret,Error_Unexpect);
+		CheckSavePic(pszFileName);
+	}
+*/	
+	return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::SetViewPos(int nX, int nY, int nWidth)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,"nX = "<<nX<<" nY = "<<nY<<" nWidth = "<<nWidth);
+	m_nX = nX;
+	m_nY = nY;
+	m_nWidth = nWidth;
+	return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::SetProperty()
+{
+	LOG4VTM_FUNCTION();
+	return Error_NotImpl;
+}
+
+ErrorCodeEnum HSPSClassImpl::GetDevStatus(HspsDevStatus& status)
+{
+	LOG4VTM_FUNCTION();
+	status = m_status;
+/*	
+	int iStatus;
+	if(HIGH_GetStatus == NULL){
+		FormatDevErrorInfo(__FUNCTION__, __LINE__,Error_Unexpect, "HIGH_GetStatus == NULL");
+		return Error_Unexpect;
+	}
+	HIGH_GetStatus(&iStatus);
+	printf("GetDevStatus = %d\n",iStatus);
+*/	
+	return Error_Succeed;
+}
+
+ErrorCodeEnum HSPSClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	memset(&devErrInfo, 0, sizeof(devErrInfo));
+	memcpy(&devErrInfo, &m_DevErrorInfo, sizeof(devErrInfo));
+	return Error_Succeed;
+}
+
+void HSPSClassImpl::DeleteOldPic(const char* pszFileName)
+{
+/*	
+	FILE* fp = NULL;
+	fp = fopen(pszFileName,"rb");
+	if(fp)
+	{
+		remove(pszFileName);
+		fclose(fp);
+	}
+*/	
+}
+
+void HSPSClassImpl::CheckSavePic(const char* pszFileName){
+/*	
+	FILE* fp = NULL;
+	int time = 0;
+	while(!fp && time++ < 5)//检测次数5次
+	{
+		sleep(1);
+		fp = fopen(pszFileName,"rb");
+	}
+	if(fp)
+		fclose(fp);
+*/		
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+	baseObj = new HSPSClassImpl();
+	if(baseObj == NULL) {
+		return Error_Resource;
+	} else {
+		cmb::log_init_config config;
+		config.dev_name = "HSPScanner";
+		config.log_level = CMB_LOG_LEVEL_TRACE;
+#if defined(_MSC_VER)
+		config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+		config.log_dir = ("/opt/rvc/dbg/");
+#endif //_MSC_VER
+		std::string str;
+		cmb::log4vendor::init(config, str);
+		printf("init after: %s\n", str.c_str());
+		return Error_Succeed;
+	}
+}
+
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+	if(pBaseObj == NULL) {
+		return Error_Param;
+	}
+
+	if(HSPSClassImpl* pTmp = dynamic_cast<HSPSClassImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+
+	return Error_Param;
+}

+ 113 - 0
DevAdapter/grg/hspscanner.1.1/hspscanner_impl.h

@@ -0,0 +1,113 @@
+#ifndef LIBFRAMEWORK_HSPS_IMPL_H
+#define LIBFRAMEWORK_HSPS_IMPL_H
+
+#include "HSPScannerClass.h"
+/*
+enum HSP_STATE{
+	HSP_DISCONNECTED = 0,
+	HSP_CONNECTED,
+	HSP_INPREVIEW,
+	HSP_OUTPREVIEW,
+	HSP_SHOW,
+	HSP_HIDE
+};
+*/
+class HSPSClassImpl : public CHSPSClass
+{
+public:
+    HSPSClassImpl();
+    ~HSPSClassImpl();
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    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);
+
+private:
+	void* m_hSo;
+    int m_mode;
+	unsigned char* m_pBuffPic;
+	HspsDevStatus m_status;
+//	ParamType m_ptype;
+//	ParamTypeValue m_ptValue;
+	bool m_bAutoCorp;
+	int m_nColorType;
+	int m_nRotateSize;
+	int m_nX;
+	int m_nY;
+	int m_nWidth;
+	DevErrorInfo m_DevErrorInfo;
+	void ZeroDevErrorInfo();
+	void FormatDevErrorInfo(const char* funcname, int line, int errCode,const char* errStr);
+	void ResetParm();
+	void DeleteOldPic(const char* pszFileName);
+	void CheckSavePic(const char* pszFileName);
+};
+
+
+#endif //LIBFRAMEWORK_HSPS_IMPL_H

+ 2 - 1
DevAdapter/grg/idcer.1.1/idcer_impl.cpp

@@ -47,7 +47,8 @@ IDCerClassImpl::IDCerClassImpl()
 {
 	m_DeviceID = -1;
 	ZeroDevErrorInfo();
-	m_sSoPath = GeSoFilePath((void*)&EnumScannerDevice);
+	//m_sSoPath = GeSoFilePath((void*)&EnumScannerDevice);
+	m_sSoPath = GeSoFilePath((void*)&CreateDevComponent);
 	m_sHeadImageName = "./zp.bmp";
 	m_sFrontPath = "./idfront.bmp";
 	m_sBackPath = "./idback.bmp";

+ 1 - 1
DevAdapter/grg/pinpad.1.1/GrgPinPadImpl.cpp

@@ -1838,7 +1838,7 @@ void CGrgPinPadImpl::mPlaySound()
 
 		std::string l_szDllFile = GetLibPath(GetSelfModuleHandle());
 
-		l_szDllFile = l_szDllFile + "grgkeypress.wav";
+		l_szDllFile = l_szDllFile + "/grg/grgkeypress.wav";
 		//std::wstring path = s2ws(l_szDllFile);
         //BOOL l_bRet = sndPlaySound(path.c_str(), SND_FILENAME | SND_ASYNC);
 		//char buff[MAX_PATH];

+ 25 - 0
DevAdapter/grg/termalprint.1.1/CMakeLists.txt

@@ -0,0 +1,25 @@
+rvc_dev_define_module("ThermalPrint")
+set(${MODULE_PREFIX}_VENDOR "grg")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        termalprint_impl.cpp
+        bitmap.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_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}/grg")
+
+target_link_libraries(${MODULE_FULL_NAME} grgUSBConsumerPrnDev dl ${VENDOR_LOG_LIB_NAME})
+target_link_libraries(${MODULE_FULL_NAME} grgGrgSp_Draw dl ${VENDOR_LOG_LIB_NAME})
+
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 81 - 0
DevAdapter/grg/termalprint.1.1/GrgSp_Draw.h

@@ -0,0 +1,81 @@
+/*****************************
+*功能:根据参数进行画图
+*
+*时间:2021-1-26
+*作者:段殷
+*修改
+********************************/
+
+#ifndef _2021_1_26_GRGSP_DRAW
+#define _2021_1_26_GRGSP_DRAW
+
+extern "C" {
+#pragma pack(push, 1)
+
+#define VOID 			void
+typedef VOID            *LPVOID;
+typedef LPVOID			HANDLE;
+
+//打印参数结构体
+typedef struct tagPrintParaDraw
+{
+        int iTextAlign;				//文本对齐方式 left:0; center:1; right:2
+        int iFontHeight;			//字体高度
+        int iFontWeight;			//字体磅值
+        int iFontOrientation;		//旋转角度
+        int iFontItalic;			//斜体0:正常 1:稍微倾斜 2:斜体(更倾斜)
+        int iFontUnderline;			//下划线
+        int iCharSet;				//字符集
+        char pcFontName[64];			//字体
+        int iWordSpace;				//字间距
+        int iLineSpace;				//行间距
+        int iDoubleHeight;     //倍高 0:正常  1:倍高 2:2倍高
+        int  iDoubleWide;       //倍宽 0:正常  1:倍宽 2:2倍宽
+
+        int iOverstep;//超过宽度方式:0:截断 1:换行
+
+        //add by dyin1 2021-3-4 当数据存在换行时的起始位置,大于0则表示实际位置。小于等于0则按x坐标开始。
+        int m_iNewLinePosition;
+        //
+}tPrintParaDraw;
+
+//打印文本结构体
+typedef struct tagPrintContentDraw
+{
+        int iPositionX;					// X坐标
+        int iPositionY;					// Y坐标
+        int iWidth;						// 文本宽度,打印内容为位图时此值忽略
+        int iHeight;					// 文本高度,打印内容为位图时此值忽略
+        int iPositionUnit;				// 坐标单位 0:毫米	1:行
+        int iType;						// 打印内容为位图或文本  0:Text,1:Bmp; 2:BARCODE
+        int	iRotation;					// 旋转角度 0:0度 1:90度 2:180度; 3:270度
+        char *pcData;					// 待打印字符或位图路径
+        bool    bInverse;               // 字体反白0:否  1:是
+        tPrintParaDraw psPrintPara;			// 打印参数结构体,打印内容为位图时此值忽略
+}tPrintContentDraw;
+
+#define DRAWSUCCESS 0
+#define DRAWFAILURE 1
+/*
+class GRG_DRAW
+{
+public:
+    GRG_DRAW(){};
+    ~GRG_DRAW(){};
+
+public:
+
+
+    int iPrint(tPrintContentDraw* p_psPrintContent, int p_iPrintContentNum,char *fileSavePath);
+};
+*/
+typedef     int  (*  PFUN_GRG_CONTEXT_TO_BMP)( int p_iPrintContentNum,  tPrintContentDraw* p_pPrintContent,const char *p_pFileName);
+
+
+
+//typedef GRG_DRAW* create_t(void);
+//typedef void destory_t(GRG_DRAW*);
+
+#pragma pack(pop)
+}
+#endif

+ 107 - 0
DevAdapter/grg/termalprint.1.1/base64.h

@@ -0,0 +1,107 @@
+#ifndef __BASE64_H__
+#define __BASE64_H__
+
+#include <iostream>
+#include <string>
+
+static const std::string base64_chars =
+"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+"abcdefghijklmnopqrstuvwxyz"
+"0123456789+/";
+
+static inline bool is_base64(const char c)
+{
+    return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+std::string base64_encode(const char * bytes_to_encode, unsigned int in_len)
+{
+    std::string ret;
+    int i = 0;
+    int j = 0;
+    unsigned char char_array_3[3];
+    unsigned char char_array_4[4];
+
+    while (in_len--)
+    {
+        char_array_3[i++] = *(bytes_to_encode++);
+        if(i == 3)
+        {
+            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+            char_array_4[3] = char_array_3[2] & 0x3f;     
+            for(i = 0; (i <4) ; i++)
+            {
+                ret += base64_chars[char_array_4[i]];
+            }
+            i = 0;
+        }
+    }
+    if(i)
+    {
+        for(j = i; j < 3; j++)
+        {
+            char_array_3[j] = '\0';
+        }
+
+        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+        char_array_4[3] = char_array_3[2] & 0x3f;
+
+        for(j = 0; (j < i + 1); j++)
+        {
+            ret += base64_chars[char_array_4[j]];
+        }
+
+        while((i++ < 3))
+        {
+            ret += '=';
+        }
+
+    }
+    return ret;
+}
+
+std::string base64_decode(std::string const & encoded_string)
+{
+    int in_len = (int) encoded_string.size();
+    int i = 0;
+    int j = 0;
+    int in_ = 0;
+    unsigned char char_array_4[4], char_array_3[3];
+    std::string ret;
+
+    while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
+        char_array_4[i++] = encoded_string[in_]; in_++;
+        if (i ==4) {
+            for (i = 0; i <4; i++)
+                char_array_4[i] = base64_chars.find(char_array_4[i]);
+
+            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+            for (i = 0; (i < 3); i++)
+                ret += char_array_3[i];
+            i = 0;
+        }
+    }
+    if (i) {
+        for (j = i; j <4; j++)
+            char_array_4[j] = 0;
+
+        for (j = 0; j <4; j++)
+            char_array_4[j] = base64_chars.find(char_array_4[j]);
+
+        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);  
+        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];  
+
+        for (j = 0; (j < i - 1); j++) ret += char_array_3[j];  
+    }  
+
+    return ret;  
+}
+#endif

+ 310 - 0
DevAdapter/grg/termalprint.1.1/bitmap.cpp

@@ -0,0 +1,310 @@
+#include "bitmap.h"
+#include <string>
+#include <sys/stat.h>
+using namespace std;
+
+Bitmap::Bitmap()
+{
+    m_pData = NULL;
+    m_dwWidth = 0;
+    m_dwHeight = 0;
+	
+	m_ImageFlag = 0;
+}
+
+Bitmap::~Bitmap(void)
+{
+    Clear();
+}
+
+void Bitmap::Clear()
+{
+    if(NULL != m_pData)
+    {
+        delete[]m_pData;
+        m_pData = NULL;
+    }
+    m_dwWidth = 0;
+    m_dwHeight = 0;
+}
+
+int Bitmap::Create(char* bmpFile)
+{
+    int nRes = SUCCESS;
+    if(nullptr == bmpFile || strlen(bmpFile) <= 0)
+    {
+        return FILENAMEERROR;
+    }
+
+    struct stat  st;
+    if(stat(bmpFile, &st) == -1){
+            perror("stat");
+            return FILENAMEERROR;
+    }
+
+    long long nLen = st.st_size;
+    BYTE * pfileData = new BYTE[nLen];
+
+    BYTE  *l_pBitStart = NULL;
+    memset(pfileData,0,nLen);
+
+    FILE *fp = fopen(bmpFile, "rb");
+    if(NULL == fp)
+    {
+        nRes = FILEOPENFAILD;
+    }
+
+    if(SUCCESS == nRes)
+    {
+        if(nLen != fread(pfileData, 1, nLen, fp))
+        {
+            delete []pfileData;
+            fclose(fp);
+            nRes =  FILEREADERROR;
+        }
+        else
+        {
+            _BITMAPFILEHEADER *pFileHead = nullptr;
+            _BITMAPINFOHEADER *pBmpInfoHead = nullptr;
+            _BITMAPINFO *pBmpInfo = nullptr;
+
+
+            pFileHead = (_BITMAPFILEHEADER *)pfileData;
+            pBmpInfo =  (_BITMAPINFO *)(pfileData+sizeof(_BITMAPFILEHEADER));
+            if(pFileHead->bfType != ((unsigned short )('M' <<  8) | 'B')
+                    || pFileHead->bfOffBits < (sizeof(_BITMAPFILEHEADER)+sizeof(_BITMAPINFOHEADER))
+                    || (pBmpInfo->bmiHeader.biSize != sizeof(_BITMAPINFOHEADER))
+                    || (pBmpInfo->bmiHeader.biWidth == 0 || pBmpInfo->bmiHeader.biHeight == 0)
+                    )
+            {
+                nRes = FILEDATARROR;
+            }
+            else
+            {
+                if(1 != pBmpInfo->bmiHeader.biBitCount && 24 != pBmpInfo->bmiHeader.biBitCount &&  32 != pBmpInfo->bmiHeader.biBitCount
+                        && 4 != pBmpInfo->bmiHeader.biBitCount && 8 != pBmpInfo->bmiHeader.biBitCount )
+                {
+                    nRes = FILEDATARROR;
+                }
+                else
+                {
+                    int  bmWidthBytes = (pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biBitCount + 31) / 32 * 4;
+                    m_tmpWidthBytes = bmWidthBytes;
+                    m_nbw = bmWidthBytes - (pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biBitCount + 7)  / 8  ;
+
+
+                    string strFile(bmpFile);
+                    string suffix = strFile.substr(strFile.size() - 3);
+                    if(suffix == "bmp")
+                    {
+                        pBmpInfo->bmiHeader.biSizeImage = bmWidthBytes * pBmpInfo->bmiHeader.biHeight;
+                    }
+
+                    if(pFileHead->bfSize < pFileHead->bfOffBits + bmWidthBytes * pBmpInfo->bmiHeader.biHeight)
+                    {
+                        nRes = FILEDATARROR;
+                    }
+                    else
+                    {
+                        l_pBitStart = (pfileData + pFileHead->bfOffBits);
+                        if(nLen - pFileHead->bfOffBits < bmWidthBytes * pBmpInfo->bmiHeader.biHeight)
+                        {
+                            nRes = FILEDATARROR;
+                        }
+                    }
+                }
+            }
+
+            if(SUCCESS == nRes)
+            {
+                Clear();
+                m_dwWidth = pBmpInfo->bmiHeader.biWidth;
+                m_dwHeight = pBmpInfo->bmiHeader.biHeight;
+								
+                if(m_pData)
+                {
+                    delete []m_pData;
+                    m_pData = NULL;
+                }
+                if(1 == pBmpInfo->bmiHeader.biBitCount)
+                {
+					
+					
+                    m_pData = new BYTE[pBmpInfo->bmiHeader.biSizeImage];
+                    memcpy(m_pData, l_pBitStart, pBmpInfo->bmiHeader.biSizeImage);
+                    for(int i = 0; i < pBmpInfo->bmiHeader.biSizeImage; i++)
+                    {
+                        m_pData[i] = ~m_pData[i];
+                    }
+                }
+                else if(24 == pBmpInfo->bmiHeader.biBitCount ||  32 == pBmpInfo->bmiHeader.biBitCount)
+                {
+					
+                    //int tmpWidthBytes = (m_dwWidth + 31) / 32 * 4;
+                    m_pData = new BYTE[m_tmpWidthBytes * m_dwHeight];
+                    memcpy(m_pData, l_pBitStart, pBmpInfo->bmiHeader.biSizeImage);
+
+                    for (int x = 0; x < m_dwWidth; x++)
+                    {
+                        for (int y = 0; y < m_dwHeight; y++)
+                        {
+                            int r = 0;
+                            int g = 0;
+                            int b = 0;
+                            if(24 == pBmpInfo->bmiHeader.biBitCount)
+                            {
+                                getBMP24Pixel(x, y, r, g, b, l_pBitStart,m_dwWidth,m_dwHeight,m_tmpWidthBytes);
+                            }
+                            else
+                            {
+                                getBMP32Pixel(x, y, r, g, b, l_pBitStart,m_dwWidth,m_dwHeight,m_tmpWidthBytes);
+                            }
+
+                            //BOOL bFront = r != 255 || g != 255 || b != 255;
+                            bool bFront = r < 200 || g < 200 || b <  200;
+                            setPixel(x, y, bFront);
+                        }
+                    }
+
+
+                }
+
+
+            }
+        }
+    }
+    if(pfileData)
+    {
+        delete []pfileData;
+        pfileData = NULL;
+    }
+
+    if(fp)
+    {
+         fclose(fp);
+    }
+
+    return nRes;
+}
+
+// DC的宽度
+int Bitmap::iGetWidth()
+{
+    return m_dwWidth;
+}
+
+// DC的高度
+int Bitmap::iGetHeight()
+{
+    return m_dwHeight;
+}
+
+
+int Bitmap::GetData(unsigned char * buf,long &nBufSize)
+{
+    if(m_dwWidth == 0 || m_dwHeight == 0 || NULL == m_pData)
+    {
+        return DATARROR;
+    }
+
+    int dataSize = m_tmpWidthBytes*m_dwHeight;
+	
+	
+    if(nBufSize < dataSize )
+   {
+	    printf("nBufSize:  %d  dataSize: %d \n",nBufSize,dataSize);
+        nBufSize = dataSize;
+        return DATASIZERROR;
+    }
+
+    BYTE *l_temp = new BYTE[m_tmpWidthBytes];
+    for(int x = 0, y = dataSize - m_tmpWidthBytes;x < y;x += m_tmpWidthBytes, y -= m_tmpWidthBytes)
+    {
+		
+		//printf("X:  %d \n",x);
+        memcpy(l_temp, m_pData + x, m_tmpWidthBytes);
+        memcpy(m_pData + x, m_pData + y, m_tmpWidthBytes);
+        memcpy(m_pData + y,l_temp, m_tmpWidthBytes);
+    }
+    delete []l_temp;
+
+
+
+    int i = 0;
+   for(int k = 0;k < dataSize;k++)
+   {
+
+      if(( (k) % m_tmpWidthBytes + m_nbw) < m_tmpWidthBytes)
+      {
+		if(m_ImageFlag == 0)
+		{
+			buf[i] = ~m_pData[k];
+		}
+		else
+		{
+			buf[i] = m_pData[k];
+		}
+        
+        i++;
+      }
+   }
+    nBufSize = i;
+    return SUCCESS;
+}
+
+
+void Bitmap::getBMP24Pixel(int x,int y, int&r, int&g,int&b, BYTE *data, int w,int h,int stride)
+{
+    if(x >= w || y >= h)
+    {
+        return;
+    }
+
+    BYTE *p = &data[stride*(h-1-y) + x*3];
+
+    b = *p;
+    g = *(p+1);
+    r = *(p+2);
+}
+
+void Bitmap::getBMP32Pixel(int x,int y, int&r, int&g,int&b, BYTE *data, int w,int h,int stride)
+{
+    if(x >= w || y >= h)
+    {
+        return;
+    }
+
+    BYTE *p = &data[stride*(h-1-y) + x*4];
+    //
+    b = *p;
+    g = *(p+1);
+    r = *(p+2);
+}
+
+void Bitmap::setPixel(int x,int y, bool in)
+{
+    if(x >= m_dwWidth || y >= m_dwHeight)
+    {
+        return;
+    }
+
+    if(NULL  == m_pData)
+    {
+        return ;
+    }
+
+    int col = (x >> 3);
+    int bmWidthBytes = (m_dwWidth + 31) / 32 * 4;
+    BYTE &tmp = m_pData[bmWidthBytes * (m_dwHeight-1-y) + col];
+
+    BYTE d = 0x01 << (7 - x % 8);
+
+    if(in)
+    {
+        tmp |= d;
+    }
+    else
+    {
+        tmp &= ~d;
+    }
+}

+ 90 - 0
DevAdapter/grg/termalprint.1.1/bitmap.h

@@ -0,0 +1,90 @@
+#ifndef BITMAP_H
+#define BITMAP_H
+
+#include<stdio.h>
+#include<sys/types.h>
+#include <string.h>
+#pragma pack(push,1)
+struct _BITMAPINFOHEADER
+{
+    u_int32_t biSize;
+    u_int32_t biWidth;
+    u_int32_t biHeight;
+    u_int16_t biPlanes;
+    u_int16_t biBitCount;
+    u_int32_t biCompression;
+    u_int32_t biSizeImage;
+    u_int32_t biXPelsPerMeter;
+    u_int32_t biYPelsPerMeter;
+    u_int32_t biClrUsed;
+    u_int32_t biClrImportant;
+};
+
+struct _BITMAPFILEHEADER
+{
+    u_int16_t bfType;
+    u_int32_t bfSize;
+    u_int16_t bfReserved1;
+    u_int16_t bfReserved2;
+    u_int32_t bfOffBits;
+};
+
+struct _RGBQUAD
+{
+    u_int8_t rgbBlue;
+    u_int8_t rgbGreen;
+    u_int8_t rgbRed;
+    u_int8_t rgbReserved;
+};
+
+struct _BITMAPINFO {
+    _BITMAPINFOHEADER    bmiHeader;
+    _RGBQUAD             bmiColors[1];
+};
+#pragma pack(pop)
+#define SUCCESS       (0)
+#define FILENAMEERROR       (-1)
+#define FILEOPENFAILD       (-2)
+#define FILEREADERROR     (-3)
+#define FILEDATARROR     (-4)
+
+#define DATARROR     (-5)
+#define DATASIZERROR     (-6)
+
+typedef unsigned char BYTE;
+
+class Bitmap
+{
+public:
+    Bitmap();
+    ~Bitmap();
+
+	//打印字符或二维码图片的标记
+	int m_ImageFlag;
+
+    void Clear();
+
+    int Create(char* bmpFile);
+
+    // 宽度
+    int iGetWidth();
+    // 高度
+    int iGetHeight();
+
+    int GetData(unsigned char * buf,long &nBufSize);
+private:
+    void getBMP24Pixel(int x,int y, int&r, int&g,int&b, BYTE *data, int w,int h,int stride);
+    void getBMP32Pixel(int x,int y, int&r, int&g,int&b, BYTE *data, int w,int h,int stride);
+    void setPixel(int x,int y, bool in);
+private:
+    BYTE *m_pData;
+    u_int32_t m_dwWidth;
+    u_int32_t m_dwHeight;
+
+    int m_tmpWidthBytes;
+
+    int m_nbw;
+	
+};
+
+#endif // BITMAP_H

Файловите разлики са ограничени, защото са твърде много
+ 1152 - 0
DevAdapter/grg/termalprint.1.1/termalprint_impl.cpp


+ 124 - 0
DevAdapter/grg/termalprint.1.1/termalprint_impl.h

@@ -0,0 +1,124 @@
+#ifndef LIBFRAMEWORK_THERM_IMPL_H
+#define LIBFRAMEWORK_THERM_IMPL_H
+
+#include "ThermalPrintClass.h"
+#include "OUsbConsumerPrnDev.h"
+#include "T542PrnDevDef.h"
+#include "GrgSp_Draw.h"
+#include "bitmap.h"
+
+class ThermalPrintClassImpl : public ThermalPrintClass
+{
+
+private:
+
+	OUsbConsumerPrnDev*	    m_pUsbConsumerPrnDev;
+	Bitmap* m_bmp;
+	
+	ThermalPaperType m_PaperType;
+
+public:
+    ThermalPrintClassImpl();
+    ~ThermalPrintClassImpl();
+
+
+	
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    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 = 0);
+
+
+    //打印文本数据函数
+    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);
+	
+	int GbkToUtf8(char *str_str, size_t src_len, char *dst_str, size_t dst_len);
+	
+	int iFontUnderline;			//下划线
+	int iFontWeight;			//字体磅值
+	bool bInverse;               // 字体反白0:否  1:是
+	int iDoubleHeight;     //倍高 0:正常  1:倍高
+	int iDoubleWide;       //倍宽 0:正常  1:倍宽 
+	int iFontHeight;	   //字体高度
+	int	iRotation;		   // 旋转角度 0:0度 1:90度 2:180度; 3:270度
+	
+	int iTextAlign;	 
+	
+	int iLineSpace;         //行间距
+	int iHeight;             //文本高度
+
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_THERM_IMPL_H

+ 17 - 0
DevAdapter/grg/ups.1.1/CMakeLists.txt

@@ -0,0 +1,17 @@
+rvc_dev_define_module("Ups")
+set(${MODULE_PREFIX}_VENDOR "grg")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+	ups_impl.cpp
+)
+
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_LIB_DIR}/grg")
+
+target_link_libraries(${MODULE_FULL_NAME} grgUPSDevDll dl ${VENDOR_LOG_LIB_NAME})
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 210 - 0
DevAdapter/grg/ups.1.1/ups_impl.cpp

@@ -0,0 +1,210 @@
+#include "ups_impl.h"
+#include <cstring>
+#include <cstdio>
+#include "log4vendor.h"
+
+
+UpsClassImpl::UpsClassImpl()
+        :m_mode(0)
+{
+	pObj = new OUpsDev();
+}
+
+UpsClassImpl::~UpsClassImpl()
+{
+	if(pObj)
+		delete pObj;
+}
+
+void UpsClassImpl::ZeroDevErrorInfo()
+{
+	memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
+}
+
+ErrorCodeEnum UpsClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	ErrorCodeEnum err = Error_Succeed;
+	tDevReturn l_tDevReturn[8] = { 0 };
+	int ret = pObj->iSetCommPara(l_tDevReturn);
+	if(ret != 0)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "iSetCommPara Failed");
+		return Error_DevConnFailed;
+	}
+
+	memset(l_tDevReturn,0,sizeof(tDevReturn)*8);
+	ret = pObj->iInit(l_tDevReturn);
+	if(ret != 0)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "iInit Failed");
+		return Error_DevConnFailed;
+	}
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return err;
+}
+
+ErrorCodeEnum UpsClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	ErrorCodeEnum err = Error_Succeed;
+	const char *pType = "PVER=Cyber#MID=UT600Eb";
+	const char *pMode = "FWID=0";
+	const char *pVendor = "grg";
+	strcpy(devCategory.szType, pType);
+	strcpy(devCategory.szModel, pMode);
+	strcpy(devCategory.szVendor, pVendor);
+	devCategory.version.wMajor = 1;
+	devCategory.version.wMinor = 1;
+	devCategory.version.wRevision = 65535;
+	devCategory.version.wBuild = 1;
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return err;
+}
+
+ErrorCodeEnum UpsClassImpl::Reset()
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	ErrorCodeEnum err = Error_Succeed;
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return err;
+}
+
+ErrorCodeEnum UpsClassImpl::DevClose()
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	ErrorCodeEnum err = Error_Succeed;
+	pObj->iCloseComm();
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return err;
+}
+
+ErrorCodeEnum UpsClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
+{
+	memset(&devErrInfo, 0, sizeof(devErrInfo));
+	memcpy(&devErrInfo, &m_DevErrorInfo, sizeof(devErrInfo));
+	return Error_Succeed;
+}
+
+ //
+ //	Get device status
+ //
+ErrorCodeEnum UpsClassImpl::GetDevStatus(UpsStatusEnum& eStatus)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	tUpsDevStatus status;
+	tDevReturn l_tDevReturn[8] = { 0 };
+	int ret = pObj->iGetDevStatus(l_tDevReturn,&status);
+	if(ret != 0){
+		eStatus = UPS_STATUS_ERROR_TO_GET_STATUS;
+		printf("GetDevStatus ret = %d,errcode = %d\n",ret,l_tDevReturn[0].iLogicCode);
+	}else{
+		if(!status.bCityPower){
+			eStatus = UPS_STATUS_NORMAL;
+		}else{
+			eStatus = UPS_STATUS_NO_ELECTOR;
+		}
+	}
+	LOG4VTM(INFO,__FUNCTION__<<" bCityPower = "<<status.bCityPower);
+	LOG4VTM(INFO,__FUNCTION__<<" bBatteryVolt = "<<status.bBatteryVolt);
+	LOG4VTM(INFO,__FUNCTION__<<" bByPass = "<<status.bByPass);
+	LOG4VTM(INFO,__FUNCTION__<<" bUpsDevFail = "<<status.bUpsDevFail);
+	LOG4VTM(INFO,__FUNCTION__<<" bUpsType = "<<status.bUpsType);
+	LOG4VTM(INFO,__FUNCTION__<<" bTestStatus = "<<status.bTestStatus);
+	LOG4VTM(INFO,__FUNCTION__<<" bTurnOff = "<<status.bTurnOff);
+	LOG4VTM(INFO,__FUNCTION__<<" bBuzzer = "<<status.bBuzzer);
+	
+	printf("bCityPower = %d\n",status.bCityPower);
+	printf("bBatteryVolt = %d\n",status.bBatteryVolt);
+	printf("bByPass = %d\n",status.bByPass);
+	printf("bUpsDevFail = %d\n",status.bUpsDevFail);
+	printf("bUpsType = %d\n",status.bUpsType);
+	printf("bTestStatus = %d\n",status.bTestStatus);
+	printf("bTurnOff = %d\n",status.bTurnOff);
+	printf("bBuzzer = %d\n",status.bBuzzer);
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}	 
+//
+//	Shutdown ups and restart it in minutes.
+//	Arguments:
+//	- dwShutTime:time to shutdown (in minutes)
+// 	- dwRestartTime:time to restart (in minutes)
+//
+ErrorCodeEnum UpsClassImpl::Shutdown(DWORD dwShutTime, DWORD dwRestartTime)
+{
+	LOG4VTM_FUNCTION();
+	LOG4VTM(INFO,__FUNCTION__);
+	tDevReturn l_tDevReturn[8] = { 0 };
+	int ret = 0;
+
+	ret = pObj->iDelayTurnOff(l_tDevReturn,dwShutTime*60);
+	if(ret != 0)
+	{
+		FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "iDelayTurnOff Failed");
+		return Error_Unexpect;
+	}
+
+/*
+	if(dwRestartTime >=0)
+	{
+		ret = pObj->iTurnOn(l_tDevReturn);
+		if(ret != 0)
+		{
+			FormatDevErrorInfo(__FUNCTION__, __LINE__, l_tDevReturn[0].iLogicCode, "iTurnOn Failed");
+			return Error_IgnoreAll;
+		}
+	}
+*/			 
+	LOG4VTM(INFO,__FUNCTION__<<" OK");
+	return Error_Succeed;
+}
+
+void UpsClassImpl::FormatDevErrorInfo(const char* funcname, int line, int errCode,char* errStr)
+{
+	ZeroDevErrorInfo();
+	snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "ErrCode:0x%x,Description:Func:%s,Line:%d,Msg:%s", errCode, funcname, line, errStr);
+	m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
+	LOG4VTM(ERROR,m_DevErrorInfo.szErrMsg);
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+	baseObj = new UpsClassImpl();
+	if(baseObj == NULL) {
+		return Error_Resource;
+	} else {
+		cmb::log_init_config config;
+		config.dev_name = "Ups";
+		config.log_level = CMB_LOG_LEVEL_TRACE;
+#if defined(_MSC_VER)
+		config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+		config.log_dir = ("/opt/rvc/dbg/");
+#endif //_MSC_VER
+		std::string str;
+		cmb::log4vendor::init(config, str);
+		printf("init after: %s\n", str.c_str());
+
+		return Error_Succeed;
+	}
+}
+
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
+{
+	if(pBaseObj == NULL) {
+		return Error_Param;
+	}
+	if(UpsClassImpl* pTmp = dynamic_cast<UpsClassImpl*>(pBaseObj))
+	{
+		delete pTmp;
+		pTmp = NULL;
+		return Error_Succeed;
+	}
+	return Error_Param;
+}

+ 48 - 0
DevAdapter/grg/ups.1.1/ups_impl.h

@@ -0,0 +1,48 @@
+#ifndef LIBFRAMEWORK_UPS_IMPL_H
+#define LIBFRAMEWORK_UPS_IMPL_H
+
+#include "UpsClass.h"
+#include "OUpsDev.h"
+
+class UpsClassImpl : public UpsClass
+{
+public:
+    UpsClassImpl();
+    ~UpsClassImpl();
+
+
+    //DeviceBaseClass
+    ErrorCodeEnum GetDevCategory(DevCategoryInfo &devCategory);
+    ErrorCodeEnum Reset();
+    ErrorCodeEnum DevClose();
+    ErrorCodeEnum GetLastErr(DevErrorInfo &devErrInfo);
+
+    //
+    //	Device open.
+    //	Arguments:
+    //	- dwPort[in]		com port number
+    //	- dwBaudRate[in]	Baud rate
+    //
+    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);
+
+private:
+    int m_mode;
+	OUpsDev* pObj;
+	DevErrorInfo m_DevErrorInfo;
+	void ZeroDevErrorInfo();
+	void FormatDevErrorInfo(const char* funcname, int line, int errCode,char* errStr);
+};
+
+
+#endif //LIBFRAMEWORK_UPS_IMPL_H

+ 15 - 0
DevAdapter/grg/watchdog.1.1/CMakeLists.txt

@@ -0,0 +1,15 @@
+rvc_dev_define_module("WatchDog")
+set(${MODULE_PREFIX}_VENDOR "grg")
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+set(${MODULE_PREFIX}_SRCS SHARED
+        watchdog_impl.cpp
+        )
+
+
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+target_include_directories(${MODULE_FULL_NAME} PRIVATE "${VENDOR_CURRENT_INCLUDE_DIR}")
+target_link_libraries(${MODULE_FULL_NAME} ${VENDOR_LOG_LIB_NAME})
+
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 239 - 0
DevAdapter/grg/watchdog.1.1/watchdog_impl.cpp

@@ -0,0 +1,239 @@
+#include "watchdog_impl.h"
+#include<cstring>
+#include <cstdio>
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/watchdog.h>
+
+#define WATCHDOG "/dev/watchdog"
+#define WATCHDOG0 "/dev/watchdog0"
+#define WATCHDOG1 "/dev/watchdog1"
+
+#include "log4vendor.h"
+
+
+int preset_timeout;
+int config_timeout;
+int timeleft;
+int testcycle = 0;
+int dummy;
+int devnum = 0;
+int wfd;
+int config_testcycle;
+int flag;
+char stopmagic = 'V';
+
+
+WatchDogClassImpl::WatchDogClassImpl():m_mode(0)
+{
+
+}
+
+WatchDogClassImpl::~WatchDogClassImpl()
+{
+
+}
+
+ErrorCodeEnum WatchDogClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
+{
+	LOG4VTM(INFO,"enter : GetDevCategory");
+	
+	memset(&devCategory, 0, sizeof(devCategory));
+
+	char l_cVender[20]={0};
+	strcpy(l_cVender,"grg");
+
+	strcpy(devCategory.szVendor,l_cVender);
+
+	char l_acDevVer[20]={0};
+	strcpy(l_acDevVer,"V=V1.0");
+	strcpy(devCategory.szModel,l_acDevVer);
+
+
+	//设备类型 	
+	memset(devCategory.szType,0,sizeof(devCategory.szType));
+	strcpy(devCategory.szType,"PVER=GPL");
+	strcat(devCategory.szType,"#MID=");
+
+
+	//设备状态 device status
+	devCategory.eState = DEVICE_STATUS_NORMAL;
+
+	int l_iMajor=4, l_iMinor=20, l_iRevision=65535, l_iBuild=1;
+	//设备版本号 software version
+	devCategory.version.wMajor = l_iMajor;
+	devCategory.version.wMinor = l_iMinor;
+	devCategory.version.wRevision = l_iRevision;
+	devCategory.version.wBuild = l_iBuild;
+
+	LOG4VTM(INFO,"Leave : GetDevCategory");
+	
+	return Error_Succeed;
+
+
+
+	// ErrorCodeEnum err = Error_Succeed;
+	// std::strcpy(devCategory.szModel, "szModel");
+	// std::strcpy(devCategory.szType, "szCategory");
+	// std::strcpy(devCategory.szVendor, "szVendor");
+	// return err;
+}
+
+
+ErrorCodeEnum WatchDogClassImpl::DevOpen()
+{
+
+	wfd = open(WATCHDOG0, O_RDWR);
+	if (wfd == -1) 
+	{
+		printf("Unable to open %s \n", WATCHDOG0);
+		return Error_DevConnFailed;
+	}  
+	return Error_Succeed;
+
+}
+
+ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
+{
+	LOG4VTM(INFO,"enter : StartWatch");
+	config_timeout = dwTimeout;
+	if (ioctl(wfd, WDIOC_SETTIMEOUT, &config_timeout) == -1)
+	{
+		printf("Watchdog settimeout ioctl error %s\n", strerror(errno));
+		if (write(wfd, &stopmagic, sizeof(stopmagic)) != sizeof(stopmagic)) 
+		{
+			printf("Watchdog magic stop write error \n");
+		}
+		close(wfd);
+		return Error_DevConnFailed;
+	}
+	LOG4VTM(INFO,"leave : StartWatch");
+	return Error_Succeed;
+
+}
+
+
+ErrorCodeEnum WatchDogClassImpl::StopWatch()
+{
+	LOG4VTM(INFO,"enter : StopWatch");
+	if (write(wfd, &stopmagic, sizeof(stopmagic)) != sizeof(stopmagic)) 
+	{
+		printf("Watchdog magic stop write error \n");
+		return Error_DevConnFailed;
+	}
+	close(wfd);
+	LOG4VTM(INFO,"leave : StopWatch");
+	return Error_Succeed;
+
+}
+
+
+ErrorCodeEnum WatchDogClassImpl::RefreshDog()
+{
+	LOG4VTM(INFO,"enter : RefreshDog");
+	if (ioctl(wfd, WDIOC_KEEPALIVE, &dummy) == -1) 
+	{
+		printf("Watchdog keeplive ioctl error %s\n", strerror(errno));
+		if (write(wfd, &stopmagic, sizeof(stopmagic)) != sizeof(stopmagic)) 
+		{
+			printf("Watchdog magic stop write error \n");
+		}
+		close(wfd);
+		return Error_DevConnFailed;
+	}
+	LOG4VTM(INFO,"leave : RefreshDog");
+	return Error_Succeed;
+
+}
+
+
+
+ErrorCodeEnum WatchDogClassImpl::Reset()
+{
+	
+	LOG4VTM(INFO,"enter : Reset");
+	if (write(wfd, &stopmagic, sizeof(stopmagic)) != sizeof(stopmagic)) 
+	{
+		printf("Watchdog magic stop write error \n");
+		return Error_DevConnFailed;
+	}
+	close(wfd);
+	LOG4VTM(INFO,"leave : Reset");
+	
+	ErrorCodeEnum err = Error_Succeed;
+	m_mode = 0;
+	return err;
+}
+
+ErrorCodeEnum WatchDogClassImpl::DevClose()
+{
+	
+	LOG4VTM(INFO,"enter : DevClose");
+	if (write(wfd, &stopmagic, sizeof(stopmagic)) != sizeof(stopmagic)) 
+	{
+		printf("Watchdog magic stop write error \n");
+		return Error_DevConnFailed;
+	}
+	close(wfd);
+	LOG4VTM(INFO,"leave : DevClose");
+	
+	ErrorCodeEnum err = Error_Succeed;
+	m_mode = 0;
+	return 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, szMessage);
+	devErrInfo.dwErrMsgLen = strlen(szMessage);
+	return Error_Succeed;
+}
+
+DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
+{
+
+	cmb::log_init_config config;
+	config.dev_name = "ThermalPrint";
+	config.log_level = CMB_LOG_LEVEL_TRACE;
+#if defined(_MSC_VER)
+	config.log_dir = ("C:\\rvc\\dbg\\");
+#else
+	config.log_dir = ("/opt/rvc/dbg/");
+#endif //_MSC_VER
+	std::string str;
+	cmb::log4vendor::init(config, str);
+	printf("init after: %s\n", str.c_str());
+
+
+	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;
+}

+ 50 - 0
DevAdapter/grg/watchdog.1.1/watchdog_impl.h

@@ -0,0 +1,50 @@
+#ifndef LIBFRAMEWORK_WATCHDOG_IMPL_H
+#define LIBFRAMEWORK_WATCHDOG_IMPL_H
+
+#include "WatchDogClass.h"
+
+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.
+    //
+    virtual 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)
+    //
+    virtual ErrorCodeEnum StartWatch(DWORD dwDelay, DWORD dwTimeout);
+
+    //
+    //	Stop watchdog.
+    //
+    virtual ErrorCodeEnum StopWatch();
+
+    //
+    //	Feed watchdog.
+    //
+    virtual ErrorCodeEnum RefreshDog();
+
+
+private:
+    int m_mode;
+};
+
+
+#endif //LIBFRAMEWORK_WATCHDOG_IMPL_H

Някои файлове не бяха показани, защото твърде много файлове са промени