TPV/TPV_MSG.CPP
2021-09-08 21:44:52 +02:00

642 lines
23 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

#include <time.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <graphics.h>
#include "c:\program\src_dos\libs\make_bot\make_bot.h"
#include "c:\program\src_dos\libs\bdatos\bdatos.hh"
#include "tpv_def.h"
#include "tpv_num.h"
BDatos BProtector; // Base de datos para el protector
MENSAJES SProtector; // Para guardar los mensajes del protector
char BufferM[6][65 + 1];
/*************************************\
| |
| Parte Principal del M¢dulo |
| |
\*************************************/
int far RatonMensajes( void );
void ConfigurarMensajes( void );
void CargaDatosProtector( void );
void MuestraAyudaProtector( char columna );
void MuestraDatosProtector( int RowStart );
void EditItemProtector( char columna, int linea );
void NuevoRegistroProtector( MENSAJES *NSProtector );
void MuestraMensajes( char columna, int linea, char como );
void ObtenCoordenadasProtector( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 );
p_Ampliada *LetraG[6];
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte principal del m¢dulo Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* ConfigurarMensajes *|
|* *|
|* Descripci¢n: *|
|* Gestiona los mensajes que se mostraran en el protector *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ConfigurarMensajes(void)
{
char i, buffer[80], key;
char CurrProtector, CurrRow, CurrCol, oldCol;
int BPush, ok;
int X0, Y0, X1, Y1;
LeeFuentes(Config.Prot_fnt);
for ( i = 0; i < 6; i++ )
if ( ( LetraG[i] = ( p_Ampliada * )malloc( sizeof( p_Ampliada ) ) ) == NULL )
{
for ( i=0; i < 6; i++ )
free( LetraG[i] );
return;
}
sprintf( buffer, "datos\\%s\\mensajes.dbf", NEmpresa );
if ( BProtector.AbrirReg( buffer, sizeof( MENSAJES ) ) == ERROR )
Error(0x01, BProtector.cError);
// Si no hay registros, creamos uno almenos.
if ( BProtector.Registros() != 0 )
{
if ( BProtector.LeeReg( (void *)&SProtector, 0 ) == ERROR )
Error(0x01, BProtector.cError);
} else {
NuevoRegistroProtector( &SProtector );
if ( BProtector.InsReg( (void *)&SProtector, 0, ARRIBA ) == ERROR )
Error(0x01, BProtector.cError);
}
LetraG[0] -> x = 17; LetraG[0] -> y = 32;
LetraG[0] -> ndigitos = 20;
LetraG[0] -> AX = 2; LetraG[0] -> AY = 2;
*LetraG[5] = *LetraG[4] = *LetraG[3] = *LetraG[2] = *LetraG[1] = *LetraG[0];
LetraG[1] -> y = 64;
LetraG[2] -> y = 96;
LetraG[3] -> y = 128;
LetraG[4] -> y = 160;
LetraG[5] -> y = 192;
for ( i = 0; i < 6; i++ )
{
LetraG[i] -> C1 = SProtector.CBg[i];
LetraG[i] -> C2 = SProtector.CFg[i];
}
// Rellenamos la pantalla con un fondo atractivo...
setfillstyle( Config.FillBgS, Config.FillBgC );
bar( 0, 0, 640, 480 );
Imprime_Estaticos( 50, "systm\\Tpv.img"); // Imprime botones estaticos 'Seccion 1'
for ( i = 0; i < 6; i++ )
sprintf( BufferM[i], "%-20s%-20s%-20s", SProtector.Mensaje1[i], SProtector.Mensaje2[i], SProtector.Mensaje3[i] );
CurrProtector = 0; CurrRow = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosProtector( CurrProtector*6 + CurrRow );
CurrCol = 0; ok = 0;
oldCol = -1;
do {
if ( CurrCol != oldCol )
{
oldCol = CurrCol; MuestraAyudaProtector( CurrCol );
}
MuestraMensajes( CurrCol, CurrRow, INTENSO );
BPush = Comprueba_Secuencia( 8, RatonMensajes );
MuestraMensajes( CurrCol, CurrRow, NORMAL );
switch ( BPush )
{
case 0: // No se pulso ningun BOTON
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
break;
case -2: // Hay una tecla normal en BUFFER
if ( ( key = getch() ) != 27 )
{
if ( key != 13 )
ungetch( key );
EditItemProtector( CurrCol, CurrRow );
for ( i = 0; i < 6; i++ )
sprintf( BufferM[i], "%-20s%-20s%-20s", SProtector.Mensaje1[i], SProtector.Mensaje2[i], SProtector.Mensaje3[i] );
}
break;
case -1: // Hay una tecla especial en BUFFER
switch( getch() )
{
// Flecha Izquierda
case 75:
case 15:
CurrCol--; if ( CurrCol < 0 ) CurrCol = 2;
break;
// Flecha Derecha
case 77:
case 9:
CurrCol ++; if ( CurrCol > 2 ) CurrCol = 0;
break;
// Flecha Arriba
case 72:
CurrRow --; if ( CurrRow < 0 ) CurrRow = 5;
break;
// Flecha Abajo
case 80:
CurrRow ++; if ( CurrRow > 5 ) CurrRow = 0;
break;
}
break;
// Cambiar Fuente
case 1:
break;
// Menu Principal
case 2:
ok = 1;
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
ObtenCoordenadasProtector( BPush, CurrRow, &X0, &Y0, &X1, &Y1 );
if ( SProtector.Desplaz[ BPush - 3 ] )
{
SProtector.Desplaz[ BPush - 3 ] = 0;
ponicono( X0+5, Y0+5, led_off, 1 );
} else {
SProtector.Desplaz[ BPush - 3 ] = 1;
ponicono( X0+5, Y0+5, led_on, 1 );
}
break;
case 9:
CurrProtector--; if ( CurrProtector < 0 ) CurrProtector = 0;
break;
case 10:
CurrProtector++; if ( CurrProtector > 5 ) CurrProtector = 5;
break;
case 11:
LetraG[CurrRow] -> C2 =SProtector.CFg[CurrRow] = (SProtector.CFg[CurrRow] + 1) % 256;
break;
case 12:
LetraG[CurrRow] -> C1 =SProtector.CBg[CurrRow] = (SProtector.CBg[CurrRow] + 1 ) % 256;
break;
case 13:
LetraG[CurrRow] -> C2 =SProtector.CFg[CurrRow] = (SProtector.CFg[CurrRow] - 1 ) % 256;
break;
case 14:
LetraG[CurrRow] -> C1 =SProtector.CBg[CurrRow] = (SProtector.CBg[CurrRow] - 1 ) % 256;
break;
default:
break;
}
} while( !ok );
if ( BProtector.EscribeReg( (void *)&SProtector, 0 ) == ERROR )
Error(0x01, BProtector.cError);
BProtector.CerrarReg();
for ( i=0; i < 6; i++ )
free( LetraG[i] );
}
/**************************************************************************\
|* *|
|* MuestraDatosSProtector *|
|* *|
|* Descripci¢n: *|
|* Dado un registro, se muestran sucesivamente este y todos *|
|* los que hay por debajo de l, hasta que se agote la base *|
|* o no quepan mas en la pantalla. *|
|* *|
|* Entradas: Registro por el que comenzar *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraDatosProtector( int RowStart )
{
int linea, campo;
int X0, Y0, X1, Y1;
// Imprimo la NLINEAS_EMPL que caben en la pantalla
for ( linea=0; linea < 6; linea++ )
{
// Por cada linea hay 3 campos, ehhh!!!
for ( campo=0; campo < 3; campo++ )
MuestraMensajes( campo, linea, NORMAL );
}
// Ahora limpio los restantes huecos si los hay
setfillstyle( SOLID_FILL, Config.TxtBgN );
for ( ; linea < 6; linea++ )
for ( campo=0; campo < 3; campo++ )
{
ObtenCoordenadasProtector( campo, linea, &X0, &Y0, &X1, &Y1 );
bar( X0, Y0, X1, Y1 );
}
for ( campo=3; campo < 9; campo++ )
{
ObtenCoordenadasProtector( campo, 1, &X0, &Y0, &X1, &Y1 );
if ( SProtector.Desplaz[ campo - 3 ] )
{
ponicono( X0+5, Y0+5, led_on, 1 );
} else {
ponicono( X0+5, Y0+5, led_off, 1 );
}
}
}
/**************************************************************************\
|* *|
|* MuestraMensajes *|
|* *|
|* Descripci¢n: *|
|* Reescribe el campo dado, seg£n la fila, y la intensidad *|
|* *|
|* Entradas: *|
|* columna campo ha mostar *|
|* linea linea en la que nos encontramos *|
|* como intensidad del texto (NORMAL/INTENSO) *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraMensajes( char columna, int linea, char como )
{
char buffer[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasProtector( columna, linea, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
case 0:
sprintf ( buffer, "%s", SProtector.Mensaje1[linea] );
break;
case 1:
sprintf ( buffer, "%s", SProtector.Mensaje2[linea] );
break;
case 2:
sprintf ( buffer, "%s", SProtector.Mensaje3[linea] );
break;
}
setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
bar( X0, Y0, X1, Y1 );
setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
outtextxy( X0+2, Y0, buffer );
}
/**************************************************************************\
|* *|
|* MuestraAyudaSProtector *|
|* *|
|* Descripci¢n: *|
|* Muestra una peque¤a descripcion del contenido para el campo *|
|* *|
|* Entradas: *|
|* columna campo ha mostar su ayuda *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void MuestraAyudaProtector( char columna )
{
char buffer1[80];
buffer1[0] = '\0';
switch( columna )
{
case 0:
sprintf ( buffer1, "Introduzca mensaje del 1er Bloque" );
break;
case 1:
sprintf ( buffer1, "Introduzca mensaje del 2er Bloque" );
break;
case 2:
sprintf ( buffer1, "Introduzca mensaje del 3er Bloque" );
break;
}
// Ayuda reducida
setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 );
// Imprime la ayudita
setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 );
}
/**************************************************************************\
|* *|
|* EditItemSProtector *|
|* *|
|* Descripci¢n: *|
|* Se encarga de editar y validar el campo. *|
|* *|
|* Entradas: *|
|* columna campo ha editar *|
|* linea linea en la que nos encontramos *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void EditItemProtector( char columna, int linea )
{
char buffer[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasProtector( columna, linea, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
case 0:
sprintf ( buffer, "%s", SProtector.Mensaje1[linea] );
if ( !( InputCadenaG( buffer, 0, 20, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy( SProtector.Mensaje1[linea], buffer );
break;
case 1:
sprintf ( buffer, "%s", SProtector.Mensaje2[linea] );
if ( !( InputCadenaG( buffer, 0, 20, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy( SProtector.Mensaje2[linea], buffer );
break;
case 2:
sprintf ( buffer, "%s", SProtector.Mensaje3[linea] );
if ( !( InputCadenaG( buffer, 0, 20, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy( SProtector.Mensaje3[linea], buffer );
break;
}
while( kbhit() ) getch();
}
/**************************************************************************\
|* *|
|* ObtenCoordenadasProtector *|
|* *|
|* Descripci¢n: *|
|* Obtiene las coordenadas de acotacion para el campo pedido *|
|* *|
|* Entradas: *|
|* columna campo del que obtener las coordenadas *|
|* linea linea en la que nos encontramos *|
|* X0 Y0 X1 Y1 Punteros para devolver las coordenadas *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ObtenCoordenadasProtector( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 )
{
// Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 3 )
*Y0 = 280 + 19*linea;
*Y1 = *Y0 + 17;
switch( columna )
{
case 0:
*X0 = 7; *X1 = 209;
break;
case 1:
*X0 = 219; *X1 = 421;
break;
case 2:
*X0 = 431; *X1 = 633;
break;
case 3:
*X0 = 350; *X1 = 380;
*Y0 = 27; *Y1 = 57;
break;
case 4:
*X0 = 350; *X1 = 380;
*Y0 = 61; *Y1 = 91;
break;
case 5:
*X0 = 350; *X1 = 380;
*Y0 = 95; *Y1 = 125;
break;
case 6:
*X0 = 350; *X1 = 380;
*Y0 = 129; *Y1 = 159;
break;
case 7:
*X0 = 350; *X1 = 380;
*Y0 = 163; *Y1 = 193;
break;
case 8:
*X0 = 350; *X1 = 380;
*Y0 = 197; *Y1 = 227;
break;
}
*X0 += 2;
*X1 -= 2;
}
/**************************************************************************\
|* *|
|* CargaDatosProtextor *|
|* *|
|* Descripci¢n: *|
|* Carga los datos del Protector *|
|* *|
|* Entradas:(ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void CargaDatosProtector( void )
{
char buffer[80];
sprintf( buffer, "datos\\%s\\mensajes.dbf", NEmpresa );
if ( BProtector.AbrirReg( buffer, sizeof( MENSAJES ) ) == ERROR )
Error(0x01, BProtector.cError);
// Si no hay registros, creamos uno almenos.
if ( BProtector.Registros() != 0 )
{
if ( BProtector.LeeReg( (void *)&SProtector, 0 ) == ERROR )
Error(0x01, BProtector.cError);
} else {
NuevoRegistroProtector( &SProtector );
if ( BProtector.InsReg( (void *)&SProtector, 0, ARRIBA ) == ERROR )
Error(0x01, BProtector.cError);
}
BProtector.CerrarReg();
}
void NuevoRegistroProtector( MENSAJES *NSProtector )
{
int i;
NSProtector ->TEspera = 15; // Segundos de espera para pasar al siguiente bloque
for ( i = 0; i < 6; i++ )
{
NSProtector ->Desplaz[i] = 0; // Indicador si se desplaza o no.
NSProtector ->Mensaje1[i][0] = '\0';// Mensaje que se va a mostrar
NSProtector ->Mensaje2[i][0] = '\0';// Mensaje que se va a mostrar
NSProtector ->Mensaje3[i][0] = '\0';// Mensaje que se va a mostrar
NSProtector ->CFg[i] = 63;
NSProtector ->CBg[i] = 0;
}
NSProtector ->Desplaz[3] = 1; // Indicador si se desplaza o no.
strcpy( NSProtector ->Mensaje1[3], "Programa realizado p" );
strcpy( NSProtector ->Mensaje2[3], "or: Jose David Guil" );// Mensaje que se va a mostrar
strcpy( NSProtector ->Mensaje3[3], "len" );// Mensaje que se va a mostrar
}
/**************************************************************************\
|* *|
|* PreviewPantalla *|
|* *|
|* Descripci¢n: *|
|* Muestra un preview de como quedar  el mensaje del protector *|
|* *|
|* Entradas:(ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void PreviewPantalla(void)
{
static int Pasadas = 20*8 - 1;
static time_t first;
static char Paso = 0;
char i;
if ( Pasadas == -1 && difftime( time(NULL), first ) >= SProtector.TEspera )
{
Pasadas = 0;
if ( Paso == 4 ) Paso = 1;
}
if ( Pasadas >= 0 )
{
Pasadas ++;
if ( Pasadas > (Paso != 3 ? 20*8 : 25*8 ) )
{
time( &first );
Pasadas = -1;
Paso++;
}
}
for ( i = 0; i < 6; i++ )
{
if ( SProtector.Desplaz[i] || Pasadas != -1 )
Fuente_Amplia3( BufferM[i], LetraG[i] );
}
}
/**************************************************************************\
|* *|
|* RatonMensajes *|
|* *|
|* Descripci¢n: *|
|* Funci¢n soporte para el control del raton, que ademas se *|
|* encarga de mostrar el letrero digital y el protector de *|
|* pantalla. *|
|* *|
|* Entradas: *|
|* Linea en la que se inserta y posici¢n f¡sica, y columna *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
int far RatonMensajes(void)
{
// inicializa_raton_grafico(0, 0, 624, 464);
// char boton_izq, boton_der;
char Que;
activa_raton();
union REGS io;
io.x.ax = 3;
do{
PreviewPantalla();
int86(0x33, &io, &io); // lee posici¢n y estados del bot¢n
x_raton = io.x.cx;
y_raton = io.x.dx;
}while( (io.x.bx & 1) == 0 && ((io.x.bx >> 1) & 1) == 0 && !kbhit() );
/////////////////////////////////////////
// RETURN Derecho Izquierdo //
// //
// 0 0 0 //
// 1 1 0 //
// 2 0 1 //
// 3 1 1 //
// //
/////////////////////////////////////////
if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==0 ) Que = 0;
if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==0 ) Que = 1;
if ( ((io.x.bx >> 1) & 1)==0 && (io.x.bx & 1)==1 ) Que = 2;
if ( ((io.x.bx >> 1) & 1)==1 && (io.x.bx & 1)==1 ) Que = 3;
desactiva_raton();
return Que;
}