Hallo, ich bastel eine Modelfernsteuerung mit einem mega32. Die meisten Sachen wie Displayanteuerung, ADC, Summensignalerzeugung waren dank des tollen Tutorials relativ schnell funktionsfähig. Jedoch sitze ich schon sehr Lange an dem Menu um die Parameter einzustellen und habe noch nicht sehr viele von den geplanten Menupunkten untergebracht. Da habe ich mir gedacht, dass das mit dem Menü auf einem 2 Zeilen Display und 4 Tastern zum Einstellen doch bistimmt bei sehr vielen Projekten gebraucht wird. Gibt es da vieleicht elegante Lösungen um die Menustruktur und den Code übersichtlich zu halten?
Ralf Nase schrieb: > Gibt es da vieleicht elegante Lösungen um die > Menustruktur und den Code übersichtlich zu halten? Man macht sich vorher nen Ablaufplan. Je ausführlicher den Plan ist, umso übersichtlicher wird der Code. Schreib also erstmal alle Menüpunkte auf und welche Funktion welche Tasten im jeweiligen Punkt haben sollen. Spaghetticodeprogrammierung ist der schlechteste Weg. Peter
Mach mal eine schöne Struktur pro Parameter mit: Zeiger auf Text (Name) Min-Wert Max-Wert Standard-Wert Zeiger auf Text (Einheit) Adresse (im Flash) - Nun ein Array davon erzeugen. - Eine Funktion, die vor und zurück durch die Parameter schalten kann. - Eine Funktion, die den Wert des aktuellen Parameters ändern kann
Für einige der Parameter kann man sich dann auch noch eine Möglichkeit definieren (zb über einen Parametertyp und den Text für die Einheiten), wie man den schnöden Zahlenwert durch Texte ersetzt um so eine Auswahl per Text zu ermöglichen. "Leerlauftrimmung: vorne/hinten" ist nun mal eingänglicher als "Leerlauftrimmung: 0/1" Bei genügend Parametern kann man sich dann darüber wieder eine Struktur legen, die mehrere derartige Parameter unter einem Oberbegriff zusammenfasst. Dann landet man bei hierarchischen Menüs mit Submenüs. So richtig interessant wird es dann erst, wenn sich Menüpunkte gegenseitig beeinflussen. Im einfachsten Fall kann das zb eine Sichtbarkeitssteuerung sein. Die Einstellparameter für "Ausschlag oben/unten" eines Deltamischers werden erst dann angezeigt, wenn der Delta-Mischer eingeschaltet ist. Oder die Menüpunkte für alle Hubschraubermischer gibt es erst dann, wenn der Modelltyp auf Hubschrauber steht. Wie genau stellst du dir die Benutzung der 4 Tasten vor? Welche Taste macht was? In den meisten Fällen bevorzuge ich bei Menüs eine 3 Tasten Steuerung: Mit 2 Tasten wird durch die Menüpunkte navigiert (oder ein Wert vergrößert/verkleinert) und die 3. Taste ist die Taste für 'Übernahme'. 3 Tasten geht gut, weil ich dann so einen Drehencoder mit integrierter Taste zur Benutzereingabe benutzen kann http://www.alps.com/WebObjects/catalog.woa/E/HTML/Encoder/Encoder_list1.html Die sind leichter stabil in einem Gehäuse einzubauen als 3 getrennte Digitaster. Das Problem mit einer 'Ein Menüsystem für alles' Lösung ist, dass dieses Menüsystem um universell einsetzbar zu sein, sehr mächtig und umfangreich sein muss. Und genau hier steckt das Problem: Sehr oft kann man sich diese Mächtigkeit (die sich in Code niederschlägt) einfach nicht leisten. Man hat den Speicher dafür nicht. Wichtig ist aber im Vorfeld: Sich genau überlegen wie das Menüsystem funktionierten soll. Dazu gehört * Das Bedienkonzept dazu gehört zb eine Systematik, welche Taste was macht. dazu gehört eine Systematik, wie Menüpunkte eventuell gruppiert werden dazu gehört eine Systematik, wie nicht numerische Werte ausgewählt werden dazu gehört eine genau Festlegung, welche Dinge am Display wo angezeigt werden * Ein genauer Plan, wie die Menüpunkte logisch gruppiert werden * Ein genauer Plan, wie zb in mehrstufigen Menühierarchien man von welchem Menü in welches andere Menü kommt und welche Menüpunkte man dort finden wird.
Ich habe das Problem einer Menüstruktur vor einiger Zeit mit einer Art binärem Baum gelöst. Dazu habe ich in meinem Code 2 Strukturen definiert: menuItems und den menuStrip. MenuItems sind die Menüpunkte. Sie bestehen aus: - einem Beschriftungstext - einem Zeiger auf den menuStrip, den sie aufrufen (child) - einem Funktionszeiger, der auf eine Funktion verweist, die die darstellung desjenigen Menüpunktes ausführt. MenuStrips sind Untermenüs. Sie stellen je eine Liste von MenuItems dar. Außerdem kennt jedes Menü sein übergeordnetes Menü (root). Mein Beispielcode baut eine Menüstruktur für einen Power-LED Controller auf, der mehrere Slaves mit PWM-Treibern steuern kann. In userInterface.c siehst du in ui_checkButtons(), wie die Funktionen im Modul menu verwendet werden. Zur Ansteuerung des LCDs habe ich die Bibliothek von Peter Fleury http://www.jump.to/fleury verwendet, allerdings mit einem 4 Zeilen Display. Zur Steuerung habe ich 4 Tasten verwendet: Hoch, runter, zurück, enter.
Danke für die Antworten. Die vier Taster sind bei mir für Oben, Unten Links und rechts. Mit Oben/Unten kann man durch die Menupunkte blättern. Mit "Rechts" betrittman das jeweils ausgewählte Untermenu mit. Mit links geht es eine Menuebene zurück. Falls ein Menu direkt eine Variable verändern kann, wird der wert mit "Oben" größer und mit "unten" kleiner. "Rechts" hat für diesen Fall noch keine Funktion. Rechts könnte dann eventuell zum Umschalten zwischen Grob-(10 Schritte) und Feineinstellung (1 Schritt) verwendet werden. Ich hatte mir erst die Menupunkte als Text in einem Editor mit Zeilennummerierung die geplanten Menupunkte aufgeschrieben und Untermenus jeweils eingerückt. Für bereits implementiere Menupunkte habe ich im Text Implementiert indem ich die Zeilennummer als "Menuschlüssel fest vergeben habe".
1 | void menu() |
2 | {
|
3 | switch (menuaktuell) |
4 | {
|
5 | case 3 : //für jeden menupunkt gibt es ein "menuaktuell case" |
6 | //lcd_clear();
|
7 | set_cursor(0,1); |
8 | lcd_string("M1 Einstellungen "); |
9 | if (menuaufgabe != 0) { //wenn eine taste gedrückt wurde... |
10 | if (menuaufgabe == 1) { |
11 | menuaktuell = 2; // eins nach oben |
12 | |
13 | }
|
14 | if (menuaufgabe == 2) { |
15 | menuaktuell = 4; // zu menu 4 springen |
16 | |
17 | }
|
18 | if (menuaufgabe == 3) { |
19 | menuaktuell = 260; // bleibt erstmal 0 |
20 | |
21 | }
|
22 | if (menuaufgabe == 4) { |
23 | menuaktuell = 3; // gibt keine übergeordete menuebene mehr |
24 | |
25 | }
|
26 | menuaufgabe = 0; |
27 | }
|
28 | |
29 | break; |
[...] bei über 250 geplanten menupunkten wird das leider etwas unübersichtlich weil der code so extrem lang wird. Marc R., danke für das Beispiel.
Ralf Nase schrieb: > bei über 250 geplanten menupunkten wird das leider etwas unübersichtlich > weil der code so extrem lang wird. Du musst deine Menüs komplett und rein nur durch die Datenstruktur abbilden. Dazu noch eine universelle Menüfunktion, die mit dieser Menübeschreibung in Datenform umgehen kann
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.