Сводный список записей блога

--->>>> Сводный список записей блога <<<<---

12 января 2024

MicroMenu и его настройка


 Когда функционал устройства становится большим и разнообразным, и для взаимодействия устройства с пользователем уже не хватает светодиодов и 7-сегментных цифровых дисплеев, на помощь приходят более продвинутые текстовые или графические дисплеи.
И зачастую логика работы устройства требует организовать кучку интерфейсных элементов в какую то однотипную структуру типа меню. Это может быть какое то простое одноуровневое меню из нескольких пунктов, а может быть и достаточно сложной многоуровневой структурой.

И возникает вопрос - как это все организовать малой кровью с небольшими затратами ресурсов МК. Когда то на easyelectronics я встретил статейку Steel.ne про организацию древовидного меню. Steel.ne использовал MicroMenu, допилив его под себя.

Идея меню проста. Каждый элемент меню - это запись с четырьмя ссылками - на предыдущую и последующую запись, на своего родителя и на потомка. Если записи по ссылке нет (например, это первый или последний элемент), соответствующая ссылка оставляется пустая (точнее там вставляется ссылка на фиктивный пустой элемент).

Составляя меню из таких кубиков, получаем четырехсвязный список. Логически он является избыточным - ссылки дублируются. Т.е. предыдущий элемент содержит ссылку на следующий, а следующий - ссылку на предыдущий. Но  такая избыточность позволяет легко перемещаться по меню в любую сторону без дополнительных программных телодвижений.

Так же в каждом элементе меню, кроме ссылок на соседние элементы, есть еще текстовая строка - текст элемента меню и 1 байт данных. В этот байт сохраняется номер команды, которая должна выполниться при выборе данного пункта меню.

Элементы меню сохраняются во флеше, не используя оперативную память микроконтроллера.
Каждый элемент меню хранит 4 ссылки, 1 байт команды и нуль-терминированную строку. Минимальная строка - это один байт 0x00.
Итого для семейства AVR, где адрес умещается в 2 байта, элемент меню минимально занимает 4 * 2 + 1 + 1 = 10 байт. Для STM-ок, где адресация 32-битная - 4 * 4 + 1 + 1 = 18 байт. 

Идея меню мне понравилась и я взял проект Steel.ne и допилил, соответственно, уже под себя. 
Достаточно долгое время я просто таскал код меню из проекта в проект методом Ctrl+C - Ctrl+V... Но потом надоело. И в 2020 году я оформил наконец то это меню в виде отдельной библиотечки.
Стало легче подключать меню в свои проекты. Заодно библиотека обрела некоторую универсальность - для семейства AVR, например, там автоматически подставляется модификатор PROGMEM хранения во флеше, процедуры чтения данных из флеша (pgm_read_xxxx).