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 нравится это.
  14. Spirik

    Spirik Нерд

    [​IMG]

    В GEM добавилась поддержка библиотеки Adafruit GFX вместе с возможностью изменять цвет меню на поддерживаемых цветных дисплеях. (Увы, без кириллицы).

    Краткое описание обновлений:
    • Поддержка Adafruit GFX через новый класс `GEM_adafruit_gfx`;
    • Новые методы `setForegroundColor()` и `setBackgroundColor()`, задающие цвет текста и фона;
    • Новое значение `GEM_ITEMS_COUNT_AUTO` для параметра `menuItemsPerScreen`, позволяющее автоматически рассчитывать число умещающихся на экран пунктов меню в зависимости от его высоты;
    • Небольшие багфиксы метода `GEMItem::hide()`, скрывающего пункты меню;
    • Соотвествующие обновления документации и wiki с гайдами по настройке, описанием тестового стенда (необходимого для запуска тестовых скетчей) и how-to'шками.
    Обновления доступны с версии 1.3.0.
    [​IMG]
     
    SOLOway нравится это.
  15. Spirik

    Spirik Нерд

    Небольшой апдейт GEM принёс поддержку пользовательских аргументов для callback-функций (как для кнопок, так и для пунктов меню, связанных с переменными). Это позволит, например, задать одну и ту же функцию для нескольких элементов меню (и выполнять требуемое действие в зависимости от значения переданного аргумента), а также создавать элементы меню в цикле. Поддерживаемые типы пользовательского аргумента: `int`, `byte`, `float`, `double`, `boolean`, `const char*`, `void*`. Помимо этого значения в callback так же будет передан указатель на текущий пункт меню.

    Соответствующим образом обновлены Readme и wiki.

    Обновления доступны с версии 1.4.0.
     
  16. Spirik

    Spirik Нерд

    [​IMG]

    Добавил примеры использования GEM с кликабельным энкодером в качестве устройства ввода (для навигации и взаимодействия с меню). Помимо этого:
    • Появилась возможность масштабировать элементы (шрифт и пиктограммы меню) в два раза в версии Adafruit GFX через `::setTextSize()` метод (может быть полезным для маленьких экранов);
    • Добавился метод `::invertKeysDuringEdit()` для инвертирования управляющих сигналов вверх/вниз (`GEM_KEY_UP`/`GEM_KEY_DOWN`) в режиме редактирования переменной (позволяет добиться более естественного порядка смены символов во время редактирования при использовании энкодера)
    Обновления доступны с версии 1.4.4.

     
    Последнее редактирование: 28 сен 2023
  17. Spirik

    Spirik Нерд

    [​IMG]

    В предновогоднем релизе GEM появился новый расширенный пример - создание Todo списка, демонстрирующий использование новых возможностей библиотеки (потому что какой уважаемый фреймворк может обойтись без примера с созданием Todo списка?):
    • Возможность задавать стили индивидуально для каждой страницы меню с использованием нового типа `GEMAppearance` и методов `::setAppearance()`;
    • Поиск пунктов меню из скетча при помощи методов `GEMPage::getMenuItem()` и `GEMItem::getMenuItemNext()`;
    • Получение указателя на текущую страницу и пункт меню при помощи методов `::getCurrentMenuPage()`, `GEMPage::getCurrentMenuItem()`, `GEMPage::getCurrentMenuItemIndex()`;
    • Включение альтернативного порядка в карусели символов при редактировании текстовых переменных при помощи `GEMItem::setAdjustedASCIIOrder()` (не придётся долго перебирать спец-символы, чтобы наконец добраться до алфавита);
    • Возможность отвязать пункт меню от страницы меню при помощи `GEMItem::remove()` (с возможностью добавить его в последующем на другую или ту же страницу через `GEMPage::addMenuItem()`);
    • Дополнительные параметры метода `GEMPage::addMenuItem()` позволяют добавлять пункты меню в указанную (по индексу) позицию на страницу (с учётом невидимых или только видимых пунктов, уже присутствующих на странице);
    • Поддержка вызова методов по цепочке, например `menu.hideVersion().invertKeysDuringEdit().init()`;
    • Версия под библиотеку AltSerialGraphicLCD теперь отключена по-умолчанию, но может быть включена по желанию через `config.h` или установку флага `GEM_ENABLE_GLCD`.
    Ещё из новостей - большинство примеров использования библиотеки теперь доступно в онлайн-симуляторе Wokwi:
    Обновления доступны с версии 1.5.0.

    С Наступающим!

    [​IMG]
     
    b707 и Airbus нравится это.
  18. Автор данного GUI из России?
     
  19. Spirik

    Spirik Нерд

  20. Ладно я еще понимаю что названия менюшек на английском ни чего плохого, зачастую занимает меньше символов, но почему все описания на английском, что в самой библиотеке, что на гитхабе. Вы русофоб?