Menus LCD TFT

Dependents:   Example_Menu_LCD_TFT

Committer:
Suky
Date:
Tue Mar 15 23:23:51 2011 +0000
Revision:
0:310ed2337a8f

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Suky 0:310ed2337a8f 1 /*
Suky 0:310ed2337a8f 2 \file Menus.h
Suky 0:310ed2337a8f 3 \version: 1.0
Suky 0:310ed2337a8f 4
Suky 0:310ed2337a8f 5 \brief Este fichero contiene funciones para creación de Menus es LCD TFT.-
Suky 0:310ed2337a8f 6
Suky 0:310ed2337a8f 7 \web www.micros-designs.com.ar
Suky 0:310ed2337a8f 8 \date 15/03/11
Suky 0:310ed2337a8f 9
Suky 0:310ed2337a8f 10 *- Version Log --------------------------------------------------------------*
Suky 0:310ed2337a8f 11 * Fecha Autor Comentarios *
Suky 0:310ed2337a8f 12 *----------------------------------------------------------------------------*
Suky 0:310ed2337a8f 13 * 15/03/11 Suky Original *
Suky 0:310ed2337a8f 14 *----------------------------------------------------------------------------*/
Suky 0:310ed2337a8f 15 ///////////////////////////////////////////////////////////////////////////
Suky 0:310ed2337a8f 16 //// ////
Suky 0:310ed2337a8f 17 //// ////
Suky 0:310ed2337a8f 18 //// (C) Copyright 2011 www.micros-designs.com.ar ////
Suky 0:310ed2337a8f 19 //// Este código puede ser usado, modificado y distribuido libremente ////
Suky 0:310ed2337a8f 20 //// sin eliminar esta cabecera y sin garantía de ningún tipo. ////
Suky 0:310ed2337a8f 21 //// ////
Suky 0:310ed2337a8f 22 //// ////
Suky 0:310ed2337a8f 23 ///////////////////////////////////////////////////////////////////////////
Suky 0:310ed2337a8f 24 #ifndef __MENUS_H__
Suky 0:310ed2337a8f 25 #define __MENUS_H__
Suky 0:310ed2337a8f 26
Suky 0:310ed2337a8f 27 #include "mbed.h"
Suky 0:310ed2337a8f 28 #include "LCDTFT.h"
Suky 0:310ed2337a8f 29 #include "Touch.h"
Suky 0:310ed2337a8f 30 #include "GenericTypeDefs.h"
Suky 0:310ed2337a8f 31 #include "Images.h"
Suky 0:310ed2337a8f 32
Suky 0:310ed2337a8f 33 // ****************************************************************************************
Suky 0:310ed2337a8f 34 #define TOUCH_X_MIN 20
Suky 0:310ed2337a8f 35 #define TOUCH_X_MAX 230
Suky 0:310ed2337a8f 36 #define TOUCH_Y_MIN 15
Suky 0:310ed2337a8f 37 #define TOUCH_Y_MAX 240
Suky 0:310ed2337a8f 38 // ****************************************************************************************
Suky 0:310ed2337a8f 39 #define MENU_FIN 0
Suky 0:310ed2337a8f 40 #define MENU_COMANDO 1
Suky 0:310ed2337a8f 41 #define MENU_SUBMENU 2
Suky 0:310ed2337a8f 42 #define SUBMENU_ANTERIOR 3
Suky 0:310ed2337a8f 43 #define MENU_MAIN 4
Suky 0:310ed2337a8f 44 // ****************************************************************************************
Suky 0:310ed2337a8f 45 #define MENSAJE_ATRAS_OK 1
Suky 0:310ed2337a8f 46 #define MENSAJE_NO_SI 2
Suky 0:310ed2337a8f 47 #define MENSAJE_ATRAS 3
Suky 0:310ed2337a8f 48
Suky 0:310ed2337a8f 49 #define MENSAJE_ACCION_ATRAS 1
Suky 0:310ed2337a8f 50 #define MENSAJE_ACCION_OK 2
Suky 0:310ed2337a8f 51 #define MENSAJE_ACCION_NO 3
Suky 0:310ed2337a8f 52 #define MENSAJE_ACCION_SI 4
Suky 0:310ed2337a8f 53
Suky 0:310ed2337a8f 54 #define MODIFICADOR_ACEPTAR 1
Suky 0:310ed2337a8f 55 #define MODIFICADOR_CANCELAR 2
Suky 0:310ed2337a8f 56 // ****************************************************************************************
Suky 0:310ed2337a8f 57 #define IMAGEN_FONDO_MENU 10
Suky 0:310ed2337a8f 58 // ****************************************************************************************
Suky 0:310ed2337a8f 59 #define BOTON_NORMAL 1
Suky 0:310ed2337a8f 60 #define BOTON_PRES_IZQ 2
Suky 0:310ed2337a8f 61 #define BOTON_PRES_DER 3
Suky 0:310ed2337a8f 62 #define ITEM_NORMAL 4
Suky 0:310ed2337a8f 63 #define ITEM_PRES 5
Suky 0:310ed2337a8f 64 // ****************************************************************************************
Suky 0:310ed2337a8f 65 #define COLOR_LETRA_BOTON ColorAqua
Suky 0:310ed2337a8f 66 #define COLOR_LETRA_BOTON_PRES ColorWhite
Suky 0:310ed2337a8f 67 #define COLOR_FONDO_LETRA ColorGray
Suky 0:310ed2337a8f 68 #define COLOR_MSJ ColorWhite
Suky 0:310ed2337a8f 69 // ****************************************************************************************
Suky 0:310ed2337a8f 70 #define JUST_IZQ 1
Suky 0:310ed2337a8f 71 #define JUST_DER 2
Suky 0:310ed2337a8f 72 #define JUST_CENTRADO 3
Suky 0:310ed2337a8f 73 // ****************************************************************************************
Suky 0:310ed2337a8f 74 #define AREA_BTN_INF_DER() (Coordenadas.x<235 && Coordenadas.x>135) && (Coordenadas.y<320 && Coordenadas.y>290)
Suky 0:310ed2337a8f 75 #define AREA_BTN_INF_IZQ() (Coordenadas.x<105 && Coordenadas.x>5) && (Coordenadas.y<320 && Coordenadas.y>290)
Suky 0:310ed2337a8f 76 // ****************************************************************************************
Suky 0:310ed2337a8f 77 TouchScreenADS7843 MyTouch(p9,p10,p12,p11,p8); // ADS7843-> SDO,SDI,SCK,CS,IRQ
Suky 0:310ed2337a8f 78 BusOut MyBus(p13,p14,p15,p16,p17,p18,p19,p20,p30,p29,p28,p27,p26,p25,p24,p23);
Suky 0:310ed2337a8f 79 LCDTFT MyLCD(p5,p6,p7,p22,p21,&MyBus);
Suky 0:310ed2337a8f 80 // ****************************************************************************************
Suky 0:310ed2337a8f 81 typedef struct{
Suky 0:310ed2337a8f 82 UINT8 TipoMenu;
Suky 0:310ed2337a8f 83 const UINT8 *TextoMenu;
Suky 0:310ed2337a8f 84 UINT8 *Menu;
Suky 0:310ed2337a8f 85 void (*PtrFuncionSeleccion)(void);
Suky 0:310ed2337a8f 86 const UINT16 *PtrIcono;
Suky 0:310ed2337a8f 87 }MENU;
Suky 0:310ed2337a8f 88 // ****************************************************************************************
Suky 0:310ed2337a8f 89 struct{
Suky 0:310ed2337a8f 90 const MENU *PtrMenu;
Suky 0:310ed2337a8f 91 UINT8 ElementoSeleccionActual;
Suky 0:310ed2337a8f 92 void (*FuncionActualEjecucion)(void);
Suky 0:310ed2337a8f 93 UINT8 CantElementosMenu;
Suky 0:310ed2337a8f 94 }MenuActual;
Suky 0:310ed2337a8f 95 // ****************************************************************************************
Suky 0:310ed2337a8f 96 struct{
Suky 0:310ed2337a8f 97 float ValorInicial;
Suky 0:310ed2337a8f 98 float ValorActual;
Suky 0:310ed2337a8f 99 UINT8 String[15];
Suky 0:310ed2337a8f 100 UINT8 Ptr;
Suky 0:310ed2337a8f 101 void (*FuncionActualEjecucion)(UINT8,float);
Suky 0:310ed2337a8f 102 }ModificadorVariable;
Suky 0:310ed2337a8f 103 // ****************************************************************************************
Suky 0:310ed2337a8f 104 struct{
Suky 0:310ed2337a8f 105 UINT8 TipoMensajePantalla;
Suky 0:310ed2337a8f 106 void (*MensajeFuncionEjecutar)(UINT8);
Suky 0:310ed2337a8f 107 }MensajePantalla;
Suky 0:310ed2337a8f 108 // ****************************************************************************************
Suky 0:310ed2337a8f 109 TOUCH_DATA Coordenadas;
Suky 0:310ed2337a8f 110 volatile bool kbhit_irq=0;
Suky 0:310ed2337a8f 111 volatile bool kbhit_tratament=0;
Suky 0:310ed2337a8f 112 // ****************************************************************************************
Suky 0:310ed2337a8f 113 void vSeteoFuncionEjecutar(void (*PtrNuevaFuncion)(void));
Suky 0:310ed2337a8f 114 void vEjecutaEventosMenu(void);
Suky 0:310ed2337a8f 115 void vSeleccionarMenuAnterior(void);
Suky 0:310ed2337a8f 116 void vSeleccionMenu(const MENU *Menu,UINT8 ElementoMenuSeleccion);
Suky 0:310ed2337a8f 117 void vEventosSubMenu(void);
Suky 0:310ed2337a8f 118 void vDibujarImagenFondo(UINT8 Seleccion);
Suky 0:310ed2337a8f 119 void vDibujarMenuInferior(const UINT8 *TextoIzq,const UINT8 *TextoDer, UINT8 Status);
Suky 0:310ed2337a8f 120 void vDibujarElementoMenu(UINT8 NElemento,UINT8 Status);
Suky 0:310ed2337a8f 121 void vMensajePantalla(const UINT8 *Mensaje,UINT16 YInicial,UINT8 TipoMensaje,void (*FuncionEjecutar)(UINT8));
Suky 0:310ed2337a8f 122 void vEventosPantallaMensaje(void);
Suky 0:310ed2337a8f 123 void vModificadorVariables(const UINT8 *NombreVariable,float ValorInicial,void (*PtrFuncion)(UINT8,float));
Suky 0:310ed2337a8f 124 void vEventosModificadorVariables(void);
Suky 0:310ed2337a8f 125 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);
Suky 0:310ed2337a8f 126 void vEscribirMensaje(unsigned short YInicial,const unsigned char *Mensaje,const char (*Fuente)[5],unsigned char Just, unsigned short Color);
Suky 0:310ed2337a8f 127 // ****************************************************************************************
Suky 0:310ed2337a8f 128 // Rutina de atencion de interrupcion.-
Suky 0:310ed2337a8f 129 void vISRTouchIRQ(){
Suky 0:310ed2337a8f 130 UINT_COORDxy Temp;
Suky 0:310ed2337a8f 131
Suky 0:310ed2337a8f 132
Suky 0:310ed2337a8f 133 MyTouch.vTestTouchPanel(&Coordenadas);
Suky 0:310ed2337a8f 134 // Coordenadas dentro del rango de pantalla LCD:
Suky 0:310ed2337a8f 135 if((Coordenadas.x>TOUCH_X_MIN && Coordenadas.x<TOUCH_X_MAX) && (Coordenadas.y>TOUCH_Y_MIN && Coordenadas.y<TOUCH_Y_MAX)){
Suky 0:310ed2337a8f 136 if(kbhit_tratament==0){
Suky 0:310ed2337a8f 137 // Cambio de coordenda y escala:
Suky 0:310ed2337a8f 138 Temp=Coordenadas.y;
Suky 0:310ed2337a8f 139 Coordenadas.y=((float)((255.0-TOUCH_X_MIN)-Coordenadas.x)*(320.0/(TOUCH_X_MAX-TOUCH_X_MIN)));
Suky 0:310ed2337a8f 140 Coordenadas.x=((float)(Temp-TOUCH_Y_MIN)*(240.0/(TOUCH_Y_MAX-TOUCH_Y_MIN)));
Suky 0:310ed2337a8f 141 kbhit_irq=1;
Suky 0:310ed2337a8f 142 }
Suky 0:310ed2337a8f 143 }
Suky 0:310ed2337a8f 144 }
Suky 0:310ed2337a8f 145 // ****************************************************************************************
Suky 0:310ed2337a8f 146 void vInitLCDTFTAndTouch(void){
Suky 0:310ed2337a8f 147 MyTouch.vInitADS7843(USE_8BITS,&vISRTouchIRQ);
Suky 0:310ed2337a8f 148 MyLCD.vLCDTFTInit();
Suky 0:310ed2337a8f 149 Led1=0;
Suky 0:310ed2337a8f 150 Led2=0;
Suky 0:310ed2337a8f 151 }
Suky 0:310ed2337a8f 152 // ****************************************************************************************
Suky 0:310ed2337a8f 153 // ****************************************************************************************
Suky 0:310ed2337a8f 154 /* ** Se carga en puntero la funcion que se ejecutara dentro del while ** */
Suky 0:310ed2337a8f 155 void vSeteamosFuncionEjecutar(void (*PtrNuevaFuncion)(void)){
Suky 0:310ed2337a8f 156 MenuActual.FuncionActualEjecucion = PtrNuevaFuncion;
Suky 0:310ed2337a8f 157 }
Suky 0:310ed2337a8f 158 /* ** Ejecuta funcion que se encuentra apuntada ** */
Suky 0:310ed2337a8f 159 void vEjecutaEventosMenu(void){
Suky 0:310ed2337a8f 160 (*MenuActual.FuncionActualEjecucion)();
Suky 0:310ed2337a8f 161 }
Suky 0:310ed2337a8f 162 /* ** Selecciona Menu anterior a mostrar despues de un comando ** */
Suky 0:310ed2337a8f 163 void vSeleccionarMenuAnterior(void){
Suky 0:310ed2337a8f 164 vSeleccionMenu(MenuActual.PtrMenu,MenuActual.ElementoSeleccionActual);
Suky 0:310ed2337a8f 165 }
Suky 0:310ed2337a8f 166
Suky 0:310ed2337a8f 167 /* ** Selecciona y dibuja un submenu, luego carga en puntero funcion que atiende sus eventos ** */
Suky 0:310ed2337a8f 168 void vSeleccionMenu(const MENU *Menu,UINT8 ElementoMenuSeleccion){
Suky 0:310ed2337a8f 169 UINT8 NElemento;
Suky 0:310ed2337a8f 170
Suky 0:310ed2337a8f 171 /* ** Guardamos el Menu actual que se visualiza y trabaja ** */
Suky 0:310ed2337a8f 172 MenuActual.PtrMenu=Menu;
Suky 0:310ed2337a8f 173 MenuActual.ElementoSeleccionActual=ElementoMenuSeleccion;
Suky 0:310ed2337a8f 174
Suky 0:310ed2337a8f 175 /* ** Borramos pantalla y dibujamos elementos del menu** */
Suky 0:310ed2337a8f 176 vDibujarImagenFondo(IMAGEN_FONDO_MENU);
Suky 0:310ed2337a8f 177
Suky 0:310ed2337a8f 178 /* ** Dibujamos barra con titulo ** */
Suky 0:310ed2337a8f 179 MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]);
Suky 0:310ed2337a8f 180 vTextoJustificado(MenuActual.PtrMenu[0].TextoMenu,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
Suky 0:310ed2337a8f 181 /* ** Dibujamos Items ** */
Suky 0:310ed2337a8f 182 NElemento=1;
Suky 0:310ed2337a8f 183 while(MenuActual.PtrMenu[NElemento].TipoMenu!=MENU_FIN){
Suky 0:310ed2337a8f 184 vDibujarElementoMenu(NElemento-1,ITEM_NORMAL);
Suky 0:310ed2337a8f 185 NElemento++;
Suky 0:310ed2337a8f 186 }
Suky 0:310ed2337a8f 187 MenuActual.CantElementosMenu=NElemento-1;
Suky 0:310ed2337a8f 188
Suky 0:310ed2337a8f 189 if(MenuActual.PtrMenu[0].TipoMenu==MENU_MAIN){
Suky 0:310ed2337a8f 190 vDibujarMenuInferior(" ","Menu",BOTON_NORMAL);
Suky 0:310ed2337a8f 191 }else{
Suky 0:310ed2337a8f 192 vDibujarMenuInferior("Atras"," ",BOTON_NORMAL);
Suky 0:310ed2337a8f 193 }
Suky 0:310ed2337a8f 194 /* ** Cargamos en puntero funci&#65533;n que atiende eventos del Submenu (Funci&#65533;n en while del main)** */
Suky 0:310ed2337a8f 195 vSeteamosFuncionEjecutar(vEventosSubMenu);
Suky 0:310ed2337a8f 196 }
Suky 0:310ed2337a8f 197
Suky 0:310ed2337a8f 198 void vDibujarImagenFondo(UINT8 Seleccion){
Suky 0:310ed2337a8f 199
Suky 0:310ed2337a8f 200 switch(Seleccion){
Suky 0:310ed2337a8f 201 case IMAGEN_FONDO_MENU:
Suky 0:310ed2337a8f 202 for(short k=0;k<320;k+=10){
Suky 0:310ed2337a8f 203 MyLCD.vLCDTFTDrawImage(0,k,WIDTH_FONDO,HEIGH_FONDO,LENGTH_FONDO,&Fondo[0]);
Suky 0:310ed2337a8f 204 }
Suky 0:310ed2337a8f 205 break;
Suky 0:310ed2337a8f 206 }
Suky 0:310ed2337a8f 207 }
Suky 0:310ed2337a8f 208 /* ** Dibuja barra inferior de botones ** */
Suky 0:310ed2337a8f 209 void vDibujarMenuInferior(const UINT8 *TextoIzq,const UINT8 *TextoDer, UINT8 Status){
Suky 0:310ed2337a8f 210
Suky 0:310ed2337a8f 211
Suky 0:310ed2337a8f 212 switch(Status){
Suky 0:310ed2337a8f 213 case BOTON_PRES_IZQ:
Suky 0:310ed2337a8f 214 vTextoJustificado(TextoIzq,5,105,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON_PRES);
Suky 0:310ed2337a8f 215 break;
Suky 0:310ed2337a8f 216 case BOTON_PRES_DER:
Suky 0:310ed2337a8f 217 vTextoJustificado(TextoDer,135,234,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON_PRES);
Suky 0:310ed2337a8f 218 break;
Suky 0:310ed2337a8f 219 case BOTON_NORMAL:
Suky 0:310ed2337a8f 220 MyLCD.vLCDTFTDrawImage(0,289,WIDTH_BOTONES,HEIGH_BOTONES,LENGTH_BOTONES,&Botones[0]);
Suky 0:310ed2337a8f 221 vTextoJustificado(TextoIzq,5,105,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON);
Suky 0:310ed2337a8f 222 vTextoJustificado(TextoDer,135,234,296,JUST_CENTRADO,&ARIAL[0],2,COLOR_LETRA_BOTON);
Suky 0:310ed2337a8f 223 break;
Suky 0:310ed2337a8f 224 }
Suky 0:310ed2337a8f 225 }
Suky 0:310ed2337a8f 226 /* ** Dibuja elementos del submenu ** */
Suky 0:310ed2337a8f 227 void vDibujarElementoMenu(UINT8 NElemento,UINT8 Status){
Suky 0:310ed2337a8f 228
Suky 0:310ed2337a8f 229 if(Status==ITEM_NORMAL){
Suky 0:310ed2337a8f 230 if((NElemento%2)==0){
Suky 0:310ed2337a8f 231 MyLCD.vLCDTFTDrawImage(35,28+((((NElemento+2)/2)-1)*65),WIDTH_ICONO,HEIGH_ICONO,LENGTH_ICONO,MenuActual.PtrMenu[NElemento+1].PtrIcono);
Suky 0:310ed2337a8f 232 MyLCD.vLCDTFTRectangle(5,81+((((NElemento+2)/2)-1)*65),114,90+((((NElemento+2)/2)-1)*65),1,COLOR_FONDO_LETRA);
Suky 0:310ed2337a8f 233 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,5,114,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON);
Suky 0:310ed2337a8f 234 }else{
Suky 0:310ed2337a8f 235 MyLCD.vLCDTFTDrawImage(155,28+((((NElemento+2)/2)-1)*65),WIDTH_ICONO,HEIGH_ICONO,LENGTH_ICONO,MenuActual.PtrMenu[NElemento+1].PtrIcono);
Suky 0:310ed2337a8f 236 MyLCD.vLCDTFTRectangle(125,81+((((NElemento+2)/2)-1)*65),234,90+((((NElemento+2)/2)-1)*65),1,COLOR_FONDO_LETRA);
Suky 0:310ed2337a8f 237 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,125,234,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON);
Suky 0:310ed2337a8f 238 }
Suky 0:310ed2337a8f 239 }else{
Suky 0:310ed2337a8f 240 if((NElemento%2)==0){
Suky 0:310ed2337a8f 241 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,5,114,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON_PRES);
Suky 0:310ed2337a8f 242 }else{
Suky 0:310ed2337a8f 243 vTextoJustificado(MenuActual.PtrMenu[NElemento+1].TextoMenu,125,234,82+((((NElemento+2)/2)-1)*65),JUST_CENTRADO,&ARIAL[0],1,COLOR_LETRA_BOTON_PRES);
Suky 0:310ed2337a8f 244 }
Suky 0:310ed2337a8f 245 }
Suky 0:310ed2337a8f 246 }
Suky 0:310ed2337a8f 247 // ****************************************************************************************
Suky 0:310ed2337a8f 248 // ****************************************************************************************
Suky 0:310ed2337a8f 249 void vEventosSubMenu(void){
Suky 0:310ed2337a8f 250 const MENU *SubMenu;
Suky 0:310ed2337a8f 251 void (*PtrComando)(void);
Suky 0:310ed2337a8f 252
Suky 0:310ed2337a8f 253 if(kbhit_irq==1){
Suky 0:310ed2337a8f 254 kbhit_irq=0;
Suky 0:310ed2337a8f 255 kbhit_tratament=1;
Suky 0:310ed2337a8f 256
Suky 0:310ed2337a8f 257 if(MenuActual.PtrMenu[0].TipoMenu==MENU_MAIN){
Suky 0:310ed2337a8f 258 if(AREA_BTN_INF_DER()){
Suky 0:310ed2337a8f 259 vDibujarMenuInferior(" ","Menu",BOTON_PRES_DER);
Suky 0:310ed2337a8f 260 wait_ms(300);
Suky 0:310ed2337a8f 261 SubMenu=(MENU *)MenuActual.PtrMenu[0].Menu;
Suky 0:310ed2337a8f 262 vSeleccionMenu(SubMenu,1);
Suky 0:310ed2337a8f 263 }
Suky 0:310ed2337a8f 264 kbhit_tratament=0;
Suky 0:310ed2337a8f 265 }else{
Suky 0:310ed2337a8f 266 for(char k=0;k<MenuActual.CantElementosMenu;k++){
Suky 0:310ed2337a8f 267 if((k%2)==0){
Suky 0:310ed2337a8f 268 if((Coordenadas.x<85 && Coordenadas.x>35) && (Coordenadas.y<(78+((((k+2)/2)-1)*65)) && Coordenadas.y>(28+((((k+2)/2)-1)*65)))){
Suky 0:310ed2337a8f 269 vDibujarElementoMenu(k,ITEM_PRES);
Suky 0:310ed2337a8f 270 wait_ms(300);
Suky 0:310ed2337a8f 271 MenuActual.ElementoSeleccionActual=k+1;
Suky 0:310ed2337a8f 272 /* ** Abrimos otro submenu o ejecutamos comando ** */
Suky 0:310ed2337a8f 273 switch(MenuActual.PtrMenu[k+1].TipoMenu){
Suky 0:310ed2337a8f 274 case MENU_COMANDO:
Suky 0:310ed2337a8f 275 PtrComando=(void(*)(void))MenuActual.PtrMenu[k+1].PtrFuncionSeleccion;
Suky 0:310ed2337a8f 276 kbhit_tratament=0;
Suky 0:310ed2337a8f 277 if(PtrComando!=NULL) (*PtrComando)();
Suky 0:310ed2337a8f 278 break;
Suky 0:310ed2337a8f 279 case MENU_SUBMENU:
Suky 0:310ed2337a8f 280 SubMenu=(MENU *)MenuActual.PtrMenu[k+1].Menu;
Suky 0:310ed2337a8f 281 vSeleccionMenu(SubMenu,1);
Suky 0:310ed2337a8f 282 break;
Suky 0:310ed2337a8f 283 }
Suky 0:310ed2337a8f 284 }
Suky 0:310ed2337a8f 285 }else{
Suky 0:310ed2337a8f 286 if((Coordenadas.x<205 && Coordenadas.x>155) && (Coordenadas.y<(78+((((k+2)/2)-1)*65)) && Coordenadas.y>(28+((((k+2)/2)-1)*65)))){
Suky 0:310ed2337a8f 287 vDibujarElementoMenu(k,ITEM_PRES);
Suky 0:310ed2337a8f 288 wait_ms(300);
Suky 0:310ed2337a8f 289 MenuActual.ElementoSeleccionActual=k+1;
Suky 0:310ed2337a8f 290 /* ** Abrimos otro submenu o ejecutamos comando ** */
Suky 0:310ed2337a8f 291 switch(MenuActual.PtrMenu[k+1].TipoMenu){
Suky 0:310ed2337a8f 292 case MENU_COMANDO:
Suky 0:310ed2337a8f 293 PtrComando=(void(*)(void))MenuActual.PtrMenu[k+1].PtrFuncionSeleccion;
Suky 0:310ed2337a8f 294 kbhit_tratament=0;
Suky 0:310ed2337a8f 295 if(PtrComando!=NULL) (*PtrComando)();
Suky 0:310ed2337a8f 296 break;
Suky 0:310ed2337a8f 297 case MENU_SUBMENU:
Suky 0:310ed2337a8f 298 SubMenu=(MENU *)MenuActual.PtrMenu[k+1].Menu;
Suky 0:310ed2337a8f 299 vSeleccionMenu(SubMenu,1);
Suky 0:310ed2337a8f 300 break;
Suky 0:310ed2337a8f 301 }
Suky 0:310ed2337a8f 302 }
Suky 0:310ed2337a8f 303 }
Suky 0:310ed2337a8f 304 }
Suky 0:310ed2337a8f 305
Suky 0:310ed2337a8f 306 if(AREA_BTN_INF_IZQ()){
Suky 0:310ed2337a8f 307 vDibujarMenuInferior("Atras"," ",BOTON_PRES_IZQ);
Suky 0:310ed2337a8f 308 wait_ms(300);
Suky 0:310ed2337a8f 309 SubMenu=(MENU *)MenuActual.PtrMenu[0].Menu;
Suky 0:310ed2337a8f 310 vSeleccionMenu(SubMenu,1);
Suky 0:310ed2337a8f 311 }
Suky 0:310ed2337a8f 312 kbhit_tratament=0;
Suky 0:310ed2337a8f 313 }
Suky 0:310ed2337a8f 314 }
Suky 0:310ed2337a8f 315 }
Suky 0:310ed2337a8f 316 // ********************************************************************************************************************************
Suky 0:310ed2337a8f 317 // ****************************************** MENSAJES EN PANTALLA ****************************************************************
Suky 0:310ed2337a8f 318 // ********************************************************************************************************************************
Suky 0:310ed2337a8f 319 /* ** Se escribe un mensaje en pantalla para elemento del tipo comando, presentando en barra inferior opcion a elegir ** */
Suky 0:310ed2337a8f 320 void vMensajePantalla(const UINT8 *Mensaje,UINT16 YInicial,UINT8 TipoMensaje,void (*FuncionEjecutar)(UINT8)){
Suky 0:310ed2337a8f 321
Suky 0:310ed2337a8f 322 MensajePantalla.MensajeFuncionEjecutar=FuncionEjecutar;
Suky 0:310ed2337a8f 323 MensajePantalla.TipoMensajePantalla=TipoMensaje;
Suky 0:310ed2337a8f 324
Suky 0:310ed2337a8f 325 vDibujarImagenFondo(IMAGEN_FONDO_MENU);
Suky 0:310ed2337a8f 326 MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]);
Suky 0:310ed2337a8f 327 vTextoJustificado(MenuActual.PtrMenu[MenuActual.ElementoSeleccionActual].TextoMenu,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
Suky 0:310ed2337a8f 328
Suky 0:310ed2337a8f 329 MyLCD.vLCDTFTRectangle(5,30,234,284,1,ColorGray);
Suky 0:310ed2337a8f 330 MyLCD.vLCDTFTRectangle(5,30,234,31,1,ColorWhite);
Suky 0:310ed2337a8f 331 MyLCD.vLCDTFTRectangle(5,283,234,284,1,ColorBlack);
Suky 0:310ed2337a8f 332 MyLCD.vLCDTFTRectangle(5,30,6,284,1,ColorWhite);
Suky 0:310ed2337a8f 333 MyLCD.vLCDTFTRectangle(233,30,234,284,1,ColorWhite);
Suky 0:310ed2337a8f 334
Suky 0:310ed2337a8f 335 vEscribirMensaje(YInicial,Mensaje,&ARIAL[0],JUST_CENTRADO,COLOR_MSJ);
Suky 0:310ed2337a8f 336
Suky 0:310ed2337a8f 337 switch(TipoMensaje){
Suky 0:310ed2337a8f 338 case MENSAJE_ATRAS_OK:
Suky 0:310ed2337a8f 339 vDibujarMenuInferior("Atras", "Ok",BOTON_NORMAL);
Suky 0:310ed2337a8f 340 break;
Suky 0:310ed2337a8f 341 case MENSAJE_NO_SI:
Suky 0:310ed2337a8f 342 vDibujarMenuInferior("No", "Si",BOTON_NORMAL);
Suky 0:310ed2337a8f 343 break;
Suky 0:310ed2337a8f 344 case MENSAJE_ATRAS:
Suky 0:310ed2337a8f 345 vDibujarMenuInferior("Atras", " ",BOTON_NORMAL);
Suky 0:310ed2337a8f 346 break;
Suky 0:310ed2337a8f 347 }
Suky 0:310ed2337a8f 348 vSeteamosFuncionEjecutar(vEventosPantallaMensaje);
Suky 0:310ed2337a8f 349 }
Suky 0:310ed2337a8f 350
Suky 0:310ed2337a8f 351 /* ** Se atiende eventos de pantalla con mensaje ** */
Suky 0:310ed2337a8f 352 void vEventosPantallaMensaje(void){
Suky 0:310ed2337a8f 353 UINT8 AccionPulsIzq,AccionPulsDer;
Suky 0:310ed2337a8f 354 const UINT8 *TextDer,*TextIzq;
Suky 0:310ed2337a8f 355
Suky 0:310ed2337a8f 356 switch(MensajePantalla.TipoMensajePantalla){
Suky 0:310ed2337a8f 357 case MENSAJE_ATRAS_OK:
Suky 0:310ed2337a8f 358 AccionPulsIzq = MENSAJE_ACCION_ATRAS;
Suky 0:310ed2337a8f 359 AccionPulsDer = MENSAJE_ACCION_OK;
Suky 0:310ed2337a8f 360 TextDer="Atras";
Suky 0:310ed2337a8f 361 TextIzq="Ok";
Suky 0:310ed2337a8f 362 break;
Suky 0:310ed2337a8f 363
Suky 0:310ed2337a8f 364 case MENSAJE_NO_SI:
Suky 0:310ed2337a8f 365 AccionPulsIzq = MENSAJE_ACCION_NO;
Suky 0:310ed2337a8f 366 AccionPulsDer = MENSAJE_ACCION_SI;
Suky 0:310ed2337a8f 367 TextDer="No";
Suky 0:310ed2337a8f 368 TextIzq="Si";
Suky 0:310ed2337a8f 369 break;
Suky 0:310ed2337a8f 370
Suky 0:310ed2337a8f 371 default:
Suky 0:310ed2337a8f 372 AccionPulsIzq = MENSAJE_ACCION_ATRAS;
Suky 0:310ed2337a8f 373 AccionPulsDer = MENSAJE_ACCION_ATRAS;
Suky 0:310ed2337a8f 374 TextDer="Atras";
Suky 0:310ed2337a8f 375 TextIzq=" ";
Suky 0:310ed2337a8f 376 }
Suky 0:310ed2337a8f 377 if(kbhit_irq==1){
Suky 0:310ed2337a8f 378 kbhit_irq=0;
Suky 0:310ed2337a8f 379 kbhit_tratament=1;
Suky 0:310ed2337a8f 380
Suky 0:310ed2337a8f 381 if(AREA_BTN_INF_DER()){
Suky 0:310ed2337a8f 382 vDibujarMenuInferior(TextIzq,TextDer,BOTON_PRES_DER);
Suky 0:310ed2337a8f 383 wait_ms(300);
Suky 0:310ed2337a8f 384 (*MensajePantalla.MensajeFuncionEjecutar)(AccionPulsIzq);
Suky 0:310ed2337a8f 385 }
Suky 0:310ed2337a8f 386 if(AREA_BTN_INF_IZQ()){
Suky 0:310ed2337a8f 387 vDibujarMenuInferior(TextIzq,TextDer,BOTON_PRES_IZQ);
Suky 0:310ed2337a8f 388 wait_ms(300);
Suky 0:310ed2337a8f 389 (*MensajePantalla.MensajeFuncionEjecutar)(AccionPulsDer);
Suky 0:310ed2337a8f 390 }
Suky 0:310ed2337a8f 391 kbhit_tratament=0;
Suky 0:310ed2337a8f 392 }
Suky 0:310ed2337a8f 393 }
Suky 0:310ed2337a8f 394
Suky 0:310ed2337a8f 395 void vModificadorVariables(const UINT8 *NombreVariable,float ValorInicial,void (*PtrFuncion)(UINT8,float)){
Suky 0:310ed2337a8f 396 const UINT8 PtrLetras[13][2]={"7","8","9","4","5","6","1","2","3",".","0","c"};
Suky 0:310ed2337a8f 397 UINT8 Ptr=0,Fmt[30];
Suky 0:310ed2337a8f 398
Suky 0:310ed2337a8f 399 ModificadorVariable.ValorInicial=ValorInicial;
Suky 0:310ed2337a8f 400 ModificadorVariable.ValorActual=0.0;
Suky 0:310ed2337a8f 401 memset(&ModificadorVariable.String[0],0,15);
Suky 0:310ed2337a8f 402 ModificadorVariable.Ptr=0;
Suky 0:310ed2337a8f 403 ModificadorVariable.FuncionActualEjecucion=PtrFuncion;
Suky 0:310ed2337a8f 404
Suky 0:310ed2337a8f 405 vDibujarImagenFondo(IMAGEN_FONDO_MENU);
Suky 0:310ed2337a8f 406 MyLCD.vLCDTFTDrawImage(0,0,WIDTH_TITULO,HEIGH_TITULO,LENGTH_TITULO,&Titulo[0]);
Suky 0:310ed2337a8f 407 vTextoJustificado(NombreVariable,5,234,4,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
Suky 0:310ed2337a8f 408
Suky 0:310ed2337a8f 409 MyLCD.vLCDTFTRectangle(22,122,217,148,1,ColorWhite);
Suky 0:310ed2337a8f 410 MyLCD.vLCDTFTRectangle(20,120,219,121,1,ColorGray);
Suky 0:310ed2337a8f 411 MyLCD.vLCDTFTRectangle(20,120,21,150,1,ColorGray);
Suky 0:310ed2337a8f 412 MyLCD.vLCDTFTRectangle(218,120,219,150,1,ColorGray);
Suky 0:310ed2337a8f 413 MyLCD.vLCDTFTRectangle(20,149,219,150,1,ColorBlack);
Suky 0:310ed2337a8f 414 sprintf((char *)&Fmt[0],"%f",ValorInicial);
Suky 0:310ed2337a8f 415 vTextoJustificado((const UINT8 *)&Fmt[0],20,219,128,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
Suky 0:310ed2337a8f 416
Suky 0:310ed2337a8f 417 // Dibuja pad Numerico:
Suky 0:310ed2337a8f 418 for(int k=209;k<289;k+=20){
Suky 0:310ed2337a8f 419 for(int j=0;j<240;j+=80){
Suky 0:310ed2337a8f 420 MyLCD.vLCDTFTDrawImage(j,k,WIDTH_TECLAS,HEIGH_TECLAS,LENGTH_TECLAS,&Teclas[0]);
Suky 0:310ed2337a8f 421 vTextoJustificado(&PtrLetras[Ptr++][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorCian);
Suky 0:310ed2337a8f 422 }
Suky 0:310ed2337a8f 423 }
Suky 0:310ed2337a8f 424 vDibujarMenuInferior("Cancelar","Aceptar",BOTON_NORMAL);
Suky 0:310ed2337a8f 425
Suky 0:310ed2337a8f 426 vSeteamosFuncionEjecutar(vEventosModificadorVariables);
Suky 0:310ed2337a8f 427 }
Suky 0:310ed2337a8f 428
Suky 0:310ed2337a8f 429 void vEventosModificadorVariables(void){
Suky 0:310ed2337a8f 430 const UINT8 PtrLetras[12][2]={"7","8","9","4","5","6","1","2","3",".","0","c"};
Suky 0:310ed2337a8f 431 UINT8 PtrTecla;
Suky 0:310ed2337a8f 432 float Temp;
Suky 0:310ed2337a8f 433
Suky 0:310ed2337a8f 434 if(kbhit_irq==1){
Suky 0:310ed2337a8f 435 kbhit_irq=0;
Suky 0:310ed2337a8f 436 kbhit_tratament=1;
Suky 0:310ed2337a8f 437
Suky 0:310ed2337a8f 438 // Testea Pad Numerico.-
Suky 0:310ed2337a8f 439 PtrTecla=0;
Suky 0:310ed2337a8f 440 for(int k=209;k<289;k+=20){
Suky 0:310ed2337a8f 441 for(int j=0;j<240;j+=80){
Suky 0:310ed2337a8f 442 if((Coordenadas.x<(j+74)) && (Coordenadas.x>(j+5)) && (Coordenadas.y<(k+15)) && (Coordenadas.y>(k+5))){
Suky 0:310ed2337a8f 443 vTextoJustificado(&PtrLetras[PtrTecla][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorWhite);
Suky 0:310ed2337a8f 444 wait_ms(300);
Suky 0:310ed2337a8f 445 vTextoJustificado(&PtrLetras[PtrTecla][0],j,j+79,k+3,JUST_CENTRADO,&ARIAL[0],2,ColorCian);
Suky 0:310ed2337a8f 446 // Borrar?
Suky 0:310ed2337a8f 447 if(PtrTecla==11){
Suky 0:310ed2337a8f 448 if(ModificadorVariable.Ptr!=0){
Suky 0:310ed2337a8f 449 ModificadorVariable.Ptr--;
Suky 0:310ed2337a8f 450 ModificadorVariable.String[ModificadorVariable.Ptr]='\0';
Suky 0:310ed2337a8f 451 }
Suky 0:310ed2337a8f 452 }else{
Suky 0:310ed2337a8f 453 ModificadorVariable.String[ModificadorVariable.Ptr++]=((UINT8)PtrLetras[PtrTecla][0]);
Suky 0:310ed2337a8f 454 }
Suky 0:310ed2337a8f 455 MyLCD.vLCDTFTRectangle(22,122,217,148,1,ColorWhite);
Suky 0:310ed2337a8f 456 vTextoJustificado((const UINT8 *)&ModificadorVariable.String[0],20,219,128,JUST_CENTRADO,&ARIAL[0],2,ColorAzulMarino);
Suky 0:310ed2337a8f 457 kbhit_tratament=0;
Suky 0:310ed2337a8f 458 return;
Suky 0:310ed2337a8f 459 }
Suky 0:310ed2337a8f 460 PtrTecla++;
Suky 0:310ed2337a8f 461 }
Suky 0:310ed2337a8f 462 }
Suky 0:310ed2337a8f 463
Suky 0:310ed2337a8f 464 if(AREA_BTN_INF_DER()){
Suky 0:310ed2337a8f 465 vDibujarMenuInferior("Cancelar","Aceptar",BOTON_PRES_DER);
Suky 0:310ed2337a8f 466 wait_ms(300);
Suky 0:310ed2337a8f 467 Temp=atof((const char *)&ModificadorVariable.String[0]);
Suky 0:310ed2337a8f 468 (*ModificadorVariable.FuncionActualEjecucion)(MODIFICADOR_ACEPTAR,Temp);
Suky 0:310ed2337a8f 469
Suky 0:310ed2337a8f 470 }
Suky 0:310ed2337a8f 471 if(AREA_BTN_INF_IZQ()){
Suky 0:310ed2337a8f 472 vDibujarMenuInferior("Cancelar","Aceptar",BOTON_PRES_IZQ);
Suky 0:310ed2337a8f 473 wait_ms(300);
Suky 0:310ed2337a8f 474 (*ModificadorVariable.FuncionActualEjecucion)(MODIFICADOR_CANCELAR,0.0);
Suky 0:310ed2337a8f 475 }
Suky 0:310ed2337a8f 476 kbhit_tratament=0;
Suky 0:310ed2337a8f 477 }
Suky 0:310ed2337a8f 478 }
Suky 0:310ed2337a8f 479 // ************************************************************************************************
Suky 0:310ed2337a8f 480 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){
Suky 0:310ed2337a8f 481 unsigned char x,NCaracteres;
Suky 0:310ed2337a8f 482 const unsigned char *Ptr;
Suky 0:310ed2337a8f 483
Suky 0:310ed2337a8f 484 if(Just!=JUST_IZQ){
Suky 0:310ed2337a8f 485 for(Ptr=PtrTexto;*Ptr!='\0';Ptr++);
Suky 0:310ed2337a8f 486 NCaracteres=Ptr - PtrTexto;
Suky 0:310ed2337a8f 487 }
Suky 0:310ed2337a8f 488 switch(Just){
Suky 0:310ed2337a8f 489 case JUST_IZQ:
Suky 0:310ed2337a8f 490 x=ExtremoIzq+5;
Suky 0:310ed2337a8f 491 break;
Suky 0:310ed2337a8f 492 case JUST_DER:
Suky 0:310ed2337a8f 493 x=ExtremoDer-NCaracteres*(5*Alto+1)-4;
Suky 0:310ed2337a8f 494 break;
Suky 0:310ed2337a8f 495 case JUST_CENTRADO:
Suky 0:310ed2337a8f 496 x=((ExtremoIzq+ExtremoDer-NCaracteres*(5*Alto+1))/2);
Suky 0:310ed2337a8f 497 break;
Suky 0:310ed2337a8f 498 }
Suky 0:310ed2337a8f 499 MyLCD.vLCDTFTText(x,y,(const char *)PtrTexto,Fuente,Alto,Color);
Suky 0:310ed2337a8f 500 }
Suky 0:310ed2337a8f 501 /* ** Escribe mensaje en pantalla multilinea justificado ** */
Suky 0:310ed2337a8f 502 void vEscribirMensaje(unsigned short YInicial,const unsigned char *Mensaje,const char (*Fuente)[5],unsigned char Just, unsigned short Color){
Suky 0:310ed2337a8f 503 char Texto[50],k,dy=0;
Suky 0:310ed2337a8f 504
Suky 0:310ed2337a8f 505 while(*Mensaje!='\0'){
Suky 0:310ed2337a8f 506 k=0;
Suky 0:310ed2337a8f 507 do{
Suky 0:310ed2337a8f 508 Texto[k++]=*Mensaje++;
Suky 0:310ed2337a8f 509 }while(*Mensaje!='\0' && *Mensaje!='\n');
Suky 0:310ed2337a8f 510 if(*Mensaje=='\n') *Mensaje++;
Suky 0:310ed2337a8f 511 if(k<50){while(k<50){Texto[k++]='\0';}}
Suky 0:310ed2337a8f 512 vTextoJustificado((const unsigned char *)&Texto[0],0,239,YInicial+dy,Just,Fuente,1,Color);
Suky 0:310ed2337a8f 513 dy+=11;
Suky 0:310ed2337a8f 514 }
Suky 0:310ed2337a8f 515 }
Suky 0:310ed2337a8f 516 #endif