#include #include #include #include #include #include #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; }