Стандартная текстовая ЖК-система меню

10

Существует ли шаблон для простой системы меню на С для текстового ЖК-дисплея. Я часто переписываю код для работы с простыми текстовыми ЖК-меню.

Я считаю, что большинство систем имеют главное меню и некоторые подменю, которые при выборе позволяют установить параметр в пределах некоторого минимального и максимального значения.

В идеале по этой системе меню можно перемещаться с помощью 4 простых клавиш, таких как ввод, отмена, вверх и вниз.

В моем приложении я использую текстовый ЖК-дисплей размером 2 строки по 16 символов, хотя идеальное решение должно быть применимо к любому дисплею NxM.

mjh2007
источник
Ничего общего с электронным дизайном! Вопрос будет закрыт.
Леон Хеллер
5
У меня сложилось впечатление, что вопросы программирования, если они применимы к встроенным системам, можно задать и здесь. Может быть, я был не прав ...
mjh2007
У меня тоже было такое же впечатление. Есть ли официальное примечание об этом?
AndrejaKo
Только очень низкоуровневые вещи, согласно FAQ. Этот вопрос о пользовательском интерфейсе.
Леон Хеллер
3
+1 Мне тоже было бы интересно ... Я их всегда варил. Используете ли вы консольный вывод или символьный дисплей NxM ... не то, чтобы у меня был ответ на любой из этих вопросов :) В нескольких встроенных системах отображения 2xN я реализовал двухкнопочный интерфейс с сочетанием Enter / Cancel и имел Next, который является кольцевой буфер и устраняет необходимость в вверх / далее и вниз / назад.
Кенни

Ответы:

5

Шаблон, который я использую для систем меню в C, выглядит примерно так:

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

Затем я объявляю массив menus, каждый из которых содержит menuitems и указатели на childподменю. Вверх и вниз перемещается через текущий выбранный массив menuitems. Назад перемещается в parentменю и вперед / выбор либо перемещается в childподменю, либо вызывает handlerFuncконечный узел.

Рендеринг меню включает в себя итерацию его пунктов.

Преимущество этой схемы в том, что она полностью управляется данными, структуры меню могут быть статически объявлены в ПЗУ независимо от функций рендерера и обработчика.

Тоби джеффи
источник
2

Ответ Тоби - очень хорошая отправная точка. Упомянутые структуры предполагают, что меню статичны, и вы просто перемещаетесь по ним.

Если вам нужны динамические меню (например, отображающие определенные значения, такие как температура, время и т. Д.), Вы должны иметь возможность генерировать это.

Одним из способов может быть регистрация функции для построения вашей строки.

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
источник