/GyverGFX

Лёгкая библиотека двухмерной графики для дисплеев и матриц

Primary LanguageC++MIT LicenseMIT

latest PIO Foo Foo Foo

Foo

GyverGFX

Движок двухмерной графики для дисплеев и матриц

  • Точка
  • Линии
  • Прямоугольники
  • Окружность
  • Кривая Безье
  • Битмап
  • Вывод текста (русский, английский) нескольких размеров
  • Вшиты 155 иконок
  • Бегущая строка

Совместимость

Совместима со всеми Arduino платформами (используются Arduino-функции)

Содержание

Установка

  • Библиотеку можно найти по названию GyverGFX и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь

Обновление

  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

Использование

GyverGFX

// конструктор
GyverGFX();
GyverGFX(int x, int y); // с указанием размеров "экрана"

// методы
void size(int x, int y);    // установить размер
int width();                // получить ширину
int height();               // получить высоту

// ============ PRIMITIVE ============
// fill:
// GFX_CLEAR - очистить фигуру
// GFX_FILL - залить фигуру
// GFX_STROKE - обвести фигуру
virtual void dot(int x, int y, uint8_t fill = 1);                   // точка
void fill(uint8_t fill = 1);                                        // залить экран
void clear();                                                       // очистить экран
void lineH(int y, int x0, int x1, uint8_t fill = 1);                // горизонтальная линия
void lineV(int x, int y0, int y1, uint8_t fill = 1);                // вертикальная линия
void line(int x0, int y0, int x1, int y1, uint8_t fill = 1);        // линия
void rect(int x0, int y0, int x1, int y1, uint8_t fill = 1);        // прямоугольник (координаты углов)
void rectWH(int x0, int y0, int w, int h, uint8_t fill = 1);        // прямоугольник (координаты угла и размер)
void roundRect(int x0, int y0, int x1, int y1, uint8_t fill = 1);   // скруглённый прямоугольник (координаты углов)
void roundRectWH(int x0, int y0, int w, int h, uint8_t fill = 1);   // скруглённый прямоугольник (координаты угла и размер)
void circle(int x, int y, int radius, uint8_t fill = 1);            // окружность
void bezier(uint8_t *arr, uint8_t size, uint8_t dense, uint8_t fill = 1);     // кривая Безье
void bezier16(int16_t *arr, uint8_t size, uint8_t dense, uint8_t fill = 1);   // кривая Безье 16 бит

// ============ TEXT ============
// наследует Print.h
print(любой тип);
println(любой тип);

// вывести столбик-байт в текущий курсор с учётом масштаба и режима текста, автоматически перенесёт курсор
void drawByte(uint8_t bits);
void drawBytes(uint8_t *bytes, int amount);           // из массива
void drawBytes_P(const uint8_t *bytes, int amount);   // из PROGMEM массива

// mode:
// GFX_ADD - добавить к буферу
// GFX_REPLACE - заменить информацию в буфере
void drawBitmap(int x, int y, const uint8_t *frame, int width, int height, uint8_t invert = 0, byte mode = 0);  // битмап (mode: GFX_ADD/GFX_REPLACE)
void textDisplayMode(bool mode);        // установить режим вывода текста
bool getTextDisplayMode();              // получить режим вывода текста

void setCursor(int x, int y);           // установить курсор
int getCursorX();                       // получить курсор x
int getCursorY();                       // получить курсор y

void setScale(uint8_t scale);           // установить масштаб текста (1-4)
uint8_t getScale();                     // получить масштаб текста

void invertText(bool inv);              // установить инверсию текста
bool getInvertText();                   // получить инверсию текста

void autoPrintln(bool mode);            // установить автоматический перенос текста
bool getAutoPrintln();                  // получить автоматический перенос текста

void setTextBound(int x0, int x1);      // установить границы вывода текста по х
void resetTextBound();                  // сбросить границы вывода текста до (0, ширина)
int getTextBoundX0();                   // получить границу вывода 0
int getTextBoundX1();                   // получить границу вывода 1

uint16_t strlen_fix(const char *str);   // определить длину строки с любыми символами (в т.ч. русскими)
uint16_t strlen_fix_P(PGM_P str);       // определить длину PGM строки с любыми символами (в т.ч. русскими)

