Versión sin post-procesado del software del VmRideR

Dependencies:   mbed

Revision:
0:3d456b8ce449
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ScreenManager/Teclado.cpp	Mon Jun 15 15:34:27 2015 +0000
@@ -0,0 +1,465 @@
+#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;
+}
\ No newline at end of file