Sistema de menu LCD de texto padrão

10

Existe um padrão para um sistema de menus simples em C para um LCD de texto. Eu me pego reescrevendo muito o código para lidar com menus simples de texto em LCD.

Acho que a maioria dos sistemas possui um menu principal e alguns submenus que, quando selecionados, permitem definir um parâmetro com algum valor mínimo e máximo.

Idealmente, esse sistema de menus pode ser navegado com 4 teclas simples, como inserir, cancelar, para cima e para baixo.

Na minha aplicação, estou usando um LCD de texto de 2 linhas x 16 caracteres, embora uma solução ideal possa ser aplicada a qualquer monitor NxM.

mjh2007
fonte
Nada a ver com design eletrônico! A pergunta será encerrada.
Leon Heller
5
Eu estava sob a impressão de questões de programação se elas se aplicassem a sistemas embarcados também poderiam ser feitas aqui. Talvez eu estava errado ...
mjh2007
Eu também estava com uma impressão semelhante. Existe uma nota oficial sobre isso?
AndrejaKo
Apenas coisas de nível muito baixo, de acordo com o FAQ. Esta pergunta é sobre a interface do usuário.
Leon Heller
3
+1 Eu também estaria interessado ... Eu sempre os preparo à mão. Você está usando uma saída do console ou uma exibição de caracteres NxM .... não que eu tenha resposta para :) Em vários sistemas de exibição 2xN incorporados, implementei duas interfaces de botão combinando Enter / Cancel e Next, que é um buffer de anel e elimina a necessidade de up / next e down / back.
Kenny #

Respostas:

5

O padrão que eu uso para sistemas de menus em C é mais ou menos assim:

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

Declaro então uma matriz de menus, cada uma contendo se menuitemponteiros para childsubmenus. Para cima e para baixo se move pela matriz atualmente selecionada de menuitems. Voltar move para o parentmenu e avançar / selecionar move para um childsubmenu ou chama um handlerFuncpara um nó folha.

A renderização de um menu envolve a iteração dos itens.

A vantagem desse esquema é que ele é totalmente orientado a dados; as estruturas de menus podem ser declaradas estaticamente na ROM, independentemente das funções de renderizador e manipulador.

Toby Jaffey
fonte
2

A resposta de Toby é um ponto de partida muito bom. As estruturas mencionadas assumem que os menus são estáticos e você apenas os navega.

Se você quiser menus dymanic (por exemplo, exibir certos valores, como temperatura, tempo etc.), precisará gerar isso.

Uma maneira poderia ser registrar uma função para criar sua string.

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
fonte