|
|
@@ -1,1790 +0,0 @@
|
|
|
-// ThermalPrint.cpp : 定义 DLL 应用程序的导出函数。
|
|
|
-//
|
|
|
-
|
|
|
-#include "stdafx.h"
|
|
|
-#include "ThermalPrint.h"
|
|
|
-#include "ImageProcessing.h"
|
|
|
-#include "log4vendor.h"
|
|
|
-using namespace std;
|
|
|
-
|
|
|
-LOG_EXTERN()
|
|
|
-#define DEV_CMD_ACTION_RESPONSE_TIMEOUT 3000 //等待动作3秒钟,超时
|
|
|
-#define MMT0INCH(x) (x*203)/25.4 //毫米单位转为英寸,DPI
|
|
|
-#define MMT0INCH2(x,y) (x*203)/(25.4*y) //毫米单位转为英寸,DPI,x为实际值,y为缩小比例
|
|
|
-extern int GetDllPathLocal(std::string& dllPath); //在dllmain.cpp
|
|
|
-
|
|
|
-
|
|
|
-DWORD gdwCharSpace = 0;
|
|
|
-DWORD gdwCharSize = 1;
|
|
|
-BYTE gDoubleHW = 0; //设置倍高倍宽标识记录。
|
|
|
-DeviceCtrl DeviceTask;
|
|
|
-LPBYTE g_ImageFile = NULL;
|
|
|
-LONG g_size = 0;
|
|
|
-ThermalPrint* g_this = NULL;
|
|
|
-
|
|
|
-
|
|
|
-unsigned long GetTickCount()
|
|
|
-{
|
|
|
- struct timespec ts;
|
|
|
-
|
|
|
- clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
|
-
|
|
|
- return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-ThermalPrint::ThermalPrint():
|
|
|
-m_bDevOpen(false)
|
|
|
-{
|
|
|
- //std::string dllPath;
|
|
|
- memset(m_szErrMsg, 0x00, sizeof(m_szErrMsg));
|
|
|
- m_nPaperType = PAPER_LABEL;
|
|
|
- m_paperWidth = 80;
|
|
|
- bPrintTextFlag = FALSE;
|
|
|
- int nRet;
|
|
|
-
|
|
|
- g_this = this;
|
|
|
- LOG_FUNCTION();
|
|
|
-
|
|
|
-}
|
|
|
-ThermalPrint::~ThermalPrint()
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- m_bDevOpen = false;
|
|
|
-
|
|
|
- //m_handDev有效,则关闭Dev
|
|
|
- DevClose();
|
|
|
-}
|
|
|
- UINT ThermalPrint::StartProcessThread(LPVOID lpvParam)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("StartProcessThread() Entry.");
|
|
|
- for(int i = 1; i <= 100; i++)
|
|
|
- {
|
|
|
- LogM("打印第%d张凭条", i);
|
|
|
- ThermalState devState;
|
|
|
- if (g_this->GetDevState(devState) != Error_Succeed)
|
|
|
- {
|
|
|
- LogM("break for");
|
|
|
- break;
|
|
|
- }
|
|
|
- //BeginPrint(PAPER_CONTINUOUS, 80);
|
|
|
- g_this->SetParam(COMMON_LEFT_MARGIN, 10);
|
|
|
- g_this->SetParam(COMMON_PRINTABLE_AREA, 60);
|
|
|
- g_this->SetParam(COMMON_ROW_SPACE, 4);
|
|
|
- g_this->SetParam(COMMON_ALIGN, 0);
|
|
|
- g_this->SetFont(FONT_UNDERLINE, 1);
|
|
|
- g_this->PrintText(LPBYTE("第一行下划线"), 12);
|
|
|
- g_this->SetFont(FONT_UNDERLINE, 0);
|
|
|
- g_this->PrintText(LPBYTE("无下划"), 6);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
-
|
|
|
- g_this->PrintText(LPBYTE("第二行"), 6);
|
|
|
- g_this->SetFont(FONT_BOLD, 1);
|
|
|
- g_this->PrintText(LPBYTE("加粗"), 4);
|
|
|
- g_this->SetFont(FONT_BOLD, 0);
|
|
|
- g_this->PrintText(LPBYTE("不加粗"), 6);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- g_this->SetFont(FONT_INVERSE, 1);
|
|
|
- g_this->PrintText(LPBYTE("第三行反白"), 10);
|
|
|
- g_this->SetFont(FONT_INVERSE, 0);
|
|
|
- g_this->PrintText(LPBYTE("不反白"), 6);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- g_this->PrintText(LPBYTE("第四行"), 6);
|
|
|
- g_this->SetFont(FONT_ROTATE, 1);
|
|
|
- g_this->PrintText(LPBYTE("旋转"), 4);
|
|
|
- g_this->SetFont(FONT_ROTATE, 0);
|
|
|
- g_this->PrintText(LPBYTE("正常"), 4);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- g_this->PrintText(LPBYTE("第五行"), 6);
|
|
|
- g_this->SetFont(FONT_CUSTOM_SIZE, 6);
|
|
|
- g_this->PrintText(LPBYTE("字体宽高自定义"), 14);
|
|
|
- g_this->SetFont(FONT_CUSTOM_SIZE, 0);
|
|
|
- g_this->PrintText(LPBYTE("正常字体"), 8);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- g_this->PrintText(LPBYTE("第七行"), 6);
|
|
|
- g_this->ControlAction(ACTION_MOVE_TO_POSITION_RELATIVE, 12);
|
|
|
- g_this->PrintText(LPBYTE("距离(横向)"), 12);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- g_this->PrintText(LPBYTE("第一行"), 6);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- LogM("打印第1张图片");
|
|
|
- DeviceTask.SendCommand(SETRASTERBMPPRINT, g_ImageFile, g_size);
|
|
|
- g_this->PrintImage(g_ImageFile, g_size);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- LogM("打印第2张图片");
|
|
|
- DeviceTask.SendCommand(SETRASTERBMPPRINT, g_ImageFile, g_size);
|
|
|
- g_this->PrintImage(g_ImageFile, g_size);
|
|
|
- //ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- LogM("打印第3张图片");
|
|
|
- DeviceTask.SendCommand(SETRASTERBMPPRINT, g_ImageFile, g_size);
|
|
|
- g_this->PrintImage(g_ImageFile, g_size);
|
|
|
- g_this->ControlAction(ACTION_PRINT_ONE_LINE, 1);
|
|
|
- g_this->ControlAction(ACTION_CUT_ALL, 1);
|
|
|
- g_this->ControlAction(ACTION_PRINT_MOVEFORWRAD_LINES, 5);
|
|
|
- //Sleep(2000);
|
|
|
- }
|
|
|
-
|
|
|
- if (g_ImageFile != NULL)
|
|
|
- {
|
|
|
- delete g_ImageFile;
|
|
|
- g_ImageFile = NULL;
|
|
|
- g_size = 0;
|
|
|
- }
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
- int getFileVer(char* sFile, short &ch1, short &ch2)
|
|
|
- {
|
|
|
- ch1 = 0;
|
|
|
- ch2 = 0;
|
|
|
- char* pFind = strstr(sFile, ".so");
|
|
|
- char* pTemp = pFind;
|
|
|
- while(pTemp)
|
|
|
- {
|
|
|
- pFind = pTemp;
|
|
|
- pTemp = strstr(pFind + 3, ".so");
|
|
|
- }
|
|
|
- if(pFind == nullptr) return 0;
|
|
|
-
|
|
|
- pTemp = pFind - 1;
|
|
|
- while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
|
|
|
- if(*pTemp == '.')
|
|
|
- ch2 = atoi(pTemp + 1);
|
|
|
-
|
|
|
- pTemp--;
|
|
|
- while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
|
|
|
-
|
|
|
- if(*pTemp == '.')
|
|
|
- ch1 = atoi(pTemp + 1);
|
|
|
-
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
-ErrorCodeEnum ThermalPrint::GetDevCategory(DevCategoryInfo &devCategory)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("GetDevCategory() Entry.");
|
|
|
- memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
|
|
|
- memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
|
|
|
- memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
|
|
|
-
|
|
|
- memcpy(devCategory.szModel, "FWID=Main Firmware: FV1.010.06", strlen("FWID=Main Firmware: FV1.010.06"));
|
|
|
- memcpy(devCategory.szType, "PVER=SNBC#MID=BT-NH80M", strlen("PVER=SNBC#MID=BT-NH80M"));
|
|
|
- memcpy(devCategory.szVendor, "keba", strlen("keba"));
|
|
|
-
|
|
|
- char sPath[256], sFile[128] = {0};
|
|
|
- GetCurModulePath(sPath, sFile);
|
|
|
- short v1,v2;
|
|
|
- getFileVer(sFile, v1, v2);
|
|
|
-
|
|
|
- devCategory.version.wMajor = v1;
|
|
|
- devCategory.version.wMinor = v2;
|
|
|
-
|
|
|
- devCategory.version.wRevision = 0xffff;
|
|
|
- devCategory.version.wBuild = 2;
|
|
|
-
|
|
|
- //_beginthreadex(NULL, 0, StartProcessThread, (LPVOID)0, 0, NULL);
|
|
|
-
|
|
|
- LogM("GetDevCategory() return:\n\
|
|
|
- devCategory.szType = %s, \n\
|
|
|
- devCategory.szVendor = %s, \n\
|
|
|
- devCategory.eState = %d, \n\
|
|
|
- devCategory.version.wMajor = %d, \n\
|
|
|
- devCategory.version.wMinor = %d, \n\
|
|
|
- devCategory.version.wRevision = %d, \n\
|
|
|
- devCategory.version.wBuild= %d, \n\
|
|
|
- devCategory..szModel = %s, \n",
|
|
|
- devCategory.szType,
|
|
|
- devCategory.szVendor,
|
|
|
- devCategory.eState,
|
|
|
- devCategory.version.wMajor,
|
|
|
- devCategory.version.wMinor,
|
|
|
- devCategory.version.wRevision,
|
|
|
- devCategory.version.wBuild,
|
|
|
- devCategory.szModel);
|
|
|
-
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-// Reset device.
|
|
|
-// Do the cleaning work and initialize device again in order to return to
|
|
|
-// the normal condition.
|
|
|
-ErrorCodeEnum ThermalPrint::Reset()
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("Reset() Entry.");
|
|
|
-
|
|
|
- DWORD dwResult = Error_Succeed;
|
|
|
- BYTE byStatus[STATUS_BUF_LEN];
|
|
|
- //Check status
|
|
|
- if ( !DeviceTask.GetStatus(byStatus) ) //Get status failed
|
|
|
- {
|
|
|
- SaveErrorInfo("Connect device is failed!");
|
|
|
- LogM("Reset(), Connect device is failed!, nRet=%d", Error_DevConnFailed);
|
|
|
- return Error_DevConnFailed; //Device offline
|
|
|
- }
|
|
|
-
|
|
|
- //Send command
|
|
|
- // dwResult = DeviceTask.SendCommandSpec(REALTIME_RESET);
|
|
|
-
|
|
|
- if ( !DeviceTask.Reset() )
|
|
|
- {
|
|
|
- SaveErrorInfo("Connect device is failed!");
|
|
|
- LogM("Reset(), Connect device is failed!, nRet=%d", Error_DevConnFailed);
|
|
|
- return Error_DevConnFailed; //Device connection error
|
|
|
- }
|
|
|
- LogM("DeviceTask.Reset() sucess.");
|
|
|
- sleep(1);
|
|
|
- //Get result status
|
|
|
- if ( !DeviceTask.GetStatus(byStatus) ) //Get status failed
|
|
|
- {
|
|
|
- SaveErrorInfo("Connect device is failed!");
|
|
|
- LogM("Reset(), Connect device is failed!, nRet=%d", Error_DevConnFailed);
|
|
|
- return Error_DevConnFailed; //Device offline
|
|
|
- }
|
|
|
- else
|
|
|
- { //Device status
|
|
|
- if ((byStatus[1] & DATA_BIT3) ||
|
|
|
- (byStatus[1] & DATA_BIT4) ||
|
|
|
- //(byStatus[1] & DATA_BIT6) ||
|
|
|
- (byStatus[0] & DATA_BIT5))
|
|
|
- {
|
|
|
- SaveErrorInfo("Device has hardware error!");
|
|
|
- LogM("Reset(), Device has hardware error!, nRet=%d", Error_Hardware);
|
|
|
- return Error_Hardware; //Device error
|
|
|
- }
|
|
|
- //Media status
|
|
|
- if (byStatus[1] & DATA_BIT2)
|
|
|
- {
|
|
|
- SaveErrorInfo("Paper jammed error!");
|
|
|
- LogM("Reset(), Paper jammed error!, nRet=%d", Error_DevMedia);
|
|
|
- return Error_DevMedia; //Media jammed
|
|
|
- }
|
|
|
- }
|
|
|
- //set read and write timeout
|
|
|
- //dwResult = DeviceTask.SetTimeOut(BT_COMMAND_WRITE_TIMEOUT,BT_COMMAND_READ_TIMEOUT);
|
|
|
-
|
|
|
- BYTE byV = 0x00;
|
|
|
- dwResult = DeviceTask.SendCommand(SETTOPPRTPOS, &byV, 1);
|
|
|
- if ( dwResult != Error_Succeed )
|
|
|
- {
|
|
|
- SaveErrorInfo("Send set line begin position command is failed!");
|
|
|
- LogM("Reset(), Send set line begin position command is failed!, nRet=%d", Error_DevConnFailed);
|
|
|
- return Error_DevConnFailed; //Device connection error
|
|
|
- }
|
|
|
- LogM("Reset() 复位模式, 动作成功");
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-//
|
|
|
-// Close device and do the cleaning work.
|
|
|
-// ex. close connection,close port,release memery and so on
|
|
|
-ErrorCodeEnum ThermalPrint::DevClose()
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("DevClose() Entry.");
|
|
|
-
|
|
|
- DeviceTask.Close();
|
|
|
- m_bDevOpen = false;
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-// Get last error the device issued.
|
|
|
-// Error message must include explanatory memorandum ,the original error
|
|
|
-// code and anything in favour of location problem.
|
|
|
-ErrorCodeEnum ThermalPrint::GetLastErr(DevErrorInfo &devErrInfo)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- //return Error_NotImpl;
|
|
|
- devErrInfo.dwErrMsgLen = strlen(m_szErrMsg);
|
|
|
- memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
|
|
|
- memcpy(devErrInfo.szErrMsg, m_szErrMsg, MIN(devErrInfo.dwErrMsgLen, MAX_DEV_ERROR_MSG_LEN));
|
|
|
-
|
|
|
- LogM("GetLastErr() return:\n\
|
|
|
- devErrInfo.szErrMsg = %s, \n\
|
|
|
- devErrInfo.dwErrMsgLen = %d", devErrInfo.szErrMsg, devErrInfo.dwErrMsgLen);
|
|
|
-
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-// PrinterClass
|
|
|
-// 打开打印机
|
|
|
-ErrorCodeEnum ThermalPrint::DevOpen(BYTE btPort, DWORD dwBaudRate)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("DevOpen(dwPort = %d, dwBaudRate = %d) Entry.", btPort, dwBaudRate);
|
|
|
- DWORD dwReturn = Error_Succeed;
|
|
|
- char cDeviceID[256];
|
|
|
- sprintf(cDeviceID, "/dev/ttyUSB%d", (int)btPort - 1);
|
|
|
-
|
|
|
- dwReturn = DeviceTask.Open(cDeviceID, (int)dwBaudRate);
|
|
|
-
|
|
|
- if ( dwReturn == Error_Succeed )
|
|
|
- {
|
|
|
- m_bDevOpen = true;
|
|
|
- //set read and write timeout
|
|
|
- //dwReturn = DeviceTask.SetTimeOut(BT_COMMAND_WRITE_TIMEOUT,BT_COMMAND_READ_TIMEOUT);
|
|
|
-
|
|
|
- BYTE byV = 0x00;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETTOPPRTPOS, &byV, 1);
|
|
|
- LogM("DevOpen succeed.");
|
|
|
- return Error_Succeed;
|
|
|
- }
|
|
|
- else if ( dwReturn == LOAD_LIB_ERROR )
|
|
|
- {
|
|
|
- SaveErrorInfo("Load driver dll is failed!");
|
|
|
- LogM("DevOpen Load driver dll is failed!");
|
|
|
- return Error_DevLoadFileFailed;
|
|
|
- }
|
|
|
- else if ( dwReturn == CONNECT_ERROR )
|
|
|
- {
|
|
|
- SaveErrorInfo("Connect device is failed!");
|
|
|
- LogM("DevOpen Connect device is failed!");
|
|
|
- return Error_DevConnFailed;
|
|
|
- }
|
|
|
-
|
|
|
- LogM("DevOpen some unknown error occurred!");
|
|
|
- SaveErrorInfo("Device open is failed, some unknown error occurred!");
|
|
|
- return Error_DevNotAvailable;
|
|
|
-}
|
|
|
-
|
|
|
-// 获取打印机实时状态
|
|
|
-ErrorCodeEnum ThermalPrint::GetDevState(ThermalState &devState)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("GetDevState() Entry.");
|
|
|
- BYTE byStatus[STATUS_BUF_LEN];
|
|
|
- memset( byStatus, 0x00, sizeof(byStatus) );
|
|
|
- memset(&m_stDevErrorInfo, 0, sizeof(DevErrorInfo));
|
|
|
-
|
|
|
- //CSetupMutex baseMutex(PRINTER_T080PLUS_MUTEX);
|
|
|
-
|
|
|
- if ( !DeviceTask.GetStatus(byStatus) ) //Get status failed
|
|
|
- {
|
|
|
- m_euDevStatus = STATE_OTHER_ERROR;
|
|
|
- sprintf(m_stDevErrorInfo.szErrMsg, "ErrMsg=%s", "Device is offline or hardware error!");
|
|
|
- m_stDevErrorInfo.dwErrMsgLen = strlen(m_stDevErrorInfo.szErrMsg);
|
|
|
- LogE("GetDevStatus GetStatus fail.");
|
|
|
- return Error_DevConnFailed;
|
|
|
- }
|
|
|
- else //Get status success
|
|
|
- {
|
|
|
- m_euDevStatus = STATE_OK;
|
|
|
- m_euPaperState = PAPER_FULL;
|
|
|
-
|
|
|
- if ((byStatus[1] & DATA_BIT3) ||
|
|
|
- (byStatus[1] & DATA_BIT4) ||
|
|
|
- //(byStatus[1] & DATA_BIT6) ||
|
|
|
- (byStatus[0] & DATA_BIT5))
|
|
|
- {
|
|
|
- m_euDevStatus = STATE_OTHER_ERROR;
|
|
|
- if (byStatus[0] & DATA_BIT5)
|
|
|
- {
|
|
|
- sprintf(m_stDevErrorInfo.szErrMsg, "ErrMsg=%s", "Cover plate is open!");
|
|
|
- LogM("sprintf_s DATA_BIT5 is called, Cover plate is open!");
|
|
|
- m_stDevErrorInfo.dwErrMsgLen = strlen(m_stDevErrorInfo.szErrMsg);
|
|
|
- }
|
|
|
- if (byStatus[1] & DATA_BIT3) //Cutter error
|
|
|
- {
|
|
|
- sprintf(m_stDevErrorInfo.szErrMsg, "ErrMsg=%s", "Cutter is error!");
|
|
|
- m_stDevErrorInfo.dwErrMsgLen = strlen(m_stDevErrorInfo.szErrMsg);
|
|
|
- LogM("sprintf_s DATA_BIT5 is called, Cutter is error!");
|
|
|
- }
|
|
|
- if (byStatus[1] & DATA_BIT4) //Auto Present error(自动上纸错误)
|
|
|
- {
|
|
|
- sprintf(m_stDevErrorInfo.szErrMsg, "ErrMsg=%s", "Auto feed error!");
|
|
|
- m_stDevErrorInfo.dwErrMsgLen = strlen(m_stDevErrorInfo.szErrMsg);
|
|
|
- LogM("sprintf_s DATA_BIT5 is called, Auto feed error!");
|
|
|
- }
|
|
|
- /*if (byStatus[1] & DATA_BIT6) //有可自动恢复错误
|
|
|
- {
|
|
|
- sprintf_s(m_stDevErrorInfo.szErrMsg, "ErrMsg=%s", "Auto recoverable error!");
|
|
|
- m_stDevErrorInfo.dwErrMsgLen = strlen(m_stDevErrorInfo.szErrMsg);
|
|
|
- LogM("sprintf_s DATA_BIT6 is called, Auto recoverable error!");
|
|
|
- }*/
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- m_euDevStatus = STATE_OK;
|
|
|
- if (byStatus[0] & DATA_BIT0)
|
|
|
- {
|
|
|
- m_bDevBusy = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- m_bDevBusy = FALSE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ////////////////////////////////////////////////////////////////////////////////
|
|
|
- // 传输->打印机状态2
|
|
|
- if (byStatus[1] & DATA_BIT2) //Jammed paper error
|
|
|
- {
|
|
|
- //m_euDevStatus = STATE_OTHER_ERROR;
|
|
|
- m_euPaperState = PAPER_JAMMED;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // 传输->打印机状态3
|
|
|
- if ((byStatus[2] & DATA_BIT2) && (byStatus[2] & DATA_BIT3)) //Paper Out
|
|
|
- {
|
|
|
- m_euPaperState = PAPER_EMPTY;
|
|
|
- }
|
|
|
- else if ((byStatus[2] & DATA_BIT0) && (byStatus[2] & DATA_BIT1)) //Paper Near End
|
|
|
- {
|
|
|
- m_euPaperState = PAPER_LOW;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- m_euPaperState = PAPER_FULL;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- devState.hardwareState = m_euDevStatus;
|
|
|
- devState.paperState = m_euPaperState;
|
|
|
- LogM("GetDevStatus is end.");
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//开始打印初始设置:paperWidth一般为80mm和57mm
|
|
|
-ErrorCodeEnum ThermalPrint::BeginPrint(ThermalPaperType eType, int paperWidth)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("BeginPrint(eType %d, paperWidth %d) is Entry.", eType, paperWidth);
|
|
|
-
|
|
|
- //全局变理恢复初值
|
|
|
- gdwCharSpace = 0;
|
|
|
- gdwCharSize = 1;
|
|
|
- gDoubleHW = 0;
|
|
|
- //初始化打印机
|
|
|
- DWORD dwRet = DeviceTask.SendCommand(INITIALIZ);
|
|
|
- if (dwRet != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Initialize device failed, check device connection!");
|
|
|
- LogE("BeginPrint(),Initialize device failed, check device connection!, nRet=%d", Error_Hardware);
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- dwRet = DeviceTask.SendCommand(SETSTADMODE);
|
|
|
- BYTE byCommandBuf[8] = {0};
|
|
|
- if ( paperWidth >= 0 )
|
|
|
- {
|
|
|
- DeviceTask.SetParam( paperWidth );
|
|
|
- m_paperWidth = paperWidth;
|
|
|
- if (eType == PAPER_CONTINUOUS)
|
|
|
- {
|
|
|
- byCommandBuf[0] = 0;
|
|
|
- DeviceTask.SendCommand(SETBLACKMARKSUPP, byCommandBuf, 1);
|
|
|
- }
|
|
|
- else if (eType == PAPER_LABEL)
|
|
|
- {
|
|
|
- byCommandBuf[0] = 1;
|
|
|
- DeviceTask.SendCommand(SETBLACKMARKSUPP, byCommandBuf, 1);
|
|
|
- }
|
|
|
- m_nPaperType = eType;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SaveErrorInfo("Paper width is invalid!");
|
|
|
- LogE("BeginPrint()Paper width is invalid!, nRet=%d", Error_DataCheck);
|
|
|
- return Error_DataCheck;
|
|
|
- }
|
|
|
-
|
|
|
- LogM("BeginPrint(eType %d, paperWidth %d) is Succeed.", eType, paperWidth);
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
|
|
|
-//第三个参数是预留参数 暂时无用到
|
|
|
-ErrorCodeEnum ThermalPrint::ControlAction(PrintAction eAction, DWORD dwValue1, DWORD dwValue2)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- DWORD dwReturn = Error_Succeed;
|
|
|
- BYTE byCommandBuf[8];
|
|
|
-
|
|
|
- memset( byCommandBuf, 0x00, sizeof(byCommandBuf) );
|
|
|
- LogM("ControlAction( eAction = %d, dwValue1 = %d, dwValue2 = %d.) is Entry.", eAction, dwValue1, dwValue2);
|
|
|
- if ( eAction == ACTION_PRINT_ONE_LINE )
|
|
|
- {
|
|
|
- dwReturn = DeviceTask.SendCommand( FEEDLINEPRINT );
|
|
|
- if (bPrintTextFlag != FALSE)
|
|
|
- {
|
|
|
- bPrintTextFlag = FALSE;
|
|
|
- }
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_PRINT_MOVEFORWRAD_LINES )
|
|
|
- {
|
|
|
- byCommandBuf[0] = (BYTE)(dwValue1>255?255:dwValue1); //MAX 255 line
|
|
|
- dwReturn = DeviceTask.SendCommand( FEEDMULTPRINT, byCommandBuf, 1 );
|
|
|
- if (bPrintTextFlag != FALSE)
|
|
|
- {
|
|
|
- bPrintTextFlag = FALSE;
|
|
|
- }
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_PRINT_MOVEBACKWRAD_LINES ) //回纸?
|
|
|
- {
|
|
|
-
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_CUT_ALL ) //全切
|
|
|
- {
|
|
|
- ThermalState devState;
|
|
|
- GetDevState(devState);
|
|
|
- if (devState.paperState == PAPER_EMPTY)
|
|
|
- {
|
|
|
- SaveErrorInfo("Device is not media!");
|
|
|
- LogE("ControlAction ACTION_CUT_ALL fail, Paper emrty, Device is not media!.");
|
|
|
- return Error_DevMedia;
|
|
|
- }
|
|
|
- if (bPrintTextFlag != FALSE)
|
|
|
- {
|
|
|
- dwReturn = DeviceTask.SendCommand( FEEDLINEPRINT );
|
|
|
- bPrintTextFlag = FALSE;
|
|
|
- }
|
|
|
- //DeviceTask.bCutPaper();
|
|
|
- dwReturn = DeviceTask.SendCommand( PAPERDIRCETCUTEX );
|
|
|
- /*if (m_nPaperType == PAPER_LABEL)
|
|
|
- {
|
|
|
- dwReturn = DeviceTask.SendCommand( PAPERFEEDCUT );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- byCommandBuf[0] = 0x01;
|
|
|
- DeviceTask.SendCommand(SETBLACKMARKSUPP, byCommandBuf, 1);
|
|
|
- byCommandBuf[0] = 0x05;
|
|
|
- dwReturn = DeviceTask.SendCommand( FEEDMULTPRINT, byCommandBuf, 1 );
|
|
|
- dwReturn = DeviceTask.SendCommand( PAPERDIRCETCUTEX );//全切纸(实际为半切)
|
|
|
- }*/
|
|
|
- LogM("SendCommand dwReturn = %d", dwReturn);
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_CUT_HALF ) //半切纸
|
|
|
- {
|
|
|
- dwReturn = DeviceTask.SendCommand( PAPERDIRCETCUTEX ); //半切纸
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_MOVE_TO_POSITION_RELATIVE )
|
|
|
- {
|
|
|
- if ((dwValue1 > DeviceTask.m_wPaperWidth) && (DeviceTask.m_wPaperWidth > 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over the paper width!");
|
|
|
- LogE("Parameter is over the paper width!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- DWORD dwPosV = MMT0INCH(dwValue1);
|
|
|
- DWORD dwH = dwPosV / 256;
|
|
|
- switch (dwH)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 1;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 2;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- dwReturn = DeviceTask.SendCommand( SETHORIRELATEPOS, byCommandBuf, 2);
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_MOVE_TO_FORWRAD_LENGTH )
|
|
|
- {
|
|
|
- DWORD dwMove = MMT0INCH(dwValue1);
|
|
|
- if (dwValue1 > 255)
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- byCommandBuf[0] = (BYTE)dwMove;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETVERIRELATEPOS, byCommandBuf, 1);
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_MOVE_TO_BLACKMARK )
|
|
|
- {
|
|
|
- dwReturn = DeviceTask.SendCommand( FEEDMARKSTART );
|
|
|
- }
|
|
|
- else if ( eAction == ACTION_PRINT_MOVEBACK_TO_LINE )
|
|
|
- {
|
|
|
- switch (dwValue1)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- {
|
|
|
- byCommandBuf[0] = 1;
|
|
|
- break;
|
|
|
- }
|
|
|
- case 1:
|
|
|
- {
|
|
|
- byCommandBuf[0] = 0;
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- dwReturn = DeviceTask.SendCommand( SETTOPPRTPOS, byCommandBuf, 1);
|
|
|
- }
|
|
|
-
|
|
|
- //Check result
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- LogM("ControlAction Send command failed, make sure device is ok!");
|
|
|
- SaveErrorInfo("Send command failed, make sure device is ok!");
|
|
|
- if ( dwReturn == HARDWARE_ERROR )
|
|
|
- {
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return Error_DataCheck;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印参数指令函数:
|
|
|
-//第三个参数是预留参数 暂时无用到
|
|
|
-ErrorCodeEnum ThermalPrint::SetParam(CommandType eType, DWORD dwValue1, DWORD dwValue2)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- DWORD dwReturn = Error_Succeed;
|
|
|
- BYTE byCommandBuf[8];
|
|
|
- LogM("SetParam is called, eType %d, dwValue1 %d, dwValue2 %d.", eType, dwValue1, dwValue2);
|
|
|
- memset( byCommandBuf, 0x00, sizeof(byCommandBuf) );
|
|
|
-
|
|
|
- if ( eType == COMMON_ROW_SPACE )
|
|
|
- {
|
|
|
- DWORD dwRowSpace = MMT0INCH(dwValue1);
|
|
|
- if (dwRowSpace > 255)
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- byCommandBuf[0] = (BYTE)dwRowSpace;
|
|
|
- dwReturn = DeviceTask.SendCommand( SETLINESPACE, byCommandBuf, 1 );
|
|
|
- }
|
|
|
- else if ( eType == COMMON_ALIGN )
|
|
|
- {
|
|
|
- if ((dwValue1 >= ALIGN_LEFT) && (dwValue1 <= ALIGN_RIGHT))
|
|
|
- {
|
|
|
- byCommandBuf[0] = (BYTE)dwValue1;
|
|
|
- dwReturn = DeviceTask.SendCommand( SETALIGN, byCommandBuf, 1 );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- else if ( eType == COMMON_REVERSE )
|
|
|
- {
|
|
|
- if (dwValue1 > 1)
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- byCommandBuf[0] = (BYTE)dwValue1; //
|
|
|
- dwReturn = DeviceTask.SendCommand( SETLINEREVERSEPRINT, byCommandBuf, 1 ); //选择或取消倒置打印
|
|
|
- }
|
|
|
- }
|
|
|
- else if ( eType == COMMON_LEFT_MARGIN )
|
|
|
- {
|
|
|
- //byCommandBuf[0] = (BYTE)(dwValue1>255?255:dwValue1); //MAX 255 mm
|
|
|
- if ((dwValue1 > DeviceTask.m_wPaperWidth) && (DeviceTask.m_wPaperWidth > 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- DWORD dwPosV = MMT0INCH(dwValue1);
|
|
|
- DWORD dwH = dwPosV / 256;
|
|
|
- switch (dwH)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 1;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 2;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- dwReturn = DeviceTask.SendCommand( SETLEFTMARGIN, byCommandBuf, 2 ); //超过paper宽度同样不执行
|
|
|
- }
|
|
|
- else if ( eType == COMMON_PRINTABLE_AREA )
|
|
|
- {
|
|
|
- //byCommandBuf[0] = (BYTE)(dwValue1>255?255:dwValue1);
|
|
|
- if ((dwValue1 > DeviceTask.m_wPaperWidth) && (DeviceTask.m_wPaperWidth > 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- if (dwValue1 > (DeviceTask.m_wPaperWidth - 5)) //修正误差
|
|
|
- {
|
|
|
- dwValue1 = DeviceTask.m_wPaperWidth - 3;
|
|
|
- }
|
|
|
-
|
|
|
- DWORD dwPosV = MMT0INCH(dwValue1);
|
|
|
- DWORD dwH = dwPosV / 256;
|
|
|
- switch (dwH)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 1;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- {
|
|
|
- DWORD dwL = dwPosV % 256;
|
|
|
- byCommandBuf[0] = (BYTE)dwL;
|
|
|
- byCommandBuf[1] = 2;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- dwReturn = DeviceTask.SendCommand(SETLINEPRINTAREA, byCommandBuf, 2);
|
|
|
- }
|
|
|
-
|
|
|
- //出错返回
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command failed, make sure device is ok!");
|
|
|
- LogE("Send command failed, make sure device is ok!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
-
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印字体指令函数:主要是字体相关饿指令函数
|
|
|
-//第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
|
|
|
-// 设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
|
|
|
-ErrorCodeEnum ThermalPrint::SetFont(FontStyle eType, DWORD dwValue1, DWORD dwValue2)
|
|
|
-{
|
|
|
-// SaveErrorInfo("未完成SetFont()开发");
|
|
|
-// return Error_NotImpl;
|
|
|
- DWORD dwReturn = Error_Succeed;
|
|
|
- BYTE byCommandBuf[8] = {0};
|
|
|
- byCommandBuf[0] = 0x00;
|
|
|
- BYTE byCHNMod = 0x00;
|
|
|
- LogM("SetFont is called, eType %d, dwValue1 %d, dwValue2 %d.", eType, dwValue1, dwValue2);
|
|
|
- if (eType == FONT_UNDERLINE)
|
|
|
- {
|
|
|
- if (dwValue1 > 1) //just 0 or 1
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- if (dwValue1 == 1)
|
|
|
- {
|
|
|
- dwValue1 = 2; //加深下划线
|
|
|
- }
|
|
|
-
|
|
|
- byCommandBuf[0] = (BYTE)dwValue1;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETFONTUNDERLINE, byCommandBuf, 1);
|
|
|
-
|
|
|
- }
|
|
|
- else if (eType == FONT_BOLD)
|
|
|
- {
|
|
|
- if (dwValue1 > 1) //just 0 or 1
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- byCommandBuf[0] = (BYTE)dwValue1;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETFONTBOLD, byCommandBuf, 1);
|
|
|
-
|
|
|
- }
|
|
|
- else if (eType == FONT_DOUBLEHEIGHT)
|
|
|
- {
|
|
|
- switch (dwValue1)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- {
|
|
|
- gDoubleHW &= 0x10;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- {
|
|
|
- gDoubleHW |= 0x01;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- byCommandBuf[0] = gDoubleHW;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSIZE, byCommandBuf, 1);
|
|
|
-
|
|
|
- }
|
|
|
- else if (eType == FONT_DOUBLEWIDE)
|
|
|
- {
|
|
|
- switch (dwValue1)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- {
|
|
|
- gDoubleHW &= 0x01;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- {
|
|
|
- gDoubleHW |= 0x10;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- byCommandBuf[0] = gDoubleHW;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSIZE, byCommandBuf, 1);
|
|
|
- if (dwValue1 == 1)
|
|
|
- {
|
|
|
- if (gdwCharSpace > 0)
|
|
|
- {
|
|
|
- DWORD dwCharSpace = MMT0INCH2(gdwCharSpace,2);
|
|
|
- byCommandBuf[0] = (BYTE)dwCharSpace;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSPACE, byCommandBuf, 1);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (gdwCharSpace > 0)
|
|
|
- {
|
|
|
- DWORD dwCharSpace = MMT0INCH(gdwCharSpace);
|
|
|
- byCommandBuf[0] = (BYTE)dwCharSpace;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSPACE, byCommandBuf, 1);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if (eType == FONT_INVERSE)
|
|
|
- {
|
|
|
- if (dwValue1 > 1) //just 0 or 1
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- byCommandBuf[0] = (BYTE)dwValue1;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETFONTINVERSE, byCommandBuf, 1);
|
|
|
-
|
|
|
- }
|
|
|
- else if (eType == FONT_ROTATE)
|
|
|
- {
|
|
|
- switch (dwValue1)
|
|
|
- {
|
|
|
- case 270:
|
|
|
- {
|
|
|
- byCommandBuf[0] = 3;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 90:
|
|
|
- {
|
|
|
- byCommandBuf[0] = 1;
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0:
|
|
|
- default:
|
|
|
- {
|
|
|
- byCommandBuf[0] = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- dwReturn = DeviceTask.SendCommand(SETFONTROTATE, byCommandBuf, 1);
|
|
|
- }
|
|
|
- else if (eType == FONT_CUSTOM_SIZE)
|
|
|
- {
|
|
|
- if ((dwValue1 > 6) || (dwValue1 < 1) || (dwValue2 > 6) || (dwValue2 < 1))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- byCommandBuf[0] = 0;
|
|
|
- switch (dwValue1)
|
|
|
- {
|
|
|
- case 1:
|
|
|
- byCommandBuf[0] |= 0x00;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- byCommandBuf[0] |= 0x10;
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- byCommandBuf[0] |= 0x20;
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- byCommandBuf[0] |= 0x30;
|
|
|
- break;
|
|
|
- case 5:
|
|
|
- byCommandBuf[0] |= 0x40;
|
|
|
- break;
|
|
|
- case 6:
|
|
|
- default:
|
|
|
- {
|
|
|
- byCommandBuf[0] |= 0x50;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- switch (dwValue2)
|
|
|
- {
|
|
|
- case 1:
|
|
|
- byCommandBuf[0] |= 0x00;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- byCommandBuf[0] |= 0x01;
|
|
|
- break;
|
|
|
- case 3:
|
|
|
- byCommandBuf[0] |= 0x02;
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- byCommandBuf[0] |= 0x03;
|
|
|
- break;
|
|
|
- case 5:
|
|
|
- byCommandBuf[0] |= 0x04;
|
|
|
- break;
|
|
|
- case 6:
|
|
|
- default:
|
|
|
- {
|
|
|
- byCommandBuf[0] |= 0x05;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSIZE, byCommandBuf, 1);
|
|
|
- if (dwValue1 > 1)
|
|
|
- {
|
|
|
- if (dwValue1 > 6)
|
|
|
- {
|
|
|
- dwValue1 = 6;
|
|
|
- }
|
|
|
-
|
|
|
- if (gdwCharSpace > 0)
|
|
|
- {
|
|
|
- DWORD dwCharSpace = MMT0INCH2(gdwCharSpace,dwValue1);
|
|
|
- byCommandBuf[0] = (BYTE)dwCharSpace;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSPACE, byCommandBuf, 1);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (gdwCharSpace > 0)
|
|
|
- {
|
|
|
- DWORD dwCharSpace = MMT0INCH(gdwCharSpace);
|
|
|
- byCommandBuf[0] = (BYTE)dwCharSpace;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSPACE, byCommandBuf, 1);
|
|
|
- }
|
|
|
- }
|
|
|
- gdwCharSize = dwValue1;
|
|
|
- }
|
|
|
- else if (eType == FONT_LEFT_RIGHT_SPACE)
|
|
|
- {
|
|
|
- if ((dwValue1 > 36) || (dwValue2 > 36))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is over valid range!");
|
|
|
- LogE("Parameter is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- gdwCharSpace = dwValue2;
|
|
|
- DWORD dwCharSpace = MMT0INCH(dwValue2);
|
|
|
- if (gdwCharSize > 1)
|
|
|
- {
|
|
|
- dwCharSpace = MMT0INCH2(dwValue2,gdwCharSize);
|
|
|
- }
|
|
|
- if (dwCharSpace > 255)
|
|
|
- {
|
|
|
- dwCharSpace = 255;
|
|
|
- }
|
|
|
- byCommandBuf[0] = (BYTE)dwCharSpace;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETCHARSPACE, byCommandBuf, 1); //字符右边距
|
|
|
- dwReturn = DeviceTask.SendCommand(SETFONTLRSPACE, byCommandBuf, 1); //汉字右边距
|
|
|
- }
|
|
|
- }
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command failed, make sure device is ok!");
|
|
|
- LogE("Send command failed, make sure device is ok!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
-
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印文本数据函数
|
|
|
-ErrorCodeEnum ThermalPrint::PrintText(BYTE *pData, DWORD dwDataLen)
|
|
|
-{
|
|
|
- if ((pData == NULL) || (dwDataLen == 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is invalid!");
|
|
|
- LogE("Parameter is invalid!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- CHAR* inputData = new CHAR[dwDataLen+1];
|
|
|
- memset(inputData, 0x00, dwDataLen+1);
|
|
|
- memcpy(inputData, pData, dwDataLen);
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("PrintText(pData %s, dwDataLen %d) is called.", pData, dwDataLen);
|
|
|
-
|
|
|
- char byDate[100] = {0};
|
|
|
- CDataConvert::StringUTF8toASCII(inputData, byDate, sizeof(byDate));
|
|
|
- if (strlen(byDate) == 0)
|
|
|
- {
|
|
|
- LogE("StringUTF8toASCII fail! strlen(byDate) == 0");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- LogXM(byDate, strlen(byDate), "StringUTF8toASCII result OK");
|
|
|
-
|
|
|
- DWORD dwRet = DeviceTask.SendData((LPBYTE)byDate, (WORD)strlen(byDate)); //发送打印内容
|
|
|
- if (dwRet != Error_Succeed)
|
|
|
- {
|
|
|
- LogXE(byDate, (WORD)strlen(byDate), "Send");
|
|
|
- SaveErrorInfo("Send command failed, make sure device is ok!");
|
|
|
- LogE("Send command failed, make sure device is ok!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- LogM("ThermalPrint::PrintText(%s, %d)", pData, dwDataLen);
|
|
|
- LogXM(byDate, strlen(byDate), "Send");
|
|
|
- bPrintTextFlag = TRUE;
|
|
|
- if (inputData != NULL)
|
|
|
- {
|
|
|
- delete[] inputData;
|
|
|
- inputData = NULL;
|
|
|
- }
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印条形码函数
|
|
|
-//dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
|
|
|
-//dwHeight 条形码高度 单位mm
|
|
|
-//iHRIPosition hri字符打印位置 见枚举类型HriPosition
|
|
|
-ErrorCodeEnum ThermalPrint::PrintBarCode(BarCodeType eType, BYTE *pData, DWORD dwDataLen, DWORD dwUnitWidth, DWORD dwHeight, HriPosition eHRIPosition)
|
|
|
-{
|
|
|
- CHAR* inputData = new CHAR[dwDataLen+1];
|
|
|
- memset(inputData, 0x00, dwDataLen+1);
|
|
|
- memcpy(inputData, pData, dwDataLen);
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("PrintBarCode is called, eType %d, pData %s, dwDataLen %d, dwUnitWidth %d, dwHeight %d.", eType, pData, dwDataLen, dwUnitWidth, dwHeight);
|
|
|
- if (inputData != NULL)
|
|
|
- {
|
|
|
- delete[] inputData;
|
|
|
- inputData = NULL;
|
|
|
- }
|
|
|
- if ((pData == NULL) || (dwDataLen == 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is invalid!");
|
|
|
- LogM("Parameter is invalid!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- if ((dwUnitWidth < 2) || (dwUnitWidth > 6))
|
|
|
- {
|
|
|
- dwUnitWidth = 2; //default is 2
|
|
|
- }
|
|
|
-
|
|
|
- //设置条码类型
|
|
|
- BYTE byBCType = 0x41;
|
|
|
- switch (eType)
|
|
|
- {
|
|
|
- case CONTENT_BARCODE_UPC_E:
|
|
|
- {
|
|
|
- byBCType = 0x42;
|
|
|
- if ((dwDataLen < 11) || (dwDataLen > 12))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over valid range!");
|
|
|
- LogE("Parameter data length is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case CONTENT_BARCODE_EAN8:
|
|
|
- {
|
|
|
- byBCType = 0x44;
|
|
|
- if ((dwDataLen < 7) || (dwDataLen > 8))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over valid range!");
|
|
|
- LogE("Parameter data length is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case CONTENT_BARCODE_EAN13:
|
|
|
- {
|
|
|
- if ((dwDataLen < 12) || (dwDataLen > 13))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over valid range!");
|
|
|
- LogE("Parameter data length is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- byBCType = 0x43;
|
|
|
- }
|
|
|
- break;
|
|
|
- case CONTENT_BARCODE_39:
|
|
|
- {
|
|
|
- byBCType = 0x45;
|
|
|
- if ((dwDataLen < 1) || (dwDataLen > 255))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over valid range!");
|
|
|
- LogE("Parameter data length is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case CONTENT_BARCODE_128:
|
|
|
- {
|
|
|
- byBCType = 0x49;
|
|
|
- if ((dwDataLen < 2) || (dwDataLen > 255))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over valid range!");
|
|
|
- LogE("Parameter data length is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case CONTENT_BARCODE_UPC_A:
|
|
|
- default:
|
|
|
- {
|
|
|
- if ((dwDataLen < 11) || (dwDataLen > 12))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over valid range!");
|
|
|
- LogE("Parameter data length is over valid range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- DWORD dwReturn = Error_Succeed;
|
|
|
-
|
|
|
- //设置HRI打印位置
|
|
|
- BYTE byHRIPos = 0;
|
|
|
- switch (eHRIPosition)
|
|
|
- {
|
|
|
- case HRI_POSITION_ABOVE:
|
|
|
- byHRIPos = 1;
|
|
|
- break;
|
|
|
- case HRI_POSITION_BELOW:
|
|
|
- byHRIPos = 2;
|
|
|
- break;
|
|
|
- case HRI_POSITION_BOTH:
|
|
|
- byHRIPos = 3;
|
|
|
- break;
|
|
|
- case HRI_POSITION_NONE:
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- dwReturn = DeviceTask.SendCommand(SETHRIPRINTPOS, &byHRIPos, 1);
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command HRI position failed, check device connection!");
|
|
|
- LogE("Send command HRI position failed, check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- //设置条码高度,DPI为203,mm 转化为inch
|
|
|
- //WORD wHeight = (WORD)(dwHeight * 203 / 25.4);
|
|
|
- WORD wHeight = (WORD)MMT0INCH(dwHeight);
|
|
|
- BYTE byHeight = wHeight>255?255:wHeight;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETBARCODEHEIGHT, &byHeight, 1);
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command Barcode height failed, check device connection!");
|
|
|
- LogE("Send command Barcode height failed, check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
-
|
|
|
- //设置条码基本宽度
|
|
|
- BYTE byWidth = (BYTE)dwUnitWidth;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETBARCODEWIDTH, &byWidth, 1);
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command Barcode width failed, check device connection!");
|
|
|
- LogE("Send command Barcode height failed, check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
-
|
|
|
- //打印条码
|
|
|
- BYTE *pbPrint = NULL;
|
|
|
- pbPrint = new BYTE[dwDataLen + 3];//
|
|
|
- memset(pbPrint, 0, dwDataLen + 3);
|
|
|
- pbPrint[0] = byBCType;
|
|
|
- pbPrint[1] = (BYTE)dwDataLen;
|
|
|
- memcpy(&pbPrint[2], pData, dwDataLen);
|
|
|
- dwReturn = DeviceTask.SendCommand(SETBARCODEPRINT, pbPrint, (WORD)(dwDataLen + 2));
|
|
|
- if (pbPrint != NULL)
|
|
|
- {
|
|
|
- delete [] pbPrint;
|
|
|
- pbPrint = NULL;
|
|
|
- }
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command Barcode print failed, check device connection!");
|
|
|
- LogE("Send command Barcode height failed, check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
-
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印二维码QRCode函数
|
|
|
-//dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
|
|
|
-ErrorCodeEnum ThermalPrint::PrintQRCode(BYTE *pData, DWORD dwDataLen, DWORD dwUnitWidth)
|
|
|
-{
|
|
|
- CHAR* inputData = new CHAR[dwDataLen+1];
|
|
|
- memset(inputData, 0x00, dwDataLen+1);
|
|
|
- memcpy(inputData, pData, dwDataLen);
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("PrintText is called, pData %s, dwDataLen %d.", inputData, dwDataLen);
|
|
|
- if (inputData != NULL)
|
|
|
- {
|
|
|
- delete[] inputData;
|
|
|
- inputData = NULL;
|
|
|
- }
|
|
|
- if ((pData == NULL) || (dwDataLen == 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is invalid!");
|
|
|
- LogE("Parameter is invalid!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- if ((dwUnitWidth > 255) || (dwUnitWidth == 0))
|
|
|
- {
|
|
|
- dwUnitWidth = 3; //default is 3
|
|
|
- }
|
|
|
- BYTE byVal = dwUnitWidth;
|
|
|
- DWORD dwRet = DeviceTask.SendCommand(SETQRCODEPARAM, &byVal, 1);
|
|
|
- if (dwRet != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send QR code para failed,check device connection!");
|
|
|
- LogE("Send QR code para failed,check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- //////////////////////////////////////////////////////////////////////////
|
|
|
- //打印条码
|
|
|
- BYTE *pbPrint = NULL;
|
|
|
- pbPrint = new BYTE[dwDataLen + 6];//
|
|
|
- memset(pbPrint, 0, dwDataLen + 6);
|
|
|
- pbPrint[0] = 0x4C; //type : QRCode
|
|
|
- pbPrint[1] = (BYTE)(dwDataLen + 5); //len
|
|
|
- pbPrint[2] = 0x4C; //纠错等级
|
|
|
- pbPrint[3] = 0x4D; //掩模图形参考
|
|
|
- pbPrint[4] = 0x41; //数据输入模式:自动(0x41)
|
|
|
- memcpy(&pbPrint[5], pData, dwDataLen);
|
|
|
- dwRet = DeviceTask.SendCommand(SETBARCODEPRINT, pbPrint, (WORD)(dwDataLen + 5));
|
|
|
- if (pbPrint != NULL)
|
|
|
- {
|
|
|
- delete [] pbPrint;
|
|
|
- pbPrint = NULL;
|
|
|
- }
|
|
|
- if (dwRet != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send QR code print failed,check device connection!");
|
|
|
- LogE("Send QR code para failed,check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- if (!WaitUntialActFinish()) //用于等待动作完成
|
|
|
- {
|
|
|
- SaveErrorInfo("Waiting Print action finish, some unknown error occurred!");
|
|
|
- LogE("Waiting Print action finish, some unknown error occurred!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印二维码QRCode函数
|
|
|
-//dwWidth 二维码长度 ,单位mm
|
|
|
-ErrorCodeEnum ThermalPrint::PrintQRCodeByArea(BYTE *pData, DWORD dwDataLen, DWORD dwUnitWidth, DWORD dwWidth)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- SaveErrorInfo("未完成PrintQRCodeByArea()开发");
|
|
|
- LogM("未完成PrintQRCodeByArea()开发");
|
|
|
- return Error_NotImpl;
|
|
|
-}
|
|
|
-
|
|
|
-//打印二维码PDF417函数
|
|
|
-//errorLevel pdf417纠错级别 取值{0..8}
|
|
|
-//dwUnitWidth 基本元素宽度 取值{3..90}
|
|
|
-//dwUnitHeight 基本元素长度 取值{1..30}
|
|
|
-//row pdf417 行数 取值{1..7}
|
|
|
-//lines pdf417 列数 取值{2..25}
|
|
|
-ErrorCodeEnum ThermalPrint::PrintPDF417code(BYTE *pData, DWORD dwDataLen, int errorLevel, DWORD dwUnitWidth, DWORD dwUnitHeight, int rows, int lines)
|
|
|
-{
|
|
|
-
|
|
|
- CHAR* inputData = new CHAR[dwDataLen+1];
|
|
|
- memset(inputData, 0x00, dwDataLen+1);
|
|
|
- memcpy(inputData, pData, dwDataLen);
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("PrintPDF417code is called, pData %s, dwDataLen %d.", inputData, dwDataLen);
|
|
|
- if (inputData != NULL)
|
|
|
- {
|
|
|
- delete[] inputData;
|
|
|
- inputData = NULL;
|
|
|
- }
|
|
|
- if ((pData == NULL) || (dwDataLen == 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is invalid!");
|
|
|
- LogE("Parameter is invalid!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- if ((dwDataLen < 1) || (dwDataLen > 255))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter data length is over range!");
|
|
|
- LogE("Parameter data length is over range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- if ((errorLevel < 0) || (errorLevel > 8))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter error level is over range!");
|
|
|
- LogE("Parameter data length is over range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- if ((rows < 3) || (rows > 90))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter rows is over range!");
|
|
|
- LogE("Parameter data length is over range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- if ((lines < 1) || (lines > 30))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter lines is over range!");
|
|
|
- LogE("Parameter data length is over range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- if ((dwUnitWidth < 1) || (dwUnitWidth > 7))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter unit width is over range!");
|
|
|
- LogE("Parameter data length is over range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- if ((dwUnitHeight < 2) || (dwUnitHeight > 25))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter unit height is over range!");
|
|
|
- LogE("Parameter data length is over range!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
-
|
|
|
- DWORD dwReturn = Error_Succeed;
|
|
|
-
|
|
|
- BYTE byErrLevel = 0;
|
|
|
- byErrLevel = errorLevel;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETPDF417ERRORLEVEL, &byErrLevel, 1);
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command set error level failed,check device connection!");
|
|
|
- LogE("Send command set error level failed,check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
-
|
|
|
- BYTE bySetInfo[8] = {0};
|
|
|
- bySetInfo[0] = 0;
|
|
|
- bySetInfo[1] = 0;
|
|
|
- bySetInfo[2] = rows;
|
|
|
- bySetInfo[3] = lines;
|
|
|
- bySetInfo[4] = (BYTE)dwUnitWidth;
|
|
|
- bySetInfo[5] = (BYTE)dwUnitHeight;
|
|
|
- dwReturn = DeviceTask.SendCommand(SETPDF417INFO, bySetInfo, 6);
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command set PDF417 info failed,check device connection!");
|
|
|
- LogE("Send command set error level failed,check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- //打印条码
|
|
|
- BYTE *pPrint = NULL;
|
|
|
- pPrint = new BYTE[dwDataLen + 3];
|
|
|
- memset(pPrint, 0, dwDataLen + 3);
|
|
|
- pPrint[0] = 0x4B; //PDF417
|
|
|
- pPrint[1] = (BYTE)dwDataLen;
|
|
|
- memcpy(&pPrint[2], pData, dwDataLen);
|
|
|
- dwReturn = DeviceTask.SendCommand(SETBARCODEPRINT, pPrint, (WORD)dwDataLen + 2);
|
|
|
- if (pPrint != NULL)
|
|
|
- {
|
|
|
- delete [] pPrint;
|
|
|
- pPrint = NULL;
|
|
|
- }
|
|
|
- if (dwReturn != Error_Succeed)
|
|
|
- {
|
|
|
- SaveErrorInfo("Send command PDF417 print failed,check device connection!");
|
|
|
- LogE("Send command set error level failed,check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- if (!WaitUntialActFinish()) //用于等待动作完成
|
|
|
- {
|
|
|
- SaveErrorInfo("Waiting Print action finish failed,some unknown error occurred!");
|
|
|
- LogE("Send command set error level failed,check device connection!");
|
|
|
- return Error_Hardware;
|
|
|
- }
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//打印二维码PDF417函数
|
|
|
-//errorLevel pdf417纠错级别 取值{0..8}
|
|
|
-//dwWidth pdf417宽度 单位mm
|
|
|
-//dwHeight pdf417长度 单位mm
|
|
|
-ErrorCodeEnum ThermalPrint::PrintPDF417codeByArea(BYTE *pData,DWORD dwDataLen,int errorLevel,DWORD dwWidth,DWORD dwHeight)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- SaveErrorInfo("未完成PrintPDF417codeByArea()开发");
|
|
|
- LogE("未完成PrintPDF417codeByArea()开发");
|
|
|
- return Error_NotImpl;
|
|
|
-// if ((pData == NULL) || (dwDataLen == 0))
|
|
|
-// {
|
|
|
-// return Error_Param;
|
|
|
-// }
|
|
|
-//
|
|
|
-// if ((dwDataLen < 1) || (dwDataLen > 255))
|
|
|
-// {
|
|
|
-// return Error_Param;
|
|
|
-// }
|
|
|
-//
|
|
|
-// if ((errorLevel < 0) || (errorLevel > 8))
|
|
|
-// {
|
|
|
-// return Error_Param;
|
|
|
-// }
|
|
|
-//
|
|
|
-// WORD wReturn = Error_Succeed;
|
|
|
-// BYTE byErrLevel = 0;
|
|
|
-// byErrLevel = errorLevel;
|
|
|
-// wReturn = DeviceTask.SendCommand(SETPDF417ERRORLEVeL, &byErrLevel, 1);
|
|
|
-// if (wReturn != Error_Succeed)
|
|
|
-// {
|
|
|
-// return Error_Hardware;
|
|
|
-// }
|
|
|
-// //设置PDF417的尺寸
|
|
|
-// // BYTE bySetInfo[8] = {0};
|
|
|
-// // bySetInfo[0] = 0;
|
|
|
-// // bySetInfo[1] = 0;
|
|
|
-// // bySetInfo[2] = 0;
|
|
|
-// // bySetInfo[3] = 0;
|
|
|
-// // bySetInfo[4] = 0;
|
|
|
-// // bySetInfo[5] = 0;
|
|
|
-// // wReturn = DeviceTask.SendCommand(SETPDF417INFO, bySetInfo, 6);
|
|
|
-// // if (wReturn != Error_Succeed)
|
|
|
-// // {
|
|
|
-// // return Error_Hardware;
|
|
|
-// // }
|
|
|
-//
|
|
|
-// //打印条码
|
|
|
-// BYTE *pPrint = NULL;
|
|
|
-// pPrint = new BYTE[dwDataLen + 3];
|
|
|
-// memset(pPrint, 0, dwDataLen + 3);
|
|
|
-// pPrint[0] = 0x4B; //PDF417
|
|
|
-// pPrint[1] = dwDataLen;
|
|
|
-// memcpy(&pPrint[2], pData, dwDataLen);
|
|
|
-// wReturn = DeviceTask.SendCommand(SETBARCODEPRINT, pPrint, dwDataLen + 2);
|
|
|
-// if (pPrint != NULL)
|
|
|
-// {
|
|
|
-// delete [] pPrint;
|
|
|
-// pPrint = NULL;
|
|
|
-// }
|
|
|
-// if (wReturn != Error_Succeed)
|
|
|
-// {
|
|
|
-// return Error_Hardware;
|
|
|
-// }
|
|
|
-// return Error_NotImpl;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//ErrorCodeEnum ThermalPrint::PrintImage(BYTE *pData, DWORD dwDataLen)
|
|
|
-//{
|
|
|
-// SaveErrorInfo("未完成PrintImage()开发");
|
|
|
-// return Error_NotImpl;
|
|
|
-//}
|
|
|
-//打印图像函数:pData是base64编码的数据
|
|
|
-ErrorCodeEnum ThermalPrint::PrintImage(BYTE *pData, DWORD dwDataLen)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("PrintImage(pData, dwDataLen= %d) Entry.", dwDataLen);
|
|
|
- LogXM(pData, dwDataLen, "Input pData")
|
|
|
-
|
|
|
- if ((pData == NULL) || (dwDataLen == 0))
|
|
|
- {
|
|
|
- SaveErrorInfo("Parameter is invalid!");
|
|
|
- LogE("PrintImage(), Parameter is invalid!, nRet=%d", Error_Param);
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- ThermalState devState;
|
|
|
- GetDevState(devState);
|
|
|
- if (devState.paperState == PAPER_EMPTY)
|
|
|
- {
|
|
|
- SaveErrorInfo("Device is not media!");
|
|
|
- LogE("PrintImage(), Device is not media!, nRet=%d", Error_DevMedia);
|
|
|
- return Error_DevMedia;
|
|
|
- }
|
|
|
- if (bPrintTextFlag != FALSE)
|
|
|
- {
|
|
|
- DeviceTask.SendCommand( FEEDLINEPRINT );
|
|
|
- bPrintTextFlag = FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- LPBYTE pImageFileHead = pData;
|
|
|
- CImageProcessing imagepro;
|
|
|
- //Base64解码
|
|
|
- QByteArray Base64Aarray((char*)pData);
|
|
|
- QByteArray fromBase64Array = QByteArray::fromBase64(Base64Aarray);
|
|
|
- LogXM(fromBase64Array.data(), fromBase64Array.size(), "fromBase64Array pData");
|
|
|
- // fromBase64Array数据格式为:BITMAPFILEHEADER + BITMAPINFOHEADER + 图像实际数据, 相当于BMP文件的16进制内容
|
|
|
- // BITMAPFILEHEADER fileHeader;
|
|
|
- // BITMAPINFOHEADER infoHeader;
|
|
|
-
|
|
|
- QByteArray strImage;
|
|
|
- if (fromBase64Array.size() > 0)
|
|
|
- {
|
|
|
- strImage = fromBase64Array.right(fromBase64Array.size() - sizeof(BITMAPFILEHEADER));
|
|
|
- //转换位图,以下载到设备RAM中(BITMAPINFOHEADER + 图像实际数据)
|
|
|
- DWORD dwLen = imagepro.LoadBmpImage((LPVOID)strImage.data());
|
|
|
-
|
|
|
- ULONG ulDataSize = 0;
|
|
|
- LPBYTE lpbyPrintImg = NULL;
|
|
|
- LPBYTE lpbyImgData = NULL;
|
|
|
- ulDataSize = imagepro.ConvertToBinaryData(lpbyImgData, ulDataSize, FALSE, FALSE);
|
|
|
- if ((ulDataSize == 0) )
|
|
|
- {
|
|
|
- SaveErrorInfo("Get image size failed!");
|
|
|
- imagepro.Destroy();
|
|
|
- LogE("PrintImage(), Get image size failed!");
|
|
|
- return Error_Param;
|
|
|
- }
|
|
|
- lpbyImgData = new BYTE[ulDataSize];
|
|
|
- if (lpbyImgData == NULL)
|
|
|
- {
|
|
|
- SaveErrorInfo("Create image save buffer failed!");
|
|
|
- LogE("PrintImage(), Create image save buffer failed!");
|
|
|
- imagepro.Destroy();
|
|
|
- return Error_Null;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memset(lpbyImgData, 0x00, ulDataSize);
|
|
|
- ulDataSize = imagepro.ConvertToBinaryData(lpbyImgData, ulDataSize, FALSE, FALSE);
|
|
|
- if (ulDataSize == 0)
|
|
|
- {
|
|
|
- delete [] lpbyImgData;
|
|
|
- imagepro.Destroy();
|
|
|
- SaveErrorInfo("Get image data for device failed!");
|
|
|
- LogE("PrintImage(), Get image data for device failed!");
|
|
|
- return Error_Null;
|
|
|
- }
|
|
|
-
|
|
|
- DWORD dwColTmp = 0;
|
|
|
- DWORD dwRowTmp = 0;
|
|
|
- imagepro.GetPixelCount(&dwColTmp, &dwRowTmp);
|
|
|
- int lineCnt = ulDataSize / dwRowTmp;
|
|
|
-
|
|
|
- lpbyPrintImg = new BYTE[ulDataSize + 5];
|
|
|
-
|
|
|
- memset(lpbyPrintImg, 0, ulDataSize + 5);
|
|
|
- lpbyPrintImg[0] = (BYTE)(lineCnt % 256);
|
|
|
- lpbyPrintImg[1] = (BYTE)(lineCnt / 256);;
|
|
|
- lpbyPrintImg[2] = (BYTE)(dwRowTmp % 256);
|
|
|
- lpbyPrintImg[3] = (BYTE)(dwRowTmp / 256);
|
|
|
-
|
|
|
- memcpy(&lpbyPrintImg[4], lpbyImgData, ulDataSize);
|
|
|
- delete [] lpbyImgData;
|
|
|
- }
|
|
|
- DWORD dwRet = Error_Succeed;
|
|
|
- //光栅方式打印位图
|
|
|
- dwRet = DeviceTask.SendCommand(SETRASTERBMPPRINT, lpbyPrintImg, ulDataSize + 4);
|
|
|
- /*if (g_ImageFile == NULL)
|
|
|
- {
|
|
|
- g_ImageFile = new BYTE[ulDataSize+5];
|
|
|
- memset(g_ImageFile, 0x00, ulDataSize+5);
|
|
|
- g_size = ulDataSize+4;
|
|
|
- memcpy(g_ImageFile, lpbyPrintImg, ulDataSize+5);
|
|
|
- }*/
|
|
|
- if (lpbyPrintImg != NULL)
|
|
|
- {
|
|
|
- delete[] lpbyPrintImg;
|
|
|
- lpbyPrintImg = NULL;
|
|
|
- }
|
|
|
- /*if (!WaitUntialActFinish()) //用于等待动作完成
|
|
|
- {
|
|
|
- SaveErrorInfo("Waiting Print action finish failed,some unknown error occurred!");
|
|
|
- imagepro.Destroy();
|
|
|
- return Error_Hardware;
|
|
|
- }*/
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SaveErrorInfo("Decode base64 failed!");
|
|
|
- imagepro.Destroy();
|
|
|
- LogE("Decode base64 failed!");
|
|
|
- return Error_NotImpl;
|
|
|
- }
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-//获取打印失败后错误信息和错误状态
|
|
|
-ErrorCodeEnum ThermalPrint::GetLastErrState(ThermalState &devState, DevErrorInfo &devErrInfo)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("GetLastErrState is called.");
|
|
|
- memset(&devErrInfo, 0, sizeof(DevErrorInfo));
|
|
|
- if (GetDevState(devState) == Error_Succeed)
|
|
|
- {
|
|
|
- memcpy(&devErrInfo, &m_stDevErrorInfo, sizeof(devErrInfo));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- devState.hardwareState = m_euDevStatus;
|
|
|
- devState.paperState = m_euPaperState;
|
|
|
- memcpy(&devErrInfo, &m_stDevErrorInfo, sizeof(devErrInfo));
|
|
|
- }
|
|
|
- return Error_Succeed;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//Private
|
|
|
-void ThermalPrint::SaveErrorInfo(CHAR* errMsg, int errCode)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
|
|
|
- LogM("ErrMsg=%s, errCode=%d.", errMsg, errCode);
|
|
|
-}
|
|
|
-int ThermalPrint::string_format(std::string &str, const std::string fmt, ...)
|
|
|
-{
|
|
|
- char *buf;
|
|
|
- va_list ap;
|
|
|
-
|
|
|
- va_start(ap, fmt);
|
|
|
- int len = vprintf (fmt.c_str(), ap) + 1;
|
|
|
- buf = (char *) malloc (len * sizeof (char));
|
|
|
- if (!buf)
|
|
|
- {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- memset(buf, 0, len);
|
|
|
- int nRet = vsnprintf (buf, len, fmt.c_str(), ap);
|
|
|
- va_end(ap);
|
|
|
-
|
|
|
- str = std::string(buf);
|
|
|
- free(buf);
|
|
|
-
|
|
|
- return nRet;
|
|
|
-}
|
|
|
-BOOL ThermalPrint::WaitUntialActFinish()
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- LogM("WaitUntialActFinish is Entry.");
|
|
|
- BOOL bState = FALSE;
|
|
|
- ThermalState stState;
|
|
|
- DWORD dwTimeStart = GetTickCount();
|
|
|
- BOOL bTimeOutFlag = FALSE;
|
|
|
- BOOL bTimeOutValid = FALSE;
|
|
|
-
|
|
|
- do
|
|
|
- {
|
|
|
- if (!bTimeOutValid)
|
|
|
- {
|
|
|
- if ((GetTickCount() - dwTimeStart) > DEV_CMD_ACTION_RESPONSE_TIMEOUT)
|
|
|
- {
|
|
|
- bTimeOutFlag = TRUE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (Error_Succeed != GetDevState(stState))
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
- BYTE byStatus[4] = {0};
|
|
|
- if (DeviceTask.GetStatus(byStatus))
|
|
|
- {
|
|
|
- if ((byStatus[0] & DATA_BIT2) == DATA_BIT2)
|
|
|
- {
|
|
|
- m_bDevBusy = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- m_bDevBusy = FALSE;
|
|
|
- }
|
|
|
- }
|
|
|
- if (m_bDevBusy)
|
|
|
- {
|
|
|
- bTimeOutValid = TRUE;
|
|
|
- sleep(500);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- bState = TRUE;
|
|
|
- }
|
|
|
- } while ((bState == FALSE) && (bTimeOutFlag == FALSE));
|
|
|
-
|
|
|
- if (bTimeOutFlag) //超时
|
|
|
- {
|
|
|
- LogE("WaitUntialActFinish is time out end.");
|
|
|
- return false;
|
|
|
- }
|
|
|
- LogM("WaitUntialActFinish is normal end.");
|
|
|
- return true;
|
|
|
-}
|