Étape 2: Menu définition
Maintenant prenez le temps de regarder le fichier de conception de menu (image ci-dessous) qui a été utilisé pour générer des menus pour le tuner.
Le fichier de menu est une spécification compacte qui raconte le générateur de code beaucoup de choses sur la façon dont vous va interagir avec l’application. --en particulier il :
• Définit les lignes de texte pour un ou plusieurs menus
• Définit les domaines qui relèvent de ces lignes qui seront liés aux variables dans le programme
• Définit les commandes qui doivent être appelées lorsqu’un champ est modifié, ou lorsque vous dessinez un champ
• Définit les types de variables associées ainsi que les limites ou d’intrants acceptables pour ces champs
• Associe certaines entrées avec des commandes à exécuter ou des menus à activer
Des menus ont cette forme :
<NomMenu > {[MenuCommand ] *
"MenuLine " [LineCommand ] *
}
NomMenu
Le nom de menu est a déclaré toujours à l’intérieur des crochets pointus, que ce soit définir le menu, ou agissant comme cible d’une action (par exemple passer à < DisplaySettingsMenu >). Le menu de niveau supérieur est toujours nommé HomeMenu.
MenuCommand
MenuCommands peut prendre la forme d’une directive de no_cursor :
[no_cursor]
Cela indique au générateur de code qu’aucun curseur ne doit s’afficher dans ce menu. Plus généralement, cependant, le MenuCommands prendra la forme d’une liaison d’événement qui associe une entrée de touche à une action particulière. Les actions peuvent être de passer à un autre menu, par exemple :
[long_back -> < DisplaySettingsMenu >]
Cela provoque la machine d’État basculer vers le DisplaySettingsMenu si le bouton est maintenu enfoncée pendant une seconde ou plus.
Ou une action de lien de l’événement peut simplement servir à déclencher un appel à une fonction généré par les utilisateurs par exemple :
[sel -> (toggleStrobe)]
Événements possibles incluent :
sel, arrière, haut, bas, long_sel, long_back
MenuLine
MenuLines sont des chaînes de caractères qui indiquent ce qui sera montré à l’écran et également identifie les zones qui seront associés à des variables par l’intermédiaire de la LineCommands. Généralement, vous voudrez avoir le curseur activé pour indiquer la ligne actuellement sélectionnée. Lorsque indiqué, le curseur s’affiche comme une grande-que de signer dans la première colonne, donc vous devez être sûr de laisser un espace vide en première position de chaque ligne. Notez également la ligne de commentaire qui permet de garder une trace de la largeur de ligne maximale--16 dans ce cas, mais cela dépendra de l’affichage que vous utilisez. Champs sont jalonnés en plaçant une chaîne de caractères unique au sein de la ligne qui sera mis en correspondance par l’associé LineCommands--Notez que vous devez être sûr de la taille de ce champ pour contenir le nombre maximal de caractères pour toute valeur de champ possible.
LineCommand
Le LineCommand est sans doute la partie la plus complexe de la syntaxe, mais, heureusement, c’est le dernier d'entre eux. Le LineCommand suit toujours la ligne qu'il modifie et son travail consiste à définir les actions de l’événement select ligne spécifiques, tant pour associer des champs avec des variables et de définir les types de ces variables si le code généré peut gérer les variables de manière adaptée type.
Ligne spécifique certains événements sont exactement comme les événements au niveau du menu ci-dessus, sauf qu’ici l’événement touche select est le seul disponible, comme les autres boutons ne sont pas généralement associés à une ligne particulière. Si défini, un événement de sélection spécifique au ligne remplacera l’événement select menu-global si le curseur se trouve sur la ligne en question.
Associations de variables de champ prennent cette forme
[FieldString Direction cible :Type ]
FieldString
Le FieldString que nous avons déjà discuté--c’est la chaîne de caractères unique ligne qui marque l’emplacement et la longueur d’un champ particulier dans le MenuLine.
Direction
La Direction indique si nous sommes associant une cible à un événement d’entrée de l’utilisateur (->), ou un événement de dessin (<-) ou les deux (<> -).
Objectif
La cible peut être une variable, un jeu ou une fonction de tirage au sort, ou une variable et une fonction de rappel a changé de valeur.
Cibler la Variable (<-| -> | <> –): [min <> – timer_minutes]
Cibler la fonction Set (->): [spd -> (SetSpeed)]
Cibler la fonction Draw (<-): [nnn <-(DrawNum)]
Cibler la Variable w/Callback (-> | <> –): [xxx -> SetContrast(LCD_Contrast)]
[strobeMode <> – SetStrobeMode(strobeMode)]
Notez que le dernier cas en dessus (l’affaire bi-directionelle Variable w/Callback), le rappel de la valeur modifiée est ignoré dans lors de l’élaboration du champ.
Type de
Le modificateur de Type est chargé d’identifier le type de variable et les limites ou les valeurs possibles.
Les types disponibles incluent décimale codée en binaire, entier signé ou non signé en 8, 16 ou 32 bits ou 8 bits énumérations. La syntaxe de ces types est comme suit :
• BCD8, BCD16, BCD32
• U8, U16, U32
• S8, S16, S32
• enum
Le modificateur de type a la forme :
:Type (limites )
Notez que (limites) sont facultatifs pour tous les types enum.
Exemples :
: BCD8(0,0x99)
: U16(8,1000)
: enum ("None", « Linéaire », « Log »)
: S16(-1000,1000)
: U32
Et c’est tout. C’est le manuel dans son intégralité pour le langage de définition de menu !
Ensuite nous allons étudier un code source requise pour terminer l’accordeur de guitare. Nous enlèverons le Mode d’entrée car il complique le code un peu sans offre beaucoup plus d’un point de vue apprentissage. En outre, le mode 3 x a travaillé beaucoup mieux que les autres modes que nous avons expérimenté, donc il n’est pas sensé de leur offrir.