| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- #include "termalprintimpl.h"
- #include "SUcs.h"
- ThermalPrintClassImpl::ThermalPrintClassImpl()
- {
- m_pPrint = new ReceiptSnbc();
- m_bStartup = false;
- }
- ThermalPrintClassImpl::~ThermalPrintClassImpl()
- {
- delete m_pPrint;
- }
- // 打开打印机
- ErrorCodeEnum ThermalPrintClassImpl::DevOpen(BYTE btPort,DWORD dwBaudRate)
- {
- int iRet = m_pPrint->Open(0x154f, 0x154f);
- if (iRet != 0) return GetErrorInfo(iRet, "DevOpen");
- iRet = m_pPrint->GetState();
- return GetErrorInfo(iRet, "DevOpen");
- }
- 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 == NULL) 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 ThermalPrintClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "GetDevCategory");
- char sSVer[256];
- char szType[] = {"PVER=SNBC#MID=BT-NH80"};
- char szModel[] = "FWID=%s";
- strcpy(devCategory.szType, szType);
- if (m_pPrint->GetFirmware(sSVer) == 0)
- sprintf(devCategory.szModel, szModel, sSVer + 1);
- else
- sprintf(devCategory.szModel, szModel, "00000000");
- strcpy(devCategory.szVendor, "cw");
- char cFilePath[300] = {0};
- GetCurLibsPath(m_sLibPath, cFilePath);
- short v1,v2;
- getFileVer(cFilePath, v1, v2);
- devCategory.version.wMajor = v1;
- devCategory.version.wMinor = v2;
- devCategory.version.wRevision = 0xffff;
- devCategory.version.wBuild = FILE_VERSION;
- char szRet[512] = {0};
- sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)",
- devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState);
- LOG4VTM(INFO, szRet);
- return Error_Succeed;
- }
- ErrorCodeEnum ThermalPrintClassImpl::Reset()
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "Reset");
- m_pPrint->Init();
- int iRet = m_pPrint->GetState();
- return GetErrorInfo(iRet, "Reset");
- }
- ErrorCodeEnum ThermalPrintClassImpl::DevClose()
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "DevClose");
- int iRet = m_pPrint->Close();
- return GetErrorInfo(iRet, "DevClose");
- }
- ErrorCodeEnum ThermalPrintClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
- {
- memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
- return Error_Succeed;
- }
- // 获取打印机实时状态
- ErrorCodeEnum ThermalPrintClassImpl::GetDevState(ThermalState& devState)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "GetDevCategory");
- int iRet = m_pPrint->GetState();
- if (iRet < 0)
- return GetErrorInfo(iRet, "Reset");
- devState.hardwareState = STATE_OK;
- switch(iRet)
- {
- case RECEIPT_SUCCESS:
- devState.paperState = PAPER_FULL;
- break;
- case RECEIPT_WARN_NO_MEDIA:
- devState.paperState = PAPER_EMPTY;
- break;
- case RECEIPT_WARN_PAP_LOW:
- devState.paperState = PAPER_LOW;
- break;
- case RECEIPT_WARN_HEAD_UP:
- devState.hardwareState = STATE_OTHER_ERROR;
- break;
- case RECEIPT_WARN_JAMMED:
- devState.paperState = PAPER_JAMMED;
- break;
- }
- return Error_Succeed;
- }
- //开始打印初始设置:paperWidth一般为80mm和57mm
- ErrorCodeEnum ThermalPrintClassImpl::BeginPrint(ThermalPaperType eType, int paperWidth)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "BeginPrint");
- int iRet = m_pPrint->Init();
- if (iRet != 0)
- return GetErrorInfo(iRet, "BeginPrint");
- m_bStartup = true;
- return Error_Succeed;
- }
- //打印控制指令函数:主要是打印,切纸和控制打印光标指令函数
- //第三个参数是预留参数 暂时无用到
- ErrorCodeEnum ThermalPrintClassImpl::ControlAction(PrintAction eAction, DWORD dwValue1, DWORD dwValue2)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "ControlAction");
- char sAnsi[256];
- sprintf(sAnsi, "ControlAction PrintAction=%d val=%d,%d", eAction, dwValue1, dwValue2);
- LOG4VTM(INFO, sAnsi);
- int iRet = 0;
- switch(eAction)
- {
- case ACTION_PRINT_ONE_LINE:
- iRet = m_pPrint->FeedLines(1);
- break;
- case ACTION_PRINT_MOVEFORWRAD_LINES:
- iRet = m_pPrint->FeedLines(dwValue1);
- break;
- // case ACTION_PRINT_MOVEBACKWRAD_LINES: //回纸n行(单位:字符行)
- // iRet = m_pPrint->FeedLines(-dwValue1);
- // break;
- case ACTION_CUT_ALL:
- iRet = m_pPrint->Cut(0);
- break;
- case ACTION_CUT_HALF:
- iRet = m_pPrint->Cut(1);
- break;
- case ACTION_MOVE_TO_POSITION_RELATIVE: //把打印光标移动相对当前位置一段距离(横向),单位mm
- iRet = m_pPrint->MoveX(dwValue1 * 8);
- break;
- case ACTION_MOVE_TO_FORWRAD_LENGTH:
- iRet = m_pPrint->FeedPaper(0, dwValue1 * 8);
- break;
- // case ACTION_MOVE_TO_BLACKMARK: //移动到黑标位置,把打印位置设置在行首(标记纸有效)
- // iRet = m_pPrint->mo
- // break;
- // case ACTION_PRINT_MOVEBACK_TO_LINE: //设置起始位置在行首,取值(0:打印内容返回行首,1:清空要打印的内容返回行首)
- // iRet = m_pPrint->FeedPaper(0, dwValue1 * 8);
- // break;
- }
- return GetErrorInfo(iRet, "ControlAction");
- }
- //打印参数指令函数:
- //第三个参数是预留参数 暂时无用到
- ErrorCodeEnum ThermalPrintClassImpl::SetParam(CommandType eType, DWORD dwValue1, DWORD dwValue2)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "SetParam");
- char sAnsi[1024];
- sprintf(sAnsi, "SetParam CommandType=%d val=%d,%d", eType, dwValue1, dwValue2);
- LOG4VTM(INFO, sAnsi);
- int iRet = 0;
- switch(eType)
- {
- case COMMON_ROW_SPACE:
- iRet = m_pPrint->SetRowDistance(dwValue1 * 8);
- break;
- case COMMON_ALIGN:
- iRet = m_pPrint->SetAlign(dwValue1);
- break;
- // case COMMON_REVERSE:
- // iRet = m_pPrint->SetInverse(dwValue1);
- // break;
- case COMMON_LEFT_MARGIN:
- iRet = m_pPrint->SetLeftDistance(dwValue1 * 8);
- break;
- case COMMON_PRINTABLE_AREA:
- iRet = m_pPrint->SetPrintArea(dwValue1 * 8);
- break;
- }
- return GetErrorInfo(iRet, "SetParam");
- }
- //打印字体指令函数:主要是字体相关饿指令函数
- //第三个参数是预留参数 设置FONT_CUSTOM_SIZE用到,dwValue1表示宽,dwValue2表示长
- // 设置FONT_LEFT_RIGHT_SPACE用到 dwValue1表示左边距 dwValue2表示右边距
- ErrorCodeEnum ThermalPrintClassImpl::SetFont(FontStyle eType, DWORD dwValue1, DWORD dwValue2)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "SetFont");
- char sAnsi[1024];
- sprintf(sAnsi, "SetFont FontStyle=%d val=%d,%d", eType, dwValue1, dwValue2);
- LOG4VTM(INFO, sAnsi);
- int iRet = 0;
- switch(eType)
- {
- case FONT_UNDERLINE:
- m_FontParam.bUL = dwValue1;
- m_bFontChanged = true;
- break;
- case FONT_BOLD:
- m_FontParam.bold = dwValue1;
- m_bFontChanged = true;
- break;
- case FONT_DOUBLEHEIGHT:
- m_FontParam.bDH = dwValue1;
- m_bFontChanged = true;
- break;
- case FONT_DOUBLEWIDE:
- m_FontParam.bDW = dwValue1;
- m_FontParam.iXScale = dwValue1 ? 2 : 1;
- m_bFontChanged = true;
- break;
- case FONT_INVERSE:
- iRet = m_pPrint->SetInverse(dwValue1);
- break;
- case FONT_CUSTOM_SIZE:
- m_FontParam.iXScale = dwValue1;
- iRet = m_pPrint->SetScale(dwValue1, dwValue2);
- break;
- case FONT_ROTATE:
- iRet = m_pPrint->SetRotate(dwValue1);
- break;
- case FONT_LEFT_RIGHT_SPACE:
- iRet = m_pPrint->SetCharSpace(dwValue1*8 / m_FontParam.iXScale, dwValue2*8 / m_FontParam.iXScale);
- break;
- }
- return GetErrorInfo(iRet, "SetParam");
- }
- //打印文本数据函数
- ErrorCodeEnum ThermalPrintClassImpl::PrintText(BYTE* pData, DWORD dwDataLen)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintText");
- int iRet = 0;
- char sAnsi[64];
- sprintf(sAnsi, "send leng=%d", dwDataLen);
- LOG4VTM(INFO, sAnsi);
- if (m_bFontChanged)
- {
- iRet = m_pPrint->SetFont(m_FontParam.bDH, m_FontParam.bDW, m_FontParam.bold, m_FontParam.bUL, false);
- m_bFontChanged = false;
- if (iRet != 0)
- return GetErrorInfo(iRet, "PrintText");
- }
- int iLen = dwDataLen > 0 ? dwDataLen : strlen((char*)pData);
- char* pGB = new char[iLen+1];
- iLen = SUcs::UTF8ToGB18030((char*)pData, iLen, pGB);
- iRet = m_pPrint->GetState();
- if (iRet < 0)
- GetErrorInfo(iRet, "PrintText");
- iRet = m_pPrint->PrintData(pGB);
- if (iRet < 0)
- return GetErrorInfo(iRet, "PrintText");
- return GetErrorInfo(0, "PrintText");
- }
- //打印条形码函数
- //dwUnitWidth 条形码基本模块宽度 取值{2..6} 默认2
- //dwHeight 条形码高度 单位mm
- //iHRIPosition hri字符打印位置 见枚举类型HriPosition
- ErrorCodeEnum ThermalPrintClassImpl::PrintBarCode(BarCodeType eType, BYTE* pData,
- DWORD dwDataLen, DWORD dwUnitWidth,
- DWORD dwHeight, HriPosition eHRIPosition)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintBarCode");
- return Error_Succeed;
- }
- //打印二维码QRCode函数
- //dwUnitWidth 二维码基本元素宽度 取值{1..255} 默认3
- ErrorCodeEnum ThermalPrintClassImpl::PrintQRCode(BYTE* pData, DWORD dwDataLen, DWORD dwUnitWidth)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintQRCode");
- return Error_Succeed;
- }
- //打印二维码QRCode函数
- //dwWidth 二维码长度 ,单位mm
- ErrorCodeEnum ThermalPrintClassImpl::PrintQRCodeByArea(BYTE* pData, DWORD dwDataLen, DWORD dwUnitWidth, DWORD dwWidth)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintQRCodeByArea");
- return Error_Succeed;
- }
- //打印二维码PDF417函数
- //errorLevel pdf417纠错级别 取值{0..8}
- //dwUnitWidth 基本元素宽度 取值{3..90}
- //dwUnitHeight 基本元素长度 取值{1..30}
- //row pdf417 行数 取值{1..7}
- //lines pdf417 列数 取值{2..25}
- ErrorCodeEnum ThermalPrintClassImpl::PrintPDF417code(BYTE* pData, DWORD dwDataLen, int errorLevel,
- DWORD dwUnitWidth, DWORD dwUnitHeight, int rows, int lines)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintPDF417code");
- return Error_Succeed;
- }
- //打印二维码PDF417函数
- //errorLevel pdf417纠错级别 取值{0..8}
- //dwWidth pdf417宽度 单位mm
- //dwHeight pdf417长度 单位mm
- ErrorCodeEnum ThermalPrintClassImpl::PrintPDF417codeByArea(BYTE* pData, DWORD dwDataLen,
- int errorLevel, DWORD dwWidth, DWORD dwHeight)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintPDF417codeByArea");
- return Error_Succeed;
- }
- //打印图像函数:pData是base64编码的数据
- ErrorCodeEnum ThermalPrintClassImpl::PrintImage(BYTE* pData, DWORD dwDataLen)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "PrintImage");
- int iRet = m_pPrint->PrintMemBmp((char*)pData, true);
- return GetErrorInfo(iRet, "PrintImage");
- }
- //获取打印失败后错误信息和错误状态
- ErrorCodeEnum ThermalPrintClassImpl::GetLastErrState(ThermalState& devState, DevErrorInfo& devErrInfo)
- {
- LOG4VTM_FUNCTION();
- if (!m_pPrint->Isopen())
- return GetErrorInfo(RECEIPT_ERR_NO_OPEN, "GetLastErrState");
- int iRet = m_pPrint->GetState();
- if (iRet < 0)
- return GetErrorInfo(iRet, "Reset");
- devState.hardwareState = STATE_OK;
- switch(iRet)
- {
- case RECEIPT_SUCCESS:
- devState.paperState = PAPER_FULL;
- break;
- case RECEIPT_WARN_NO_MEDIA:
- devState.paperState = PAPER_EMPTY;
- break;
- case RECEIPT_WARN_PAP_LOW:
- devState.paperState = PAPER_LOW;
- break;
- case RECEIPT_WARN_HEAD_UP:
- devState.hardwareState = STATE_OTHER_ERROR;
- break;
- case RECEIPT_WARN_JAMMED:
- devState.paperState = PAPER_JAMMED;
- break;
- }
- memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
- return Error_Succeed;
- }
- /////////////////////////////////////////////////////////////////////////////
- // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
- const static CmbErrorDef PrintErrInfo[] = {
- {RECEIPT_SUCCESS, "命令执行成功", Error_Succeed, DEC_SUCCESS},
- {RECEIPT_ERR_NO_FOND, "设备未找到", Error_Hardware, DEC_DEV_NOT_FOUND},
- {RECEIPT_ERR_NO_OPEN, "设备尚未打开", Error_Param, DEC_DEV_NOT_OPENED},
- {RECEIPT_ERR_RCV_ERR, "数据接收错误", Error_IO, DEC_COMMUNICATION_FAILED},
- {RECEIPT_ERR_IN_ERR, "输入参数错误", Error_Param, DEC_INVALID_PARAMETER},
- {RECEIPT_ERR_DEV_ERR, "设备硬件故障", Error_Hardware, DEC_HARDWARE},
- {RECEIPT_WARN_NO_MEDIA, "缺纸", Error_DevMedia, DEC_HARDWARE},
- {RECEIPT_WARN_HEAD_UP, "机头未闭合", Error_Hardware, DEC_HARDWARE},
- {RECEIPT_WARN_JAMMED, "卡纸", Error_Hardware, DEC_HARDWARE},
- {RECEIPT_WARN_PAP_LOW, "纸少", Error_Succeed, DEC_SUCCESS},
- };
- ErrorCodeEnum ThermalPrintClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
- {
- size_t iLenOne = sizeof(CmbErrorDef);
- size_t iLenAll = sizeof(PrintErrInfo);
- int iCount = iLenAll / iLenOne;
- char sErrInfo[256]="";
- DWORD dSta = 0;
- int iErr = -1;
- for (int ia = 0; ia < iCount; ia++)
- {
- if (PrintErrInfo[ia].iCode == iCode)
- {
- dSta = PrintErrInfo[ia].iInf;
- strcpy(sErrInfo, PrintErrInfo[ia].sInf);
- iErr = PrintErrInfo[ia].iRet;
- break;
- }
- }
- char sErrAll[300];
- va_list arglist;
- va_start(arglist, sErr);
- _vsnprintf(sErrAll, 128, sErr, arglist);
- va_end(arglist);
- if (sErrInfo[0])
- {
- strcat(sErrAll, " ");
- strcat(sErrAll, sErrInfo);
- }
- sErrAll[200] = 0;
- iLenOne = strlen(sErrAll);
- sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
- // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
- m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
- if (iErr != Error_Succeed)
- LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
- else
- LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
- return (ErrorCodeEnum)iErr;
- }
|