Versión sin post-procesado del software del VmRideR
Dependencies: mbed
ScreenManager/Teclado.cpp
- Committer:
- JuanManuelAmador
- Date:
- 2015-06-15
- Revision:
- 0:3d456b8ce449
File content as of revision 0:3d456b8ce449:
#include "mbed.h" #include "Teclado.h" extern ScreenManager SC; extern DigitalIn boton1; extern DigitalIn boton2; extern DigitalIn boton3; extern DigitalIn boton4; extern DigitalIn boton5; extern DigitalOut myled; void Teclado::initialize(DogMLCD* lcd){ // Se inicializa la variable que guarda el último nombre introducido for(int i = 0; i < MAXCARACTERESESCRITURA; i++){ nombre[i] = 0; } // Se inicializa la selección setSelect(0); indiceEscritura = 0; mostrarRecuadro(lcd); // Por defecto se muestran caracteres de letras minusculas asignarMinusculas(); ifMayus = false; // Se muestran los caracteres normales mostrarCaracteres(lcd); // Se muestran los caracteres especiales mostrarEspeciales(lcd); // Se inicializa la selección Xsel = 0; Ysel = 0; lastXsel = 0; lastYsel = 0; // Se pinta la selección por defecto drawSelection(OFFSETX-2, WRITTENSPACE, CARACTER11, CARACTER11, lcd); // transmit work screen to physical screen: lcd->Flush(); } // El botón 5 envía a la pantalla correspondiente según el elemento seleccionado void Teclado::button5pressed(DogMLCD* lcd){ // Si no es una tecla especial if(m[Ysel][Xsel] > ULTIMOCARACTERESPECIAL){ // select font to use: lcd->XFont = xfont_8; if(indiceEscritura < MAXCARACTERESESCRITURA){ // Si se ha pulsado sobre un caracter normal se añade este al recuadro donde se muestra lo escrito if(m[Ysel][Xsel] > ULTIMOCARACTERESPECIAL){ // Si el elemento no es un caracter o tecla especial // Se asigna el caracter en la cedena nombre[indiceEscritura] = m[Ysel][Xsel]; indiceEscritura++; // Se actualiza el caracter finde cadena if(indiceEscritura < MAXCARACTERESESCRITURA){ nombre[indiceEscritura] = '\0'; } // Se borra la cadena mostrada actualmente lcd->Rect(POSCADENAX,1,WIDTH-2, WRITTENSPACE-2, DOGMLCD_full, wipe); // Se escribe la nueva cadena lcd->XString(POSCADENAX, 1, nombre); } } }else{ // Teclas especiales if(m[Ysel][Xsel] == SPACEBAR){ // Barra espaciadora // Se aplica un espacio nombre[indiceEscritura] = ' '; indiceEscritura++; // Se actualiza el caracter fin de cadena if(indiceEscritura < MAXCARACTERESESCRITURA){ nombre[indiceEscritura] = '\0'; } }else if(m[Ysel][Xsel] == MAYUS){ // Se intercambian los caracteres actuales mayúsculas/minúculas // Primero se limpia la pantalla lcd->Clear(); mostrarRecuadro(lcd); // Se asignan los caracteres que corresponden if(ifMayus){ asignarMinusculas(); ifMayus = false; }else{ asignarMayusculas(); ifMayus = true; } // Se muestran los caracteres normales mostrarCaracteres(lcd); // Se muestran los caracteres especiales mostrarEspeciales(lcd); // Se escribe la selección del mayus drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11-1, lcd); // select font to use: lcd->XFont = xfont_8; // Se escribe la nueva cadena lcd->XString(POSCADENAX, 1, nombre); // transmit work screen to physical screen: lcd->Flush(); }else if(m[Ysel][Xsel] == BACK){ // Se borra el último caracter de la cadena escribiendo en su lugar un caracter fin de cadena if(indiceEscritura > 0){ // Si hay algo que borrar indiceEscritura--; nombre[indiceEscritura] = '\0'; // Se borra la cadena mostrada actualmente lcd->Rect(POSCADENAX,1,WIDTH-2, WRITTENSPACE-2, DOGMLCD_full, wipe); // Se escribe la nueva cadena lcd->XString(POSCADENAX, 1, nombre); } }else if(m[Ysel][Xsel] == APLICAR){ SC.changeScreen(nameNextScreen); } } // transmit work screen to physical screen: lcd->Flush(); } void Teclado::mostrarEspeciales(DogMLCD* lcd){ // Se pinta la flecha de borrado de caracteres lcd->Rect(OFFSETX + CARACTER11*10 + 2, WRITTENSPACE + CARACTER11*3 + 3, OFFSETX + CARACTER11*10 + 2 + 6, WRITTENSPACE + CARACTER11*3 + 3 + 5); lcd->LineV(OFFSETX + CARACTER11*10 + 1, WRITTENSPACE + CARACTER11*3 + 4, WRITTENSPACE + CARACTER11*3 + 7); lcd->LineV(OFFSETX + CARACTER11*10, WRITTENSPACE + CARACTER11*3 + 5, WRITTENSPACE + CARACTER11*3 + 6); // Se pinta la flecha de mayus lcd->Rect(OFFSETX + 2, WRITTENSPACE + CARACTER11*4 + 5, OFFSETX + 2 + 3, WRITTENSPACE + CARACTER11*4 + 5 + 4); lcd->LineH(OFFSETX + 1, WRITTENSPACE + CARACTER11*4 + 4, OFFSETX + 1 + 5); lcd->LineH(OFFSETX + 2, WRITTENSPACE + CARACTER11*4 + 3, OFFSETX + 2 + 3); lcd->LineH(OFFSETX + 3, WRITTENSPACE + CARACTER11*4 + 2, OFFSETX + 3 + 1); // Se pinta el intro (abarca el espacio de dos elementos de la matriz) lcd->Rect(OFFSETX + CARACTER11*10 + 5, WRITTENSPACE + CARACTER11*4 + 1, OFFSETX + CARACTER11*10 + 5 + 2, WRITTENSPACE + CARACTER11*4 + 5); lcd->Rect(OFFSETX + CARACTER11*9 + 3, WRITTENSPACE + CARACTER11*4 + 6, OFFSETX + CARACTER11*9 + 3 + 15, WRITTENSPACE + CARACTER11*4 + 6 + 2); lcd->LineV(OFFSETX + CARACTER11*9 + 2, WRITTENSPACE + CARACTER11*4 + 5, WRITTENSPACE + CARACTER11*4 + 5 + 4); lcd->LineV(OFFSETX + CARACTER11*9 + 1, WRITTENSPACE + CARACTER11*4 + 6, WRITTENSPACE + CARACTER11*4 + 6 + 2); lcd->LineV(OFFSETX + CARACTER11*9 , WRITTENSPACE + CARACTER11*4 + 7, WRITTENSPACE + CARACTER11*4 + 7); // Se pinta la barra espaciadora (abarca el espacio de 8 elementos de la matriz) lcd->Rect(OFFSETX + CARACTER11 + 3, WRITTENSPACE + CARACTER11*4 + 6, OFFSETX + CARACTER11 + 79, WRITTENSPACE + CARACTER11*4 + 6 + 1); lcd->Rect(OFFSETX + CARACTER11 + 3, WRITTENSPACE + CARACTER11*4 + 2, OFFSETX + CARACTER11 + 3 + 1, WRITTENSPACE + CARACTER11*4 + 2 + 3); lcd->Rect(OFFSETX + CARACTER11 + 78, WRITTENSPACE + CARACTER11*4 + 2, OFFSETX + CARACTER11 + 79, WRITTENSPACE + CARACTER11*4 + 2 + 3); } void Teclado::seleccionarAplicar(DogMLCD* lcd){ drawSelection(OFFSETX + CARACTER11 + 84, WRITTENSPACE + CARACTER11*4, 24, 10, lcd); } void Teclado::deseleccionarAplicar(DogMLCD* lcd){ drawDeselection(OFFSETX + CARACTER11 + 84, WRITTENSPACE + CARACTER11*4, 24, 10, lcd); } void Teclado::seleccionarBarraEspaciadora(DogMLCD* lcd){ drawSelection(OFFSETX + CARACTER11 - 1, WRITTENSPACE + CARACTER11*4, 84, 10, lcd); } void Teclado::deseleccionarBarraEspaciadora(DogMLCD* lcd){ drawDeselection(OFFSETX + CARACTER11 - 1, WRITTENSPACE + CARACTER11*4, 84, 10, lcd); } void Teclado::mostrarCaracteres(DogMLCD* lcd){ // select font to use: lcd->XFont = xfont_11; // Se recorre la matriz mostrando todo lo que no sean caracteres o teclas especiales for(int i = 0; i < FILASMATRIZ; i++){ for(int j = 0; j < COLUMNASMATRIZ; j++){ if(m[i][j] > ULTIMOCARACTERESPECIAL){ // SI el elemento no es un caracter o tecla especial // se muestra lcd->XChar(OFFSETX + CARACTER11*j, WRITTENSPACE + CARACTER11*i, m[i][j]); } } } } void Teclado::mostrarRecuadro(DogMLCD* lcd){ lcd->Frame(0, 0,WIDTH-1, WRITTENSPACE-1); } // El botón 1 sube la selección al elemento superior al actual void Teclado::button1pressed(DogMLCD* lcd){ // Si sales de los elementos seleccionables no se cambia de selección if((Ysel - 1) >= 0){ // Si se venía de la última fila (teclas especiales) if(Ysel == (FILASMATRIZ-1) ){ // Si se venía la barra espaciadora se selecciona esta if(m[Ysel][Xsel] == SPACEBAR){ deseleccionarBarraEspaciadora(lcd); }else if(m[Ysel][Xsel] == APLICAR){ // Si se venía de la tecla aplicar se selecciona esta deseleccionarAplicar(lcd); }else{ // se venía del mayus mayus drawDeselection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11-1, lcd); } }else{ // Se deselecciona la tecla anterior drawDeselection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); } // Se selecciona el nuevo elemento Ysel--; // Se escribe la nueva selección drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); // transmit work screen to physical screen: lcd->Flush(); } } // El botón 2 desplaza la selección al elemento izquierdo al actual void Teclado::button2pressed(DogMLCD* lcd){ // Si sales de los elementos seleccionables no se cambia de selección if((Xsel - 1) >= 0){ // Si se está en la última fila if(Ysel == (FILASMATRIZ-1) ){ // Se se venía de la tecla aplicar if(m[Ysel][Xsel] == APLICAR){ deseleccionarAplicar(lcd); seleccionarBarraEspaciadora(lcd); // Se mueven dos elementos a la izquierda Xsel -= 2; }else{ deseleccionarBarraEspaciadora(lcd); // Se mueve la selección al elemento de la izquierda Xsel = 0; // Se escribe la nueva selección (la selección es CARACTER11-1 por razones de espacio) (tecla mayus) drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11-1, lcd); } }else{ // Se borra la selección anterior drawDeselection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); // Se selecciona el nuevo elemento Xsel--; // Se escribe la nueva selección drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); } // transmit work screen to physical screen: lcd->Flush(); } } // El botón 3 desplaza la selección al elemento derecho al actual void Teclado::button3pressed(DogMLCD* lcd){ // Si sales de los elementos seleccionables no se cambia de selección if((Xsel + 1) < COLUMNASMATRIZ){ // Si se está en la última fila if(Ysel == (FILASMATRIZ-1) ){ // Se se venía de la tecla mayus if(m[Ysel][Xsel] == MAYUS){ drawDeselection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11-1, lcd); seleccionarBarraEspaciadora(lcd); // Se mueven un elemento a la derecha Xsel++; }else if(m[Ysel][Xsel] == SPACEBAR){ //si se venía de la barra espaciadora deseleccionarBarraEspaciadora(lcd); // Se mueve la selección al penultimo elemento Xsel = 9; // Se escribe la nueva selección (la selección es CARACTER11-1 por razones de espacio) (tecla mayus) seleccionarAplicar(lcd); } }else{ // Se borra la selección anterior drawDeselection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); // Se selecciona el nuevo elemento Xsel++; // Se escribe la nueva selección drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); } // transmit work screen to physical screen: lcd->Flush(); } } // El botón 4 baja la selección al elemento superior al actual void Teclado::button4pressed(DogMLCD* lcd){ // Si sales de los elementos seleccionables no se cambia de selección if((Ysel + 1) < FILASMATRIZ){ // Se borra la selección anterior drawDeselection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); // Se selecciona el nuevo elemento Ysel++; // Si la siguiente fila es la última (teclas especiales) if(Ysel == (FILASMATRIZ-1) ){ // Se guarda la última tecla que estaba seleccionada lastXsel = Xsel; lastYsel = Ysel-1; // Si se va hacia la barra espaciadora se selecciona esta if(m[Ysel][Xsel] == SPACEBAR){ seleccionarBarraEspaciadora(lcd); }else if(m[Ysel][Xsel] == APLICAR){ // Si se va hacia la tecla aplicar se selecciona esta seleccionarAplicar(lcd); }else{ // Se escribe la nueva selección (la selección es CARACTER11-1 por razones de espacio) (tecla mayus) drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11-1, lcd); } }else{ // Se escribe la nueva selección drawSelection(OFFSETX-2 + Xsel*CARACTER11, WRITTENSPACE + Ysel*CARACTER11, CARACTER11, CARACTER11, lcd); } // transmit work screen to physical screen: lcd->Flush(); } } char *Teclado::getNombre(){ return nombre; } // Esta función guarda la pantalla a la que se debe volver en caso de ser pulsado el boton atras void Teclado::setNextScreen(char nameScreen[NCARSCREEN]){ strcpy(nameNextScreen, nameScreen); } void Teclado::asignarMinusculas(){ // Primera fila m[0][0] = 'q'; m[0][1] = 'w'; m[0][2] = 'e'; m[0][3] = 'r'; m[0][4] = 't'; m[0][5] = 'y'; m[0][6] = 'u'; m[0][7] = 'i'; m[0][8] = 'o'; m[0][9] = 'p'; m[0][10] = '('; // Segunda fila m[1][0] = 'a'; m[1][1] = 's'; m[1][2] = 'd'; m[1][3] = 'f'; m[1][4] = 'g'; m[1][5] = 'h'; m[1][6] = 'j'; m[1][7] = 'k'; m[1][8] = 'l'; m[1][9] = 164; m[1][10] = ')'; // Tercera fila m[2][0] = 'z'; m[2][1] = 'x'; m[2][2] = 'c'; m[2][3] = 'v'; m[2][4] = 'b'; m[2][5] = 'n'; m[2][6] = 'm'; m[2][7] = ','; m[2][8] = '.'; m[2][9] = ';'; m[2][10] = '_'; // Cuarta fila m[3][0] = '1'; m[3][1] = '2'; m[3][2] = '3'; m[3][3] = '4'; m[3][4] = '5'; m[3][5] = '6'; m[3][6] = '7'; m[3][7] = '8'; m[3][8] = '9'; m[3][9] = '0'; m[3][10] = BACK; // Quinta fila m[4][0] = MAYUS; m[4][1] = SPACEBAR; m[4][2] = SPACEBAR; m[4][3] = SPACEBAR; m[4][4] = SPACEBAR; m[4][5] = SPACEBAR; m[4][6] = SPACEBAR; m[4][7] = SPACEBAR; m[4][8] = SPACEBAR; m[4][9] = APLICAR; m[4][10] = APLICAR; } void Teclado::asignarMayusculas(){ // Primera fila m[0][0] = 'Q'; m[0][1] = 'W'; m[0][2] = 'E'; m[0][3] = 'R'; m[0][4] = 'T'; m[0][5] = 'Y'; m[0][6] = 'U'; m[0][7] = 'I'; m[0][8] = 'O'; m[0][9] = 'P'; m[0][10] = '('; // Segunda fila m[1][0] = 'A'; m[1][1] = 'S'; m[1][2] = 'D'; m[1][3] = 'F'; m[1][4] = 'G'; m[1][5] = 'H'; m[1][6] = 'J'; m[1][7] = 'K'; m[1][8] = 'L'; m[1][9] = 165; m[1][10] = ')'; // Tercera fila m[2][0] = 'Z'; m[2][1] = 'X'; m[2][2] = 'C'; m[2][3] = 'V'; m[2][4] = 'B'; m[2][5] = 'N'; m[2][6] = 'M'; m[2][7] = ','; m[2][8] = '.'; m[2][9] = ';'; m[2][10] = '_'; // Cuarta fila m[3][0] = '1'; m[3][1] = '2'; m[3][2] = '3'; m[3][3] = '4'; m[3][4] = '5'; m[3][5] = '6'; m[3][6] = '7'; m[3][7] = '8'; m[3][8] = '9'; m[3][9] = '0'; m[3][10] = BACK; // Quinta fila m[4][0] = MAYUS; m[4][1] = SPACEBAR; m[4][2] = SPACEBAR; m[4][3] = SPACEBAR; m[4][4] = SPACEBAR; m[4][5] = SPACEBAR; m[4][6] = SPACEBAR; m[4][7] = SPACEBAR; m[4][8] = SPACEBAR; m[4][9] = APLICAR; m[4][10] = APLICAR; }