Göra interaktiva Microcontroller Apps i minuter (2 / 4 steg)
Steg 2: Menyn Definition
Nu ta en stund att titta på menyn design fil (bild nedan) som användes för att skapa menyer för tunern.
Menyn filen är en kompakt specifikation som berättar den koden generera en hel del om hur du kommer att interagera med programmet. --i synnerhet det:
• Definierar textraderna för en eller flera menyer
• Definierar fält inom de linjer som ska kopplas till variabler i programmet
• Definierar kommandon som ska anropas när ett fält ändras eller när du ritar ett fält
• Definierar typerna för tillhörande faktorer samt gränser eller acceptabelt ingångar för fälten
• Associerar vissa knappen ingångar med kommandon som ska köras eller menyer för att aktiveras
Menyerna har denna form:
<MenuName > {[MenuCommand ] *
"MenuLine " [LineCommand ] *
}
MenuName
Menynamnet alltid anges inuti vinkelparenteser oavsett om det är definiera menyn, eller agerar som mål för en åtgärd (t.ex. växla till < DisplaySettingsMenu >). Översta menyn är alltid heter HomeMenu.
MenuCommand
MenuCommands kan ske i form av ett no_cursor direktiv:
[no_cursor]
Detta säger kodgeneratorn att ingen markören ska visas på den här menyn. Mer allmänt, kommer MenuCommands dock ta form av en händelse länk som associerar en knappen input med en viss åtgärd. Åtgärder kan vara att byta till en annan meny t.ex.:
[long_back -> < DisplaySettingsMenu >]
Detta orsakar tillståndsdatorn att växla till DisplaySettingsMenu om back-knappen hålls ned för en full sekund eller mer.
Eller en händelse länkåtgärd kan enkelt användas för att utlösa ett anrop till en förbrukaren-utviklet funktion t.ex.:
[sel -> (toggleStrobe)]
Möjliga händelser inkluderar:
SEL, tillbaka, upp, ner, long_sel, long_back
MenuLine
MenuLines är strängar som anger vad som ska visas på displayen och också identifierar fält som ska associeras med variabler via LineCommands. Vanligtvis kommer du har markören aktiverad anger den markerade raden. När visas markören visas som en större-än underteckna i den första kolumnen, så du måste se till att lämna ett tomt utrymme i första positionen i varje rad. Notera också kommentarraden som hjälper till att hålla reda på maximal linjebredden--16 i detta fall, men det beror på den skärm du använder. Fälten är utstakad genom att placera en sträng med tecken som är unikt inom den linje som kommer att matchas av den tillhörande LineCommands--notera att du måste se till att storlek i det här fältet innehåller det maximala antalet tecken för varje möjligt fältvärdet.
LineCommand
LineCommand är kanske den mest komplexa delen av syntax, men tack och lov, detta är den sista. LineCommand följer alltid linjen det modifierar och dess uppgift är att både definiera linjespecifika Välj händelse åtgärder, och att associera fält med variabler och ange vilka typer av dessa variabler så den genererade koden kan hantera variablerna på ett typ-lämpligt sätt.
Linjespecifika utvalda händelser är exakt som menynivå händelserna ovan förutom att här händelsen select-knappen är enda tillgängliga som de andra knapparna inte är vanligtvis förknippas med en viss linje. Om definitionen, åsidosätter en linjespecifika Välj händelse menyn-global select händelsen om markören finns på den aktuella raden.
Fältet variabel föreningar ta detta formulär
[FieldString riktning mål :typ ]
FieldString
Den FieldString vi har redan diskuterat--det är den linje-unika teckensträng som markerar platsen och längden på ett visst område inom MenuLine.
Riktning
Riktningen anger huruvida vi associerar ett mål med en ingång användarhändelse (->), eller en ritning händelse (<-) eller båda (<> -).
Mål
Målet kan vara en variabel, en uppsättning eller en draw funktion, eller en variabel och en värde-förändrats-callback-funktion.
Rikta variabel (<-| -> | <> -): [min <> - timer_minutes]
Rikta in funktion (->): [spd -> (SetSpeed)]
Rikta Rita funktion (<-): [nnn <-(DrawNum)]
Rikta variabel w/motringning (-> | <> -): [xxx -> SetContrast(LCD_Contrast)]
[strobeMode <> - SetStrobeMode(strobeMode)]
Observera att det i sista fallet ovan (bi-directional variabel w/motringning fallet), värdet ändras återuppringning ignoreras i när du ritar fältet.
Typ
Typ modifieraren ansvarar för att identifiera variabeltyp och gränser eller möjliga värden.
Tillgängliga typer inkluderar binary coded decimal, signerade eller osignerade heltal i 8, 16 eller 32 bitar eller 8-bitars uppräkningar. Syntaxen för dessa typer är följande:
• BCD8, BCD16, BCD32
• U8, U16, U32
• S8, S16, S32
• enum
Typ modifieraren har form:
:Typ (gränser )
Observera att (gränsvärden) är valfritt för alla utom enum-typer.
Exempel:
: BCD8(0,0x99)
: U16(8,1000)
: enum ("None", "Linjär", "Log")
: S16(-1000,1000)
: U32
Och det är det. Det är hela manualen för definition menyspråket!
Nästa ska vi titta på en källkoden krävs för att avsluta gitarr tuner. Vi ska ta bort läget input eftersom det komplicerar koden lite utan erbjudande mycket mer ur ett lärande perspektiv. 3 x läge arbetade också, mycket bättre än de andra lägen som vi experimenterade med, så det inte vettigt att erbjuda dem.