Bygga menysystem i mjukvara - hur?
Bygga menysystem i mjukvara - hur?
Elektriska apparater (video, TV, stereo m.m.) har ofta ett enkelt användargränssnitt som någon klok beteendevetare varit med och utformat. Detta utgör oftast det 'yttersta' skiktet av apparaten, det som är synligt för användaren. Längst ner, i det understa skiktet, finns alla funktioner som mjukvaruutvecklarna (vi) skrivit och för att apparaten ska fungera så måste användargränssnittet kopplas till hårdvarufunktionerna på något sätt. Det är lätt att skriva mängder av hårdvarurelaterad mjukvara men när det kommer till steget att koppla ihop allt i ett menyssystem så blir det oftast lite knivigt...
Min stora diskussionsfråga är då; hur gör man detta bäst?
Ett scenario kan vara menysystemet på en äldre mobiltelefon (typ Nokia 3310, 3210). Dvs. ett menyssystem med menyer och undermenyer i flera steg där det finns inställningar längst ner i varje meny.
Mina funderingar har gått mot abstrakta datatyper (träd, grafer) och objektorientering. Är det någon som har praktisk erfarenhet av detta och har några tips?
(Målsystemet är embedded och spåket är C.)
Min stora diskussionsfråga är då; hur gör man detta bäst?
Ett scenario kan vara menysystemet på en äldre mobiltelefon (typ Nokia 3310, 3210). Dvs. ett menyssystem med menyer och undermenyer i flera steg där det finns inställningar längst ner i varje meny.
Mina funderingar har gått mot abstrakta datatyper (träd, grafer) och objektorientering. Är det någon som har praktisk erfarenhet av detta och har några tips?
(Målsystemet är embedded och spåket är C.)
Frågan är till vilken tillämpning? Tänker du dig ett stort menysystem (typ mobiltelefon) eller är det ett litet (typ kaffebryggare).
Ett litet kan man nog utforma i skallen ett stort kräver mer eftertänksamhet och i viss mån dubbla inställningsplatser för samma sak. Ett exempel SMS-signalen skulle kunna finnas i både "signalmenyn" och "smsmenyn".
En annan sak är navigeringen. JAg ska (framtida projekt) bygga mig en sak och där tänkte jag köra med denna. Annars tror jag upp/ner och höger/vänster är bra, du "navigerar" med upp ner och förändrar med höger/vänster.
Detta är lite allmäna tankar hoppas de hjälpte lite.
Ett litet kan man nog utforma i skallen ett stort kräver mer eftertänksamhet och i viss mån dubbla inställningsplatser för samma sak. Ett exempel SMS-signalen skulle kunna finnas i både "signalmenyn" och "smsmenyn".
En annan sak är navigeringen. JAg ska (framtida projekt) bygga mig en sak och där tänkte jag köra med denna. Annars tror jag upp/ner och höger/vänster är bra, du "navigerar" med upp ner och förändrar med höger/vänster.
Detta är lite allmäna tankar hoppas de hjälpte lite.
Tillämpningen saknar betydelse (men ja, det är en kommersiellt produkt i stil/omfattning av en äldre mobiltelefon).
Om man generaliserar så gäller frågan de menysystem där man _inte_ klarar av att hålla logiken i skallen. Ett menysystem för en uC med en 2x16 LCD brukar vara rätt så lätthanterliga och där vill man oftast inte "abstrahera" koden alltför mycket heller.
Hur navigeringen går till rent praktiskt är upp till den som designar gränssnittet, valet av styrspak o.d. är alltså relativt ointressant när det gäller implementeringen av menysystem.
Om man generaliserar så gäller frågan de menysystem där man _inte_ klarar av att hålla logiken i skallen. Ett menysystem för en uC med en 2x16 LCD brukar vara rätt så lätthanterliga och där vill man oftast inte "abstrahera" koden alltför mycket heller.
Hur navigeringen går till rent praktiskt är upp till den som designar gränssnittet, valet av styrspak o.d. är alltså relativt ointressant när det gäller implementeringen av menysystem.
Ja XML skulle vara en bra metod att strukturera och lagra informationen om menysystemets uppbyggnad, men när man kommer till själva implementationen i C-kod, hur gör man då? Varje nod i menysystemet har ju ofta också en menytext eller ikon kopplad till sig, en timeout och kanske en lista med val.
På något sätt känns det som att objektorientering och arv klingar bra i detta problem men helst vill jag undvika objektimplementering i C.
Givetvis så kan jag ju komma på något eget med hjälp av stuct:ar i olika nivåer (typ träd) men först vill jag ha några smarta inputs från forumet om det finns något lämpligare sätt?
På något sätt känns det som att objektorientering och arv klingar bra i detta problem men helst vill jag undvika objektimplementering i C.
Givetvis så kan jag ju komma på något eget med hjälp av stuct:ar i olika nivåer (typ träd) men först vill jag ha några smarta inputs från forumet om det finns något lämpligare sätt?
Ett sätt är att tänka tillstånd.
Varje tillstånd har parametrar hur den ska flyttas sig till nästa tillstånd.
Eventuellt en default text och eventuellt en funktion som ska anropas.
Denna c-kod implementation skulle gå att modifiera så att det passar den hårdvaran man har.
Atmel butterfly har en implementation av detta
GCC port av avr butterfly koden:
http://www.siwawi.arubi.uni-kl.de/avr_projects/#bf_app
Sedan kan man ju parsa XML som gör c-kod som passar denna implementation.
Varje tillstånd har parametrar hur den ska flyttas sig till nästa tillstånd.
Eventuellt en default text och eventuellt en funktion som ska anropas.
Denna c-kod implementation skulle gå att modifiera så att det passar den hårdvaran man har.
Atmel butterfly har en implementation av detta
GCC port av avr butterfly koden:
http://www.siwawi.arubi.uni-kl.de/avr_projects/#bf_app
Sedan kan man ju parsa XML som gör c-kod som passar denna implementation.
Det kan göras på ett antal sätt men om det är så att man kan trimma ett antal variabler kan man göra ett enkelt system.
Man ser till att variablerna ligger i en tabell med fast index, man har ytterligare tabell med minimum och maximumvärden osv.
Med detta i systemet är det enkelt att göra en rutin som medger att man kan öka/minska den valda variabel och spara värdet med en OK-knapp osv.
Ska man ha text blir det en del mer komplicerat men det kan lösas med tabeller också.
Ska det vara ett komplext menysystem kan man bli tvungen att göra färdiga rutiner (öka/minsta värde + kolla med aktuella gränser) för att spara programminne och är det blandade tal/text/av<->på osv använder jag (i C) switch(Menu_Index) för att ha en exakt anpassning till varje meny-punkt.
Man ser till att variablerna ligger i en tabell med fast index, man har ytterligare tabell med minimum och maximumvärden osv.
Med detta i systemet är det enkelt att göra en rutin som medger att man kan öka/minska den valda variabel och spara värdet med en OK-knapp osv.
Ska man ha text blir det en del mer komplicerat men det kan lösas med tabeller också.
Ska det vara ett komplext menysystem kan man bli tvungen att göra färdiga rutiner (öka/minsta värde + kolla med aktuella gränser) för att spara programminne och är det blandade tal/text/av<->på osv använder jag (i C) switch(Menu_Index) för att ha en exakt anpassning till varje meny-punkt.
Re: Bygga menysystem i mjukvara - hur?
Jag ifrågasätter gärna "klok". Jag tycker inte alltid de är så "logiska" eller glasklara, i stil med "detdär hade jag gjort bättre själv". Men det går ju inte göra system som passar alla...oJsan skrev:Elektriska apparater (video, TV, stereo m.m.) har ofta ett enkelt användargränssnitt som någon klok beteendevetare varit med och utformat.
Vad är det egentligen för människor som sitter och bestämmer hur menysystem ska vara strukturerade i, låt säga, moderna mobiltelefoner? Någon som råkar jobba på Sony Ericsson (eller inhyrd konsultfirma) och vågar svara på det? Är det vanliga civiningenjörer, beteendevetare eller någon annan sorts utvecklare?
Med strukturer och pekare kommer du väl långt! Om man först erkänner att användargränssnitt käkar minne, så kan du sedan smälta att ha en struktur för en generell meny, och hålla variabler för varje giltig input/output. I denna struktur stoppar man lätt in text, placering, grafik och var man kan hoppa härnäst. Hela uppbyggnaden blir då en stor (kors)länkad lista där varje nod är en meny.oJsan skrev:(Målsystemet är embedded och spåket är C.)
Fast jag vet inte, jag har inte provat göra något seriöst menysystem själv på det sättet

