Versión de Firmware con funciones de RAM incorporadas.
Dependencies: mbed
Fork of VmRecorderV1dot1 by
Diff: ScreenManager/Menu.cpp
- Revision:
- 0:3d456b8ce449
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ScreenManager/Menu.cpp Mon Jun 15 15:34:27 2015 +0000 @@ -0,0 +1,90 @@ +#include "mbed.h" +#include "Menu.h" + +extern ScreenManager SC; + +extern DigitalIn boton1; +extern DigitalIn boton4; +extern DigitalIn boton5; + +void Menu::initialize(DogMLCD* lcd){ + // Se inicializa la selección + setSelect(0); + + // select font to use: + lcd->XFont = xfont_11; + + // Para pintar los elementos del menú primero + // se calcula la posición del primer elemento y el offset hasta el siguiente elemento (eje vertical) + int offset = HEIGHT/(nElementos + 1); + int posy0 = offset - SEMIHEIGHTFONT; + + // Se pintan los elementos del menu con dos particularidades: + // - El elemento seleccionado se pinta "seleccionado" + // - Los elementos se pintan centrados + + for(int i = 0; i < nElementos; i++){ + posElement[i][2] = widthElement(i, lcd); + posElement[i][0] = (WIDTH - posElement[i][2])/2; + posElement[i][1] = offset*(i) + posy0;; + lcd->XString(posElement[i][0], posElement[i][1], list[i]); + // Si el elemento está seleccionado se marca con la forma de selección correspondiente + if(i == getSelect()){ + drawSelection(posElement[i][0]-2, posElement[i][1]-1, posElement[i][2]+2, HEIGHTCARACTER+2, lcd); + } + } + + // transmit work screen to physical screen: + lcd->Flush(); +} + +// El botón 1 sube la selección al elemento superior al actual +void Menu::button1pressed(DogMLCD* lcd){ + // Si sales de los elementos seleccionables no se cambia de selección + if((getSelect()-1) >= 0){ + setSelect(getSelect()-1); + drawDeselection(posElement[getLastSelect()][0]-2, posElement[getLastSelect()][1]-1, posElement[getLastSelect()][2]+2, HEIGHTCARACTER+2, lcd); + drawSelection(posElement[getSelect()][0]-2, posElement[getSelect()][1]-1, posElement[getSelect()][2]+2, HEIGHTCARACTER+2, lcd); + // transmit work screen to physical screen: + lcd->Flush(); + } +} + +// El botón 4 baja la selección al elemento superior al actual +void Menu::button4pressed(DogMLCD* lcd){ + // Si sales de los elementos seleccionables no se cambia de selección + if((getSelect()+1) <= (nElementos - 1)){ + setSelect(getSelect()+1); + drawDeselection(posElement[getLastSelect()][0]-2, posElement[getLastSelect()][1]-1, posElement[getLastSelect()][2]+2, HEIGHTCARACTER+2, lcd); + drawSelection(posElement[getSelect()][0]-2, posElement[getSelect()][1]-1, posElement[getSelect()][2]+2, HEIGHTCARACTER+2, 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 Menu::button5pressed(DogMLCD* lcd){ + SC.changeScreen(nextScreenID[getSelect()]); +} + +// Añade un elemento al menu con el texto especificado en el primer argumento +// cada elemento nos enviará a la pantalla con el identificador del segundo argumento +// Devuelve el identificador del elemento añadido +int Menu::addElement(char text[], char nameNextScreen[NCARSCREEN]){ + strcpy(list[nElementos], text); + strcpy(nextScreenID[nElementos], nameNextScreen); + nElementos++; + return nElementos - 1; +} + + +// Devuelve el ancho del elemento +// Para ello lo recorre sumando los pixeles que ocupa cada caracter +int Menu::widthElement(int element, DogMLCD* lcd){ + int width = 0; + for(int i = 0; i < (strlen(list[element])); i++){ + width += lcd->GetGlyph(list[element][i]).wid + 1; + } + return width; +} +