Всем привет! Спешу поделиться своей библиотекой для построения графических многоуровневых меню для Ардуино: GEM (Good Enough Menu) Возможно, кому-то она сможет быть не менее полезна, чем мне Позволяет редактировать переменные (`int`, `byte`, `char[17]`), есть чекбоксы (`boolean`), селекты, кнопки и коллбэки на сохранение значений. Предназначена для работы с бэкпэком для графических LCD дисплеев SparkFun Graphic LCD Serial Backpack в связке с альтернативной прошивкой и библиотекой AltSerialGraphicLCD. Требования выглядят довольно специфичными, но эта связка позволяет подключить LCD к своему проекту всего 4-мя пинами (два на Serial, два на питание) и обладает богатыми возможностями по работе с графикой. Библиотека идёт с подробной документацией и аннотированными примерами, а так же Вики с дополнительным описанием примеров и всякими HowTo. С интересом попробую портировать её на бэкпэк от Амперки, если таковому будет суждено когда-нибудь увидеть свет=)
Нет, к сожалению, поскольку у AltSerialGraphicLCD-прошивки бэкпэка нет кириллического набора символов.
Жаль, кириллицы нету, без этого даже щупать не хочется, ибо кириллица - наше всё. Ну не понимают юзеры на аглицком меню, хоть тресни.
Будем ждать версию бэкпэка от Амперки (и надеяться, что кириллица там будет). В комментариях на Ютьюбе они обмолвились, что планы такие есть.
В GEM добавилась поддержка популярной библиотеки U8g2, а вместе с ней и кириллицы! Для того, чтобы активировать кириллические шрифты, нужно вызвать метод `enableCyrillic()` перед методом `init()`. При этом возрастёт размер, занимаемый программой в памяти МК, что следует иметь в виду. Кириллица поддерживается в элементах интерфейса (заголовки страниц меню, названия пунктов меню, кнопок и ссылок), а так же в опциях списков выбора (они же "селекты", "выпадашки", "дропдауны"). Однако, увы, (пока?) не поддерживается редактирование кириллических строковых переменных. Краткое описание обновлений: Поддержка U8g2 через новый класс `GEM_u8g2`; Небольшая чистка и оптимизация кода (и AltSerialGraphicLCD, и U8g2 версии); Базовая поддержка кириллицы (метод `enableCyrillic()`) и соотвествующий пример кода; Новый метод `reInit()`, возвращающий дисплей к требуемым настройкам после выхода из пользовательского контекста; Соотвествующие обновления документации и wiki с гайдами по настройке, описанием тестового стенда (необходимого для запуска тестовых скетчей) и how-to'шками. Обновления доступны с версии 1.1.0.
А другие типы данных реально добавить? в частности интересует дата/время. И еще вопрос - если я использую матричную клавиатуру 4*5, 9-пиновую, работаю с Keypad.h, как ее нажатия привязать к меню?
Дата/время (как и любые другие типы) - это, по сути, просто число. Так что его вполне можно реализовать на основе имеющегося `int`, или, что скорее, комбинации нескольких таких полей, настроив нужные валидации и отображение через коллбэки. Если совсем по простому: можно хранить часы, минуты, день, месяц, год в разных переменных и редактировать их по отдельности (при этом задавать месяц через селект, для удобства). Или, если заморочиться, можно редактировать отображаемую дату в `char[17]`, написав соотвествующий коллбэк, который бы распарсил таймстэмп из требуемого формата и сохранил в `unsigned long` переменную. Не имею опыта работы с этой библиотекой, но, подозреваю, что всё сведётся к использованию её функции `getKey()`, и последующему вызову `menu.registerKeyPress()` из GEM с одной из соответствующих констант клавиш. Код (C++): void loop() { // If menu is ready to accept button press... if (menu.readyForKey()) { // ...detect key press key = keypad.getKey(); // and pass action to menu based on pressed key menu.registerKeyPress(); switch (key) { case 2: menu.registerKeyPress(GEM_KEY_UP); break; case 6: menu.registerKeyPress(GEM_KEY_RIGHT); break; ... default: menu.registerKeyPress(GEM_KEY_NONE); break; } } } Что-то в таком духе=) Подробнее см. в Вики: тут, тут и тут.
А как обрабатывать цифровые нажатия на клавиатуре? Например ввод значения не стрелками, а клавишами 0-9?
Такого не предусмотрено. Всё взаимодействие с меню (ввод/редактирование переменных равно как и навигация) осуществляется 6 кнопками: Вверх, Вниз, Влево, Вправо, ОК и Назад/Отмена.
А если пункт меню сделать кнопкой вместо переменной и в функции обрабатывать нажатия цифровых кнопок и менять значение?
В обработчике, который вешается на кнопку, можно делать всё, что угодно: использовать графическую библиотеку в своих целях, использовать любые другие библиотеки, изменять значение переменных, вызывать другие функции и проч. - всё то же, что можно делать в любом другом своём скетче. Но обработка процесса редактирования переменной и его визуализация в таком случае находятся за пределами GEM-библиотеки, так что пользователь сам должен будет реализовать этот процесс.
В GEM добавилась опциональная поддержка редактирования переменных с плавающей запятой типов `float` и `double`. По умолчанию она включена, для отключения нужно закомментировать соответствующую строчку в файлике `config.h`, идущим вместе с библиотекой. В Readme появилась новая секция с деталями по имплементации (вкратце: dtostrf() для конвертации в строку и atof() для конвертации обратно). Так же добавилась пара новых методов для динамического управления заголовками пунктов меню: `GEMItem::setTitle()` и `GEMItem::getTitle()`. Можно использовать, например, для реализации динамических лейблов кнопок, отражающих статус процесса после их нажатия: Все перечисленные апдейты снабжены обновлённой документацией и доступны в версии 1.2.1.
В GEM добавилась поддержка библиотеки Adafruit GFX вместе с возможностью изменять цвет меню на поддерживаемых цветных дисплеях. (Увы, без кириллицы). Краткое описание обновлений: Поддержка Adafruit GFX через новый класс `GEM_adafruit_gfx`; Новые методы `setForegroundColor()` и `setBackgroundColor()`, задающие цвет текста и фона; Новое значение `GEM_ITEMS_COUNT_AUTO` для параметра `menuItemsPerScreen`, позволяющее автоматически рассчитывать число умещающихся на экран пунктов меню в зависимости от его высоты; Небольшие багфиксы метода `GEMItem::hide()`, скрывающего пункты меню; Соотвествующие обновления документации и wiki с гайдами по настройке, описанием тестового стенда (необходимого для запуска тестовых скетчей) и how-to'шками. Обновления доступны с версии 1.3.0.
Небольшой апдейт GEM принёс поддержку пользовательских аргументов для callback-функций (как для кнопок, так и для пунктов меню, связанных с переменными). Это позволит, например, задать одну и ту же функцию для нескольких элементов меню (и выполнять требуемое действие в зависимости от значения переданного аргумента), а также создавать элементы меню в цикле. Поддерживаемые типы пользовательского аргумента: `int`, `byte`, `float`, `double`, `boolean`, `const char*`, `void*`. Помимо этого значения в callback так же будет передан указатель на текущий пункт меню. Соответствующим образом обновлены Readme и wiki. Обновления доступны с версии 1.4.0.
Добавил примеры использования GEM с кликабельным энкодером в качестве устройства ввода (для навигации и взаимодействия с меню). Помимо этого: Появилась возможность масштабировать элементы (шрифт и пиктограммы меню) в два раза в версии Adafruit GFX через `::setTextSize()` метод (может быть полезным для маленьких экранов); Добавился метод `::invertKeysDuringEdit()` для инвертирования управляющих сигналов вверх/вниз (`GEM_KEY_UP`/`GEM_KEY_DOWN`) в режиме редактирования переменной (позволяет добиться более естественного порядка смены символов во время редактирования при использовании энкодера) Обновления доступны с версии 1.4.4.