Standardowy tekstowy system menu LCD

10

Czy istnieje wzór dla prostego systemu menu w C dla tekstowego wyświetlacza LCD. Często zmieniam kod na obsługę prostych tekstowych menu LCD.

Uważam, że większość systemów ma menu główne i niektóre podmenu, które po wybraniu pozwalają ustawić parametr z pewną minimalną i maksymalną wartością.

Idealnie do tego systemu menu można nawigować za pomocą 4 prostych klawiszy, takich jak Enter, Cancel, Up i Down.

W mojej aplikacji korzystam z 2-liniowego x 16-tekstowego wyświetlacza LCD, chociaż idealne rozwiązanie powinno być możliwe do zastosowania na każdym wyświetlaczu NxM.

mjh2007
źródło
Nie ma nic wspólnego z projektowaniem elektronicznym! Pytanie zostanie zamknięte.
Leon Heller
5
Miałem wrażenie, że pytania dotyczące programowania wrażeń dotyczą systemów wbudowanych. Może się myliłem ...
mjh2007,
Miałem podobne wrażenie. Czy jest na to oficjalna notatka?
AndrejaKo,
Tylko rzeczy bardzo niskiego poziomu, zgodnie z FAQ. To pytanie dotyczy interfejsu użytkownika.
Leon Heller
3
+1 Też byłbym zainteresowany ... Zawsze je ręcznie uwarzyłem. Czy używasz wyjścia konsoli lub wyświetlacza znaków NxM .... nie, że mam odpowiedź na jedno z nich :) Na kilku wbudowanych systemach wyświetlania 2xN zaimplementowałem dwa przyciski interfejsów z kombinacją Enter / Cancel i mam Next, który jest bufor pierścieniowy i eliminuje potrzebę góra / next i down / back.
kenny,

Odpowiedzi:

5

Wzór, którego używam dla systemów menu w C, jest mniej więcej taki:

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
};

Następnie deklaruję tablicę menus zawierającą menuitems i wskaźniki do childpodmenu. W górę i w dół porusza się po aktualnie wybranej tablicy menuitems. Wstecz przenosi do parentmenu i do przodu / wybierz albo przechodzi do childpodmenu, albo wywołuje a handlerFuncdla węzła liścia.

Renderowanie menu polega tylko na iteracji po jego elementach.

Zaletą tego schematu jest to, że jest w pełni sterowany danymi, struktury menu mogą być deklarowane statycznie w pamięci ROM niezależnie od funkcji renderera i obsługi.

Toby Jaffey
źródło
2

Odpowiedź Toby'ego jest bardzo dobrym punktem wyjścia. Wspomniane struktury zakładają, że menu są statyczne i po prostu się po nich poruszasz.

Jeśli chcesz mieć menu dymaniczne (np. Wyświetlające określone wartości, takie jak temperatura, czas itp.), Musisz mieć możliwość ich wygenerowania.

Jednym ze sposobów może być zarejestrowanie funkcji do budowania łańcucha.

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
źródło