Tack för alla svar! Av svaren att döma så så finns det ingen generell arbetsmetod utan man väljer det som passar målsystemet bäst.
För tillfället har jag (vi) löst det hela med switch/case i två nivåer. En yttre som innehåller tillstånd (menytillstånd) och en inre som innehåller händelser (knapptryckningar etc.). Aktuellt tillstånd bestämmer alltså vad som händer när ett event inträffar eller en knapp trycks in.
Visst, det fungerar, men det blir svåröverskådligt och att exempelvis flytta en meny kan vara svårt och kan leda till buggar. Det är därför jag vill bolla idéer om något bättre sätt att lösa problemet.
$tiff: Jag hade nog en gnutta ironi i åtanke när jag skrev 'klok', för det är ju inte alltid som det blev så bra i slutändan.
(På vårt företag är det inte någon mjukvaruhackare som definierat användargränssnittet, men inte heller någon beteendevetare.)
Vad är föresten '(kors)länkad lista'? Vet inte riktigt vilken abstrakt datatyp du syftar på, är det graf?
För tillfället har jag (vi) löst det hela med switch/case i två nivåer. En yttre som innehåller tillstånd (menytillstånd) och en inre som innehåller händelser (knapptryckningar etc.). Aktuellt tillstånd bestämmer alltså vad som händer när ett event inträffar eller en knapp trycks in.
Visst, det fungerar, men det blir svåröverskådligt och att exempelvis flytta en meny kan vara svårt och kan leda till buggar. Det är därför jag vill bolla idéer om något bättre sätt att lösa problemet.
$tiff: Jag hade nog en gnutta ironi i åtanke när jag skrev 'klok', för det är ju inte alltid som det blev så bra i slutändan.

