Files
Tools_CPP/devices/Printers/CitizenPPU700/CitizenPPU700Class.cpp
2024-11-01 12:23:13 +05:00

786 lines
18 KiB
C++

//---------------------------------------------------------------------------
#pragma hdrstop
#include "CitizenPPU700Class.h"
#include "globals.h"
#include "boost/format.hpp"
#include "DeviceThread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
CCitizenPPU700::CCitizenPPU700(int ComPort,int BaudRate,TLogClass* _Log) : CPrinter(ComPort,_Log, "CitizenPPU700")
{
DataLength = 1;
delete Port;
COMParameters->Parity = NOPARITY;
COMParameters->BaudRate = 19200;
if (BaudRate > 0)
COMParameters->BaudRate = BaudRate;
Port = new TComPort(COMParameters,Log,true);
LoggingErrors = false;
//Init();
//GetState();
//SetCodeTable();
State = 0x00;
OldState = 0x00;
SubState = 0x00;
OldSubState = 0x00;
DeviceName = "CitizenPPU700";
MinLinesCount += 3;
//SetCharacterSize();
}
CCitizenPPU700::~CCitizenPPU700()
{
}
void CCitizenPPU700::SendCommand()
{
DeviceThread = new TDeviceThread(true,false);
Start();
delete DeviceThread;
DeviceThread = NULL;
}
void CCitizenPPU700::PrintString(AnsiString text)
{
PrintLine(text);
SendCommand();
}
void CCitizenPPU700::PrintCheck(TStringList* Text)
{
char subtext[100];
for(int i=0; i<Text->Count; i++)
{
memset(subtext,0,100);
CharToOem(Text->Strings[i].c_str(), subtext);
PrintString(Text->Strings[i]);
//PrintString(AnsiString(subtext));
//PrintBigString(AnsiString(subtext));
}
Cut(true);
}
void CCitizenPPU700::SendPacket(BYTE* command, int bytes_count,int datalen, BYTE* data, bool datafirst)
{
if (!Port->PortInit)
return;
try
{
//çäåñü â áóôåð ïèøåì êîìàíäó äëÿ âûïîëíåíèÿ
ClearCommand();
ClearAnswer();
if (!datafirst)
{
for(int i=0; i<bytes_count; i++)
Command[i] = command[i];
if (datalen != 0)
{
if (data!=NULL)
memcpy(&Command[bytes_count],data,datalen);
}
}
else
{
if (datalen != 0)
{
if (data!=NULL)
memcpy(&Command[0],data,datalen);
}
for(int i=datalen; i<datalen+bytes_count; i++)
Command[i] = command[i-datalen];
}
//CommandParameters->SetParameters(Command,bytes_count+datalen,command[0],0);
CommandSize = bytes_count+datalen;
}
__finally
{
}
}
std::string CCitizenPPU700::GetStateDescription()
{
return GetStatusDescription((BYTE)DeviceState->StateCode);
}
void CCitizenPPU700::PrintLine(AnsiString text)
{
//SelectFont();
/*BYTE command[200];
memset(command,0,200);
int ind = text.Length();
memcpy(text.c_str(),command,text.Length());
command[ind] = 0x0A;
SendType = NotRecieveAnswer;
SendPacket(command,text.Length()+1,0,NULL);
SendCommand();*/
BYTE command[2];
command[0] = 0x0A;
command[1] = 0x0D;
int datalen = text.Length();
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,text.c_str(),true);
}
void CCitizenPPU700::PrintBigString(AnsiString text)
{
ClearCommand();
ClearAnswer();
Command[0] = 0x1B;
Command[1] = 0x21;
Command[2] = 0x10;
memcpy(&Command[3],text.c_str(),text.Length());
CommandSize = 3 + text.Length();
Command[CommandSize] = 0x0A;
Command[CommandSize+1] = 0x0D;
CommandSize += 2;
SendType = NotRecieveAnswer;
SendCommand();
}
void CCitizenPPU700::SetBarCodeHeight(BYTE n) //ñòàâèò âûñîòó, 255 - ìàêñèìóì
{
n = n ? n : 0xFF;
BYTE command[2];
command[0] = 0x1D;
command[1] = 0x68;
int datalen = 1;
BYTE data[1];
data[0] = n;
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::SetBarCodeWidth(BYTE n) //çàäàåò øèðèíó ìèíèìàëüíî ïîëîñêè
{
n = ((n >= 2) && (n <= 6)) ? n : 2;
BYTE command[2];
command[0] = 0x1D;
command[1] = 0x77;
int datalen = 1;
BYTE data[1];
data[0] = n; //2..6 - øèðèíà â ó.å.
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::SetBarCodeFont(BYTE n) //çàäàåò ôîíò, 3 òèïà: À, B èëè C
{
n = ((n <= 2) || ((n >=48 ) && (n <= 50))) ? n : 2;
BYTE command[2];
command[0] = 0x1D;
command[1] = 0x66;
int datalen = 1;
BYTE data[1];
data[0] = n; //== 0-2 èëè 48-50
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::SetBarCodeHRIposition(BYTE n) //ïå÷àòü öèôèðåê áàðêîäà
{
n = ((n <= 3) || ((n >= 48) && (n <= 51))) ? n : 1;
BYTE command[2];
command[0] = 0x1D;
command[1] = 0x48;
int datalen = 1;
BYTE data[1];
data[0] = n; //== 0..3 èëè 48..51: íå ïå÷àòàòü/íàä/ïîä/ïîä è íàä
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::PrintBarCode(std::string text)
{
try
{
const int text_size = 25;
const int command_size = 3 + 1 + text_size;
BYTE command[command_size];
memset(command, 0, command_size);
command[0] = 0x1D;
command[1] = 0x6B;
command[2] = 73;
command[3] = text_size;
text = "{B" + text;
memcpy(&command[4], fill(text, " ", text_size, SIDE::LEFT).c_str(), text_size);
SendType = NotRecieveAnswer;
SendPacket(command,command_size,0,NULL);
SendCommand();
}
catch(...)
{
ExceptionFilter(__FILE__, BOOST_CURRENT_FUNCTION, __LINE__, Log);
}
}
void CCitizenPPU700::Feed(int count)
{
/*BYTE command[2];
command[0] = 0x0D;
command[1] = 0x0A;
SendType = NotRecieveAnswer;
SendPacket(command,1,0,NULL,true);
SendCommand();*/
for(int i=1; i<=count; i++)
{
BYTE command[2];
command[0] = 0x0A;
command[1] = 0x0D;
SendType = NotRecieveAnswer;
SendPacket(command,2,0,NULL);
SendCommand();
}
}
// áèò 0 - óäâîåííûé ðàçìåð ïî îáåèì îñÿì
// áèò 1 - ðåçåðâ
// áèò 2 - ðåçåðâ
// áèò 3 - ïîâûøåííàÿ èíòåíñèâíîñòü
// áèò 4 - ðàñòÿæåíèå ïî Õ
// áèò 5 - ðïñòÿæåíèå ïî Ó
// áèò 6 - èíâåðñèÿ ïå÷àòè
// áèò 7 - ïîä÷¸ðêèâàíèå
void CCitizenPPU700::ShriftOptionsEx(BYTE option)//true - çàâîäñêîé øðèôò false - ïîëüçîâàòåëüñêèé
{
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x21;
int datalen = 1;
BYTE data[1];
data[0] = option;
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::SetUnderline(bool option)
{
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x2D;
int datalen = 1;
BYTE data[1];
if (option)
data[0] = 1;
else
data[0] = 0;
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::SetBold(bool option)
{
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x45;
int datalen = 1;
BYTE data[1];
if (option)
data[0] = 1;
else
data[0] = 0;
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::SetDoublePrint(bool option)
{
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x47;
int datalen = 1;
BYTE data[1];
if (option)
data[0] = 1;
else
data[0] = 0;
SendType = NotRecieveAnswer;
SendPacket(command,2,datalen,data);
SendCommand();
}
void CCitizenPPU700::Init()
{
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x40;
SendType = NotRecieveAnswer;
SendPacket(command,2,0,NULL);
SendCommand();
}
void CCitizenPPU700::Cut(bool option)//true - ïîëíûé îòðåç false - íåïîëíûé îòðåç ÷åêà
{
UNREFERENCED_PARAMETER(option);
BYTE command[2];
command[0] = 0x1B;
//command[1] = 0x69;
command[1] = 0x6D;
/*if (option)
command[1] = 0x69;
else
command[1] = 0x6D;*/
SendType = NotRecieveAnswer;
SendPacket(command,2,0,NULL);
SendCommand();
}
bool CCitizenPPU700::IsPaperInPresenter()
{
BYTE command[3];
BYTE Code = 0;
command[0] = 0x1D;
command[1] = 0x72;
command[2] = 0x01;
SendType = RecieveAnswer;
SendPacket(command,3,0,NULL);
SendCommand();
if (DeviceState == NULL)
return false;
if (DeviceState->AnswerSize > 0)
Code = Answer[0];
if (LoggingErrors)
Log->Write((boost::format("IsPaperInPresenter() Code=%1%") % Code).str().c_str());
Code &= 0x08;
if (Code > 0)
return true;
else
return false;
}
void CCitizenPPU700::GetState()
{
Init();
State = 0xFF;
SubState = 0x0;
StateDescr = "";
SubStateDescr = "";
Error = 0;
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x76;
SendType = RecieveAnswer;
SendPacket(command,2,0,NULL);
SendCommand();
if (DeviceState == NULL)
return;
if (DeviceState->AnswerSize > 0)
State = Answer[0];
Log->Write((boost::format("Printer State=%1%") % GetStatusDescription((BYTE)State).c_str()).str().c_str());
DeviceState->StateCode = State;
DeviceState->StateDescription = GetStatusDescription((BYTE)State);
DeviceState->SubStateCode = 0x00;
DeviceState->SubStateDescription = "";
//=====================new 27-04-2007===========================================
std::string result = "";
switch(DeviceState->DSR_CTS)
{
case DsrCtsOff:
{
result = "DSR Off, CTS Off";
Log->Write(result.c_str());
Error = 1;
PrinterEnable = false;
DeviceState->OutStateCode = DSE_HARDWARE_ERROR;
if (DeviceState->OldOutStateCode != DeviceState->OutStateCode)
{
//DeviceState->OldOutStateCode = DeviceState->OutStateCode;
//DeviceState->OldStateCode = DeviceState->StateCode;
DeviceState->StateDescription = "Âûêëþ÷åíà ñèãíàëüíàÿ ëèíèÿ";
DeviceState->StateChange = true;
//if (ChangeEvent)
//StateChanged(DeviceState);
ChangeDeviceState();
}
return;
}
// break;
case DsrCtsOn:
result = "DSR On, CTS On";
Log->Write(result.c_str());
break;
case DsrOn:
result = "Only DSR On, CTS Off";
Log->Write(result.c_str());
break;
case CtsOn:
{
result = "Only CTS On, DSR Off";
Log->Write(result.c_str());
Error = 1;
PrinterEnable = false;
DeviceState->OutStateCode = DSE_HARDWARE_ERROR;
if (DeviceState->OldOutStateCode != DeviceState->OutStateCode)
{
//DeviceState->OldOutStateCode = DeviceState->OutStateCode;
DeviceState->StateDescription = "Âûêëþ÷åíà ñèãíàëüíàÿ ëèíèÿ";
DeviceState->StateDescription = result;
DeviceState->StateChange = true;
//if (ChangeEvent)
//StateChanged(DeviceState);
ChangeDeviceState();
}
return;
}
// break;
}
if (Error == 1) return;
result = "OK";
Error = 0;
PrinterEnable = true;
DeviceState->OutStateCode = DSE_OK;
ChangeDeviceState();
DeviceState->StateDescription = result;
//if (OldState != StatusCode)
/*if (DeviceState->OldOutStateCode != DeviceState->OutStateCode)
{
DeviceState->OldOutStateCode = DeviceState->OutStateCode;
OldState = DeviceState->StateCode;
DeviceState->StateCode = StatusCode;
DeviceState->StateDescription = result;
DeviceState->StateChange = true;
if (ChangeEvent)
StateChanged(DeviceState);
return StateDescr = result;
}*/
//==============================================================================
/*if (State == 0x00)
{
if (Error == 1)
{
Error = 0;
DeviceState->StateChange = true;
if (ChangeEvent)
StateChanged(DeviceState);
}
}*/
}
std::string CCitizenPPU700::GetStatusDescription(BYTE StatusCode)
{
std::string result = "";
if (StatusCode == 0x00)
{
result += "OK";
PrinterEnable = true;
DeviceState->OutStateCode = DSE_OK;
DeviceState->StateDescription = result;
return StateDescr = result;
}
if (StatusCode == 0xFF)
{
result += "Ïðèíòåð íåäîñòóïåí!";
Error = 1;
PrinterEnable = false;
if (OldState != StatusCode)
{
OldState = DeviceState->StateCode;
DeviceState->StateCode = StatusCode;
DeviceState->StateDescription = result;
DeviceState->OutStateCode = DSE_NOTMOUNT;
DeviceState->StateChange = true;
//if (ChangeEvent)
//StateChanged(DeviceState);
ChangeDeviceState();
}
return StateDescr = result;
}
BYTE code = (BYTE)StatusCode & (BYTE)0x04;
if (code > 0)
{
result += "Áóìàãà êîí÷èëàñü ";
Error = 1;
PrinterEnable = false;
if (OldState != StatusCode)
{
OldState = DeviceState->StateCode;
DeviceState->StateCode = StatusCode;
DeviceState->OutStateCode = DSE_NOTPAPER;
DeviceState->StateDescription = result;
DeviceState->StateChange = true;
//if (ChangeEvent)
//StateChanged(DeviceState);
ChangeDeviceState();
}
return StateDescr = result;
}
code = (BYTE)StatusCode & (BYTE)0x01;
if (code > 0)
{
result += "Áóìàãà ñêîðî êîí÷èòñÿ ";
Error = 1;
PrinterEnable = true;
if (OldState != StatusCode)
{
OldState = DeviceState->StateCode;
DeviceState->StateCode = StatusCode;
DeviceState->OutStateCode = DSE_NEARENDPAPER;
DeviceState->StateDescription = result;
DeviceState->StateChange = true;
//if (ChangeEvent)
//StateChanged(DeviceState);
ChangeDeviceState();
}
return StateDescr = result;
}
return StateDescr = result;
}
void CCitizenPPU700::SelectFont()
{
BYTE command[3];
command[0] = 0x1B;
command[1] = 0x4D;
command[2] = 0;
SendType = NotRecieveAnswer;
SendPacket(command,3,0,NULL);
SendCommand();
}
void CCitizenPPU700::PrintCheck(AnsiString text, std::string barcode)
{
GetState();
Push();
SelectFont();
if (DeviceState->StateCode == 0xff)
return;
SetCodeTable();
//SetCharacterSize();
//Log->Write("Text to printer: "+ text);
TStringList* strings = new TStringList();
AnsiString delim = "\r\n";
LinesCount = 0;
while(true)
{
int pos = text.Pos(delim);
if (pos == 0)
break;
text = text.Delete(pos,2);
text = text.Insert("|",pos);
}
delim = "|";
char _subtext[1024];
while(true)
{
int pos = text.Pos(delim);
if (pos == 0)
{
AnsiString subtext = text;
memset(_subtext,0,1024);
CharToOem(subtext.c_str(), _subtext);
PrintString(AnsiString(_subtext));
LinesCount++;
break;
}
AnsiString subtext = text.SubString(0,pos-1);
text = text.SubString(pos+1,text.Length()-pos);
//if (!subtext.IsEmpty())
//{
memset(_subtext,0,1024);
CharToOem(subtext.c_str(), _subtext);
//PrintBigString(AnsiString(_subtext));
LinesCount++;
PrintString(AnsiString(_subtext));
//}
}
if(!barcode.empty())
{
SetBarCodeHeight(0xA0); //âûñîòà áàðêîäà, 0 .. 255 - â ó.å.
SetBarCodeHRIposition(1); //ìåñòî ïå÷àòè öèôèðåê áàðêîäà, 0..3 èëè 48..51: íå ïå÷àòàòü/íàä/ïîä/ïîä è íàä
SetBarCodeFont(1); //ôîíò, 0 .. 2 èëè 48 .. 50: 3 òèïà: À, B èëè C, À->C: ìåíüøå è óæå
SetBarCodeWidth(2); //øèðèíó ìèíèìàëüíî ïîëîñêè, 2..6 - â ó.å.
PrintBarCode(barcode);
Feed(2);
}
//for(int i=0; i<7; i++)
//Feed();
//==========new 06-06-2007 ================
_MinLinesCount = 3;
//=========================================
FeedToMinLinesCount();
Cut(true);
//PrintCheck(strings);
switch (PushActionType)
{
case Nothing:
PushEx2();
break;
case Pull:
Push();
break;
case PullAndPush:
PushEx();
break;
default:
//Push();
break;
}
delete strings;
}
void CCitizenPPU700::SetCodeTable()
{
BYTE command[3];
command[0] = 0x1B;
command[1] = 0x74;
command[2] = 0x07;
SendType = NotRecieveAnswer;
SendPacket(command,3,0,NULL);
SendCommand();
}
void CCitizenPPU700::SetCharacterSize()
{
BYTE command[3];
command[0] = 0x1D;
command[1] = 0x21;
command[2] = 0x77;
SendType = NotRecieveAnswer;
SendPacket(command,3,0,NULL);
SendCommand();
}
bool CCitizenPPU700::IsPrinterEnable()
{
GetState();
return PrinterEnable;
}
void CCitizenPPU700::Push()
{
if (IsPaperInPresenter() == false)
return;
BYTE command[3];
command[0] = 0x1D;
command[1] = 0x52;
command[2] = 0x30;
SendType = NotRecieveAnswer;
SendPacket(command,3,0,NULL);
SendCommand();
}
void CCitizenPPU700::PushEx()
{
if (IsPaperInPresenter() == false)
return;
BYTE command[4];
command[0] = 0x1D;
command[1] = 0x52;
command[2] = 0x31;
command[3] = 30;
SendType = NotRecieveAnswer;
SendPacket(command,4,0,NULL);
SendCommand();
}
void CCitizenPPU700::PushEx2()
{
//if (IsPaperInPresenter() == false)
//return;
BYTE command[4];
command[0] = 0x1D;
command[1] = 0x52;
command[2] = 0x31;
command[3] = 0xFF;
SendType = NotRecieveAnswer;
SendPacket(command,4,0,NULL);
SendCommand();
}
bool CCitizenPPU700::IsItYou()
{
BYTE command[2];
command[0] = 0x1B;
command[1] = 0x76;
SendType = RecieveAnswer;
SendPacket(command,2,0,NULL);
SendCommand();
if (DeviceState == NULL)
return false;
if (DeviceState->AnswerSize == 0)
return false;
return true;
}
int CCitizenPPU700::Initialize()
{
try
{
Init();
GetState();
SetCodeTable();
SetInitialized();
}
catch(...)
{
ExceptionFilter(__FILE__, BOOST_CURRENT_FUNCTION, __LINE__, Log);
}
}
void CCitizenPPU700::Settings()
{
/*BYTE command[];
command[0] = 0x1D;
command[1] = 0x28;
command[2] = 0x45;
command[3] = 0x;
command[4] = 0x;
command[5] = 0x03;
//bit 1
command[] = 0x04;
command[] = 48;
//bit 2
command[] = 0x04;
command[] = 48;
//bit 3
command[] = 0x04;
command[] = 48;
//bit 4
command[] = 0x04;
command[] = 49;
//bit 5
command[] = 0x04;
command[] = 48;
//bit 6
command[] = 0x04;
command[] = 48;
//bit 7
command[] = 0x04;
command[] = 48;
//bit 8
command[] = 0x04;
command[] = 48;
SendType = RecieveAnswer;
SendPacket(command,2,0,NULL);
SendCommand();*/
}