Меню для двухстрочного дисплея

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

На форуме тема меню поднималась неоднократно.

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

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

Описание работы, коды, видео, фото - все в последующих сообщениях.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Демонстрация работы размещена на 

Объект меню рассчитан на работу с двухстрочным буквенно-цифровым индикатором (вероятно, можно использовать для 4-строчного).
Объект рассчитан на переключение параметров, имеющих 2 или несколько значений, а также ввод чисел в диапазоне 0-127.
Объект предусматривает наличие 2 типов пунктов меню:
1. Элемент - встраивается в текущее дерево меню, может иметь дочерние объекты, либо элементы, либо листья. Совмещение не допускается. Имеет собственную строку для отображения на экране.
2. Лист - в дереве не представлен. По сути - это свойство элемента, позволяющее ему присваивать числовое значение. 
Объект предназначен для использования в Arduino, поэтому оптимизирован по объему занимаемой памяти и имеет следующие ограничения:
- Общее количество элементов не должно превышать 128, включая корневой элемент. Максимальное количество листьев 16256.
- Диапазон числовых значений лежит в диапазоне от 0 до 127 (может быть меньше).
- Элемент не может одновременно иметь дочерние элементы и листья. Либо одно, либо другое.
- Максимальное количество строк, используемое в меню, не может превышать 256.
Лист может отображаться либо как число, либо как строка, причем, строки листьев должны последовательно располагаться в массиве строк, начиная с указанного в родительском элементе номера строки. Если в качесте номера строки указано 255, вместо строк из масива отображается порядковый номер листа (число).
Таким образом, отображение листа определяется свойствами родительского объекта.
 
Предыдущий вариант меню использовался в проекте http://arduino.ru/forum/proekty/analog-analogovogo-sintezatora
 
 
А настоящий был усовершенствован (точнее - доведен до ума, т.к. в предыдущей версии были некоторые нерешенные вопросы) для проекта http://arduino.ru/forum/proekty/midi-boxmidi-sintezator
 
Файлы находятся здесь: https://drive.google.com/open?id=1v3PxBtSoTpEVkkrjZ2kFPSCCOQ-ABI6z