CtrlMstr/CtrlElemento.cpp
2021-09-12 22:02:01 +02:00

446 lines
16 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "CtrlPPal.h"
#include "CtrlSocket.h"
#include "CtrlElemento.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define Blinking 600
//###########################################################################
//###########################################################################
//###########################################################################
//---------------------------------------------------------------------------
__fastcall TElemento::TElemento(TComponent* Owner)
: TImage(Owner)
{
NumElemento = 0;
myIP="0.0.0.0";
SurfaceIs = sfNone;
BlinkCode = IP_OFF; // Intentando conectar con el TERMINAL
StatusCode= ERROR; // ERROR, aun no hemos conseguido conectar...
Blink = new TTimer(this); // Establecemos el timer, que mostrará las advertencias
Blink->OnTimer = OnBlink; // visuales de estado del componente.
Blink->Interval = Blinking; // Inicialmente activo, con la advertencia IP_QUERY
Blink->Enabled = true;
Revisor = new TTimer(this); // Este timer, se encargará de comunicar el estado OFF
Revisor->OnTimer = OnRevisor; // al TERMINAL-DOG, cuando proceda. ( Finalizado su tiempo ).
Revisor->Interval = 0;
Revisor->Enabled = false;
PideMasTiempo = false;
}
//---------------------------------------------------------------------------
__fastcall TElemento::~TElemento()
{
delete Blink;
delete Revisor;
}
//---------------------------------------------------------------------------
void __fastcall TElemento::SetElemento( int Elemento, AnsiString IP, AnsiString Name )
{
if ( ! IP.IsEmpty() && IP.Length() >= 7 )
myIP = IP;
NumElemento = Elemento;
myName = Name;
if ( !CtrlPPal->ServerHook )
RefreshElement();
}
//---------------------------------------------------------------------------
void __fastcall TElemento::RefreshElement(void)
{
BlinkCode = IP_QUERY;
StatusCode = ERROR;
// Blink->Enabled = true;
Blink->Interval = Blinking;
//////// Vemos si el terminal esta activo ///////////////////////////////////
ThreadSocket *MySocket;
MySocket = (ThreadSocket *)CtrlPPal->GetThread();
MySocket->SetSocket( myIP, 5432 );
MySocket->OWNER_Element = this;
MySocket->CtrlCOP = QueryTIME;
MySocket->CtrlTiempo = TDateTime::CurrentTime();
MySocket->Resume();
//////// ///////////////////////////////////
}
//---------------------------------------------------------------------------
void __fastcall TElemento::HistoricoTermON( TDateTime CtrlTiempo )
{
bool UsaBono = (Precio == -1);
if ( UsaBono ) Precio = 0;
if ( PideMasTiempo )
{
ImporteAcumulado += Precio;
if ( CtrlTiempo > TiempoPedido ) CtrlTiempo = TiempoPedido;
} else {
ImporteAcumulado = Precio;
}
// Insertamos en el historial de usos, la activación del terminal...
CtrlPPal->TbHistorial -> InsertRecord( ARRAYOFCONST(( NumElemento,
(Variant)TiempoComienzo,
(Variant)CtrlTiempo, idc, idtc, Precio )) );
CtrlPPal->TbHistorial -> FlushBuffers();
// Descontamos al cliente su tiempo del bono...
if ( UsaBono )
{
TBookmark SavePlace;
// get a bookmark so that we can return to the same record
SavePlace = CtrlPPal->TbPersonas->GetBookmark();
if ( CtrlPPal->TbPersonas->Locate( "CodCliente1", idc, TLocateOptions() << loCaseInsensitive) )
{
unsigned short Hour, Min, Sec, MSec;
CtrlTiempo.DecodeTime( &Hour, &Min, &Sec, &MSec );
NCliente = CtrlPPal->TbPersonas->FieldByName("Nombre")->AsString + " " + CtrlPPal->TbPersonas->FieldByName("Apellidos")->AsString;
CtrlPPal->TbPersonas->Edit();
if ( CtrlPPal->TbPersonas->FieldByName("TiempoM")->AsInteger < Min )
{
CtrlPPal->TbPersonas->FieldByName("TiempoH")->AsInteger = CtrlPPal->TbPersonas->FieldByName("TiempoH")->AsInteger - Hour -1;
CtrlPPal->TbPersonas->FieldByName("TiempoM")->AsInteger = (CtrlPPal->TbPersonas->FieldByName("TiempoM")->AsInteger +60 - Min);
} else {
CtrlPPal->TbPersonas->FieldByName("TiempoH")->AsInteger = CtrlPPal->TbPersonas->FieldByName("TiempoH")->AsInteger - Hour;
CtrlPPal->TbPersonas->FieldByName("TiempoM")->AsInteger = CtrlPPal->TbPersonas->FieldByName("TiempoM")->AsInteger - Min;
}
CtrlPPal->TbPersonas->FieldByName("FModif")->AsDateTime = TDateTime::CurrentDateTime();
CtrlPPal->TbPersonas->Post();
CtrlPPal->TbPersonas->FlushBuffers();
} else {
NCliente = "## No ENCONTRADO ##";
}
// Move back to the bookmark
CtrlPPal->TbPersonas->GotoBookmark(SavePlace);
CtrlPPal->TbPersonas->FreeBookmark(SavePlace);
}
}
//---------------------------------------------------------------------------
void __fastcall TElemento::SetActiveTime( TDateTime Tiempo, int L_idc, int L_idtc, Currency L_Precio )
{
idc = L_idc; idtc = L_idtc; Precio = L_Precio;
TDateTime Queda = TiempoRestante();
BlinkCode = IP_QUERY;
StatusCode = ERROR;
// Blink->Enabled = true;
Blink->Interval = Blinking;
if ( Revisor->Enabled )
{
PideMasTiempo = true;
Revisor->Enabled = false;
TiempoComienzo = TDateTime::CurrentDateTime() + Queda;
} else {
PideMasTiempo = false;
TiempoComienzo = TDateTime::CurrentDateTime();
}
TiempoPedido = Tiempo;
ThreadSocket *MySocket;
MySocket = (ThreadSocket *)CtrlPPal->GetThread();
MySocket->SetSocket( myIP, 5432 );
MySocket->CtrlCOP = SettingSTATUS;
MySocket->OWNER_Element = this;
if ( PideMasTiempo )
MySocket->CtrlTiempo = TiempoPedido + Queda;
else
MySocket->CtrlTiempo = TiempoPedido;
MySocket->CtrlState = true;
MySocket->Resume();
unsigned short hour, min, sec, msec;
if ( PideMasTiempo ) Tiempo = Tiempo + Queda;
Tiempo.DecodeTime( &hour, &min, &sec, &msec );
Revisor->Interval = msec + ( sec + ( (min+0) + hour*60 )*60 )*1000 ;
Revisor->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TElemento::OnBlink(TObject *Sender)
{
ultImagen = !ultImagen;
// Mostrar parpadeo según corresponda...
switch ( BlinkCode )
{
case IP_OFF:
if ( SurfaceIs != sfRoja )
{
SurfaceIs = sfRoja;
Picture = CtrlPPal->iElemento2->Picture;
WriteMyName();
}
if ( ultImagen )
Canvas->Draw( 17, 3, CtrlPPal->iElemento3->Picture->Graphic );
else
Canvas->FillRect(Rect(17,4,60,48));
break;
case IP_QUERY:
if ( SurfaceIs != sfAzul )
{
SurfaceIs = sfAzul;
Picture = CtrlPPal->iElementoV->Picture;
WriteMyName();
}
if ( ultImagen )
Canvas->Draw( 17, 3, CtrlPPal->iElemento4->Picture->Graphic );
else
Canvas->FillRect(Rect(17,4,60,48));
break;
case NONE:
default:
ShowElementInfo();
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TElemento::OnRevisor(TObject *Sender)
{
ForcedTimeOut();
// ShowMessage(
CtrlPPal->Memo1->Lines->Insert( 0, (Now()).DateTimeString() + Format( " Terminal %d. Fin de Tiempo. :_)", ARRAYOFCONST((NumElemento))));
Revisor->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TElemento::ForcedTimeOut(void)
{
Revisor->Enabled = false;
StatusCode = ERROR; // Estamos en proceso de COMPROBACION / ERROR
BlinkCode = IP_QUERY; // --- INTENTANDO COMUNICAR --
// Blink->Enabled = true; // Activamos el parpadeo
Blink->Interval = Blinking;
/// ENVIAMOS EL MENSAJE...
ThreadSocket *MySocket;
MySocket = (ThreadSocket *)CtrlPPal->GetThread();
MySocket->SetSocket( myIP, 5432 );
MySocket->CtrlCOP = SettingSTATUS;
MySocket->OWNER_Element = this;
MySocket->CtrlState = false;
MySocket->Resume();
//################################################################################################
TBookmark SavePlace;
SavePlace = CtrlPPal->TbElementosCFG->GetBookmark();
if ( CtrlPPal->TbElementosCFG -> Locate( "NumElement", NumElemento, TLocateOptions() << loCaseInsensitive ) )
{
if ( CtrlPPal->TbElementosCFG->FieldByName( "Activo" )->AsBoolean )
{
CtrlPPal->TbElementosCFG->Edit();
CtrlPPal->TbElementosCFG->FieldByName( "Tiempo" )->AsDateTime = EncodeTime( 0, 0, 0, 0 );
CtrlPPal->TbElementosCFG->FieldByName( "Activo" )->AsBoolean = false;
CtrlPPal->TbElementosCFG->Post();
}
}
CtrlPPal->TbElementosCFG->GotoBookmark(SavePlace);
CtrlPPal->TbElementosCFG->FreeBookmark(SavePlace);
//################################################################################################
}
//---------------------------------------------------------------------------
void __fastcall TElemento::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
Picture = CtrlPPal->iElemento2->Picture;
if ( CtrlPPal->ChangePositionEnabled )
{
if ( Button == mbLeft )
ElementoAnclado = true;
faElmX = X;
faElmY = Y;
}
}
//---------------------------------------------------------------------------
void __fastcall TElemento::MouseMove(TShiftState Shift, int X, int Y)
{
if ( CtrlPPal->ChangePositionEnabled )
{
if ( ElementoAnclado )
{
POINT MousePos;
GetCursorPos(&MousePos);
Left = MousePos.x - CtrlPPal->Left - CtrlPPal->Pizarra->Left - faElmX;
Top = MousePos.y - CtrlPPal->Top - CtrlPPal->Pizarra->Top - faElmY;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TElemento::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
// (Mover)
if ( Button == mbLeft )
{
if ( CtrlPPal->ChangePositionEnabled )
{
ElementoAnclado = false;
if ( Left <= 0 ) Left = 0;
if ( Top <= 0 ) Top = 0;
// ##########################################################################################
if ( CtrlPPal->TbElementosCFG -> Locate( "NumElement", NumElemento, TLocateOptions() << loCaseInsensitive ) )
{
CtrlPPal->TbElementosCFG -> Edit();
CtrlPPal->TbElementosCFG -> FieldByName("PosX") -> AsInteger = Left;
CtrlPPal->TbElementosCFG -> FieldByName("PosY") -> AsInteger = Top;
CtrlPPal->TbElementosCFG -> Post();
}
// ##########################################################################################
}
}
SurfaceIs = sfNone;
ShowElementInfo();
}
//---------------------------------------------------------------------------
// TiempoInicio --> Tiempo que queda hasta la desconexión
void __fastcall TElemento::ClientTimeIs( double Tiempo, double TiempoInicio )
{
BlinkCode = NONE;
// Blink->Enabled = false;
Blink->Interval = 60000;
if ( Tiempo <= 0 )
{
StatusCode = FREE;
Revisor->Enabled = false;
} else {
if ( StatusCode !=WORKING || (double)TiempoPedido < Tiempo )
{
TiempoComienzo = ( TDateTime::CurrentTime() - (Tiempo - TiempoInicio) );
// TiempoComienzo = TiempoInicio;
TiempoPedido = Tiempo;
unsigned short hour, min, sec, msec;
RTiempoRestante = TiempoInicio;
RTiempoRestante.DecodeTime( &hour, &min, &sec, &msec );
Revisor->Enabled = false;
Revisor->Interval = msec + ( sec + ( (min+0) + hour*60 )*60 )*1000 ;
Revisor->Enabled = true;
}
StatusCode = WORKING;
}
ShowElementInfo();
}
//---------------------------------------------------------------------------
void __fastcall TElemento::ShowElementInfo( void )
{
if ( StatusCode != ERROR )
{
// Picture = StatusCode != FREE ? CtrlPPal->iElementoV->Picture : CtrlPPal->iElemento5->Picture;
Picture = CtrlPPal->iElementoV->Picture;
WriteMyName();
unsigned short h, m, s, ms; int w;
AnsiString sOUT;
Canvas->Font->Size = 12;
sOUT = "# " + AnsiString( NumElemento ) + " #"; w = ( 44 - Canvas->TextWidth( sOUT ) ) / 2;
// En caso de estar activo el terminal
if ( StatusCode == WORKING )
{
Canvas->Font->Color = clRed; /*Nombre del Terminal*/ Canvas->TextOut( 17+w, 3, sOUT );
Canvas->Font->Color = clBlue; Canvas->Font->Size = 10;
// Hora en la que inicia la sesión.
TiempoComienzo.DecodeTime( &h, &m, &s, &ms );
sOUT = Format( "%02d:%02d", ARRAYOFCONST(( h, m )) );
w = ( 44 - Canvas->TextWidth( sOUT ) ) / 2;
Canvas->TextOut( 17+w, 22, sOUT );
// Tiempo de juego que le queda
TDateTime Queda;
Queda = TiempoRestante();//TiempoPedido + TiempoComienzo - TDateTime::CurrentTime();
Queda.DecodeTime( &h, &m, &s, &ms );
Canvas->TextOut( 17, 35, Format( "R: %02d:%02d", ARRAYOFCONST(( h, (m+1) ))) );
/*
// Tiempo de juego que le fue asignado
(TbElementosCFG->FieldByName( "Tiempo" )->AsDateTime).DecodeTime( &h, &m, &s, &ms );
E->Canvas->TextOut( 17, 40, Format( "((( %02d:%02d )))", ARRAYOFCONST(( h, m ))) );
*/
} else {
Canvas->Font->Color = clBlue;
// Nombre/Número del terminal
Canvas->TextOut( 17+w, 3, sOUT );
// El terminal esta libre
Canvas->Font->Color = clGreen;
Canvas->TextOut( 15, 25, "LIBRE" );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TElemento::CerrarWindows( void )
{
StatusCode = ERROR; // Estamos en proceso de COMPROBACION / ERROR
BlinkCode = IP_QUERY; // --- INTENTANDO COMUNICAR --
// Blink->Enabled = true; // Activamos el parpadeo /// ENVIAMOS EL MENSAJE...
Blink->Interval = Blinking;
ThreadSocket *MySocket;
MySocket = (ThreadSocket *)CtrlPPal->GetThread();
MySocket->SetSocket( myIP, 5432 );
MySocket->CtrlCOP = CloseWINDOWS;
MySocket->CtrlState = CloseWINDOWS;
MySocket->Resume();
// Actualizamos el historial
CtrlPPal->TbHistorial -> InsertRecord( ARRAYOFCONST(( NumElemento,
(Variant)TDateTime::CurrentDateTime(),
(Variant)TiempoRestante(), 0, 999, 0 )) );
}
//---------------------------------------------------------------------------
void __fastcall TElemento::EnviarListasAppl( void )
{
/*
StatusCode = ERROR; // Estamos en proceso de COMPROBACION / ERROR
BlinkCode = IP_QUERY; // --- INTENTANDO COMUNICAR --
Blink->Interval = Blinking;
*/
ThreadSocket *MySocket;
MySocket = (ThreadSocket *)CtrlPPal->GetThread();
MySocket->SetSocket( myIP, 5432 );
MySocket->CtrlCOP = sendLIST;
MySocket->CtrlState = sendLIST;
MySocket->Resume();
// Actualizamos el historial
CtrlPPal->TbHistorial -> InsertRecord( ARRAYOFCONST(( NumElemento,
(Variant)TDateTime::CurrentDateTime(),
(Variant)TiempoRestante(), 0, 997, 0 )) );
}
//---------------------------------------------------------------------------
void __fastcall TElemento::WriteMyName( void )
{
int W;
Canvas->Font->Color = clRed;
Canvas->Font->Style = Canvas->Font->Style << fsBold;
Canvas->Font->Size = 10;
W = ( 77 - Canvas->TextWidth( myName ) ) / 2;
Canvas->TextOut( W, 64, myName );
Canvas->Font->Style = Canvas->Font->Style >> fsBold;
}
//---------------------------------------------------------------------------
TDateTime __fastcall TElemento::TiempoRestante(void)
{
return TiempoPedido + TiempoComienzo - TDateTime::CurrentTime();
}
//---------------------------------------------------------------------------
TDateTime __fastcall TElemento::TiempoInicio(void)
{
return TiempoComienzo;
}
//---------------------------------------------------------------------------