| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025 |
- // ReceiptBase.cpp : Defines the entry point for the DLL application.
- //
- #include "ReceiptBase.h"
- //m_iUsedLeng修改成用纸长度,原为行数。
- ReceiptBase::ReceiptBase()
- {
- m_iLetSpace = 0;
- m_iUsedLeng = 0;
- m_iMinPaper = 400; //400*0.125=50mm
- m_iLineHeight = 30;
- m_iNVHeight = 0;
- m_iLineLeng = 48;
- m_iLastPos = 0;
- m_iLinesPrted = 0;
- m_iMMPerSec = 80;
- }
- ReceiptBase::~ReceiptBase()
- {
- m_cSerial.Close();
- }
- void ReceiptBase::SetLinePara(int iLineLeng, int iLeftSpace, int iSpeed)
- {
- m_iLetSpace = iLeftSpace;
- m_iLineLeng = iLineLeng;
- m_iMMPerSec = iSpeed;
- }
- //凭条打印机 判断端口打开
- bool ReceiptBase::Isopen()
- {
- return m_cSerial.IsOpen();
- }
- int ReceiptBase::Open(const int iVID, const int iPID, const int iFD)
- {
- if(m_cSerial.IsOpen()) return RECEIPT_SUCCESS;
- //sew此处需要修改
- if (m_cSerial.Open("{28d78fad-5a12-11D1-ae5b-0000f803a8c2}", iVID, iPID) == false)
- return -1;
- Init();
- return RECEIPT_SUCCESS;
- }
- // 关闭端口
- int ReceiptBase::Close()
- {
- if(m_cSerial.IsOpen() == false)
- return RECEIPT_SUCCESS;
- m_cSerial.Close();
- return RECEIPT_SUCCESS;
- }
- //通用发送数据接口
- int ReceiptBase::SendData(const unsigned char *sSend,int iDatLen,int iTimeout)
- {
- int iCount = 0;
- int ia;
- for (ia=0; ia<iDatLen; ia++)
- if (sSend[ia] == '\n') iCount++;
- if (iCount > 50 && iCount > iDatLen / 10)
- iCount = 50;
- static INT64 iPrintTime = 0;
- if (iCount)
- {
- m_iLinesPrted += iCount;
- if (m_iLinesPrted > 20) //50行处理一次
- {
- int iTimeWant = m_iLinesPrted * m_iLineHeight * 1000 / (8 * m_iMMPerSec);
- INT64 iCurTime = ::GetSystemTime();
- int iUse = (int)(iCurTime - iPrintTime);
- if (iUse < 0 || iUse > iTimeWant) iUse = iTimeWant;
- int iSleep = iTimeWant - iUse;
- if (iSleep > 0)
- Sleep(iSleep);
- iPrintTime = iCurTime;
- m_iLinesPrted = 0;
- }
- }
- return m_cSerial.Send(sSend, iDatLen, iTimeout);
- }
- //通用接收数据接口
- int ReceiptBase::ReadData(unsigned char *sRead,int iWant,int iTimeout)
- {
- return m_cSerial.Receive((unsigned char *)sRead, iWant, iTimeout);
- }
- //打印机初始化
- int ReceiptBase::Init()
- {
- if(m_cSerial.IsOpen() == false) return RECEIPT_ERR_NO_OPEN;
- unsigned char szSendBuf[20];
- szSendBuf[0] = 0x1b;
- szSendBuf[1] = 0x40;
- int nRet = SendData(szSendBuf, 2, 3000);
- if (nRet < 2)
- return RECEIPT_ERR_RCV_ERR;
- SetRowDistance(0);
- SetLeftDistance(0);
- SetFont(false, false, false, false, false);
- SetAlign(0);
- SetScale(1,1);
- SetInverse(false);
- SetRotate(false);
- SetBlackFlag(false);
- return RECEIPT_SUCCESS;
- }
- //通用发送数据接口
- int ReceiptBase::SendHexStr(const char *sData, int iDataLen)
- {
- if (iDataLen == 0) iDataLen = strlen(sData);
- if (iDataLen > 1000) return RECEIPT_ERR_IN_ERR;
- unsigned char sSend[512];
- int iCount = ::HexStrToANSI(sData, sSend, iDataLen);
- if (iCount <= 0)
- return RECEIPT_ERR_IN_ERR;
- int iRet = SendData(sSend, iCount);
- return iRet;
- }
- //数据输出,打印
- int ReceiptBase::PrintData(const char * sData)
- {
- unsigned char sSend[128];
- if(sData == NULL || strlen((char*)sData) < 1)
- {
- return RECEIPT_ERR_IN_ERR;
- }
- int iLeng = strlen((char*)sData);
- int iPos = 0, iLinePos = 0;
- int iChCount = 0;
- unsigned char chTemp;
- bool bLineMax, bLineEnd, bDataEnd;
- int iLengMax = m_iLineLeng;
- for (iPos = 0 ; iPos < iLeng; )
- {
- bLineMax = FALSE;
- bLineEnd = FALSE;
- bDataEnd = FALSE;
- iChCount = 0; //半个汉字计算
- memset(sSend, ' ', m_iLetSpace);
- if (m_iLastPos)
- iLinePos = m_iLastPos;
- else
- iLinePos = m_iLetSpace;
- while (iLinePos < iLengMax)
- {
- chTemp = (unsigned char)sData[iPos++];
- if (chTemp == '\r' || chTemp == '\n')
- { //一行结束
- bLineEnd = TRUE;
- break;
- }
- //数据不包含换行
- sSend[iLinePos++] = chTemp;
- //计算半个汉字
- if (chTemp >= 128)
- iChCount++;
- else
- iChCount = 0;
- if (iPos >= iLeng)
- { //总数据结束
- bDataEnd = TRUE;
- break;
- }
- }
- if (iLinePos >= iLengMax)
- bLineMax = TRUE;
- //处理半个汉字,最后是半个汉字,前移一字节
- if ((iChCount % 2) == 1 && (bLineMax || bDataEnd))
- {
- iLinePos--;
- iPos--;
- }
- if (bLineMax || bLineEnd)
- {
- sSend[iLinePos] = '\n';
- iLinePos++;
- m_iUsedLeng += m_iLineHeight;
- }
- sSend[iLinePos] = 0;
- int iStart = 0;
- if (m_iLastPos)
- {
- iStart = m_iLastPos;
- m_iLastPos = 0;
- }
- if (SendData(sSend + iStart, iLinePos - iStart, 1000) < iLinePos - iStart)
- return RECEIPT_ERR_RCV_ERR;
- //数据的最后一个字符是汉字的半个字符
- if ((iChCount % 2) == 1 && iPos == (iLeng - 1))
- {
- m_iLastPos = iLinePos;
- return iPos;
- }
- //windows格式\r\n换行处理
- if (chTemp == '\r' && sData[iPos] == '\n')
- iPos++;
- }
- if (bLineMax || bLineEnd)
- m_iLastPos = 0;
- else
- m_iLastPos = iLinePos;
- return iPos;
- }
- //走纸n行
- int ReceiptBase::FeedLines(int iLines)
- {
- for (int ia = 0; ia < iLines; ia++)
- {
- int iRet = SendData((unsigned char*)"\r\n", 2, 500);
- Sleep(40);
- m_iUsedLeng += m_iLineHeight;
- m_iLastPos = 0;
- if (iRet < 1) return RECEIPT_ERR_RCV_ERR;
- }
- return RECEIPT_SUCCESS;
- }
- //走纸n行
- int ReceiptBase::PrintChar(char ch, int iCount)
- {
- for (int ia = 0; ia < iCount; ia++)
- {
- int iRet = SendData((unsigned char*)&ch, 1, 500);
- if (ch == '\n'){
- SendData((unsigned char*)"\r", 1, 500);
- Sleep(40);
- m_iUsedLeng += m_iLineHeight;
- m_iLastPos = 0;
- }
- if (iRet < 1) return RECEIPT_ERR_RCV_ERR;
- }
- return RECEIPT_SUCCESS;
- }
- //走纸n行
- int ReceiptBase::PrintLine(const char* sLine)
- {
- int iRet = PrintData(sLine);
- if (iRet < 0) return iRet;
- return FeedLines(1);
- }
- //横向移动
- int ReceiptBase::MoveX(int iX)
- {
- if(iX < 0 || iX > 255)
- {
- return RECEIPT_ERR_IN_ERR;
- }
- unsigned char sCmd[4]={0x1b, 0x5c, (unsigned char)iX, 0};
- int nRet = SendData(sCmd,4);
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //走纸1点阵
- int ReceiptBase::FeedPaper(short iMode, short iDistance)
- {
- unsigned char cpSend[10]={0};
- int nRet = 0;
- if ( iMode == 0 ) //往前走
- {
- m_iUsedLeng += iDistance;
- cpSend[0] = 0x1B;
- cpSend[1] = 0x4A;
- while (iDistance > 0 ) //line 大于 0 才执行后走纸命令
- {
- if (iDistance > 80)
- {
- cpSend[2] = 80;
- iDistance -= 80;
- }
- else
- {
- cpSend[2] = (char)iDistance;
- iDistance = 0;
- }
- nRet = SendData(cpSend,3,500);
- }
- if (nRet < 0) return nRet;
- SendData((unsigned char*)"\r", 1, 500);
- return RECEIPT_SUCCESS;
- }
- return RECEIPT_ERR_RCV_ERR;
- }
- //0:全切 1:半切
- int ReceiptBase::Cut(int iMode)
- {
- SetFont(0, 0, 0, 0, 0);
- SendData((unsigned char*)"\r", 1, 500); //为保证最后一行数据输出
- if (m_iUsedLeng < m_iMinPaper -160 )
- FeedPaper(0, (m_iMinPaper - m_iUsedLeng - 160) >> 3);
- //机械结构,切刀位置在2cm位置,必须走纸2cm后切纸,否则最后数据被切掉
- FeedPaper(0, 160);
- unsigned char cpSend[20];
- int nRet = 0;
- cpSend[0]=0x1B;
- cpSend[1]=0x4E;
- cpSend[2]=0x03;
- cpSend[3]=iMode;
- SendData(cpSend,4,300);
- cpSend[0]=0x1D;
- cpSend[1]=0x56;
- cpSend[2]=0x42;
- cpSend[3]=0x00;
- Sleep(300);
- nRet = SendData(cpSend,4,300);
- m_iUsedLeng=0;
- m_cSerial.Flush();
- Sleep(300);
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //nAlign 0 - 左对齐 ,1 - 居中, 2 - 右对齐
- int ReceiptBase::SetAlign(short nAlign)
- {
- if(nAlign > 2 || nAlign <0)
- {
- return RECEIPT_ERR_IN_ERR;
- }
- unsigned char szSendBuf[20];
- int nRet = 0;
- memset(szSendBuf,'\0',20);
- szSendBuf[0] = 0x1b;
- szSendBuf[1] = 0x61;
- szSendBuf[2] = (char)nAlign;//0 - 左对齐 ,1 - 居中, 2 - 右对齐
- nRet = SendData(szSendBuf,3);
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //DH 倍高 DW倍宽 DD黑体 UL下划线
- int ReceiptBase::SetFont(bool bDH, bool bDW, bool bDD, bool bUL, bool bCharB)
- {
- unsigned char sCmd[4], chChi = 0, chAsc = 0;
- //英文模式
- sCmd[0]=0x1B;
- sCmd[1]=0x21;
- if (bDH)
- {
- chAsc += 16;
- chChi += 8;
- m_iLineHeight = 54;
- }
- else
- m_iLineHeight = 30;
- if (bUL)
- {
- chAsc += 0x80;
- chChi += 0x80;
- }
- if (bDW)
- {
- chAsc += 32;
- chChi += 4;
- }
- if (bDD)
- {
- chAsc += 8;
- }
- if (bCharB)
- {
- chAsc += 1;
- }
- sCmd[2] = chAsc;
- SendData(sCmd,3,500);
- //汉字倍宽倍高模式
- sCmd[0]=0x1C;
- sCmd[1]=0x21;
- sCmd[2] = chChi;
- SendData(sCmd,3,500);
- // sCmd[0]=0x1b;
- // sCmd[1]=0x2d;
- // sCmd[2]=bUL ? 1 : 0;
- // SendData(sCmd,3,500);
- // sCmd[0]=0x1c;
- // sCmd[1]=0x57;
- // sCmd[2]=(bDW | bDH) ? 1 : 0;
- // SendData(sCmd,3,500);
- return RECEIPT_SUCCESS;
- }
- //设置打印放大倍数(1-6)
- int ReceiptBase::SetScale(int iX, int iY)
- {
- iX--;
- iY--;
- if (iX < 0 || iX > 5) iX = 0;
- if (iY < 0 || iY > 5) iY = 0;
- unsigned char sCmd[4];
- sCmd[0]=0x1D;
- sCmd[1]=0x21;
- sCmd[2] = (iX << 4) + iY;
- int nRet = SendData(sCmd,3,300);
- m_cSerial.Flush();
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //设置黑白反显打印模式
- int ReceiptBase::SetInverse(bool b)
- {
- unsigned char sCmd[4];
- sCmd[0]=0x1D;
- sCmd[1]=0x42;
- sCmd[2] = b;
-
- int nRet = SendData(sCmd,3,300);
- m_cSerial.Flush();
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //选择/取消顺时针旋转90度
- int ReceiptBase::SetRotate(bool b)
- {
- unsigned char sCmd[4];
- sCmd[0]=0x1B;
- sCmd[1]=0x56;
- sCmd[2] = b;
-
- int nRet = SendData(sCmd,3,300);
- m_cSerial.Flush();
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //是否黑标纸
- int ReceiptBase::SetBlackFlag(bool b)
- {
- unsigned char sCmd[4];
- sCmd[0]=0x1B;
- sCmd[1]=0x63;
- sCmd[2]=0x30;
- sCmd[3]=b?153:0;
-
- int nRet = SendData(sCmd,4,300);
- m_cSerial.Flush();
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //设置黑标位置
- int ReceiptBase::SetBlackPos(int iLen)
- {
- int iRet = SetBlackFlag(true);
- if (iRet!=RECEIPT_SUCCESS)
- return iRet;
- unsigned char sCmd[6];
- sCmd[0]=0x1B;
- sCmd[1]=0x63;
- sCmd[2]=0x31;
- if (iLen < 19)
- iLen = 19;
- if (iLen > 65534)
- iLen = 65534;
- sCmd[3] = iLen%256;
- sCmd[4] = iLen/256;
-
- int nRet = SendData(sCmd,5,300);
- m_cSerial.Flush();
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //获取固件版本
- int ReceiptBase::GetFirmware(char* s)
- {
- unsigned char sCmd[128];
- sCmd[0]=0x1D;
- sCmd[1]=0x49;
- sCmd[2]=3;
- int nRet = SendData(sCmd,3,300);
- if (nRet < 0) return nRet;
- //Sleep(10);
- int iLen = ReadData(sCmd, 127, 300);
- if(iLen < 1)
- return RECEIPT_ERR_RCV_ERR;
- sCmd[iLen] = 0;
- strcpy(s, (char*)sCmd);
- return RECEIPT_SUCCESS;
- }
- //打印高速20,中速10,低速 00
- int ReceiptBase::SetPrintSpeed(short nSpeed)
- {
- return RECEIPT_SUCCESS;
- }
- int ReceiptBase::SetRowDistance(int nDis)
- {
- unsigned char cpSend[10]={0};
- int nRet = 0;
- if(nDis == 0)
- {
- cpSend[0]=0x1B;
- cpSend[1]=0x32;
- nRet = SendData(cpSend,2,300);
- m_iLineHeight = 30;
- }
- else
- {
- cpSend[0]=0x1B;
- cpSend[1]=0x33;
- cpSend[2]=(char)nDis&0xFF;
- nRet = SendData(cpSend,3,300);
- m_iLineHeight = nDis;
- }
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //设置左边空白
- int ReceiptBase::SetLeftDistance(int iLeft)
- {
- unsigned char cmd[]={0x1D, 0x4C, 0x00, 0x00};
- cmd[2] = iLeft%256;
- cmd[3] = iLeft/256;
- int nRet = SendData(cmd,4,300);
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- //设置字符间隔,单位为点(0.125mm)
- int ReceiptBase::SetCharSpace(char iLeft, char iRight)
- {
- char iWide = (iLeft + iRight) >> 1;
- unsigned char cmd[]={0x1B, 0x20, iWide};
- int nRet = SendData(cmd,3,300);
- if (nRet < 0) return nRet;
- unsigned char cmd2[]={0x1C, 0x53, (char)iLeft, (char)iRight};
- SendData(cmd2,4,300);
- return RECEIPT_SUCCESS;
- }
- //设置打印区域
- int ReceiptBase::SetPrintArea(int iLeng)
- {
- unsigned char cmd[]={0x1D, 0x57, 0x00, 0x00};
- cmd[2] = iLeng%256;
- cmd[3] = iLeng/256;
- int nRet = SendData(cmd,4,300);
- if (nRet < 0) return nRet;
- return RECEIPT_SUCCESS;
- }
- // ctype 1 EAN13 =2CODE128-A =3 CODE128-B =4 CODE128-C
- // iBytePos 0不打印HRI字符 1条码上方打印 2条码下方打印 3条码上下方打印
- int ReceiptBase::PrinterCode(const char* cdata, UINT ctype,
- UINT iBytePos,UINT BarCodeWidth,UINT BarCodeHeight, bool bCharB)
- {
- if(iBytePos > 3) return RECEIPT_ERR_IN_ERR;
- if(strlen(cdata) > 80) return RECEIPT_ERR_IN_ERR;
- //字符打印位置 0不打印HRI字符 1条码上方打印 2条码下方打印 3条码上下方打印
- char szSendBuf[100];
- szSendBuf[0]=0x1D;
- szSendBuf[1]=0x48;
- szSendBuf[2]=iBytePos;
- int nRet = SendData((unsigned char*)szSendBuf, 3,3000);
- if(nRet < RECEIPT_SUCCESS) return nRet;
- if(BarCodeWidth<2)
- BarCodeWidth = 2;
- if(BarCodeWidth>6)
- BarCodeWidth = 6;
- //设置条形码宽度 2 - 6
- szSendBuf[0]=0x1D;
- szSendBuf[1]=0x77;
- szSendBuf[2]=BarCodeWidth;
- nRet = SendData((unsigned char*)szSendBuf, 3,3000);
- if(nRet < RECEIPT_SUCCESS) return nRet;
- memset(szSendBuf, 0x00, sizeof(szSendBuf));
- //条码高度,点
- szSendBuf[0]=0x1D;
- szSendBuf[1]=0x68;
- szSendBuf[2]=BarCodeHeight;
- m_iUsedLeng += BarCodeHeight;
- nRet = SendData((unsigned char*)szSendBuf, 3,3000);
- if(nRet < RECEIPT_SUCCESS) return nRet;
- memset(szSendBuf, 0x00, sizeof(szSendBuf));
- //条码下面字符的字体
- szSendBuf[0]=0x1D;
- szSendBuf[1]=0x66;
- szSendBuf[2]=bCharB;
- nRet = SendData((unsigned char*)szSendBuf, 3,3000);
- if(nRet < RECEIPT_SUCCESS) return nRet;
- memset(szSendBuf, 0x00, sizeof(szSendBuf));
- unsigned char cmdbuf[256] = {0x1d, 0x6b, };
- int iDatPos = 0;
- if (ctype > 0 && ctype < 9)
- cmdbuf[2] = ctype + 'A';
- else
- return RECEIPT_ERR_IN_ERR;
- int nInLen = strlen(cdata);
- cmdbuf[3] = nInLen;
- iDatPos = 4;
- memcpy(cmdbuf+iDatPos,cdata,nInLen);
- FeedLines(1);
- nRet = SendData(cmdbuf, iDatPos + nInLen + 1, 3000);
- if(nRet < RECEIPT_SUCCESS) return nRet;
- return RECEIPT_SUCCESS;
- }
- ///////////////////////////////////////////////////////////
- int ReceiptBase::Bit24ToBit1(const unsigned char* sInData, int iWidth, int iHigh, unsigned char** psOutData)
- {
- //存储模式为4字节对齐
- int iInXBytes = ((iWidth * 3) + 3) & 0xfffc;
- int iX, iY, iPos, iRGB;
- int iOutXytes = ((iWidth + 31) >> 3) & 0xfffc;
- int iSizeOut = iOutXytes * iHigh;
- unsigned char* sOutData = new unsigned char[iSizeOut];
- memset(sOutData, 0, iSizeOut);
- for(iY = 0; iY < iHigh; iY++)
- {
- for (iX = 0; iX < iWidth; iX++)
- {
- //在真彩图位置和数据
- iPos = (iInXBytes * iY) + iX * 3;
- iRGB = sInData[iPos++] + sInData[iPos++] + sInData[iPos];
- //在单色图位置
- if (iRGB > 100)
- {
- iPos = (iOutXytes * iY) + (iX >> 3);
- sOutData[iPos] |= (1 << (7-(iX % 8)));
- }
- }
- }
- *psOutData = sOutData;
- return iSizeOut;
- }
- int ReceiptBase::Bit1ToPrint(unsigned char* sInData, int iWidth, int iHigh, BOOL bRotate, unsigned char** psOutData)
- {
- //旋转后的位图
- int nBytesOfWidth = ((iWidth+31) >> 3) & 0xfffc; //bmp为标准4字节对齐
- int nBytesOfHeight = (iHigh+7) >> 3; //打印像素竖向排列
- int nBytesOutWidth = (iWidth+7) >> 3; //bmp为标准4字节对齐,输出为1字节对齐
- int iBufSize= nBytesOutWidth * nBytesOfHeight * 8;
- unsigned char *pOutData = new unsigned char[iBufSize];
- *psOutData = pOutData;
- memset(pOutData,0x00,iBufSize);
- //反色,BMP的 1 为白色的底色,与打印机定义相反
- int iTemp = 0;
- for(iTemp = 0; iTemp < nBytesOfWidth * iHigh; iTemp++)
- {
- sInData[iTemp] = 0xff - sInData[iTemp];
- }
- //BMP为横向排列,先从左到右再从下到上,
- if (bRotate)
- {
- //打印机下载数据为纵向排列,先从上到下再从左到右
- for (int iX = 0; iX < iWidth; iX++)
- {
- for (int iY = 0; iY < iHigh; iY++)
- {
- //计算在bmp中的位置
- int iYPos = iHigh - 1 - iY;//Y向倒转后的位置
- int iXPos = iX >> 3; //字节位置,/8
- //位图中字节位置
- iTemp = (nBytesOfWidth * iYPos) + iXPos;
- //字节中的位置
- iXPos = 7 - (iX % 8); //测试结果,高位在左
- bool bIsBlack = (sInData[iTemp] >> iXPos) & 1;
- //打印机单个字节内的顺序为从下到上
- //打印机字节位置
- iTemp = iX * nBytesOfHeight + (iY >> 3);
- //字节中的位置,需要Y向倒置
- iYPos = (7 - (iY % 8));
- pOutData[iTemp] |= (bIsBlack << iYPos);
- }
- }
- }
- else
- {
- int iRight = iWidth % 8;
- unsigned char chRight = 0;
- while (iRight)
- {
- chRight |= (1 << (8 - iRight));
- iRight--;
- }
- //打印机下载数据为从上到下
- for (int iY = 0; iY < iHigh; iY++)
- {
- //计算在bmp中的位置
- int iOldStart = nBytesOfWidth * (iHigh - 1 - iY);
- int iNewStart = nBytesOutWidth * iY;
- memcpy(pOutData + iNewStart, sInData + iOldStart, nBytesOutWidth);
- //此处可能会出现右侧黑边,需要处理最后一个字节像素
- if (chRight) *(pOutData + iNewStart + nBytesOutWidth - 1) &= chRight;
- }
- }
- return iBufSize;
- }
- //位图打印
- int ReceiptBase::GetBmpData(const char *sData, bool bBASE64, unsigned char** psOut, int* iPrintW, int* iPrintH, BOOL bRotate)
- {
- if (sData==NULL)
- return RECEIPT_ERR_IN_ERR;
- unsigned char* sBmpDat=NULL;
- int iBmpLen=0;
- if (bBASE64)
- {
- int iLen = strlen(sData);
- if (iLen < 256)
- return RECEIPT_ERR_IN_ERR;
- sBmpDat = new unsigned char[iLen+1];
- iBmpLen = ::Base64Decode(sData, iLen, sBmpDat, iLen);
- if (iBmpLen < 256) {
- delete sBmpDat;
- return RECEIPT_ERR_IN_ERR;
- }
- }
- else
- {
- char sName[128];
- if (sData==NULL || sData[0]==0)
- strcpy(sName,"logo.bmp");
- else
- strcpy(sName,sData);
- FILE* file = fopen(sName, "rb");
- if (file == NULL)
- return RECEIPT_ERR_IN_ERR;
- fseek(file, 0, SEEK_END);
- iBmpLen=ftell(file);
- fseek(file,0, SEEK_SET);
- if (iBmpLen<192)
- return RECEIPT_ERR_IN_ERR;
- sBmpDat=new unsigned char[iBmpLen+1];
- fread(sBmpDat, 1, iBmpLen,file);
- fclose(file);
- }
- ///////////////////////////////
- BITMAPFILEHEADER bfh;
- BITMAPINFOHEADER bih;
- int iReadPos = 0;
- memcpy(&bfh, sBmpDat, sizeof(bfh));
- iReadPos = sizeof(bfh);
- memcpy(&bih, sBmpDat + iReadPos, sizeof(bih));
- iReadPos = bfh.bfOffBits;
- int iSizeAll = (bih.biWidth * bih.biHeight * bih.biBitCount) >> 3;
- if (iBmpLen < iSizeAll + iReadPos) return RECEIPT_ERR_IN_ERR;
- //获得实际图像尺寸
- *iPrintW = bih.biWidth;
- *iPrintH = bih.biHeight;
- unsigned char* sTemp = NULL;
- if (bih.biBitCount == 24)
- {
- Bit24ToBit1(sBmpDat + iReadPos, bih.biWidth, bih.biHeight, &sTemp);
- iBmpLen = Bit1ToPrint(sTemp, bih.biWidth, bih.biHeight, bRotate, psOut);
- delete sBmpDat;
- return iBmpLen;
- }
- if (bih.biBitCount == 1)
- {
- iBmpLen = Bit1ToPrint(sBmpDat+iReadPos, bih.biWidth, bih.biHeight, bRotate, psOut);
- delete sBmpDat;
- return iBmpLen;
- }
- //////////////////////////////
- return RECEIPT_ERR_IN_ERR;
- }
- //功能:将单色 bmp 图像数据下载到硬件
- int ReceiptBase::DownloadNVBmp(const char *sData, bool bBASE64)
- {
- unsigned char* sBmpDat=NULL;
- int iWidth, iHeight;
- int iRet = GetBmpData(sData, bBASE64, &sBmpDat, &iWidth, &iHeight, TRUE);
- if (iRet < 0) return iRet;
- int iWidthByte = (iWidth+7) >> 3; //bmp4字节对齐,此处不需要,1字节对齐即可
- int iHeightByte = (iHeight+7) >> 3;
- m_iNVHeight = iHeightByte * 8;
- //下载位图
- unsigned char cmd1[8]={0x1C, 0x71, 1, 0, 0, 0, 0};
- cmd1[3] = iWidthByte;
- cmd1[5] = iHeightByte;
- SendData(cmd1, 7);
- // Sleep(10);
- int iMax = iWidthByte * iHeightByte * 8;
- for (int ia=0; ia<iMax; )
- {
- int iOnce = min(iMax - ia, 2000);
- SendData((unsigned char*)sBmpDat + ia, iOnce);
- ia += iOnce;
- Sleep(100);
- }
- // Sleep(50);
- delete sBmpDat;
- return RECEIPT_SUCCESS;
- }
- //打印NV位图
- int ReceiptBase::PrintNVBmp(bool bDH, bool bDW)
- {
- //打印位图
- unsigned char cmd2[]={0x1C,0x70,1,0};
- if (bDH) cmd2[3] += 2;
- if (bDW) cmd2[3] += 1;
- SendData(cmd2, 4);
- m_iUsedLeng += m_iNVHeight;
- return 0;
- }
- //功能:将单色 bmp 图像数据下载到硬件
- int ReceiptBase::PrintMemBmp(const char *sData, bool bBASE64)
- {
- //光栅位图方试
- unsigned char* sBmpDat=NULL;
- int iWidth, iHeight;
- int iRet = GetBmpData(sData, bBASE64, &sBmpDat, &iWidth, &iHeight, FALSE);
- if (iRet < 0) return iRet;
- int iWidthByte = (iWidth + 7) >> 3; //宽度字节数
- int iWidthDown = iWidthByte < 80 ? iWidthByte : 80;
- int iOutHeight = ((4096 / iWidthDown) / 24) * 24; //高度需要是24倍数
- unsigned char sSend[4*1024];
- sSend[0] = 0x1D; //光栅位图打印
- sSend[1] = 0x76;
- sSend[2] = 0x30;
- sSend[3] = 0;
- sSend[4] = iWidthDown; //宽度方向字节数
- sSend[5] = 0;
- sSend[7] = 0;
- int iSendPos;
- for (int iHPos = 0; iHPos < iHeight; iHPos += iOutHeight)
- {
- int iBmpHeight = (iHeight - iHPos < iOutHeight) ? iHeight - iHPos : iOutHeight;
- sSend[6] = iBmpHeight; //高度方向点数
- iSendPos = 8;
- for ( int ia = 0; ia < iBmpHeight; ia++)//宽度循环
- {
- memcpy(sSend + iSendPos, sBmpDat + iWidthByte * (iHPos + ia), iWidthDown);
- iSendPos += iWidthDown;
- }
- SendData(sSend, iSendPos);
- Sleep(100);
- }
- delete sBmpDat;
- m_iUsedLeng += iHeight;
- return RECEIPT_SUCCESS;
- }
- //原有,转换成字符串
- short ReceiptBase::GetBinBuf(short val,char *buf)
- {
- char sBufs[][8]=
- {
- "0000", "0001", "0010", "0011",
- "0100", "0101", "0110", "0111",
- "1000", "1001", "1010", "1011",
- "1100", "1101", "1110", "1111"
- };
- if (val >= 0 && val <= 15)
- {
- memcpy(buf, sBufs[val], 4);
- return 0;
- }
- return 1;
- }
- //原有,变量转化成字串
- short ReceiptBase::ByteToBytes(short value,char *buf)
- {
- char low_byte,high_byte,low_buf[5],high_buf[5];
- short ret1,ret2;
- memset(low_buf,'\0',5);
- memset(high_buf,'\0',5);
- if(value<0 || value>255)
- return 2; //非法值
- low_byte=value%16;
- high_byte=value/16;
- ret1=GetBinBuf(low_byte,low_buf);
- ret2=GetBinBuf(high_byte,high_buf);
- if(ret1!=0 || ret2!=0)
- return 1; //计算错误
- memcpy(buf,high_buf,4);
- memcpy(buf+4,low_buf,4);
- return 0;
- }
- int ReceiptBase::GetStateData(const char* sCmd1, const char* sCmd2, const char* sCmd3, const char* sCmd4)
- {
- if(sCmd2[1] == '1' || sCmd3[4]=='1') //打印机故障
- return RECEIPT_ERR_DEV_ERR;
- if(sCmd2[5] == '1') //打印机头抬起
- return RECEIPT_WARN_HEAD_UP;
- if(sCmd4[7] == '1') //卡纸
- return RECEIPT_WARN_JAMMED;
- if(sCmd4[2] == '1') //缺纸
- return RECEIPT_WARN_NO_MEDIA;
- if(sCmd4[4] == '1') //纸将尽
- return RECEIPT_WARN_PAP_LOW;
- return RECEIPT_SUCCESS;
- }
- int ReceiptBase::GetState()
- {
- char sState[4][16];
- int iRet = ReadStateData(NULL, sState[1], sState[2], sState[3]);
- if (iRet != RECEIPT_SUCCESS) return iRet;
- return GetStateData(NULL, sState[1], sState[2], sState[3]);
- }
- //发送状态查询命令
- int ReceiptBase::ReadStateData(short nNum,char * buf)
- {
- unsigned char szSendBuf[20];
- int ret,back;
- char chRcvbuf[10] = {0};
- short nRcvlen;
- int nRet = 0;
- memset(szSendBuf,'\0',20);
- szSendBuf[0]=0x10;
- szSendBuf[1]=0x04;
- szSendBuf[2]=(char)nNum;
- nRet = SendData(szSendBuf,3,300);
- if(nRet <=0 )
- {
- return RECEIPT_ERR_RCV_ERR;
- }
- //Sleep(10);
- nRcvlen = ReadData((unsigned char*)chRcvbuf, 1, 3000);
- if(nRcvlen < 1)
- {
- return RECEIPT_ERR_RCV_ERR;
- }
- back=chRcvbuf[0];
- ret=ByteToBytes(back,buf);
- if(ret!=0)
- {
- return RECEIPT_ERR_IN_ERR;
- }
- buf[8] = 0;
- return RECEIPT_SUCCESS;
- }
- //取状态
- int ReceiptBase::ReadStateData(char * buf1, char* buf2, char * buf3, char * buf4)
- {
- int nRet = 0;
- if(buf1)
- {
- nRet = ReadStateData(1,buf1);
- if(nRet != RECEIPT_SUCCESS)
- return nRet;
- }
- /////////////////
- if(buf2)
- {
- nRet = ReadStateData(2,buf2);
- if(nRet != RECEIPT_SUCCESS)
- return nRet;
- }
- /////////////////
- if(buf3)
- {
- nRet = ReadStateData(3,buf3);
- if(nRet != RECEIPT_SUCCESS)
- return nRet;
- }
- /////////////////
- if(buf4)
- {
- nRet = ReadStateData(4,buf4);
- return nRet;
- }
- return RECEIPT_SUCCESS;
- }
|