Système de menus LCD texte standard

10

Existe-t-il un modèle pour un système de menu simple en C pour un écran LCD de texte. Je me retrouve à réécrire beaucoup de code pour gérer de simples menus LCD de texte.

Je trouve que la plupart des systèmes ont un menu principal et certains sous-menus qui, lorsqu'ils sont sélectionnés, vous permettent de définir un paramètre avec une valeur minimale et maximale.

Idéalement, ce système de menus pourrait être parcouru avec 4 touches simples telles que Entrée, Annuler, Haut et Bas.

Dans mon application, j'utilise un écran LCD texte de 2 lignes x 16 caractères, mais une solution idéale devrait pouvoir être appliquée à n'importe quel écran NxM.

mjh2007
la source
Rien à voir avec le design électronique! La question sera fermée.
Leon Heller
5
J'avais l'impression que les questions de programmation si elles s'appliquaient aux systèmes embarqués pouvaient être posées ici aussi. Peut-être que j'avais tort ...
mjh2007
J'étais aussi sous l'impression similaire. Y a-t-il une note officielle à ce sujet?
AndrejaKo
Seulement des trucs de très bas niveau, selon la FAQ. Cette question concerne l'interface utilisateur.
Leon Heller
3
+1 Ça m'intéresserait aussi ... Je les ai toujours brassées à la main. Utilisez-vous une sortie de console ou un affichage de caractères NxM .... pas que j'ai une réponse pour l'un ou l'autre :) Sur plusieurs systèmes d'affichage 2xN intégrés, j'ai implémenté deux interfaces de bouton avec la combinaison Entrée / Annuler et j'ai Next qui est un tampon d'anneau et élimine le besoin de haut / suivant et bas / arrière.
kenny

Réponses:

5

Le modèle que j'utilise pour les systèmes de menus en C est quelque chose comme ceci:

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

Je déclare ensuite un tableau de menus contenant chacun menuitems et des pointeurs vers des childsous-menus. Haut et bas se déplace dans le tableau de menuitems actuellement sélectionné . Retour se déplace dans le parentmenu et avancer / sélectionner se déplace vers un childsous - menu ou appelle un handlerFuncnœud nœud.

Le rendu d'un menu implique simplement une itération à travers ses éléments.

L'avantage de ce schéma est qu'il est entièrement piloté par les données, les structures de menu peuvent être statiquement déclarées dans la ROM indépendamment des fonctions de rendu et de gestion.

Toby Jaffey
la source
2

La réponse de Toby est un très bon point de départ. Les structures mentionnées supposent que les menus sont statiques et que vous les parcourez simplement.

Si vous voulez des menus dynamiques (par exemple, afficher certaines valeurs, telles que la température, l'heure, etc.), vous devez être en mesure de générer cela.

Une façon pourrait être d'avoir enregistré une fonction pour construire votre chaîne.

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
la source