Sistema de menú LCD de texto estándar

10

¿Existe un patrón para un sistema de menú simple en C para una pantalla LCD de texto? Me encuentro reescribiendo mucho código para manejar menús simples de texto en LCD.

Creo que la mayoría de los sistemas tienen un menú principal y algunos submenús que, cuando se seleccionan, le permiten establecer un parámetro con un valor mínimo y máximo.

Idealmente, este sistema de menús se puede navegar con 4 teclas simples como ingresar, cancelar, arriba y abajo.

En mi aplicación, estoy usando una pantalla LCD de texto de 2 líneas x 16 caracteres, aunque una solución ideal debería poder aplicarse a cualquier pantalla NxM.

mjh2007
fuente
¡Nada que ver con el diseño electrónico! La pregunta será cerrada.
Leon Heller
55
Estaba bajo la impresión de preguntas de programación si se podían aplicar aquí a los sistemas integrados también. Tal vez me equivoqué ...
mjh2007
Estaba bajo una impresión similar también. ¿Hay una nota oficial al respecto?
AndrejaKo
Solo cosas de muy bajo nivel, de acuerdo con las preguntas frecuentes. Esta pregunta es sobre la interfaz de usuario.
Leon Heller
3
+1 Yo también estaría interesado ... Siempre los he preparado a mano. ¿Está utilizando una salida de consola o una pantalla de caracteres NxM ... no es que tenga una respuesta para ninguno :) En varios sistemas de pantalla 2xN integrados, he implementado dos interfaces de botones combinando Enter / Cancel y tengo Next, que es un anillo de búfer y elimina la necesidad de arriba / siguiente y abajo / atrás.
kenny

Respuestas:

5

El patrón que uso para los sistemas de menús en C es algo como esto:

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

Luego declaro una matriz de menus que contiene menuitemsy punteros a childsubmenús. Arriba y abajo se mueve a través de la matriz de menuitems seleccionada actualmente . Atrás se mueve al parentmenú y avanza / selecciona se mueve a un childsubmenú o llama handlerFunca un nodo hoja.

Renderizar un menú solo implica iterar a través de sus elementos.

La ventaja de este esquema es que está totalmente basado en datos, las estructuras de menú pueden declararse estáticamente en ROM independientemente de las funciones de renderizador y controlador.

Toby Jaffey
fuente
2

La respuesta de Toby es un muy buen punto de partida. Las estructuras mencionadas suponen que los menús son estáticos y simplemente navega por ellos.

Si desea menús dinámicos (por ejemplo, mostrar ciertos valores, como temperatura, tiempo, etc.), debe poder generarlos.

Una forma podría ser registrar una función para construir su cadena.

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
fuente