Przeglądaj źródła

#IQRV #comment [Module] ThermalPrint实体在Linux下编译通过,不过需要依赖新的框架版本

gifur 4 lat temu
rodzic
commit
0ab06b3e78

+ 80 - 220
Module/mod_ThermalPrint/ThermalPrintFSM.cpp

@@ -1,24 +1,23 @@
 #include "stdafx.h"
 #include "SpHelper.h"
 #include "ThermalPrintFSM.h"
-#include "mod_Thermalprint.h"
+#include "mod_ThermalPrint.h"
 #include "base64.h"
 #include "GetDevInfoHelper.h"
+#include "SpUtility.h"
 
 
 ErrorCodeEnum CThermalPrintFSM::OnInit()
 {
-	/*------2020-02-27------*/
-	//modify by LZM
-	VendorLogControler(this,"ThermalPrint");
-	/*---------------------*/
-	//获取配置文件root.ini
+	LOG_FUNCTION();
+	GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
 	ErrorCodeEnum eErrDev = Error_Succeed;
 	CSimpleStringA csDllName(true);
-	eErrDev = FetchVendorDllName(csDllName);
+    auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
+	eErrDev = pEntity->ExtractVendorLibFullPath(csDllName);
 
 	//root.ini文件未配置则置热敏打印机不可用,但是实体依然启动
-	if(eErrDev==Error_Null){
+	if(eErrDev== Error_NotConfig) {
 		m_bSupportPrint=false;//表示不支持打印
 		m_bDevOpen=false;//表示dev打开失败
 		m_pCommandList=NULL;
@@ -31,10 +30,10 @@ ErrorCodeEnum CThermalPrintFSM::OnInit()
 		return eErrDev;
 	}
 	Dbg("VendorDllName: %s.", (LPCTSTR)csDllName);
-	eErrDev = LoadDllAndGetAddress((const char*)csDllName);
+	eErrDev = m_hDevHelper.LoadUp(csDllName);
 	if(eErrDev!=Error_Succeed)
 	{
-		Dbg("LoadDllAndGetAddress failed %s.", (LPCTSTR)csDllName);
+		Dbg("LoadUp failed %s.", (LPCTSTR)csDllName);
 		return eErrDev;
 	}
 	Dbg("Get functions' addresses succed.");
@@ -44,6 +43,7 @@ ErrorCodeEnum CThermalPrintFSM::OnInit()
 	if(eErrDev!=Error_Succeed)
 	{
 		Dbg("FetchOtherParam failed.");
+		m_hDevHelper.TearDown();
 		return eErrDev;
 	}
 	Dbg("m_port is %d,m_baudrate is %d",m_port,m_baudrate);
@@ -54,39 +54,11 @@ ErrorCodeEnum CThermalPrintFSM::OnInit()
 	int MilliSleepSec = 1000;
 	do 
 	{
-		if(!bCreateDevCom)
-		{
-			if(CreateDevComponent((DeviceBaseClass*&)m_pPrinter) != eErrDev)
-			{
-				LOG_TRACE("Create ThermalPrint module failed.");
-				initCount++;
-				m_pPrinter = NULL;
-				if(initCount >= MilliSleepSec)
-				{
-					SafeFreeLibrary();
-					return Error_DevConnFailed;
-				}
-				continue;
-			}
-			bCreateDevCom = true;
-			LOG_TRACE("Create ThermalPrint module suc.");
-		}
-
-		eErrDev = m_pPrinter->DevOpen(m_port,m_baudrate);
+		eErrDev = m_hDevHelper->DevOpen(m_port,m_baudrate);
 		if(eErrDev!=Error_Succeed)
 		{
-			LogWarn(Severity_Middle,Error_NotInit,LOG_ERR_THERMAL_PRINTER_DEV_OPEN_FAIL,"ThermalPrint open failed.");
-			LOG_TRACE("Open device failed(%d)",eErrDev);
-			DevErrorInfo devOpenErrInfo = {0};;
-			if((m_pPrinter->GetLastErr(devOpenErrInfo))==Error_Succeed)
-			{
-				Dbg("Open device failed : %s.", devOpenErrInfo.szErrMsg);
-			}
-			else
-			{
-				Dbg("Open device failed : GetLastErr failed.");
-			}
-			SafeFreeLibrary();
+			LOG_THERMALPRINT_ERROR_MSG_MACRO(eErrDev, DevOpen);
+			m_hDevHelper.TearDown();
 			return Error_DevConnFailed;
 		}else{
 			m_bSupportPrint=true;//表示支持打印
@@ -96,111 +68,12 @@ ErrorCodeEnum CThermalPrintFSM::OnInit()
 			eErrDev = Error_Succeed;
 		}
 	} while (0);
-	
 
 	return eErrDev;
 }
 
-ErrorCodeEnum CThermalPrintFSM::FetchVendorDllName(CSimpleStringA& csDllPath)
+ErrorCodeEnum CThermalPrintFSM::FetchOtherParam() 
 {
-	ErrorCodeEnum erroCode = Error_Unexpect;
-	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
-	CSmartPointer<IConfigInfo> spRootConfig;
-	erroCode = spEntityFunction->OpenConfig(Config_Root, spRootConfig);
-	if(erroCode==Error_Succeed)
-	{
-		CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityBase()->GetEntityName();
-
-		csDllPath = GetEntityBase()->GetEntityName();
-		CSimpleStringA str;
-		spRootConfig->ReadConfigValue(strSection, "Vendor", str);
-		if(!str.IsNullOrEmpty())
-		{
-			csDllPath += ".";
-			csDllPath += str;
-		}else{
-			//如果root未配置则Vendor未空
-			erroCode=Error_Null;
-			Dbg("root.ini  ThermalPrint/Vendor is null");
-			return erroCode;
-		}
-
-
-
-		str.Clear();
-		spRootConfig->ReadConfigValue(strSection, "Version", str);
-		if(!str.IsNullOrEmpty())
-		{
-			csDllPath += ".";
-			csDllPath += str;
-			spRootConfig->ReadConfigValueInt(strSection, "Version", m_version);
-		}
-
-		str.Clear();
-		spRootConfig->ReadConfigValue(strSection, "Batch", str);
-		if(!str.IsNullOrEmpty())
-		{
-			csDllPath += ".";
-			csDllPath += str;
-			spRootConfig->ReadConfigValueInt(strSection, "Batch", m_batch);
-		}
-
-		CSimpleStringA strDepPath;
-		GetEntityBase()->GetFunction()->GetPath("Dep", strDepPath);
-		csDllPath = CSimpleStringA::Format("%s\\%s.dll", (LPCTSTR)strDepPath, (LPCTSTR)csDllPath);
-
-		erroCode = Error_Succeed;
-	}
-	else
-	{
-		//TODO: SetCustLastErrorCode();
-	}
-	return erroCode;
-}
-
-ErrorCodeEnum CThermalPrintFSM::LoadDllAndGetAddress(const char* szDllName)
-{
-	ErrorCodeEnum erroCode = Error_Unexpect;
-	SafeFreeLibrary();
-	m_hVendorDll = LoadLibraryA(szDllName);
-	if (m_hVendorDll == NULL)
-	{
-		DWORD tmpError = GetLastError();
-		Dbg("LoadLibraryA[%s] failed with error %u.", szDllName, tmpError);
-		if(tmpError == 126)
-		{
-			Dbg("缺失某个DLL导致的错误。");
-		}
-
-		return Error_DevLoadFileFailed;
-	}
-	if ((CreateDevComponent = (lpCreateDevCom)GetProcAddress(m_hVendorDll,"CreateDevComponent")) == NULL)
-	{
-
-		Dbg("Get 'CreateDevComponent' Func address failed with code %d", GetLastError());
-		return Error_DevLoadFileFailed;
-	}
-	if ((ReleaseDevComponent = (lpReleaseDevCom)GetProcAddress(m_hVendorDll,"ReleaseDevComponent")) == NULL)
-	{
-
-		Dbg("Get 'ReleaseDevComponent' Func address failed with code %d", GetLastError());
-		return Error_DevLoadFileFailed;
-	}
-
-	return Error_Succeed;
-
-}
-
-ErrorCodeEnum CThermalPrintFSM::SafeFreeLibrary()
-{
-	if(m_hVendorDll){
-		FreeLibrary(m_hVendorDll);
-		m_hVendorDll=NULL;
-	}
-	return Error_Succeed;
-}
-
-ErrorCodeEnum CThermalPrintFSM::FetchOtherParam(){
 	ErrorCodeEnum erroCode = Error_Unexpect;
 	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
 	CSmartPointer<IConfigInfo> spRootConfig;
@@ -218,39 +91,14 @@ ErrorCodeEnum CThermalPrintFSM::FetchOtherParam(){
 		if(!str.IsNullOrEmpty()){
 			spRootConfig->ReadConfigValueInt(strSection, "Baudrate", m_baudrate);
 		}
-		erroCode=Error_Succeed;
-	}
-	else
-	{
-		//TODO: SetCustLastErrorCode();
 	}
+
 	return erroCode;
 }
 
 ErrorCodeEnum CThermalPrintFSM::OnExit()
 {
-	//释放对象
-	if(m_pPrinter)
-	{
-		ErrorCodeEnum erroCode = m_pPrinter->DevClose();
-		LOG_TRACE("Close device returned %d(0x%x).", erroCode, erroCode);
-		if(erroCode!=Error_Succeed){
-			DevErrorInfo devOpenErrInfo = {0};
-			if((m_pPrinter->GetLastErr(devOpenErrInfo))==Error_Succeed){
-				Dbg("Close device failed : %s.", devOpenErrInfo.szErrMsg);
-			}else{
-				Dbg("Close device failed : GetLastErr failed.");
-			}
-		}else{
-			m_bDevOpen=false;
-		}
-		erroCode = ReleaseDevComponent((DeviceBaseClass*&)m_pPrinter);
-		LOG_TRACE("Get 'ReleaseDevComponent' Func returned %d(0x%x).", erroCode, erroCode);
-		m_pPrinter = NULL;
-	}
-	//释放dll
-	SafeFreeLibrary();
-
+	m_hDevHelper.TearDown();
 	//清理打印指令
 	if(m_pCommandList){
 		ClearPrintCMD();
@@ -263,7 +111,7 @@ ErrorCodeEnum CThermalPrintFSM::GetPrintState(int& state , CSimpleStringA& err_m
 {
 	if(m_bDevOpen){
 		ThermalState thState;
-		if(m_pPrinter->GetDevState(thState)==Error_Succeed){
+		if(m_hDevHelper->GetDevState(thState)==Error_Succeed){
 			Dbg("热敏检查:纸状态 %d , 硬件状态 %d",(int)thState.paperState,(int)thState.hardwareState);
 			if(thState.hardwareState==STATE_OK){
 				if(thState.paperState==PAPER_FULL){
@@ -283,7 +131,7 @@ ErrorCodeEnum CThermalPrintFSM::GetPrintState(int& state , CSimpleStringA& err_m
 				state=4;
 				DevErrorInfo devOpenErrInfo = {0};
 				ThermalState thermalState;
-				if((m_pPrinter->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
+				if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
 				{
 					err_msg = devOpenErrInfo.szErrMsg;
 				}
@@ -298,7 +146,7 @@ ErrorCodeEnum CThermalPrintFSM::GetPrintState(int& state , CSimpleStringA& err_m
 			return Error_Succeed;
 		}else{
 			DevErrorInfo devOpenErrInfo = {0};
-			if((m_pPrinter->GetLastErr(devOpenErrInfo))==Error_Succeed)
+			if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
 			{
 				Dbg("device GetDevState failed : %s.", devOpenErrInfo.szErrMsg);
 			}
@@ -654,6 +502,8 @@ ErrorCodeEnum CThermalPrintFSM::ParsePrintXml( CSimpleStringA xml )
 	scew_parser *parser = NULL;
 	scew_tree *tree = NULL;
 	scew_element *root = NULL;	//????这个如何delete
+	scew_list* lst = NULL;
+	int count = 0;
 
 	reader = scew_reader_buffer_create(xml.GetData(),xml.GetLength());
 	if (!reader) {			
@@ -681,8 +531,8 @@ ErrorCodeEnum CThermalPrintFSM::ParsePrintXml( CSimpleStringA xml )
 		ret = Error_Exception;
 		goto on_error;
 	}
-	scew_list *lst = scew_element_children(root);
-	int count =scew_list_size(lst);
+	lst = scew_element_children(root);
+	count =scew_list_size(lst);
 	Dbg("共有%d行命令",count);
 	if (lst) {
 		for (scew_list *it = scew_list_first(lst); it; it = scew_list_next(it)) {
@@ -825,7 +675,7 @@ unsigned int CThermalPrintFSM::s2_on_event( FSMEvent* e )
 			DevErrorInfo devOpenErrInfo = {0};
 			ThermalState thermalState;
 			CSimpleStringA err_msg="";
-			if((m_pPrinter->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
+			if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
 			{
 				err_msg = devOpenErrInfo.szErrMsg;
 				Dbg("Print is fail :[%s],ThermalPaperState is %d ,ThermalHardwareState is %d ",err_msg.GetData(),thermalState.paperState,thermalState.hardwareState);
@@ -836,9 +686,9 @@ unsigned int CThermalPrintFSM::s2_on_event( FSMEvent* e )
 			}
 			
 			//需要reset一次
-			if(m_pPrinter->Reset()!=Error_Succeed){
+			if(m_hDevHelper->Reset()!=Error_Succeed){
 				DevErrorInfo devOpenErrInfo = {0};
-				if((m_pPrinter->GetLastErr(devOpenErrInfo))==Error_Succeed)
+				if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
 				{
 					Dbg("Reset failed : [%s]", devOpenErrInfo.szErrMsg);
 				}
@@ -891,8 +741,8 @@ void CThermalPrintFSM::OnPrintSucc()
 	PrintResult evt;
 	evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
 	evt.print_Result=0;
-	evt.error_code = CSimpleStringA2W("");
-	evt.error_msg = CSimpleStringA2W("");
+	evt.error_code = L"";
+	evt.error_msg = L"";
 	SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
 }
 
@@ -903,7 +753,7 @@ int CThermalPrintFSM::PreCheckPrinter()
 {
 	if(m_bDevOpen){
 		ThermalState thState;
-		if(m_pPrinter->GetDevState(thState)==Error_Succeed){
+		if(m_hDevHelper->GetDevState(thState)==Error_Succeed){
 			Dbg("打印预检查:纸状态 %d , 硬件状态 %d",(int)thState.paperState,(int)thState.hardwareState);
 			if(thState.hardwareState==STATE_OK){
 				if(thState.paperState==PAPER_FULL){
@@ -934,7 +784,7 @@ int CThermalPrintFSM::PreCheckPrinter()
 				DevErrorInfo devOpenErrInfo = {0};
 				ThermalState thermalState;
 				CSimpleStringA err_msg="";
-				if((m_pPrinter->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
+				if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
 				{
 					err_msg = devOpenErrInfo.szErrMsg;
 				}
@@ -955,7 +805,7 @@ int CThermalPrintFSM::PreCheckPrinter()
 			}
 		}else{
 			DevErrorInfo devOpenErrInfo = {0};
-			if((m_pPrinter->GetLastErr(devOpenErrInfo))==Error_Succeed)
+			if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
 			{
 				Dbg("device GetDevState failed : %s.", devOpenErrInfo.szErrMsg);
 			}
@@ -980,7 +830,7 @@ int CThermalPrintFSM::Print()
 {
 	if(m_bDevOpen){
 		//开始调用beginPrint
-		if(m_pPrinter->BeginPrint(m_paperType,m_paperWidth)!=Error_Succeed){
+		if(m_hDevHelper->BeginPrint(m_paperType,m_paperWidth)!=Error_Succeed){
 			//失败
 			m_errCode=Error_Print;
 			m_errMsg="调用热敏适配器BeginPrint方法失败";
@@ -998,7 +848,7 @@ int CThermalPrintFSM::Print()
 				if(ExecutePrintCMD(cmd)!=Error_Succeed){
 					Dbg("执行%s命令失败",strCMD.GetData());
 					//尝试把可能执行了一半的错误纸张吐出来,以免影响后面的任务
-					m_pPrinter->ControlAction(ACTION_CUT_ALL,1);
+					m_hDevHelper->ControlAction(ACTION_CUT_ALL,1);
 					isOK=false;
 					break;
 				}
@@ -1024,7 +874,8 @@ int CThermalPrintFSM::Print()
 	}
 }
 
-int CThermalPrintFSM::ExecutePrintCMD(PrintCommand* cmd){
+int CThermalPrintFSM::ExecutePrintCMD(PrintCommand* cmd)
+{
 	//针对不同的指令调不同的打印命令
 	if(cmd->eCommandType<10){
 		//CommandType
@@ -1046,23 +897,23 @@ int CThermalPrintFSM::ExecuteParamCMD(PrintCommand* cmd){
 	DWORD value2=0;
 	if(cmd->eCommandType==CMD_COMMON_ROW_SPACE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetParam(COMMON_ROW_SPACE,value1);
+		return m_hDevHelper->SetParam(COMMON_ROW_SPACE,value1);
 
 	}else if(cmd->eCommandType==CMD_COMMON_ALIGN){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetParam(COMMON_ALIGN,value1);
+		return m_hDevHelper->SetParam(COMMON_ALIGN,value1);
 
 	}else if(cmd->eCommandType==CMD_COMMON_REVERSE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetParam(COMMON_REVERSE,value1);
+		return m_hDevHelper->SetParam(COMMON_REVERSE,value1);
 
 	}else if(cmd->eCommandType==CMD_COMMON_LEFT_MARGIN){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetParam(COMMON_LEFT_MARGIN,value1);
+		return m_hDevHelper->SetParam(COMMON_LEFT_MARGIN,value1);
 
 	}else if(cmd->eCommandType==CMD_COMMON_PRINTABLE_AREA){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetParam(COMMON_PRINTABLE_AREA,value1);
+		return m_hDevHelper->SetParam(COMMON_PRINTABLE_AREA,value1);
 
 	}else {
 		Dbg("打印命令不存在");
@@ -1075,23 +926,23 @@ int CThermalPrintFSM::ExecuteFontCMD(PrintCommand* cmd){
 	DWORD value2=0;
 	if(cmd->eCommandType==CMD_FONT_UNDERLINE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_UNDERLINE,value1);
+		return m_hDevHelper->SetFont(FONT_UNDERLINE,value1);
 
 	}else if(cmd->eCommandType==CMD_FONT_BOLD){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_BOLD,value1);
+		return m_hDevHelper->SetFont(FONT_BOLD,value1);
 
 	}else if(cmd->eCommandType==CMD_FONT_INVERSE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_INVERSE,value1);
+		return m_hDevHelper->SetFont(FONT_INVERSE,value1);
 
 	}else if(cmd->eCommandType==CMD_FONT_DOUBLEHEIGHT){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_DOUBLEHEIGHT,value1);
+		return m_hDevHelper->SetFont(FONT_DOUBLEHEIGHT,value1);
 
 	}else if(cmd->eCommandType==CMD_FONT_DOUBLEWIDE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_DOUBLEWIDE,value1);
+		return m_hDevHelper->SetFont(FONT_DOUBLEWIDE,value1);
 
 	}else if(cmd->eCommandType==CMD_FONT_CUSTOM_SIZE){
 		//2个参数 
@@ -1104,16 +955,16 @@ int CThermalPrintFSM::ExecuteFontCMD(PrintCommand* cmd){
 		value1 = (DWORD)atoi((LPCTSTR)valueArray[0]);
 		value2 = (DWORD)atoi((LPCTSTR)valueArray[1]);
 
-		return m_pPrinter->SetFont(FONT_CUSTOM_SIZE,value1,value2);
+		return m_hDevHelper->SetFont(FONT_CUSTOM_SIZE,value1,value2);
 
 	}else if(cmd->eCommandType==CMD_FONT_ROTATE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_ROTATE,value1);
+		return m_hDevHelper->SetFont(FONT_ROTATE,value1);
 
 	}else if(cmd->eCommandType==CMD_FONT_LEFT_RIGHT_SPACE){
 		//暂时只支持一个参数,参数只有右边距
 		value2=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->SetFont(FONT_LEFT_RIGHT_SPACE,0,value2);
+		return m_hDevHelper->SetFont(FONT_LEFT_RIGHT_SPACE,0,value2);
 
 	}else {
 		Dbg("打印命令不存在");
@@ -1126,39 +977,39 @@ int CThermalPrintFSM::ExecuteActionCMD(PrintCommand* cmd){
 	DWORD value2=0;
 	if(cmd->eCommandType==CMD_ACTION_PRINT_ONE_LINE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_PRINT_ONE_LINE,value1);
+		return m_hDevHelper->ControlAction(ACTION_PRINT_ONE_LINE,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEFORWRAD_LINES){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_PRINT_MOVEFORWRAD_LINES,value1);
+		return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEFORWRAD_LINES,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEBACKWRAD_LINES){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_PRINT_MOVEBACKWRAD_LINES,value1);
+		return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEBACKWRAD_LINES,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_CUT_ALL){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_CUT_ALL,value1);
+		return m_hDevHelper->ControlAction(ACTION_CUT_ALL,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_CUT_HALF){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_CUT_HALF,value1);
+		return m_hDevHelper->ControlAction(ACTION_CUT_HALF,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_POSITION_RELATIVE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_MOVE_TO_POSITION_RELATIVE,value1);
+		return m_hDevHelper->ControlAction(ACTION_MOVE_TO_POSITION_RELATIVE,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_FORWRAD_LENGTH){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_MOVE_TO_FORWRAD_LENGTH,value1);
+		return m_hDevHelper->ControlAction(ACTION_MOVE_TO_FORWRAD_LENGTH,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_BLACKMARK){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_MOVE_TO_BLACKMARK,value1);
+		return m_hDevHelper->ControlAction(ACTION_MOVE_TO_BLACKMARK,value1);
 
 	}else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEBACK_TO_LINE){
 		value1=(DWORD)atoi(cmd->strCommand); 
-		return m_pPrinter->ControlAction(ACTION_PRINT_MOVEBACK_TO_LINE,value1);
+		return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEBACK_TO_LINE,value1);
 
 	}else {
 		Dbg("打印命令不存在");
@@ -1184,7 +1035,7 @@ int CThermalPrintFSM::ExecuteImageCMD(PrintCommand* cmd){
 		//}
 		BYTE* data = (BYTE*)cmd->strCommand.GetData();
 		DWORD len = (DWORD)cmd->strCommand.GetLength();
-		return m_pPrinter->PrintImage(data,len);
+		return m_hDevHelper->PrintImage(data,len);
 
 	}else if(cmd->eCommandType==CMD_PRINT_TEXT){
 		//Dbg("要打印的文本长度:%d",cmd->strCommand.GetLength());
@@ -1192,7 +1043,7 @@ int CThermalPrintFSM::ExecuteImageCMD(PrintCommand* cmd){
 		
 		BYTE* data = (BYTE*)cmd->strCommand.GetData();
 		DWORD len = (DWORD)cmd->strCommand.GetLength();
-		return m_pPrinter->PrintText(data,len);
+		return m_hDevHelper->PrintText(data,len);
 
 	}else if(cmd->eCommandType==CMD_PRINT_BARCODE){
 		//3个参数 
@@ -1209,7 +1060,7 @@ int CThermalPrintFSM::ExecuteImageCMD(PrintCommand* cmd){
 		//DWORD height =(DWORD)atoi((LPCTSTR)valueArray[1]);
 		//HriPosition position =(HriPosition)atoi((LPCTSTR)valueArray[2]);
 
-		//return m_pPrinter->PrintBarCode(eType,data,len,unitWidth,height,position);
+		//return m_hDevHelper->PrintBarCode(eType,data,len,unitWidth,height,position);
 		Dbg("CMD_PRINT_BARCODE 打印命令暂不支持");
 		return Error_Exception;
 	}else if(cmd->eCommandType==CMD_PRINT_QR){
@@ -1237,16 +1088,25 @@ void CThermalPrintFSM::ClearPrintCMD()
 
 char* CThermalPrintFSM::ConvertUtf8ToGBK(char* strUtf8)
 {
-	int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
-	WCHAR* wszGBK = new WCHAR[len + 1];
-	memset(wszGBK, 0, len * 2 + 2);
-	MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
-
-	len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
-	char* szGBK = new char[len + 1];
-	memset(szGBK, 0, len + 1);
-	WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
-	delete[] wszGBK;
-
+#if defined(RVC_OS_WIN)
+    int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
+    WCHAR* wszGBK = new WCHAR[len + 1];
+    memset(wszGBK, 0, len * 2 + 2);
+    MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
+
+    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
+    char* szGBK = new char[len + 1];
+    memset(szGBK, 0, len + 1);
+    WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
+    delete[] wszGBK;
+    return szGBK;
+#else
+	std::string str(strUtf8);
+	std::string result = SP::Utility::UTF8ToGBK(str);
+	const int len = result.length();
+    char* szGBK = new char[len + 1];
+    memset(szGBK, 0, len + 1);
+	strcpy(szGBK, result.c_str());
 	return szGBK;
+#endif //RVC_OS_WIN
 }

+ 7 - 15
Module/mod_ThermalPrint/ThermalPrintFSM.h

@@ -6,15 +6,11 @@
 #include "ThermalPrint_server_g.h"
 #include "ThermalPrint_msg_g.h"
 #include "ThermalPrintClass.h"
+#include "DevFSMCommBase.hpp"
 #include <list>
 #include "scew.h"
 #include "EventCode.h"
 
-//定义GPIO灯的参数
-//#define LOG_EVT_THERMAL_PRINTER_GREEN_ON 0x21900001 //闪灯
-//#define LOG_EVT_THERMAL_PRINTER_GREEN_OFF 0x21900002 //关闭闪灯
-
-
 enum EvtType
 {
 	USER_EVT_QUIT =  EVT_USER+1,
@@ -96,7 +92,8 @@ public:
 	}
 };
 
-class CThermalPrintFSM: public FSMImpl<CThermalPrintFSM>{
+class CThermalPrintFSM: public CCommDevFSM<CThermalPrintFSM, ThermalPrintClass>
+{
 public:
 	enum {s0, s1, s2};
 
@@ -117,7 +114,10 @@ public:
 		END_FSM_RULE()
 
 public:
-	CThermalPrintFSM():m_bSupportPrint(false),m_bDevOpen(false),m_bHasPrintTask(false),m_hVendorDll(NULL),m_pCommandList(NULL),m_pPrinter(NULL){
+
+	CThermalPrintFSM()
+		:m_bSupportPrint(false),m_bDevOpen(false),m_bHasPrintTask(false),m_pCommandList(NULL)
+	{
 		m_version=0;
 		m_batch=0;
 		m_port=0;
@@ -144,9 +144,6 @@ public:
 	virtual void s2_on_exit();
 	virtual unsigned int s2_on_event(FSMEvent* e);
 
-
-	ErrorCodeEnum FetchVendorDllName(CSimpleStringA& csDllPath);
-	ErrorCodeEnum LoadDllAndGetAddress(const char* szDllName);
 	ErrorCodeEnum SafeFreeLibrary();
 	ErrorCodeEnum FetchOtherParam();
 
@@ -199,11 +196,6 @@ public:
 	void OnPreCheckFailed();
 	char* ConvertUtf8ToGBK(char* strUtf8);
 private:
-	lpCreateDevCom CreateDevComponent;
-	lpReleaseDevCom ReleaseDevComponent;
-
-	HMODULE m_hVendorDll;//适配器handle
-	ThermalPrintClass* m_pPrinter;//适配器类
 	list<PrintCommand*>* m_pCommandList;//打印指令集合
 
 

+ 11 - 2
Module/mod_ThermalPrint/mod_ThermalPrint.h

@@ -3,10 +3,14 @@
 #pragma once
 
 #include "stdafx.h"
+#include "modVer.h"
+#include "SpTest.h"
 #include "SpBase.h"
 #include "SpIni.h"
 #include "ThermalPrintFSM.h"
 #include "ThermalPrintError.h"
+#include "DevEntityCommBase.hpp"
+
 #include <fstream>
 
 
@@ -30,7 +34,8 @@ private:
 	CThermalPrintEntity* m_pEntity;
 };
 
-class CThermalPrintEntity: public CEntityBase{
+class CThermalPrintEntity : public CDevAdptEntityBase
+{
 public :
 	CThermalPrintEntity() {}
 
@@ -38,6 +43,10 @@ public :
 
 	virtual const char *GetEntityName() const { return "ThermalPrint"; }
 
+    const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
+
+    ON_ENTITYT_TEST()
+
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
 	{
 		LOG_FUNCTION();
@@ -203,7 +212,7 @@ public :
 	CSimpleStringA Readxml(){
 		CSimpleStringA strDepPath;
 		m_fsm.GetEntityBase()->GetFunction()->GetPath("Dep", strDepPath);
-		CSimpleStringA filePath=CSimpleStringA::Format("%s\\ThermalTest.xml", (LPCTSTR)strDepPath);
+		CSimpleStringA filePath=CSimpleStringA::Format("%s" SPLIT_SLASH_STR "ThermalTest.xml", (LPCTSTR)strDepPath);
 	
 		CSimpleStringA str;
 		ifstream in(filePath.GetData(), ios::in);