Forum: Compiler & IDEs Menu mit 4 Tasten und 2 Zeilen Display


von Ralf N. (spargiraffe)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von StinkyWinky (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marc R. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Ralf N. (spargiraffe)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.