GEM - Графическое меню для Arduino

Тема в разделе "Глядите, что я сделал", создана пользователем Spirik, 22 фев 2018.

  1. Spirik

    Spirik Нерд

    Всем привет!

    Спешу поделиться своей библиотекой для построения графических многоуровневых меню для Ардуино: GEM (Good Enough Menu) Возможно, кому-то она сможет быть не менее полезна, чем мне :)

    [​IMG]

    Позволяет редактировать переменные (`int`, `byte`, `char[17]`), есть чекбоксы (`boolean`), селекты, кнопки и коллбэки на сохранение значений.

    Предназначена для работы с бэкпэком для графических LCD дисплеев SparkFun Graphic LCD Serial Backpack в связке с альтернативной прошивкой и библиотекой AltSerialGraphicLCD. Требования выглядят довольно специфичными, но эта связка позволяет подключить LCD к своему проекту всего 4-мя пинами (два на Serial, два на питание) и обладает богатыми возможностями по работе с графикой.

    Библиотека идёт с подробной документацией и аннотированными примерами, а так же Вики с дополнительным описанием примеров и всякими HowTo.

    С интересом попробую портировать её на бэкпэк от Амперки, если таковому будет суждено когда-нибудь увидеть свет=)
     
    OldKryptos, issaom, ИгорьК и ещё 1-му нравится это.
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Кириллицу поддерживает?
     
  3. Spirik

    Spirik Нерд

    Нет, к сожалению, поскольку у AltSerialGraphicLCD-прошивки бэкпэка нет кириллического набора символов.
     
  4. DIYMan

    DIYMan Guest

    Жаль, кириллицы нету, без этого даже щупать не хочется, ибо кириллица - наше всё. Ну не понимают юзеры на аглицком меню, хоть тресни.
     
    Andrey12 нравится это.
  5. Spirik

    Spirik Нерд

    Будем ждать версию бэкпэка от Амперки (и надеяться, что кириллица там будет). В комментариях на Ютьюбе они обмолвились, что планы такие есть.
     
  6. Spirik

    Spirik Нерд

    В GEM добавилась поддержка популярной библиотеки U8g2, а вместе с ней и кириллицы! Для того, чтобы активировать кириллические шрифты, нужно вызвать метод `enableCyrillic()` перед методом `init()`. При этом возрастёт размер, занимаемый программой в памяти МК, что следует иметь в виду.

    [​IMG]

    Кириллица поддерживается в элементах интерфейса (заголовки страниц меню, названия пунктов меню, кнопок и ссылок), а так же в опциях списков выбора (они же "селекты", "выпадашки", "дропдауны"). Однако, увы, (пока?) не поддерживается редактирование кириллических строковых переменных.

    Краткое описание обновлений:
    • Поддержка U8g2 через новый класс `GEM_u8g2`;
    • Небольшая чистка и оптимизация кода (и AltSerialGraphicLCD, и U8g2 версии);
    • Базовая поддержка кириллицы (метод `enableCyrillic()`) и соотвествующий пример кода;
    • Новый метод `reInit()`, возвращающий дисплей к требуемым настройкам после выхода из пользовательского контекста;
    • Соотвествующие обновления документации и wiki с гайдами по настройке, описанием тестового стенда (необходимого для запуска тестовых скетчей) и how-to'шками.
    Обновления доступны с версии 1.1.0.
     
    JIuSS, Tomasina и issaom нравится это.
  7. JIuSS

    JIuSS Нуб

    А другие типы данных реально добавить? в частности интересует дата/время.
    И еще вопрос - если я использую матричную клавиатуру 4*5, 9-пиновую, работаю с Keypad.h, как ее нажатия привязать к меню?
     
  8. Spirik

    Spirik Нерд

    Дата/время (как и любые другие типы) - это, по сути, просто число. Так что его вполне можно реализовать на основе имеющегося `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;
        }
      }
    }
    Что-то в таком духе=) Подробнее см. в Вики: тут, тут и тут.
     
    JIuSS нравится это.
  9. JIuSS

    JIuSS Нуб

    А как обрабатывать цифровые нажатия на клавиатуре? Например ввод значения не стрелками, а клавишами 0-9?
     
  10. Spirik

    Spirik Нерд

    Такого не предусмотрено. Всё взаимодействие с меню (ввод/редактирование переменных равно как и навигация) осуществляется 6 кнопками: Вверх, Вниз, Влево, Вправо, ОК и Назад/Отмена.
     
    JIuSS нравится это.
  11. JIuSS

    JIuSS Нуб

    А если пункт меню сделать кнопкой вместо переменной и в функции обрабатывать нажатия цифровых кнопок и менять значение?
     
  12. Spirik

    Spirik Нерд

    В обработчике, который вешается на кнопку, можно делать всё, что угодно: использовать графическую библиотеку в своих целях, использовать любые другие библиотеки, изменять значение переменных, вызывать другие функции и проч. - всё то же, что можно делать в любом другом своём скетче. Но обработка процесса редактирования переменной и его визуализация в таком случае находятся за пределами GEM-библиотеки, так что пользователь сам должен будет реализовать этот процесс.
     
  13. Spirik

    Spirik Нерд

    В GEM добавилась опциональная поддержка редактирования переменных с плавающей запятой типов `float` и `double`. По умолчанию она включена, для отключения нужно закомментировать соответствующую строчку в файлике `config.h`, идущим вместе с библиотекой. В Readme появилась новая секция с деталями по имплементации (вкратце: dtostrf() для конвертации в строку и atof() для конвертации обратно).

    Так же добавилась пара новых методов для динамического управления заголовками пунктов меню: `GEMItem::setTitle()` и `GEMItem::getTitle()`. Можно использовать, например, для реализации динамических лейблов кнопок, отражающих статус процесса после их нажатия:


    Все перечисленные апдейты снабжены обновлённой документацией и доступны в версии 1.2.1.
     
    SOLOway нравится это.