первый
This commit is contained in:
192
devices/Printers/ESC_POS/ESC_POS_Printer.cpp
Normal file
192
devices/Printers/ESC_POS/ESC_POS_Printer.cpp
Normal file
@ -0,0 +1,192 @@
|
||||
//Reference: https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=72
|
||||
|
||||
#include "ESC_POS_Printer.h"
|
||||
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
#else
|
||||
#include <iostream>
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
ESC_POS_Printer::ESC_POS_Printer()
|
||||
{
|
||||
m_hPrinter = NULL;
|
||||
m_usb = false;
|
||||
m_Serial = NULL;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
ESC_POS_Printer::~ESC_POS_Printer()
|
||||
{
|
||||
if (m_Serial != NULL)
|
||||
{
|
||||
close();
|
||||
delete m_Serial;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::openSerial(std::string ComNumber)
|
||||
{
|
||||
m_Serial->Open(ComNumber);
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::openUSB(std::wstring printerName)
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
bool result=true;
|
||||
if (!OpenPrinter((LPWSTR)printerName.c_str(), &m_hPrinter, NULL))
|
||||
result = false;
|
||||
m_usb = true;
|
||||
return result;
|
||||
#else
|
||||
std::string str( printerName.begin(), printerName.end() );
|
||||
return openUSB(str);
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::openUSB(std::string printerName)
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
bool result=true;
|
||||
if (!OpenPrinter((LPWSTR)printerName.c_str(), &m_hPrinter, NULL))
|
||||
result = false;
|
||||
m_usb = true;
|
||||
return result;
|
||||
#else
|
||||
m_hPrinter = fopen(printerName.c_str(), "w");
|
||||
if(m_hPrinter)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::Start()
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
DWORD Level = 1;
|
||||
std::wstring docName = L"Print ticket";
|
||||
|
||||
DOC_INFO_1 pDocInfo;
|
||||
pDocInfo.pDocName = (LPWSTR)docName.c_str();
|
||||
pDocInfo.pOutputFile = NULL;
|
||||
pDocInfo.pDatatype = NULL;
|
||||
|
||||
bool result = true;
|
||||
StartDocPrinter(m_hPrinter, Level, (BYTE*)&pDocInfo);
|
||||
if (!StartPagePrinter(m_hPrinter))
|
||||
result = false;
|
||||
return result;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::End()
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
bool result = true;
|
||||
if (!EndPagePrinter(m_hPrinter))
|
||||
result = false;
|
||||
if (!EndDocPrinter(m_hPrinter))
|
||||
result = false;
|
||||
return result;
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::close()
|
||||
{
|
||||
if (m_Serial != NULL)
|
||||
{
|
||||
m_Serial->Close();
|
||||
}
|
||||
if (m_hPrinter != NULL)
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
if (!EndPagePrinter(m_hPrinter))
|
||||
return false;
|
||||
if (!EndDocPrinter(m_hPrinter))
|
||||
return false;
|
||||
ClosePrinter(m_hPrinter);
|
||||
#else
|
||||
if(fclose(m_hPrinter)==0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
//width - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8)
|
||||
//height - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//bitArray - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool ESC_POS_Printer::printImage(int width, int height, unsigned char* bitArray)
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
DWORD Written = 0;
|
||||
int arLen = (width * height) / 8;
|
||||
|
||||
char bCmdPrint[] = { 0x1d, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
int w = width;
|
||||
int h = height;
|
||||
bCmdPrint[4] = (((w / 8) >> 0) & 0xFF); //xL <20> xL and xH specify the horizontal direction data count for one bit image (xL + xH x 256) in bytes
|
||||
bCmdPrint[5] = (((w / 8) >> 8) & 0xFF); //xH
|
||||
bCmdPrint[6] = ((h >> 0) & 0xFF); //yL <20> yL and yH specify the vertical direction data count for one bit image (yL + yH x 256) in dots.
|
||||
bCmdPrint[7] = ((h >> 8) & 0xFF); //yH
|
||||
WritePrinter(m_hPrinter, bCmdPrint, sizeof(bCmdPrint), &Written);
|
||||
WritePrinter(m_hPrinter, bitArray, arLen, &Written);
|
||||
|
||||
return arLen == Written;
|
||||
#else
|
||||
int Written = 0;
|
||||
int arLen = (width * height) / 8;
|
||||
|
||||
char bCmdPrint[] = { 0x1d, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
int w = width;
|
||||
int h = height;
|
||||
bCmdPrint[4] = (((w / 8) >> 0) & 0xFF); //xL <20> xL and xH specify the horizontal direction data count for one bit image (xL + xH x 256) in bytes
|
||||
bCmdPrint[5] = (((w / 8) >> 8) & 0xFF); //xH
|
||||
bCmdPrint[6] = ((h >> 0) & 0xFF); //yL <20> yL and yH specify the vertical direction data count for one bit image (yL + yH x 256) in dots.
|
||||
bCmdPrint[7] = ((h >> 8) & 0xFF); //yH
|
||||
|
||||
Written = fwrite(bCmdPrint, sizeof(char), sizeof(bCmdPrint), m_hPrinter);
|
||||
Written = fwrite(bitArray, sizeof(char), arLen, m_hPrinter);
|
||||
|
||||
return arLen == Written;
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::Feed()
|
||||
{
|
||||
char bCmdFeed[] = { 27, 100, 5 };
|
||||
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
DWORD Written = 0;
|
||||
WritePrinter(m_hPrinter, bCmdFeed, sizeof(bCmdFeed), &Written);
|
||||
return Written == 3;
|
||||
#else
|
||||
int Written = 0;
|
||||
Written = fwrite(bCmdFeed, sizeof(char), sizeof(bCmdFeed), m_hPrinter);
|
||||
fflush(m_hPrinter);
|
||||
return Written == 3;
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
bool ESC_POS_Printer::Cut()
|
||||
{
|
||||
char bCmdCut[] = { 0x1B,0x6D };
|
||||
#if defined(_WIN32) || defined(_WINDOWS) || defined(_BORLAND) || defined(__BORLANDC__)
|
||||
DWORD Written = 0;
|
||||
WritePrinter(m_hPrinter, bCmdCut, sizeof(bCmdCut), &Written);
|
||||
return Written == 2;
|
||||
#else
|
||||
int Written = 0;
|
||||
fwrite(bCmdCut, sizeof(char),sizeof(bCmdCut), m_hPrinter);
|
||||
fflush(m_hPrinter);
|
||||
return Written == 2;
|
||||
#endif
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user