Vad är föresten '(kors)länkad lista'? Vet inte riktigt vilken abstrakt datatyp du syftar på, är det graf?
Ojdå, jag missade visst ironin mellan orden, trodde för en stund att du faktikt respekterade vanliga menysystem 
Jag vet faktist inte riktigt vilken datatyp det borde motsvara.
Om varje menystruktur inehåller pekare till de menyer man kan nå därifrån så får man ju ett träd i någon mån. Men sedan kommer man till problemet när en meny ska återanvändas av en helt annan gren i trädet, då blir det inte så fint längre, och heller inget träd till struktur? Kanske är det en graf då...

Jag vet faktist inte riktigt vilken datatyp det borde motsvara.
Om varje menystruktur inehåller pekare till de menyer man kan nå därifrån så får man ju ett träd i någon mån. Men sedan kommer man till problemet när en meny ska återanvändas av en helt annan gren i trädet, då blir det inte så fint längre, och heller inget träd till struktur? Kanske är det en graf då...
Ska du programera i c eller c++?
Ett meny system är ju ett praktexempel på en uppgift som blir så mycket enklare om man kan använda sig av objekt-orienterad programering. Specielt det att man kan ha en basklass med alla gemensamma funktioner som sedan kan ärvas och modifieras för alla typer av undermenyer man tänkt implementera.
Ett meny system är ju ett praktexempel på en uppgift som blir så mycket enklare om man kan använda sig av objekt-orienterad programering. Specielt det att man kan ha en basklass med alla gemensamma funktioner som sedan kan ärvas och modifieras för alla typer av undermenyer man tänkt implementera.