Menus LCD TFT

Dependents:   Example_Menu_LCD_TFT

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Menus.h Source File

Menus.h

00001 /*
00002    \file Menus.h
00003    \version: 1.0
00004    
00005    \brief Este fichero contiene funciones para creación de Menus es LCD TFT.- 
00006    
00007    \web www.micros-designs.com.ar
00008    \date 15/03/11
00009    
00010  *- Version Log --------------------------------------------------------------*
00011  *   Fecha       Autor                Comentarios                             *
00012  *----------------------------------------------------------------------------*
00013  * 15/03/11      Suky        Original                                         *
00014  *----------------------------------------------------------------------------*/ 
00015 ///////////////////////////////////////////////////////////////////////////
00016 ////                                                                   ////
00017 ////                                                                   ////
00018 ////        (C) Copyright 2011 www.micros-designs.com.ar               ////
00019 //// Este código puede ser usado, modificado y distribuido libremente  ////
00020 //// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
00021 ////                                                                   ////
00022 ////                                                                   ////
00023 /////////////////////////////////////////////////////////////////////////// 
00024 #ifndef __MENUS_H__
00025 #define __MENUS_H__
00026 
00027 #include "mbed.h"
00028 #include "LCDTFT.h"
00029 #include "Touch.h"
00030 #include "GenericTypeDefs.h"
00031 #include "Images.h"
00032 
00033 // ****************************************************************************************
00034 #define TOUCH_X_MIN 20
00035 #define TOUCH_X_MAX 230
00036 #define TOUCH_Y_MIN 15
00037 #define TOUCH_Y_MAX 240
00038 // ****************************************************************************************
00039 #define MENU_FIN                0
00040 #define MENU_COMANDO            1
00041 #define MENU_SUBMENU            2
00042 #define SUBMENU_ANTERIOR        3
00043 #define MENU_MAIN               4
00044 // ****************************************************************************************
00045 #define MENSAJE_ATRAS_OK        1
00046 #define MENSAJE_NO_SI           2
00047 #define MENSAJE_ATRAS           3
00048 
00049 #define MENSAJE_ACCION_ATRAS    1
00050 #define MENSAJE_ACCION_OK       2
00051 #define MENSAJE_ACCION_NO       3
00052 #define MENSAJE_ACCION_SI       4
00053 
00054 #define MODIFICADOR_ACEPTAR     1
00055 #define MODIFICADOR_CANCELAR    2
00056 // ****************************************************************************************
00057 #define IMAGEN_FONDO_MENU       10
00058 // ****************************************************************************************
00059 #define BOTON_NORMAL            1
00060 #define BOTON_PRES_IZQ          2
00061 #define BOTON_PRES_DER          3
00062 #define ITEM_NORMAL             4
00063 #define ITEM_PRES               5
00064 // ****************************************************************************************
00065 #define COLOR_LETRA_BOTON       ColorAqua
00066 #define COLOR_LETRA_BOTON_PRES  ColorWhite
00067 #define COLOR_FONDO_LETRA       ColorGray
00068 #define COLOR_MSJ               ColorWhite
00069 // ****************************************************************************************
00070 #define JUST_IZQ                1
00071 #define JUST_DER                2
00072 #define JUST_CENTRADO           3
00073 // ****************************************************************************************
00074 #define AREA_BTN_INF_DER()       (Coordenadas.x<235 && Coordenadas.x>135) && (Coordenadas.y<320 && Coordenadas.y>290)
00075 #define AREA_BTN_INF_IZQ()       (Coordenadas.x<105 && Coordenadas.x>5) && (Coordenadas.y<320 && Coordenadas.y>290)
00076 // ****************************************************************************************
00077 TouchScreenADS7843 MyTouch(p9,p10,p12,p11,p8); // ADS7843-> SDO,SDI,SCK,CS,IRQ
00078 BusOut    MyBus(p13,p14,p15,p16,p17,p18,p19,p20,p30,p29,p28,p27,p26,p25,p24,p23);
00079 LCDTFT    MyLCD(p5,p6,p7,p22,p21,&MyBus);
00080 // ****************************************************************************************
00081 typedef struct{
00082     UINT8 TipoMenu;
00083     const UINT8 *TextoMenu;
00084     UINT8 *Menu;
00085     void (*PtrFuncionSeleccion)(void);
00086     const UINT16 *PtrIcono;
00087 }MENU;
00088 // ****************************************************************************************
00089 struct{
00090     const MENU *PtrMenu;
00091     UINT8 ElementoSeleccionActual; 
00092     void (*FuncionActualEjecucion)(void);
00093     UINT8 CantElementosMenu;
00094 }MenuActual;
00095 // ****************************************************************************************
00096 struct{
00097     float ValorInicial;
00098     float ValorActual;
00099     UINT8 String[15];
00100     UINT8 Ptr;
00101     void (*FuncionActualEjecucion)(UINT8,float);
00102 }ModificadorVariable;
00103 // ****************************************************************************************
00104 struct{
00105     UINT8 TipoMensajePantalla;
00106     void (*MensajeFuncionEjecutar)(UINT8);
00107 }MensajePantalla;
00108 // ****************************************************************************************
00109 TOUCH_DATA Coordenadas;
00110 volatile bool kbhit_irq=0;
00111 volatile bool kbhit_tratament=0;
00112 // ****************************************************************************************
00113 void vSeteoFuncionEjecutar(void (*PtrNuevaFuncion)(void));
00114 void vEjecutaEventosMenu(void);
00115 void vSeleccionarMenuAnterior(void);
00116 void vSeleccionMenu(const MENU *Menu,UINT8 ElementoMenuSeleccion);
00117 void vEventosSubMenu(void);
00118 void vDibujarImagenFondo(UINT8 Seleccion);
00119 void vDibujarMenuInferior(const UINT8 *TextoIzq,const UINT8 *TextoDer, UINT8 Status);
00120 void vDibujarElementoMenu(UINT8 NElemento,UINT8 Status);
00121 void vMensajePantalla(const UINT8 *Mensaje,UINT16 YInicial,UINT8 TipoMensaje,void (*FuncionEjecutar)(UINT8));
00122 void vEventosPantallaMensaje(void);
00123 void vModificadorVariables(const UINT8 *NombreVariable,float ValorInicial,void (*PtrFuncion)(UINT8,float));
00124 void vEventosModificadorVariables(void);
00125 void vTextoJustificado(const unsigned char *PtrTexto,unsigned short ExtremoIzq, unsigned short ExtremoDer, unsigned short y, unsigned char Just,const char (*Fuente)[5],unsigned char Alto, unsigned short Color);
00126 void vEscribirMensaje(unsigned short YInicial,const unsigned char *Mensaje,const char (*Fuente)[5],unsigned char Just, unsigned short Color);
00127 // ****************************************************************************************
00128 // Rutina de atencion de interrupcion.-
00129 void vISRTouchIRQ(){
00130     UINT_COORDxy Temp;
00131     
00132     
00133     MyTouch.vTestTouchPanel(&Coordenadas);
00134     // Coordenadas dentro del rango de pantalla LCD:
00135     if((Coordenadas.x>TOUCH_X_MIN && Coordenadas.x<TOUCH_X_MAX) && (Coordenadas.y>TOUCH_Y_MIN && Coordenadas.y<TOUCH_Y_MAX)){
00136         if(kbhit_tratament==0){            
00137             // Cambio de coordenda y escala:
00138             Temp=Coordenadas.y;
00139             Coordenadas.y=((float)((255.0-TOUCH_X_MIN)-Coordenadas.x)*(320.0/(TOUCH_X_MAX-TOUCH_X_MIN)));
00140             Coordenadas.x=((float)(Temp-TOUCH_Y_MIN)*(240.0/(TOUCH_Y_MAX-TOUCH_Y_MIN)));
00141             kbhit_irq=1;
00142         }
00143     }    
00144 }
00145 // ****************************************************************************************
00146 void vInitLCDTFTAndTouch(void){
00147     MyTouch.vInitADS7843(USE_8BITS,&vISRTouchIRQ);
00148     MyLCD.vLCDTFTInit();
00149     Led1=0;
00150     Led2=0;
00151 }
00152 // ****************************************************************************************
00153 // ****************************************************************************************
00154 /* ** Se carga en puntero la funcion que se ejecutara dentro del while ** */
00155 void vSeteamosFuncionEjecutar(void (*PtrNuevaFuncion)(void)){    
00156     MenuActual.FuncionActualEjecucion = PtrNuevaFuncion;
00157 }
00158 /* ** Ejecuta funcion que se encuentra apuntada ** */
00159 void vEjecutaEventosMenu(void){
00160     (*MenuActual.FuncionActualEjecucion)();
00161 }
00162 /* ** Selecciona Menu anterior a mostrar despues de un comando ** */
00163 void vSeleccionarMenuAnterior(void){
00164     vSeleccionMenu(MenuActual.PtrMenu,MenuActual.ElementoSeleccionActual);
00165 }
00166     
00167 /* ** Selecciona y dibuja un submenu, luego carga en puntero funcion que atiende sus eventos ** */
00168 void vSeleccionMenu(const MENU *Menu,UINT8 ElementoMenuSeleccion){
00169 UINT8 NElemento;
00170 
00171     /* ** Guardamos el Menu actual que se visualiza y trabaja ** */
00172     MenuActual.PtrMenu=Menu;
00173     MenuActual.ElementoSeleccionActual=ElementoMenuSeleccion;
00174 
00175     /* ** Borramos pantalla y dibujamos elementos del menu** */
00176     vDibujarImagenFondo(IMAGEN_FONDO_MENU);
00177     
00178     /* ** Dibujamos barra con titulo ** */
00179     MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]);
00180     vTextoJustificado(MenuActual.PtrMenu[0].TextoMenu,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
00181     /* ** Dibujamos Items ** */
00182     NElemento=1;
00183     while(MenuActual.PtrMenu[NElemento].TipoMenu!=MENU_FIN){    
00184         vDibujarElementoMenu(NElemento-1,ITEM_NORMAL);
00185         NElemento++;
00186     }
00187     MenuActual.CantElementosMenu=NElemento-1;
00188     
00189     if(MenuActual.PtrMenu[0].TipoMenu==MENU_MAIN){
00190         vDibujarMenuInferior(" ","Menu",BOTON_NORMAL);
00191     }else{
00192         vDibujarMenuInferior("Atras"," ",BOTON_NORMAL);
00193     }
00194     /* ** Cargamos en puntero funci&#65533;n que atiende eventos del Submenu (Funci&#65533;n en while del main)** */
00195     vSeteamosFuncionEjecutar(vEventosSubMenu);
00196 }
00197 
00198 void vDibujarImagenFondo(UINT8 Seleccion){
00199 
00200     switch(Seleccion){
00201         case IMAGEN_FONDO_MENU:
00202             for(short k=0;k<320;k+=10){
00203                 MyLCD.vLCDTFTDrawImage(0,k,WIDTH_FONDO,HEIGH_FONDO,LENGTH_FONDO,&Fondo[0]);
00204             }
00205         break;
00206     }
00207 }
00208 /* ** Dibuja barra inferior de botones ** */ 
00209 void vDibujarMenuInferior(const UINT8 *TextoIzq,const UINT8 *TextoDer, UINT8 Status){
00210 
00211     
00212     switch(Status){
00213         case BOTON_PRES_IZQ:
00214             vTextoJustificado(TextoIzq,5,105,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON_PRES);
00215         break;
00216         case BOTON_PRES_DER:
00217             vTextoJustificado(TextoDer,135,234,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON_PRES);
00218         break;
00219         case BOTON_NORMAL:
00220             MyLCD.vLCDTFTDrawImage(0,289,WIDTH_BOTONES,HEIGH_BOTONES,LENGTH_BOTONES,&Botones[0]);
00221             vTextoJustificado(TextoIzq,5,105,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON);
00222             vTextoJustificado(TextoDer,135,234,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON);
00223         break;
00224     }
00225 }
00226 /* ** Dibuja elementos del submenu ** */
00227 void vDibujarElementoMenu(UINT8 NElemento,UINT8 Status){
00228 
00229     if(Status==ITEM_NORMAL){
00230         if((NElemento%2)==0){
00231             MyLCD.vLCDTFTDrawImage(35,28+((((NElemento+2)/2)-1)*65),WIDTH_ICONO,HEIGH_ICONO,LENGTH_ICONO,MenuActual.PtrMenu[NElemento+1].PtrIcono);
00232             MyLCD.vLCDTFTRectangle(5,81+((((NElemento+2)/2)-1)*65),114,90+((((NElemento+2)/2)-1)*65),1,COLOR_FONDO_LETRA);
00233             vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,5,114,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON);
00234         }else{
00235             MyLCD.vLCDTFTDrawImage(155,28+((((NElemento+2)/2)-1)*65),WIDTH_ICONO,HEIGH_ICONO,LENGTH_ICONO,MenuActual.PtrMenu[NElemento+1].PtrIcono);  
00236             MyLCD.vLCDTFTRectangle(125,81+((((NElemento+2)/2)-1)*65),234,90+((((NElemento+2)/2)-1)*65),1,COLOR_FONDO_LETRA);
00237             vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,125,234,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON);  
00238         }
00239     }else{
00240         if((NElemento%2)==0){
00241             vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,5,114,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON_PRES);
00242         }else{
00243             vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,125,234,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON_PRES);  
00244         }
00245     }
00246 }
00247 // ****************************************************************************************
00248 // ****************************************************************************************
00249 void vEventosSubMenu(void){
00250     const MENU *SubMenu;
00251     void (*PtrComando)(void);
00252     
00253     if(kbhit_irq==1){
00254         kbhit_irq=0;
00255         kbhit_tratament=1;
00256         
00257         if(MenuActual.PtrMenu[0].TipoMenu==MENU_MAIN){
00258             if(AREA_BTN_INF_DER()){
00259                 vDibujarMenuInferior(" ","Menu",BOTON_PRES_DER);
00260                 wait_ms(300);
00261                 SubMenu=(MENU *)MenuActual.PtrMenu[0].Menu;
00262                 vSeleccionMenu(SubMenu,1);
00263             }
00264             kbhit_tratament=0;
00265         }else{
00266             for(char k=0;k<MenuActual.CantElementosMenu;k++){
00267                 if((k%2)==0){
00268                     if((Coordenadas.x<85 && Coordenadas.x>35) && (Coordenadas.y<(78+((((k+2)/2)-1)*65)) && Coordenadas.y>(28+((((k+2)/2)-1)*65)))){
00269                         vDibujarElementoMenu(k,ITEM_PRES);
00270                         wait_ms(300);
00271                         MenuActual.ElementoSeleccionActual=k+1;
00272                         /* ** Abrimos otro submenu o ejecutamos comando ** */
00273                         switch(MenuActual.PtrMenu[k+1].TipoMenu){
00274                             case MENU_COMANDO:
00275                                 PtrComando=(void(*)(void))MenuActual.PtrMenu[k+1].PtrFuncionSeleccion;
00276                                 kbhit_tratament=0;
00277                                 if(PtrComando!=NULL) (*PtrComando)();
00278                             break;
00279                             case MENU_SUBMENU:
00280                                 SubMenu=(MENU *)MenuActual.PtrMenu[k+1].Menu;
00281                                 vSeleccionMenu(SubMenu,1);
00282                             break;
00283                         }
00284                     }
00285                 }else{
00286                     if((Coordenadas.x<205 && Coordenadas.x>155) && (Coordenadas.y<(78+((((k+2)/2)-1)*65)) && Coordenadas.y>(28+((((k+2)/2)-1)*65)))){
00287                         vDibujarElementoMenu(k,ITEM_PRES);
00288                         wait_ms(300);
00289                         MenuActual.ElementoSeleccionActual=k+1;
00290                         /* ** Abrimos otro submenu o ejecutamos comando ** */
00291                         switch(MenuActual.PtrMenu[k+1].TipoMenu){
00292                             case MENU_COMANDO:
00293                                 PtrComando=(void(*)(void))MenuActual.PtrMenu[k+1].PtrFuncionSeleccion;
00294                                 kbhit_tratament=0; 
00295                                 if(PtrComando!=NULL) (*PtrComando)();
00296                             break;
00297                             case MENU_SUBMENU:
00298                                 SubMenu=(MENU *)MenuActual.PtrMenu[k+1].Menu;
00299                                 vSeleccionMenu(SubMenu,1);
00300                             break;
00301                         }
00302                     }
00303                 }                
00304             }
00305             
00306             if(AREA_BTN_INF_IZQ()){
00307                 vDibujarMenuInferior("Atras"," ",BOTON_PRES_IZQ);
00308                 wait_ms(300);
00309                 SubMenu=(MENU *)MenuActual.PtrMenu[0].Menu;
00310                 vSeleccionMenu(SubMenu,1);
00311             }
00312             kbhit_tratament=0;        
00313         }
00314     }    
00315 } 
00316 // ********************************************************************************************************************************
00317 // ****************************************** MENSAJES EN PANTALLA ****************************************************************
00318 // ********************************************************************************************************************************
00319 /* ** Se escribe un mensaje en pantalla para elemento del tipo comando, presentando en barra inferior opcion a elegir ** */
00320 void vMensajePantalla(const UINT8 *Mensaje,UINT16 YInicial,UINT8 TipoMensaje,void (*FuncionEjecutar)(UINT8)){
00321 
00322     MensajePantalla.MensajeFuncionEjecutar=FuncionEjecutar;
00323     MensajePantalla.TipoMensajePantalla=TipoMensaje;
00324 
00325     vDibujarImagenFondo(IMAGEN_FONDO_MENU);
00326     MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]);
00327     vTextoJustificado(MenuActual.PtrMenu[MenuActual.ElementoSeleccionActual].TextoMenu,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
00328     
00329     MyLCD.vLCDTFTRectangle(5,30,234,284,1,ColorGray);
00330     MyLCD.vLCDTFTRectangle(5,30,234,31,1,ColorWhite);
00331     MyLCD.vLCDTFTRectangle(5,283,234,284,1,ColorBlack);
00332     MyLCD.vLCDTFTRectangle(5,30,6,284,1,ColorWhite);
00333     MyLCD.vLCDTFTRectangle(233,30,234,284,1,ColorWhite);
00334     
00335     vEscribirMensaje(YInicial,Mensaje,&ARIAL[0],JUST_CENTRADO,COLOR_MSJ);
00336 
00337     switch(TipoMensaje){
00338         case MENSAJE_ATRAS_OK:
00339             vDibujarMenuInferior("Atras", "Ok",BOTON_NORMAL);
00340         break;        
00341         case MENSAJE_NO_SI:
00342             vDibujarMenuInferior("No", "Si",BOTON_NORMAL);
00343         break;        
00344         case MENSAJE_ATRAS:
00345             vDibujarMenuInferior("Atras", " ",BOTON_NORMAL);
00346         break;
00347     }
00348     vSeteamosFuncionEjecutar(vEventosPantallaMensaje);
00349 }
00350 
00351 /* ** Se atiende eventos de pantalla con mensaje ** */
00352 void vEventosPantallaMensaje(void){    
00353     UINT8 AccionPulsIzq,AccionPulsDer;
00354     const UINT8 *TextDer,*TextIzq;
00355 
00356     switch(MensajePantalla.TipoMensajePantalla){
00357         case MENSAJE_ATRAS_OK:
00358             AccionPulsIzq = MENSAJE_ACCION_ATRAS;
00359             AccionPulsDer = MENSAJE_ACCION_OK;
00360             TextDer="Atras";
00361             TextIzq="Ok";
00362         break;
00363 
00364         case MENSAJE_NO_SI:
00365             AccionPulsIzq = MENSAJE_ACCION_NO;
00366             AccionPulsDer = MENSAJE_ACCION_SI;
00367             TextDer="No";
00368             TextIzq="Si";
00369         break;
00370         
00371         default:
00372             AccionPulsIzq = MENSAJE_ACCION_ATRAS;
00373             AccionPulsDer = MENSAJE_ACCION_ATRAS;
00374             TextDer="Atras";
00375             TextIzq=" ";
00376     }
00377     if(kbhit_irq==1){
00378         kbhit_irq=0;
00379         kbhit_tratament=1;
00380         
00381         if(AREA_BTN_INF_DER()){
00382             vDibujarMenuInferior(TextIzq,TextDer,BOTON_PRES_DER);
00383             wait_ms(300);
00384             (*MensajePantalla.MensajeFuncionEjecutar)(AccionPulsIzq);
00385         }
00386         if(AREA_BTN_INF_IZQ()){
00387             vDibujarMenuInferior(TextIzq,TextDer,BOTON_PRES_IZQ);
00388             wait_ms(300);
00389             (*MensajePantalla.MensajeFuncionEjecutar)(AccionPulsDer);
00390         }
00391         kbhit_tratament=0;
00392     }
00393 }
00394 
00395 void vModificadorVariables(const UINT8 *NombreVariable,float ValorInicial,void (*PtrFuncion)(UINT8,float)){
00396     const UINT8 PtrLetras[13][2]={"7","8","9","4","5","6","1","2","3",".","0","c"};
00397     UINT8 Ptr=0,Fmt[30]; 
00398 
00399     ModificadorVariable.ValorInicial=ValorInicial;
00400     ModificadorVariable.ValorActual=0.0;
00401     memset(&ModificadorVariable.String[0],0,15);
00402     ModificadorVariable.Ptr=0;
00403     ModificadorVariable.FuncionActualEjecucion=PtrFuncion;
00404     
00405     vDibujarImagenFondo(IMAGEN_FONDO_MENU);
00406     MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]);
00407     vTextoJustificado(NombreVariable,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
00408     
00409     MyLCD.vLCDTFTRectangle(22,122,217,148,1,ColorWhite);
00410     MyLCD.vLCDTFTRectangle(20,120,219,121,1,ColorGray);
00411     MyLCD.vLCDTFTRectangle(20,120,21,150,1,ColorGray);
00412     MyLCD.vLCDTFTRectangle(218,120,219,150,1,ColorGray);
00413     MyLCD.vLCDTFTRectangle(20,149,219,150,1,ColorBlack);
00414     sprintf((char *)&Fmt[0],"%f",ValorInicial);
00415     vTextoJustificado((const UINT8 *)&Fmt[0],20,219,128,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
00416     
00417     // Dibuja pad Numerico:
00418     for(int k=209;k<289;k+=20){
00419         for(int j=0;j<240;j+=80){
00420             MyLCD.vLCDTFTDrawImage(j,k,WIDTH_TECLAS,HEIGH_TECLAS,LENGTH_TECLAS,&Teclas[0]);
00421             vTextoJustificado(&PtrLetras[Ptr++][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorCian);
00422         }
00423     }
00424     vDibujarMenuInferior("Cancelar","Aceptar",BOTON_NORMAL);
00425     
00426     vSeteamosFuncionEjecutar(vEventosModificadorVariables);
00427 }
00428 
00429 void vEventosModificadorVariables(void){
00430     const UINT8 PtrLetras[12][2]={"7","8","9","4","5","6","1","2","3",".","0","c"};
00431     UINT8 PtrTecla;
00432     float Temp;
00433 
00434     if(kbhit_irq==1){
00435         kbhit_irq=0;
00436         kbhit_tratament=1;
00437         
00438         // Testea Pad Numerico.-
00439         PtrTecla=0;
00440         for(int k=209;k<289;k+=20){
00441             for(int j=0;j<240;j+=80){
00442                 if((Coordenadas.x<(j+74)) && (Coordenadas.x>(j+5)) && (Coordenadas.y<(k+15)) && (Coordenadas.y>(k+5))){
00443                     vTextoJustificado(&PtrLetras[PtrTecla][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorWhite);
00444                     wait_ms(300);
00445                     vTextoJustificado(&PtrLetras[PtrTecla][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorCian);
00446                     // Borrar?
00447                     if(PtrTecla==11){
00448                         if(ModificadorVariable.Ptr!=0){
00449                             ModificadorVariable.Ptr--;
00450                             ModificadorVariable.String[ModificadorVariable.Ptr]='\0';
00451                         }
00452                     }else{
00453                         ModificadorVariable.String[ModificadorVariable.Ptr++]=((UINT8)PtrLetras[PtrTecla][0]);
00454                     }
00455                     MyLCD.vLCDTFTRectangle(22,122,217,148,1,ColorWhite);
00456                     vTextoJustificado((const UINT8 *)&ModificadorVariable.String[0],20,219,128,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
00457                     kbhit_tratament=0;
00458                     return;
00459                 }
00460                 PtrTecla++;
00461             }
00462         }
00463         
00464         if(AREA_BTN_INF_DER()){
00465             vDibujarMenuInferior("Cancelar","Aceptar",BOTON_PRES_DER);
00466             wait_ms(300);
00467             Temp=atof((const char *)&ModificadorVariable.String[0]);
00468             (*ModificadorVariable.FuncionActualEjecucion)(MODIFICADOR_ACEPTAR,Temp);
00469            
00470         }
00471         if(AREA_BTN_INF_IZQ()){
00472             vDibujarMenuInferior("Cancelar","Aceptar",BOTON_PRES_IZQ);
00473             wait_ms(300);
00474             (*ModificadorVariable.FuncionActualEjecucion)(MODIFICADOR_CANCELAR,0.0);
00475         }
00476         kbhit_tratament=0;
00477     }
00478 }
00479 // ************************************************************************************************
00480 void vTextoJustificado(const unsigned char *PtrTexto,unsigned short ExtremoIzq, unsigned short ExtremoDer, unsigned short y, unsigned char Just,const char (*Fuente)[5],unsigned char Alto, unsigned short Color){
00481     unsigned char x,NCaracteres;
00482     const unsigned char *Ptr;
00483 
00484     if(Just!=JUST_IZQ){
00485         for(Ptr=PtrTexto;*Ptr!='\0';Ptr++);
00486         NCaracteres=Ptr - PtrTexto;
00487     }
00488     switch(Just){
00489         case JUST_IZQ:
00490             x=ExtremoIzq+5;
00491         break;
00492         case JUST_DER:
00493             x=ExtremoDer-NCaracteres*(5*Alto+1)-4;
00494         break;
00495         case JUST_CENTRADO:
00496             x=((ExtremoIzq+ExtremoDer-NCaracteres*(5*Alto+1))/2);
00497         break;
00498     }
00499     MyLCD.vLCDTFTText(x,y,(const char *)PtrTexto,Fuente,Alto,Color);
00500 }
00501 /* ** Escribe mensaje en pantalla multilinea justificado ** */
00502 void vEscribirMensaje(unsigned short YInicial,const unsigned char *Mensaje,const char (*Fuente)[5],unsigned char Just, unsigned short Color){
00503     char Texto[50],k,dy=0;
00504     
00505     while(*Mensaje!='\0'){
00506         k=0;
00507         do{
00508             Texto[k++]=*Mensaje++;
00509         }while(*Mensaje!='\0' && *Mensaje!='\n');
00510         if(*Mensaje=='\n') *Mensaje++;
00511         if(k<50){while(k<50){Texto[k++]='\0';}}
00512         vTextoJustificado((const unsigned char *)&Texto[0],0,239,YInicial+dy,Just,Fuente,1,Color);
00513         dy+=11;
00514     }
00515 }
00516 #endif