Bygga menysystem i mjukvara - hur?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Bygga menysystem i mjukvara - hur?

Inlägg av oJsan »

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.)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

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.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

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.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Så du önskar skriva ett allmänt menysystem som man kan modifiera utefter behov och tillämpning. Är det rätt uppfattat?

Rent spontant tänker jag på xml för strukturen iaf. Känns som man kan få bra översikt där.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

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?
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

Jag har en modifierad variant av denna kod för att använda freeRTOS där jag är intresserad att anropa funktionen som tillståndet har flera gånger i sekunden. Detta för kunna uppdatera skärmen om det kommer ny information.
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Re: Bygga menysystem i mjukvara - hur?

Inlägg av $tiff »

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.
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...
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?

oJsan skrev:(Målsystemet är embedded och spåket är C.)
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.
Fast jag vet inte, jag har inte provat göra något seriöst menysystem själv på det sättet :)
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

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. :wink: (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?
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

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å...
Jonan
Inlägg: 7
Blev medlem: 5 januari 2007, 08:22:00
Ort: Norrköping

Inlägg av Jonan »

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.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Språket är tyvärr C, annars hade det, som du säger, varit perfekt med klasser och arv.
Den dagen jag får lite mer tid över så skulle det vara bra att bygga en generell struktur med hjälp av structar, men tills vidare får jag nog göra på den röriga switch-case-metoden... :?
Skriv svar