Arduino-меню

Проекты и идеи
Arduino-меню

Во время разработки крупных проектов хочется иметь какую-то общность, некое подобие ОС. Только для микроконтроллера. Чаще всего требуется организовать какое-либо меню и вывести его на ЖК дисплей. Меню должно иметь некую иерархию, позволять править какие-либо значения, используемые в процессе работы.

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

Нужно задаться некоторыми требованиями, предъявляемыми к меню:

1. Меню должно содержать достаточно большое количество вложенных элементов. В моем случае — 255.
2. Меню должно поддерживать различные типы элементов. В моем случае это 256, то есть в принципе, если очень захочется, можно будет под каждый элемент меню написать свой обработчик.
3. Универсальный интерфейс, общий для каждого пункта. Иначе будет просто непонятно, как работать с тем или иным элементом.
4. Умение работать с 4 и более кнопками. В моем случае кнопок может быть до 8, а комбинаций их нажатия — опять таки 256.

Одним из вариантов было рассмотрено готовое мини-меню, о котором я знал вот по ЭТОЙ ссылке. Мне оно показалось чрезмерно загроможденным. Сравните описание структуры меню там и здесь.

Как сторонник *nix систем, я взял за основу некоторые принципы организации файловой системы используемой в этих системах. Главный принцип — это то, что любой элемент файловой системы является файлом. Другой вопрос в том, каков тип этого файла.

Пока, мне кажутся достаточными три типа:

1. Папка. Может содержать кучу вложенных файлов.
2. Конфиг. Позволяет изменить какое-то число, используемое в работающих программах. Всего может быть три типа конфигов — ограниченные конфиги, когда они ограничены максимальным и минимальным значениями, неограниченные конфиги, когда они ограничены только 0 и 65535. Ну и еще булевы конфиги — когда можно установить Да/Нет. Значение конфига хранится во внутренней еепром МК.
3. Программа. Представляет собой отдельную функцию, которая может иметь схожий интерфейс, но при этом — работает сама по себе. В принципе, можно воткнуть хоть тетрис, со своим стилем отображения.

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

Вся файловая структура хранится в одном массиве. Массив одномерный, где для каждого файла отводится 4 байта.

1 байт хранит тип файла. 0 — папка, 1 — программа, 2 — конфиг. Любого из этих типов файлов может быть сколько угодно.

2 байт хранит номер родителя. Для дочерней папки это номер родительной папки, для конфига и программы — номер папки, в которой они лежат.

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

4 байт у папки хранит номер последнего вложенного файла. у программы — является ли она демоном, т.е. надо ли в ней остаться, или запустить ее, а она будет работать в фоне (это уже при использовании прерывания по таймеру например) для кофига 4 байт не используется.

Итого, для представленного в видео меню будет следующее описание массива структур:
static byte fileStruct[FILENUMB*FILEREW] PROGMEM =
{
0,0,1,4,
1,0,0,0,
1,0,1,0,
0,0,5,9,
0,0,10,13,
1,3,2,0,
2,3,0,0,
1,3,3,0,
2,3,1,0,
1,3,4,0,
0,4,14,15,
2,4,2,0,
1,4,5,0,
1,4,6,0,
2,10,3,0,
2,10,4,0
};

Еще один массив хранит названия файлов:
prog_char file_0[] PROGMEM = «Main Menu»;
prog_char file_1[] PROGMEM = «Automatic work»;
prog_char file_2[] PROGMEM = «Manual work»;
prog_char file_3[] PROGMEM = «Setup»;
prog_char file_4[] PROGMEM = «System»;
prog_char file_5[] PROGMEM = «Date & Time»;
prog_char file_6[] PROGMEM = «Plavnoe izmenenie»;
prog_char file_7[] PROGMEM = «Grafik rabot»;
prog_char file_8[] PROGMEM = «Povtor Grafika»;
prog_char file_9[] PROGMEM = «Sytochnie progami»;
prog_char file_10[] PROGMEM = «Yarkost v luksax»;
prog_char file_11[] PROGMEM = «Indication v luks»;
prog_char file_12[] PROGMEM = «Kalibrovka»;
prog_char file_13[] PROGMEM = «Serial Number»;
prog_char file_14[] PROGMEM = «dlya 100%»;
prog_char file_15[] PROGMEM = «dlya 0%»;

PROGMEM const char *fileNames[] = {
file_0,
file_1,
file_2,
file_3,
file_4,
file_5,
file_6,
file_7,
file_8,
file_9,
file_10,
file_11,
file_12,
file_13,
file_14,
file_15 };


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

Еще один массив хранит данные о конфигах. Он хранит начальное и конечное значения, а также стартовый номер ячейки еепром. Почему стартовый? Потому что, если число больше 255, то оно пишется в две ячейки. Тип конфига определяется по максимальному значению — если 0 — то это неограниченный, если 1 — то булев, если другое число — то ограниченный.

Ниже — видео отлаженного меню без глюков)))))

technik 23.06.2010 в 13.31 комментарии 0 0

комментарии(0)

Комментировать

Для добавления комментария авторизируйтесь.
Последние комментарии:
© 2010 pobot.ru