Standard-Text-LCD-Menüsystem

10

Gibt es ein Muster für ein einfaches Menüsystem in C für ein Text-LCD? Ich schreibe häufig Code neu, um einfache Text-LCD-Menüs zu handhaben.

Ich finde, die meisten Systeme haben ein Hauptmenü und einige Untermenüs, mit denen Sie bei Auswahl einen Parameter mit einem minimalen und maximalen Wert einstellen können.

Idealerweise kann dieses Menüsystem mit 4 einfachen Tasten wie Eingabe, Abbrechen, Auf und Ab navigiert werden.

In meiner Anwendung verwende ich ein 2-Zeilen x 16-Zeichen-Text-LCD, obwohl eine ideale Lösung auf jedes NxM-Display angewendet werden kann.

mjh2007
quelle
Nichts mit elektronischem Design zu tun! Frage wird geschlossen.
Leon Heller
5
Ich hatte den Eindruck, dass Programmierfragen, die sich auf eingebettete Systeme beziehen, auch hier gestellt werden könnten. Vielleicht habe ich mich geirrt ...
mjh2007
Ich hatte auch einen ähnlichen Eindruck. Gibt es eine offizielle Notiz dazu?
AndrejaKo
Laut FAQ nur sehr niedriges Zeug. Diese Frage betrifft die Benutzeroberfläche.
Leon Heller
3
+1 Ich wäre auch interessiert ... Ich habe sie immer von Hand gebraut. Verwenden Sie eine Konsolenausgabe oder eine NxM-Zeichenanzeige ... nicht, dass ich eine Antwort darauf habe :) Auf mehreren eingebetteten 2xN-Anzeigesystemen habe ich zwei Tastenschnittstellen mit der Kombination von Enter / Cancel implementiert und Next, das ist a Ringpuffer und macht Up / Next & Down / Back überflüssig.
Kenny

Antworten:

5

Das Muster, das ich für Menüsysteme in C verwende, ist ungefähr so:

struct menuitem
{
  const char *name; // name to be rendered
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};

struct menu
{
  struct menu *parent; // pointer to parent menu
  struct **menuitem; // array of menu items, NULL terminated
};

Ich deklariere dann ein Array von menus, das jeweils menuitems und Zeiger auf childUntermenüs enthält. Auf und Ab bewegt sich durch das aktuell ausgewählte Array von menuitems. Zurück wechselt zum parentMenü und Vorwärts / Auswählen wechselt entweder zu einem childUntermenü oder ruft a handlerFuncfür einen Blattknoten auf.

Das Rendern eines Menüs umfasst lediglich das Durchlaufen seiner Elemente.

Der Vorteil dieses Schemas besteht darin, dass es vollständig datengesteuert ist und die Menüstrukturen unabhängig von den Renderer- und Handlerfunktionen statisch im ROM deklariert werden können.

Toby Jaffey
quelle
2

Tobys Antwort ist ein sehr guter Ausgangspunkt. Die genannten Strukturen setzen voraus, dass die Menüs statisch sind und Sie nur durch sie navigieren.

Wenn Sie dymanische Menüs möchten (z. B. Anzeigen bestimmter Werte wie Temperatur, Zeit usw.), müssen Sie in der Lage sein, diese zu generieren.

Eine Möglichkeit könnte darin bestehen, eine Funktion zum Erstellen Ihrer Zeichenfolge zu registrieren.

struct menuitem
{
  const char *name; // name to be rendered
  const char * (*builderFunc)( const char *name );  // callback to generate string, if not null.
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};
BrendanSimon
quelle