первый

This commit is contained in:
2024-11-01 12:23:13 +05:00
parent 801d9d33fa
commit 0688c46a7e
226 changed files with 162921 additions and 0 deletions

View File

@ -0,0 +1,233 @@
//---------------------------------------------------------------------------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;
}
//---------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!getSerialNumber()) return false; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if(!getNominals()) return false; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
}else return false;
}
//---------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 <20><><EFBFBD><EFBFBD><EFBFBD> <20> CRC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
}
/*---------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
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;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if(BytesRead!=39)
{
saveLog("<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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); //<2F><> <20><><EFBFBD><EFBFBD>
DWORD BytesWritten=cPort->Write(ConGetBT,sizeof(ConGetBT));
DWORD BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
if(!CheckOnCRC(ReadAr,BytesRead)) return bNominals;
Sleep(100); //<2F><> <20><><EFBFBD><EFBFBD>
for(unsigned char i=0;i<23;i++)
{
bt[i].val=addZero(ReadAr[3+i*5],ReadAr[3+i*5+4]);
//<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <20><><EFBFBD><EFBFBD><EFBFBD>
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() //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
{
vThread = new ValidatorThread(false);
}
//---------------------------------------------------------------------------
bool Validator::stopPay() //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
{
vThread->Stop();
}
//---------------------------------------------------------------------------
//<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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)); //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Sleep(10);
BytesWritten=cPort->Write(ConStPoll, sizeof(ConStPoll)); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BytesRead=cPort->Read(ReadAr,sizeof(ReadAr));
if(CheckOnCRC(ReadAr,BytesRead))
{
if(ReadAr[3] == 19)
{}else
if(ReadAr[3]==20) //IDLING <20> The state in which Bill-to-Bill is ready accept bills.
{}else
if(ReadAr[3]==21) //******<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)*****
{}else
if(ReadAr[3]==23)
{}else
if(ReadAr[3]==25) //DISABLED <20> 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) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{}else
if(ReadAr[3]==69)
{}else
if(ReadAr[3]==129) //<2F> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(ReadAr[4]<23)
{
result=bt[ReadAr[4]].val; //<2F> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ReadAr[5]
saveLog("(Pay)"+IntToStr(result));
}
}
}
Sleep(100);
return result;
}
//---------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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() //<2F><><EFBFBD><EFBFBD> 0 <20><> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//if(! bNominals) getNominals(); //todo <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(! bNominals) return 1;
return 0;
}
//---------------------------------------------------------------------------
AnsiString Validator::GetStatusDescription(BYTE StatusCode) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (StatusCode == 0x00)
return "OK";
else
if (StatusCode == 1)
return "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>";
else
return "Error";
}
//---------------------------------------------------------------------------