// ============ DEFINE ============
// дефайны настроек
// (перед подключением библиотеки)
#define GFX_NO_PRINT                    // отключить модуль вывода текста (экономия памяти)

Встроенные иконки

В библиотеке идёт набор из 155 иконок 8х8, файл fonts/icons8x8.h. Выводятся следующим образом:

obj.drawBytes_P(GFX_icons::alarm, 8);
obj.drawBytes_P(GFX_icons::email, 8);

RunningGFX

Асинхронная бегущая строка. Не хранит строку внутри себя, поэтому по очевидным причинам поддерживает работу с:

  • Глобально созданными String - строками
  • Глобально созданными PROGMEM - строками
  • Глобально созданными char[] - строками
  • Строковыми константами (они изначально являются глобальными)

Особенности:

  • Для автоматического обновления строки в классе должен быть реализован метод update()
  • Строку можно изменять во время движения: setText() не запускает движение заново, поэтому при обновлении String-строки можно вызвать setText для автоматического пересчёта длины
  • Настройки бегущей строки (масштаб, режим текста) не влияют на дисплей, точнее автоматически устанавливаются обратно
  • Один объект управляет одной строкой. если нужно несколько одновременно бегущих строк - создай несколько обьектов, пример ниже
// конструктор
RunningGFX(GyverGFX* gfx);

// методы
void setText(const char* str);      // установить текст const char*
void setText(String& str);          // установить текст String
void setText_P(PGM_P str);          // установить текст из PROGMEM (глобальный)

void invertText(bool inv);          // инвертировать текст
void setScale(uint8_t scale);       // масштаб текста
void textDisplayMode(bool mode);    // режим вывода текста GFX_ADD/GFX_REPLACE
void setWindow(int16_t x0, int16_t x1, int16_t y);  // установить окно (x0, x1, y)
void setSpeed(uint16_t pixPerSec);  // установить скорость (пикселей в секунду)

void start();                       // запустить бегущую строку с начала
void stop();                        // остановить бегущую строку
void resume();                      // продолжить движение с момента остановки

// тикер. Вернёт 0 в холостом, 1 при новом шаге, 2 при завершении движения
// Можно передать false чтобы дисплей не обновлялся сам
uint8_t tick(bool update = true);

// сдвинуть строку на 1 пиксель. Можно передать false чтобы дисплей не обновлялся сам
uint8_t tickManual(bool update = true);

Пример

// пример наследования в класс. Нужно реализовать методы dot и update
class MAX7219 : public GyverGFX {
public:
  MAX7219(int width, int height) : GyverGFX(width * 8, height * 8) {}
  void dot(int x, int y, uint8_t fill = GFX_FILL) {
    // ...
  }
  void update() {
    // ...
  }
};
// пример RunningGFX
// RunningGFX работает с классом, который наследует GyverGFX. Например библиотека GyverMAX7219

MAX7219<4, 1, 5> mtrx;  // одна матрица (1х1), пин CS на D5
RunningGFX run1(&mtrx);
RunningGFX run2(&mtrx);
const char pstr_g[] PROGMEM = "Global pgm string";
String str_g = "123";

void setup() {
  mtrx.begin();       // запускаем
  mtrx.setBright(5);  // яркость 0..15

  run1.setText("hello");  // строковая константа
  // run1.setText(str_g); // глобальная стринга
  run1.setSpeed(15);
  run1.setWindow(0, 16, 0);
  run1.start();

  run2.setText_P(pstr_g); // глобальная PGM строка
  run2.setSpeed(10);
  run2.setWindow(8, 16, 0);
  run2.start();
}

void loop() {
  run1.tick();
  run2.tick();
}

Версии

  • v1.0
  • v1.1 - оптимизация памяти
  • v1.2 - небольшая оптимизация
  • v1.3 - добавил фичи
  • v1.4 - мелкие фиксы
  • v1.5 - добавлено отключение модуля вывода текста GFX_NO_PRINT
  • v1.5.1 - мелкие фиксы
  • v1.6 - мелкие улучшения, добавлен движок бегущей строки
  • v1.7
    • Улучшена бегущая строка
    • Добавлены настройки
    • Добавлены новые инструменты вывода графики (drawByte, drawBytes, drawBytes_p)
    • Добавлены иконки
    • Улучшен шрифт

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код