Files
Tools_CPP/devices/Validators/_Validator.cpp
2024-11-01 12:23:13 +05:00

234 lines
6.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//---------------------------------------------------------------------------00
#pragma hdrstop
#include <IniFiles.hpp>
#include "Validator.h"
#include "ud_Module.h"
//---------------------------------------------------------------------------
Validator* validator=NULL;
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
#define POLYNOMIAL 0x08408
unsigned int GetCRC16(unsigned char* bufData, unsigned int sizeData)
{
unsigned int CRC, i;
unsigned char j;
CRC = 0;
for(i=0; i < sizeData; i++)
{
CRC ^= bufData[i];
for(j=0; j < 8; j++)
{
if(CRC & 0x0001) {CRC >>= 1; CRC ^= POLYNOMIAL;}
else CRC >>= 1;
}
}
return CRC;
}
//---------------------------------------------------------------------------
//Äîáàâèòü íóëè ê öèôðå
int addZero(int val,int cnt)
{
for(int i=0;i<cnt;i++)
val=val*10;
return val;
}
//---------------------------------------------------------------------------
Validator::Validator()
{
Pay=0;
cPort=new ComPort();
bNominals=false;
LoadSetup();
}
//---------------------------------------------------------------------------
Validator::~Validator()
{
delete cPort;
}
//---------------------------------------------------------------------------
bool Validator::Start()
{
if(cPort->Open(cPort->port))
{
cPort->BaudRate=cPort->BaudRate;
if(!cPort->Setup()) return false;
if(!Reset()) return false; //Ïåðåçàãðóçèòü âàëèäàòîð
if(!getSerialNumber()) return false; //Ïîëó÷èòü ñåðèéíûé íîìåð
if(!getNominals()) return false; //Ïîëó÷èòü íîìèíàëû ïðîøèòûõ êóïþð
}else return false;
}
//---------------------------------------------------------------------------
//Ñðàâíèòü ïîñëåäíèå 2 áàéòà ñ CRC äàííûõ
bool Validator::CheckOnCRC(unsigned char* lpBuffer,unsigned long nSize)
{
if(nSize<2) return false;
unsigned int CRC=GetCRC16(lpBuffer,nSize-2);
WORD* pCRC=(WORD*)&lpBuffer[nSize-2];
return (CRC==*pCRC);
}
/*---------------------------------------------------------------------------
Ïåðåçàãðóçèòü âàëèäàòîð*/
bool Validator::Reset()
{
DWORD BytesWritten=cPort->Write(ConReset,sizeof(ConReset));
DWORD BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
Sleep(5000);
return CheckOnCRC(ReadAr,BytesRead);
}
//---------------------------------------------------------------------------
bool Validator::getSerialNumber()
{
DWORD BytesWritten=cPort->Write(ConIdent,sizeof(ConIdent));
DWORD BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
if(!CheckOnCRC(ReadAr,BytesRead)) return false;
//Íóæíûé ëè íàì îòâåò
if(BytesRead!=39)
{
saveLog("Íå óäàëîñü ïîëó÷èòü íîìåð ïàðòèè âàëèäàòîðà");
return false;
}
//Âûáèðàåì ¹ ïàðòèè
AnsiString str1((char*)&ReadAr[3],15);
BatchNumber=str1.Trim();
AnsiString str2((char*)&ReadAr[18],12);
SerialNumber=str2.Trim();
Sleep(100);
return true;
}
//---------------------------------------------------------------------------
bool Validator::getNominals()
{
bNominals=false;
Sleep(100); //íà âñÿê
DWORD BytesWritten=cPort->Write(ConGetBT,sizeof(ConGetBT));
DWORD BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
if(!CheckOnCRC(ReadAr,BytesRead)) return bNominals;
Sleep(100); //íà âñÿê
for(unsigned char i=0;i<23;i++)
{
bt[i].val=addZero(ReadAr[3+i*5],ReadAr[3+i*5+4]);
//Êîä ñòðàíû 3 áóêâû
bt[i].country[0]=ReadAr[3+i*5+1];
bt[i].country[1]=ReadAr[3+i*5+2];
bt[i].country[2]=ReadAr[3+i*5+3];
bt[i].val=addZero(ReadAr[3+i*5],ReadAr[3+i*5+4]);
}
bNominals=true;
return bNominals;
}
//---------------------------------------------------------------------------
void Validator::LoadSetup()
{
TIniFile* ini=new TIniFile(ExtractFilePath(ParamStr(0))+"\\Setup.ini");
cPort->port=ini->ReadString("Validator","Port","");
cPort->BaudRate=ini->ReadInteger("Validator","BaudRate",0);
delete ini;
}
//---------------------------------------------------------------------------
void Validator::SaveSetup()
{
TIniFile* ini=new TIniFile(ExtractFilePath(ParamStr(0))+"\\Setup.ini");
ini->WriteString("Validator","Port",cPort->port);
ini->WriteInteger("Validator","BaudRate",cPort->BaudRate);
delete ini;
}
//---------------------------------------------------------------------------
bool Validator::startPay() //Ñòàðòóåì ïîòîê
{
vThread = new ValidatorThread(false);
}
//---------------------------------------------------------------------------
bool Validator::stopPay() //Ñòîïèì ïîòîê
{
vThread->Stop();
}
//---------------------------------------------------------------------------
//Ýòî âûïîëíÿåòñÿ â öèêëå â îòäåëüíîì ïîòîêå
int Validator::getPay()
{
if(!cPort->bOpen){Sleep(1000); return 0;}
int result=0;
DWORD BytesWritten=0;
DWORD BytesRead=0;
BytesWritten=cPort->Write(ConReACK, sizeof(ConReACK)); //Îòâåò âàëèäàòîðó ÷òî âñ¸ íîðìàëüíî
Sleep(10);
BytesWritten=cPort->Write(ConStPoll, sizeof(ConStPoll)); //Ïåðåéòè â ðåæèì ïîëó÷åíèÿ ïëàòåæåé
BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
if(CheckOnCRC(ReadAr,BytesRead))
{
if(ReadAr[3] == 19)
{}else
if(ReadAr[3]==20) //IDLING The state in which Bill-to-Bill is ready accept bills.
{}else
if(ReadAr[3]==21) //******Ïðèíÿëè êóïþðó(Ïðîøëà 1 èç ïðîâåðîê)*****
{}else
if(ReadAr[3]==23)
{}else
if(ReadAr[3]==25) //DISABLED The Bill-to-Bill unit has been disabled by the Controller and also the state in which Bill-to-Bill unit is after initialization.
{
BytesWritten=cPort->Write(ConEnBT , sizeof(ConEnBT));
BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
}else
if(ReadAr[3]==28) //Èçâëå÷åíà êóïþðà
{}else
if(ReadAr[3]==69)
{}else
if(ReadAr[3]==129) //Â êàêóþ êàñåòó ïîïàëà êóïþðà
{
if(ReadAr[4]<23)
{
result=bt[ReadAr[4]].val; //Â êàñåòå ReadAr[5]
saveLog("(Pay)"+IntToStr(result));
}
}
}
Sleep(100);
return result;
}
//---------------------------------------------------------------------------
//Çàâåðøåíèå ðàáîòû ïî ïðè¸ìó ïëàòåæåé
void Validator::endPay()
{
DWORD BytesWritten=cPort->Write(ConDiBT , sizeof(ConDiBT));
DWORD BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
BytesWritten=cPort->Write(ConReACK , sizeof(ConReACK));
BytesWritten=cPort->Write(ConStPoll , sizeof(ConStPoll));
BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
}
//---------------------------------------------------------------------------
int Validator::GetState() //Åñëè 0 òî âñ¸ â ïîðÿäêå
{
//if(! bNominals) getNominals(); //todo íå ïîäõîäèò äëÿ ïðîâåðêè
if(! bNominals) return 1;
return 0;
}
//---------------------------------------------------------------------------
AnsiString Validator::GetStatusDescription(BYTE StatusCode) //Îïèñàíèå ñòàòóñà
{
if (StatusCode == 0x00)
return "OK";
else
if (StatusCode == 1)
return "Íå óäàëîñü ïîëó÷èòü íîìèíàëû êóïþð";
else
return "Error";
}
//---------------------------------------------------------------------------