Paso 2: Definición de menú
Ahora tome un momento para mirar el archivo de diseño de menú (imagen de abajo) que se utilizó para generar los menús para el sintonizador.
El archivo de menú es una especificación compacta que dice el generador de código mucho acerca de la manera que usted va a interactuar con la aplicación. --en particular:
• Define las líneas de texto de uno o más menús
• Define los campos dentro de esas líneas que está ligadas a las variables en el programa
• Define los comandos que se deben llamar cuando se cambia un campo, o cuando dibujo un campo
• Define los tipos de variables asociadas como los límites o entradas aceptables para aquellos campos de
• Asocia ciertas entradas de botón con comandos a ser ejecutados o menús para activar
Menús tienen esta forma:
<MenuName > {[MenuCommand ] *
"MenuLine " [LineCommand ] *
}
MenuName
El nombre del menú siempre se indica dentro de corchetes angulares ya sea definir el menú, o actuando como el objetivo de una acción (por ejemplo, cambiar a < DisplaySettingsMenu >). El menú de nivel superior siempre se nombra HomeMenu.
MenuCommand
MenuCommands puede tomar la forma de una directiva de no_cursor:
[no_cursor]
Esto dice el generador de código que no cursor debe mostrarse en este menú. Más comúnmente, sin embargo, el MenuCommands tendrá la forma de un enlace de evento que asocia una entrada de botón con una acción determinada. Las acciones pueden cambiar a otro menú por ejemplo:
[long_back -> < DisplaySettingsMenu >]
Esto hace que la máquina de estado cambiar a la DisplaySettingsMenu si el botón de retroceso se mantiene pulsado durante un segundo o más.
O una acción de enlace de evento simplemente puede usarse para activar una llamada a una función generado por el usuario por ejemplo:
[sel -> (toggleStrobe)]
Eventos posibles incluyen:
SEL, detrás, arriba, abajo, long_sel, long_back
MenuLine
MenuLines son cadenas de caracteres que indican lo que se mostrará en la pantalla y también se identifican los campos que se asocia variables mediante la LineCommands. Por lo general tienes que tener el cursor para indicar la línea actualmente seleccionada. Cuando se muestra, el cursor aparece como un mayor-que firmar en la primera columna, así que usted debe estar seguro de dejar un espacio en blanco en la primera posición de cada línea. Tenga en cuenta también la línea de comentario que ayuda a mantener un seguimiento de la anchura máxima de línea--16 en este caso, pero esto dependerá de la pantalla que está utilizando. Los campos están marcados mediante la colocación de una cadena de caracteres que es único dentro de la línea que será compensada por el LineCommands asociado, tenga en cuenta que usted debe estar seguro a la medida este campo para contener el número máximo de caracteres para cualquier valor de campo posible.
LineCommand
El LineCommand es posiblemente la parte más compleja de la sintaxis, pero, afortunadamente, esta es la última. El LineCommand sigue siempre la línea que modifica y su trabajo es definir acciones evento select específicos de línea tanto para asociar los campos con las variables y definir los tipos de las variables así que el código generado puede manejar las variables de manera apropiada por el tipo.
Eventos seleccionadas específicos de línea son exactamente como los eventos de nivel de menú anterior excepto que aquí el evento del botón de selección es el único disponible como los otros botones no son típicamente asociados con una línea en particular. Si, un evento select específicos de línea anula el evento select menú global si el cursor está situado en la línea en cuestión.
Asociaciones de variables de campo toman esta forma
[FieldString dirección destino :tipo ]
FieldString
La FieldString que ya hemos analizado, es la cadena de caracteres única línea que marca la ubicación y la longitud de un campo en el MenuLine.
Dirección
La dirección indica si estamos asociando un objetivo con un evento de entrada del usuario (->), o un evento de dibujo (<-) o ambos (<> -).
Blanco
El objetivo puede ser una variable, un sistema o una función de drenaje, o una variable y una función callback valor cambiado.
Objetivo Variable (<-| -> | <> –): [min <> – timer_minutes]
Objetivo establecer la función (->): [spd -> (SetSpeed)]
Dibujar la función de destino (<-): [nnn <-(DrawNum)]
Objetivo Variable w/Callback (-> | <> –): [xxx -> SetContrast(LCD_Contrast)]
[strobeMode <> – SetStrobeMode(strobeMode)]
Tenga en cuenta que el último caso en sobre (el caso bidireccional Variable w/Callback), la devolución de llamada de cambio de valor se omite al dibujar el campo.
Tipo
El modificador de tipo es responsable de identificar el tipo de variable y los límites o valores posibles.
Los tipos disponibles incluyen binario codificado decimal, entero firmado o sin firmar de 8, 16 o 32 bits o 8 bits enumeraciones. La sintaxis de estos tipos es como sigue:
• BCD8, BCD16, BCD32
• U8, U16, U32
• S8, S16, S32
• enum
El modificador de tipo tiene la forma:
:Tipo (límites )
Tenga en cuenta que (límites) son opcionales para todos los tipos enum.
Ejemplos:
: BCD8(0,0x99)
: U16(8,1000)
: enumeración ("ninguno", "Lineal", "Log")
: S16(-1000,1000)
: U32
Y eso es todo. Eso es todo el manual para el lenguaje de definición de menú!
A continuación veremos un código fuente necesario para terminar el afinador de guitarra. Te quitamos la entrada Mode como complica el código un poco sin ofrecer mucho más desde un punto de vista del aprendizaje. También, el modo 3 x trabajó mucho mejor que los otros modos que experimentamos, por lo que no tiene sentido para ofrecerles.