Stap 2: Menu definitie
Nu neem een moment om te kijken naar het menu ontwerp bestand (afbeelding hieronder) dat werd gebruikt voor het genereren van de menu's voor de tuner.
Het menu bestand is een compacte specificatie die de codegenerator veel vertelt over de manier waarop die u zal omgaan met de toepassing. --in het bijzonder het:
• Definieert de tekstregels voor één of meer menu 's
• Definieert velden binnen deze lijnen, die zal worden gekoppeld aan variabelen in het programma
• Opdrachten die moeten worden aangeroepen wanneer een veld is gewijzigd, of bij het opstellen van een veld definieert
• De typen voor bijbehorende variabelen evenals de grenzen of aanvaardbaar ingangen voor deze velden worden gedefinieerd
• Associates bepaalde knop ingangen met opdrachten moeten worden uitgevoerd of menu's worden geactiveerd
Menu's hebben dit formulier:
<MenuName > {[MenuCommand ] *
"MenuLine " [LineCommand ] *
}
MenuName
De menunaam staat altijd vermeld binnen punthaken, of is het definiëren van het menu, of handelen als het doelwit van een actie (bijvoorbeeld overschakelen naar < DisplaySettingsMenu >). Het hoogste niveau menu is altijd HomeMenu genoemd.
MenuCommand
MenuCommands kan de vorm aannemen van een richtlijn van de no_cursor:
[no_cursor]
Dit vertelt de codegenerator dat geen cursor in dit menu moet worden weergegeven. Meer in het algemeen, echter het MenuCommands zal de vorm aannemen van een link van de gebeurtenis die een knop input worden gekoppeld aan een bepaalde actie. Acties kunnen overstappen naar een ander menu bv:
[long_back -> < DisplaySettingsMenu >]
Dit zorgt ervoor dat de machine van de staat om te schakelen naar de DisplaySettingsMenu als de back-knop ingedrukt wordt gehouden voor een volle seconde of meer.
Of een gebeurtenis link actie kan gewoon worden gebruikt om bijvoorbeeld een aanroep naar een door de gebruiker gegenereerde functie activeren:
[sel -> (toggleStrobe)]
Mogelijke gebeurtenissen opnemen:
sel, terug, omhoog, omlaag, long_sel, long_back
MenuLine
MenuLines zijn tekenreeksen die aangeven wat wordt getoond op het display en identificeert ook velden die gekoppeld aan variabelen via de LineCommands worden zal. Meestal wil je de cursor om aan te geven van de geselecteerde regel ingeschakeld hebben. Wanneer getoond, de cursor wordt weergegeven als een groter-dan in de eerste kolom, dus moet u ervoor dat u laat een lege ruimte op de eerste positie van elke regel. Merk ook de opmerkingsregel die helpt bij het bijhouden van de maximale lijndikte--16 in dit geval, maar dit zal afhangen van de weergave die u gebruikt. Velden zijn afgebakend door het plaatsen van een reeks van tekens die uniek is binnen de lijn die zal gepaard gaan met de bijbehorende LineCommands--er rekening mee dat u moet er zeker op maat van dit veld bevat het maximum aantal tekens voor elke mogelijke veldwaarde.
LineCommand
De LineCommand is wellicht het meest complexe deel van de syntaxis, maar gelukkig, dit is de laatste. De LineCommand volgt altijd de regel die is het wijzigen en haar taak is om zowel lijn-specifieke select gebeurtenis acties definiëren en velden koppelen aan variabelen en om te bepalen welke typen van deze variabelen dus de gegenereerde code kan de variabelen in een type-geschikte manier.
Lijn-specifieke Selecteer gebeurtenissen zijn precies hetzelfde als de bovenstaande menu-niveau-gebeurtenissen, behalve dat hier de selecteren knop gebeurtenis de enige beschikbaar is als de andere knoppen niet meestal geassocieerd met een bepaalde lijn zijn. Als gedefinieerd, overschrijft een lijn-specifieke select gebeurtenis de menu-global select gebeurtenis als de cursor op de regel in kwestie bevindt zich.
Veld variabele verenigingen nemen dit formulier
[FieldString richting doel :Type ]
FieldString
De FieldString die we al hebben besproken--het is de lijn-unieke tekenreeks die de locatie en de lengte van een bepaald veld binnen de MenuLine markeert.
Richting
De richting geeft aan of we een doel zijn associëren met een gebruikersgebeurtenis invoer-(>), of een draw event (<-) of beide (<> -).
Doel
Het doel kan zijn een variabele, een set of een draw functie, of een variabele en een waarde-gewijzigd-callback functie.
Target variabele (<-| -> | <> -): [min <> - timer_minutes]
Target Set functie (->): [spd -> (SetSpeed)]
Richten op vestigen functie (<-): [nnn <-(DrawNum)]
Variabele w/Callback target (-> | <> -): [xxx -> SetContrast(LCD_Contrast)]
[strobeMode <> - SetStrobeMode(strobeMode)]
Merk op dat het in laatste geval boven (het geval van de bi-directionele variabele w/Callback), de waarde-gewijzigd-callback wordt genegeerd in bij de opstelling van het veld.
Type
De parameter Type is verantwoordelijk voor de identificatie van het type variabele en de grenzen of de mogelijke waarden.
Beschikbare typen omvatten binary coded decimal, ondertekend of niet-ondertekende integer van 8, 16 of 32 bits of 8-bits opsommingen. De syntaxis voor deze types is als volgt:
• BCD8, BCD16, BCD32
• U8, U16, U32
• S8, S16, S32
• enum
De parameter type heeft de vorm:
:Type (grenzen )
Merk op dat (grenzen) optioneel voor alles behalve enum typen zijn.
Voorbeelden:
: BCD8(0,0x99)
: U16(8,1000)
: enum ("None", "Lineaire", "Log")
: S16(-1000,1000)
: U32
En thats it. Dat is het hele handboek voor de definitie van de menutaal!
Vervolgens zullen we kijken een de broncode moet voltooien de gitaar tuner. We verwijderen de modus input als het bemoeilijkt de code een beetje zonder aanbod veel meer vanuit een oogpunt van leren. Ook de 3 x-modus werkte veel beter dan de andere modi die we met experimenteerden, dus het niet zinvol om hen te bieden.