CAP/cap_control_CB5/LEGO_COMM.cpp
2021-09-01 18:53:06 +02:00

427 lines
17 KiB
C++
Raw Blame History

//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include <mmsystem.h>
// #include <vcl\Clipbrd.hpp>
#include "LEGO_COMM.h"
#include "TPropiedades.h"
#pragma package(smart_init)
#pragma link "LM2000"
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall Unit1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
__fastcall CheckLEGOs::CheckLEGOs(bool CreateSuspended)
: TThread(CreateSuspended)
{
SetAntiPassBack(false);
Lm2000 = new TLm2000(Propiedades->Owner);
Lm2000->OnBuscaTarjeta = Lm2000BuscaTarjeta;
Lm2000->OnVerboseMessage = Lm2000VerboseMessage;
TbSession = new TSession(Propiedades->Owner);
}
//---------------------------------------------------------------------------
void __fastcall CheckLEGOs::SetDB( AnsiString Host, AnsiString Login, AnsiString PWD )
{
// Asignamos los nuevos valores
DB_host = Host;
DB_login = Login;
DB_pwd = PWD;
TbSession->Active = false;
TbSession->SessionName = "AccesosCAP";
TbSession->Active = true;
// Activamos los cambios
TbCards = new TTable(Propiedades->Owner);
TbCards->TableName = DB_host + "\\datos\\Cards.db";
TbCards->SessionName = "AccesosCAP";
TbHistorial = new TTable(Propiedades->Owner);
TbHistorial->TableName = DB_host + "\\datos\\historial.db";
// TbHistorial->BeforeOpen = TbHistorialBeforeOpen;
TbHistorial->SessionName = "AccesosCAP";
TbHistorial->Active = true; // Tabla de eventos del sistema
TbAccesos = new TTable(Propiedades->Owner);
TbAccesos->TableName = DB_host + "\\datos\\accesos.db";
TbAccesos->SessionName = "AccesosCAP";
// TbAccesos->BeforeOpen = TbAccesosBeforeOpen;
TbAccesos->Active = true; // Tabla de eventos del sistema
crdDENTRO = TbAccesos->RecordCount;
TbAccesos->Active = false; // Tabla de eventos del sistema
Propiedades->Ocupacion->Value = crdDENTRO;
}
//---------------------------------------------------------------------------
void __fastcall CheckLEGOs::SetPuerto( AnsiString pCOM )
{
Puerto = pCOM;
}
//---------------------------------------------------------------------------
void __fastcall CheckLEGOs::SetDiasCortesia( int nDias )
{
DiasDeCortesia = nDias;
}
//---------------------------------------------------------------------------
/*
void __fastcall CheckLEGOs::TbHistorialBeforeOpen(TDataSet *DataSet)
{
if ( !FileExists( TbHistorial->TableName ) )
{
// Usamos la propiedad FielDefs para definir
// las columnas que contendr<64> la tabla
TbHistorial -> FieldDefs -> Clear();
TbHistorial -> FieldDefs -> Add("id", ftAutoInc, 0, false );
TbHistorial -> FieldDefs -> Add("idCard", ftInteger, 0, false );
TbHistorial -> FieldDefs -> Add("fechaE", ftDate, 0, false );
TbHistorial -> FieldDefs -> Add("horaE", ftTime, 0, false );
TbHistorial -> FieldDefs -> Add("fechaS", ftDate, 0, false );
TbHistorial -> FieldDefs -> Add("horaS", ftTime, 0, false );
TbHistorial -> IndexDefs-> Clear();
TbHistorial->IndexDefs->Add("Primary", "id", TIndexOptions() << ixPrimary << ixUnique);
TbHistorial->IndexDefs->Add("iAccesos", "idCard;fechaE;horaE", TIndexOptions() << ixCaseInsensitive );
// Creamos la base...
TbHistorial -> CreateTable();
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + " :: Iniciando sistema por primera vez..." );
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + " :: Generaci<63>n de ficheros auxiliares concluido" );
}
}
*/
//---------------------------------------------------------------------------
/*
void __fastcall CheckLEGOs::TbAccesosBeforeOpen(TDataSet *DataSet)
{
if ( !FileExists( TbAccesos->TableName ) )
{
// Usamos la propiedad FielDefs para definir
// las columnas que contendr<64> la tabla
TbAccesos -> FieldDefs -> Clear();
TbAccesos -> FieldDefs -> Add("id", ftAutoInc, 0, false );
TbAccesos -> FieldDefs -> Add("idCard", ftInteger, 0, false );
TbAccesos -> FieldDefs -> Add("fechaE", ftDate, 0, false );
TbAccesos -> FieldDefs -> Add("horaE", ftTime, 0, false );
TbAccesos -> FieldDefs -> Add("puedeSalir", ftBoolean, 0, false );
TbAccesos -> IndexDefs-> Clear();
TbAccesos->IndexDefs->Add("Primary", "id", TIndexOptions() << ixPrimary << ixUnique);
TbAccesos->IndexDefs->Add("iAccesos", "idCard;fechaE;horaE", TIndexOptions() << ixCaseInsensitive );
// Creamos la base...
TbAccesos -> CreateTable();
}
}
*/
//---------------------------------------------------------------------------
void __fastcall CheckLEGOs::SetLegoID(int nLe, int *Le, int nLs, int *Ls)
{
int i;
nLEGOSe = nLe;
if ( IDe ) delete [] IDe;
IDe = new int[nLe];
for ( i=0; i<nLe; i++ )
IDe[i] = Le[i];
nLEGOSs = nLs;
if ( IDs ) delete [] IDs;
IDs = new int[nLs];
for ( i=0; i<nLs; i++ )
IDs[i] = Ls[i];
}
//---------------------------------------------------------------------------
void __fastcall CheckLEGOs::Execute()
{
char rcv[80]; AnsiString CB;
int i,j=0;
/*
// Forzamos el modo de trabajo
POP pop = { 0, 0, 0, 1, 65535, 0,0, 0};
CAB cab2 = { 0, 0, 0, 8, 0, 0, 0, 0 };
Lm2000->ProgramOperationParameters( 1, &pop );
Lm2000->SetCharsOnBand( 1, &cab2 );
*/
Lm2000->CierraPuerto();
Lm2000->AbrePuerto( Puerto.c_str() );
//---- Place thread code here ----
while( !Terminated )
{
//nothing;
for ( i=0; i< nLEGOSe; i++ )
{
Propiedades->StatusBar1->Panels->Items[1]->Text = (j++);
Lm2000->SimpleInterrogation( IDe[i], rcv );
if ( rcv[5] == ':' )
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + Format( " :: E(%03d)-%s", ARRAYOFCONST(( IDe[i], rcv )) ) );
}
if ( Terminated ) break;
/*
if ( Clipboard()->HasFormat(CF_TEXT) )
{
if ( Clipboard()->AsText.SubString(1,7) == "JDsoft:" )
{
CB = Clipboard()->AsText;
// Abrir barrera
if ( CB[8] == 'O' )
ShowMessage("Abrir barrera n<> " + CB.SubString(9,CB.Length()) );
// Cerrar barrera
if ( CB[8] == 'C' )
ShowMessage("Cerrar barrera n<> " + CB.SubString(9,CB.Length()) );
Clipboard()->Clear();
}
}
*/
for ( i=0; i< nLEGOSs; i++ )
{
Propiedades->StatusBar1->Panels->Items[1]->Text = (j++);
Lm2000->SimpleInterrogation( IDs[i], rcv );
if ( rcv[5] == ':' )
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + Format( " :: S(%03d)-%s", ARRAYOFCONST(( IDs[i], rcv )) ) );
}
}
Lm2000->CierraPuerto();
}
//---------------------------------------------------------------------------
bool __fastcall CheckLEGOs::Lm2000VerboseMessage(AnsiString msg)
{
if ( msg[3] != 'n' && msg[9] != ':' )
Propiedades->StatusBar1->Panels->Items[0]->Text = msg;
return true;
}
//---------------------------------------------------------------------------
/*
bool __fastcall CheckLEGOs::EsEntrada( int ID )
{
bool dev = false;
for ( int i=0; i<Propiedades->nLEGOSe; i++ )
{
if ( Propiedades->IDe[i] == ID )
{
dev = true;
break;
}
}
return dev;
}
*/
// El lector EXTERNO ser<65> siempre la SALIDA
#define EsEntrada( X ) (X & 0x0008)
//---------------------------------------------------------------------------
void __fastcall CheckLEGOs::SetAntiPassBack(bool AP)
{
AntiPassBack = AP;
}
//---------------------------------------------------------------------------
bool __fastcall CheckLEGOs::RetiraPermisoSalida(void)
{
TbAccesos->Active = true;
TbAccesos->First();
while( !TbAccesos->Eof )
{
// Si es abonado, denegamos su permiso a salir
if ( (TbAccesos->FieldByName("idCard")->AsInteger & 0x0001)==0 )
{
if ( TbAccesos->FieldByName("PuedeSalir")->AsBoolean )
{
TbAccesos->Edit();
TbAccesos->FieldByName("fechaE")->AsDateTime = TDateTime::CurrentDate();
TbAccesos->FieldByName("horaE")->AsDateTime = TDateTime::CurrentTime();
TbAccesos->FieldByName("PuedeSalir")->AsBoolean = false;
TbAccesos->Post();
}
}
TbAccesos->Next();
}
TbAccesos->Active = false;
}
bool __fastcall CheckLEGOs::Lm2000BuscaTarjeta(int ID, int FGA, int TPA,
int CDA, int *TPR, int *PNR, char *message)
{
bool dev = false;//, horaOK = true;
*TPR = 0;
*PNR = 0;
// Distinguimos entre ENTRAR y SALIR
// 27-mar-2002 Cambiada la funcion es entrada
// if ( EsEntrada( ID ) )
if ( EsEntrada( FGA ) )
{
// E N T R A D A
/*
// Comprueba si esta dentro del horario...
if ( Propiedades->CheckHorario() )
{
sndPlaySound("snd\\fuera_de_hora.wav", SND_ASYNC | SND_FILENAME);
sprintf( message, "-FUERA DE TIEMPOPase por caja" );
dev = false;
} else
*/
{
// Verificamos que el aforo no este lleno
if ( crdDENTRO >= maxDENTRO )
{
sndPlaySound("snd\\parking_lleno.wav", SND_ASYNC | SND_FILENAME);
sprintf( message, "-AFORO COMPLETO-por favor espere" );
dev = false;
} else {
// El aforo NO ESTA LLENO
TbCards->Active = true;
// TbCards->Refresh();
// Buscamos si existe esa tarjeta...
dev = false; TbCards->First();
while( !TbCards->Eof )
{
if ( TbCards->FieldByName("idCard")->AsInteger == CDA )
{ dev = true; break;} else TbCards->Next();
}
if ( dev )
{
TbAccesos->Active = true; // Tabla de tarjetas dentro del complejo
dev = false; TbAccesos->First();
while( !TbAccesos->Eof )
{
if ( TbAccesos->FieldByName("idCard")->AsInteger == CDA )
{ dev = true; break;} else TbAccesos->Next();
}
// Si ya ha entrado y no es un VIP
if ( dev && AntiPassBack && ! TbCards->FieldByName( "vip" ) -> AsBoolean )
{
sndPlaySound("snd\\card_acceso_denegado_antipassback.wav", SND_ASYNC | SND_FILENAME);
sprintf( message, "-YA ESTA DENTRO-" );
dev = false;
} else {
dev = false;
bool acceso = TbCards->FieldByName( "acceso" )->AsBoolean;
// Comprobamos los permisos
if ( acceso &&
TDateTime::CurrentDate() <= (TbCards->FieldByName( "fechaM" )->AsDateTime + DiasDeCortesia)
)
{
TbAccesos->Insert();
TbAccesos->FieldByName("idCard")->AsInteger = CDA;
TbAccesos->FieldByName("fechaE")->AsDateTime = TDateTime::CurrentDate();
TbAccesos->FieldByName("horaE")->AsDateTime = TDateTime::CurrentTime();
TbAccesos->FieldByName("PuedeSalir")->AsBoolean = true;
TbAccesos->Post();
crdDENTRO++;
Propiedades->Ocupacion->Value = crdDENTRO;
dev = true;
sndPlaySound("snd\\card_acceso_permitido_entrada.wav", SND_ASYNC | SND_FILENAME);
} else {
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + Format( " :: V(%03d)-%d-%d-%d Valida Hasta: %s %s", ARRAYOFCONST(( ID, FGA, TPA, CDA, TbCards->FieldByName( "fechaM" )->AsString, acceso ? "CON ACCESO":"SIN ACCESO" )) ) );
sndPlaySound("snd\\card_acceso_denegado_entrada.wav", SND_ASYNC | SND_FILENAME);
}
sprintf( message, TbCards->FieldByName("msg")->AsString.c_str() );
}
TbAccesos->Active = false; // Tabla de tarjetas dentro del complejo
} else {
sprintf( message, "-ACCESO DENEGADO-tarjeta no vale" );
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + Format( " :: V(%03d)-%d-%d-%d", ARRAYOFCONST(( ID, FGA, TPA, CDA )) ) );
sndPlaySound("snd\\card_no_encontrado.wav", SND_ASYNC | SND_FILENAME);
}
TbCards->Active = false;
}
}
} else {
// S A L I D A
TbAccesos->Active = true; // Tabla de tarjetas dentro del complejo
dev = false; TbAccesos->First();
while( !TbAccesos->Eof )
{
if ( TbAccesos->FieldByName("idCard")->AsInteger == CDA )
{ dev = true; break;} else TbAccesos->Next();
}
if ( !dev && !AntiPassBack )
{
TbCards->Active = true;
dev = false; TbCards->First();
while( !TbCards->Eof )
{
if ( TbCards->FieldByName("idCard")->AsInteger == CDA )
{ dev = true; break;} else TbCards->Next();
}
TbCards->Active = false;
if (dev)
{
TbHistorial->Insert();
TbHistorial->FieldByName("idCard")->AsInteger = CDA;
TbHistorial->FieldByName("fechaS")->AsDateTime = TDateTime::CurrentDate();
TbHistorial->FieldByName("horaS")->AsDateTime = TDateTime::CurrentTime();
sprintf( message, "-ACCESO MULTIPLE PERMITIDO- Vuelva pronto" );
sndPlaySound("snd\\card_acceso_permitido_salida.wav", SND_ASYNC | SND_FILENAME);
dev = true;
TbAccesos->Active = false; // Tabla de tarjetas dentro del complejo
return dev;
}
}
if ( dev )
{
if ( TbAccesos->FieldByName("PuedeSalir")->AsBoolean )
{
// Movemos esta ficha al historial...
TbHistorial->Insert();
TbHistorial->FieldByName("idCard")->AsInteger = CDA;
TbHistorial->FieldByName("fechaE")->AsDateTime = TbAccesos->FieldByName("fechaE")->AsDateTime;
TbHistorial->FieldByName("horaE")->AsDateTime = TbAccesos->FieldByName("horaE")->AsDateTime;
TbHistorial->FieldByName("fechaS")->AsDateTime = TDateTime::CurrentDate();
TbHistorial->FieldByName("horaS")->AsDateTime = TDateTime::CurrentTime();
TbAccesos->Delete();
sprintf( message, "-ACCESO PERMITIDO- Vuelva pronto" );
sndPlaySound("snd\\card_acceso_permitido_salida.wav", SND_ASYNC | SND_FILENAME);
crdDENTRO--;
Propiedades->Ocupacion->Value = crdDENTRO;
dev = true;
} else {
sprintf( message, "-ACCESO DENEGADO-Pase por caja" );
sndPlaySound("snd\\card_acceso_denegado_salida_pagar.wav", SND_ASYNC | SND_FILENAME);
dev = false;
}
} else {
sprintf( message, "-ACCESO DENEGADO- NO HA ENTRADO " );
sndPlaySound("snd\\card_acceso_denegado_salida.wav", SND_ASYNC | SND_FILENAME);
Propiedades->mHistorial->Lines->Insert( 0, (Now()).DateTimeString() + Format( " :: V(%03d)-%d-%d-%d", ARRAYOFCONST(( ID, FGA, TPA, CDA )) ) );
dev = false;
}
TbAccesos->Active = false; // Tabla de tarjetas dentro del complejo
}
return dev;
}
//---------------------------------------------------------------------------