Skip to content
AlexGyver edited this page Feb 25, 2024 · 75 revisions

Документация GyverHub

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

  1. Примеры, Примеры dev
  2. Документация (эта страница)

Компиляция

Настройки

Перед подключением библиотеки можно объявить настройки, влияющие на компиляцию библиотеки:

// BRIDGES
#define GH_NO_STREAM  // отключить встроенный модуль связи stream
#define GH_NO_HTTP    // отключить встроенный модуль связи http (для esp)
#define GH_NO_WS      // отключить встроенный модуль связи ws (для esp)
#define GH_NO_MQTT    // отключить встроенный модуль связи mqtt (для esp)

#define GH_BRIDGE_AMOUNT 5       // количество мостов подключения
#define GH_WS_PORT 81            // websocket порт
#define GH_MQTT_RECONNECT 10000  // период переподключения встроенного MQTT (для esp)

// MODULES
#define GH_NO_PAIRS    // отключить поддержку типа Pairs
#define GH_NO_GET      // отключить отправку на get-топик (mqtt)
#define GH_NO_INFO     // отключить info билдер
#define GH_NO_MODULES  // отключить "модули" (все включены)
#define GH_NO_REQUEST  // отключить поддержку запросов

// FS
#define GH_NO_FS                 // отключить файловую систему (для esp)
#define GH_FETCH_CHUNK_SIZE 512  // размер чанка при скачивании с платы (для esp)
#define GH_UPL_CHUNK_SIZE 512    // размер чанка при загрузке на плату (для esp)
#define GH_FS_DEPTH 5            // глубина сканирования файловой системы (esp32)

// TRANSFER
#define GH_NO_FETCH    // отключить скачивание файлов (для esp)
#define GH_NO_UPLOAD   // отключить загрузку файлов (для esp)
#define GH_NO_OTA      // отключить ОТА обновления (для esp)
#define GH_NO_OTA_URL  // отключить ОТА по ссылке (для esp)
#define GH_REBOOT_DELAY 1500    // задержка перед перезагрузкой после OTA (для esp)

// PORTAL
#define GH_FILE_PORTAL     // загружать сайт из памяти есп (положи файлы в папку /hub/) (для esp)
#define GH_INCLUDE_PORTAL  // включить сайт в память программы, ~50кБ (не нужно загружать файлы в память) (для esp)

// HTTP
#define GH_PUBLIC_PATH "/www"          // путь к папке с файлами с HTTP доступом (для esp)
#define GH_HTTP_PORT 80                // http порт (для esp)
#define GH_CACHE_PRD "max-age=604800"  // период кеширования файлов для портала (для esp)

#define GH_NO_HTTP_TRANSFER       // отключить загрузку/скачивание/ОТА по http (для esp)
#define GH_NO_HTTP_DNS            // отключить DNS сервер (для esp)
#define GH_NO_HTTP_OTA            // отключить ОТА обновления по http (для esp)
#define GH_NO_HTTP_PUBLIC         // отключить доступ к файлам по http c ip/www (для esp)
#define GH_NO_HTTP_FETCH          // отключить скачивание файлов по http (для esp)
#define GH_NO_HTTP_UPLOAD         // отключить загрузку файлов по http (для esp)
#define GH_NO_HTTP_UPLOAD_PORTAL  // упрощённую загрузку файлов с ip/hub/upload_portal (для esp)
Платформа

Библиотека сама определяет, на какой платформе компилируется. Для ESP8266/ESP32 предусмотрен отдельный флаг GH_ESP_BUILD (доступен после подключения библиотеки), включюащий сетевые возможности в компиляцию. Для создания кросс-платформенного кода можно "прятать" код для ESP внутри условной конструкции:

#include <GyverHub.h>

#ifdef GH_ESP_BUILD
// этот код будет компилироваться только для esp
#endif

Также в макросе GH_PLATFORM содержится название платформы в виде строки:

  • "ESP8266"
  • "ESP32"
  • "ESP32-S2"
  • "ESP32-S3"
  • "ESP32-C3"
  • "Arduino" для всех остальных

GyverHub

Примечание по типам данных

Для удобства в библиотеке используются "универсальные" типы данных. Компилятор сам понимает, что передали в функцию:

  • AnyText - строка в любом виде ("строка", F("строка"), char*, String)
  • AnyValue - любой целочисленный и дробный тип данных + строки в любом виде
  • AnyPtr - указатель (адрес) переменной любого типа (String, char*, все числа) + системные (Colors, Flags, Pos, Button, Log)
Инициализация
GyverHub;
GyverHub(String net);                                        // + имя сети
GyverHub(String net, String name);                           // + имя в списке устройств
GyverHub(String net, String name, String icon);              // + иконка в списке устройств
GyverHub(String net, String name, String icon, uint32_t id); // + вручную задать ID устройства

Иконки Font Awesome v5 Solid, бесплатный пак:

  • Список иконок
  • Вставлять в "строку" сам символ (глиф) "" или его код "f6ad"
  • Пустая строка "" - отключить иконку
Система
// настроить префикс, название и иконку. Опционально задать свой ID устройства вида 0xXXXXXX (для esp он генерируется автоматически)
void config(String prefix, String name = "", String icon = "", uint32_t id = 0);

// установить версию прошивки для отображения в Info
void setVersion(String v);

// установить размер буфера строки для сборки интерфейса (умолч. 1000)
void setBufferSize(uint16_t size);

// установить пин-код для открытия устройства (значение больше 1000, не может начинаться с 000..)
void setPIN(uint32_t pin);

uint32_t getPIN();                  // прочитать пин-код
void begin();                       // запустить
void end();                         // остановить
bool tick();                        // тикер, вызывать в loop

bool addBridge(gh::Bridge* bridge); // добавить мост подключения
Статус
bool running();     // вернёт true, если система запущена
bool focused();     // true - интерфейс устройства сейчас открыт на сайте или в приложении
bool canSend();     // доступна ли сейчас отправка (функции updateXxx и sendXxx)
Обработчики
// подключить функцию-сборщик интерфейса вида f(gh::Builder& builder)
void onBuild(f);

// подключить обработчик запроса клиента вида f(gh::Request& request)
void onRequest(f);

// подключить функцию-сборщик инфо вида f(gh::Info& info)
void onInfo(f) ;

// подключить обработчик входящих сообщений с веб-консоли вида f(String str)
void onCLI(f);

// подключить обработчик получения unix времени с клиента вида f(uint32_t unix)
void onUnix(f);

// подключить обработчик скачивания файлов вида f(gh::Fetcher& fetcher)
void onFetch(f);

// подключить функцию-обработчик перезагрузки вида f(gh::Reboot res). Будет вызвана перед перезагрузкой
void onReboot(f);

// подключить обработчик загрузки файлов вида f(String& path). Будет вызван при сохранении файла
void onUpload(f);

// безопасная загрузка файлов (загружать во временный файл) (умолч. включен, true)
void safeUpload(bool state);
Отправка
// отправить текст в веб-консоль. Опционально цвет
void sendCLI(AnyText str, gh::Colors col = gh::Colors::Default, gh::Client* client = nullptr);

// обновить панель управления в приложении
void sendRefresh(gh::Client* client = nullptr);

// выполнить js код
void sendScript(AnyText script, gh::Client* client = nullptr);

// отправить действие (обновить файл, вызвать Confirm/Prompt)
void sendAction(AnyText name, gh::Client* client = nullptr);

// отправить пуш уведомление
void sendPush(AnyText text, gh::Client* client = nullptr);

// отправить всплывающее уведомление
void sendNotice(AnyText text, gh::Colors col = gh::Colors::Green, gh::Client* client = nullptr);

// показать окно с ошибкой
void sendAlert(AnyText text, gh::Client* client = nullptr);
Обновление
// обновить виджет. Указать имя виджета (или список), имя функции, клиента (опционально)
gh::UpdateInline update(AnyText name, AnyText func, gh::Client* client = nullptr);

// обновить виджет. Указать имя виджета (или список), клиента (опционально)
gh::UpdateInline update(AnyText name, gh::Client* client = nullptr);

// отправить value update на имя виджета int/string/bool
void sendUpdate(AnyText name, AnyValue value, gh::Client* client = nullptr);

// отправить value update на имя виджета float
void sendUpdate(AnyText name, double value, uint8_t dec, gh::Client* client = nullptr);

// отправить value update по имени компонента (значение будет прочитано в build). Нельзя вызывать из build. Имена можно передать списком через ;
void sendUpdate(AnyText name, gh::Client* client = nullptr);
MQTT
// автоматически отправлять новое состояние на get-топик при изменении через set (умолч. false)
void sendGetAuto(bool state);

// отправить имя-значение на get-топик (MQTT) int/string/bool
void sendGet(AnyText name, AnyValue value);

// отправить имя-значение на get-топик (MQTT) float
void sendGet(AnyText name, double value, uint8_t dec);

// отправить значение по имени компонента на get-топик (MQTT) (значение будет прочитано в build). Имена можно передать списком через ;
void sendGet(String name);

// отправить MQTT LWT команду на включение/выключение
void sendStatus(bool status);

// топик статуса для отправки
String topicStatus();

// общий топик для подписки
String topicDiscover();

// топик устройства для подписки
String topicHub();
Чтение билдера
// получить полный JSON пакет панели управления. Флаг enclose true - обернуть в результат в []
String getUI(bool enclose = false);

// получить JSON объект {имя:значение, ...} виджетов (из билдера)
String getValues();

// получить значение компонента по имени (из билдера)
String getValue(AnyText name);
Публичные члены
uint8_t menu;   // номер текущего пункта меню
String prefix = "";
String name = "";
String icon = "";
String version = "";
const char* id;
gh::Bridge* bridges[GH_BRIDGE_AMOUNT];
Modules modules;
gh::HubStream stream;
HubMQTT mqtt;

Билдер

Виджеты
// =================== МЕНЮ ====================
// Меню. Передать пункты меню списком "пункт1;пункт2" + attach, click
Widget& Menu(AnyText text);

// =================== СТРУКТУРА ====================
// начать строку. Всегда возвращает true
bool beginRow(uint8_t width = 1);

// закончить строку
void endRow();

// начать столбец. Всегда возвращает true
bool beginCol(uint8_t width = 1);

// закончить столбец
void endCol();

// пустой виджет. Параметры: size, square
Widget& Space();

// =================== ВВОД ====================
// Поле ввода текста. Параметры: value (текст), color, regex, maxLen, disabled, attach, click + параметры виджета
Widget& Input(AnyPtr ptr);
Widget& Input_(AnyText name, AnyPtr ptr);

// Поле ввода текста. Параметры: value (текст), rows, maxLen, disabled, attach, click + параметры виджета
Widget& InputArea(AnyPtr ptr);
Widget& InputArea_(AnyText name, AnyPtr ptr);

// Поле ввода пароля. Параметры: value (текст), color, regex, maxLen, disabled, attach, click + параметры виджета
Widget& Pass(AnyPtr ptr);
Widget& Pass_(AnyText name, AnyPtr ptr);

// Всплывающее окно подтверждения. Параметры: text (подпись), attach, click. Для активации отправь обновление action()
Widget& Confirm(AnyPtr ptr);
Widget& Confirm_(AnyText name, AnyPtr ptr);

// Всплывающее окно ввода. Параметры: value (значение), text (подпись), attach, click. Для активации отправь обновление action()
Widget& Prompt(AnyPtr ptr);
Widget& Prompt_(AnyText name, AnyPtr ptr);

// Дата. Параметры: value(unix), color, disabled, attach, click + параметры виджета
Widget& Date(AnyPtr ptr);
Widget& Date_(AnyText name, AnyPtr ptr);

// Время. Параметры: value(unix), color, disabled, attach, click + параметры виджета
Widget& Time(AnyPtr ptr);
Widget& Time_(AnyText name, AnyPtr ptr);

// Дата и время. Параметры: value(unix), color, disabled, attach, click + параметры виджета
Widget& DateTime(AnyPtr ptr);
Widget& DateTime_(AnyText name, AnyPtr ptr);

// Слайдер. Параметры: value (значение), color, range, unit, disabled, attach, click + параметры виджета
Widget& Slider(AnyPtr ptr);
Widget& Slider_(AnyText name, AnyPtr ptr);

// Спиннер. Параметры: value (значение), range, unit, disabled, attach, click + параметры виджета
Widget& Spinner(AnyPtr ptr);
Widget& Spinner_(AnyText name, AnyPtr ptr);

// Выпадающий список. Параметры: value (номер пункта), text (список), color, disabled, attach, click + параметры виджета
Widget& Select(AnyPtr ptr);
Widget& Select_(AnyText name, AnyPtr ptr);

// Цвет. Параметры: value (цвет), disabled, attach, click + параметры виджета
Widget& Color(AnyPtr ptr);
Widget& Color_(AnyText name, AnyPtr ptr);

// Выключатель. Параметры: value (состояние), color, disabled, attach, click + параметры виджета
Widget& Switch(AnyPtr ptr);
Widget& Switch_(AnyText name, AnyPtr ptr);

// Выключатель. Параметры: value (состояние), icon, color, fontSize, disabled, attach, click + параметры виджета
Widget& SwitchIcon(AnyPtr ptr);
Widget& SwitchIcon_(AnyText name, AnyPtr ptr);

// Вкладки. Параметры: value (выбранная), text (список), color, disabled, attach, click + параметры виджета. text не обновляется
Widget& Tabs(AnyPtr ptr);
Widget& Tabs_(AnyText name, AnyPtr ptr);

// Кнопка. Параметры: icon, color, fontSize, disabled, attach, click + параметры виджета
Widget& Button(gh::Button* ptr);
Widget& Button_(AnyText name, gh::Button* ptr);

// Кнопки выбора. Параметры: value (флаги), text (список), color, disabled, attach, click + параметры виджета
Widget& Flags(gh::Flags* ptr);
Widget& Flags_(AnyText name, gh::Flags* ptr);

// Джойстик. keep - возвращать в центр, exp - экспоненциальные значения. Параметры: color + параметры виджета
Widget& Joystick(Pos* pos = nullptr, bool keep = 0, bool exp = 0);
Widget& Joystick_(AnyText name, Pos* pos = nullptr, bool keep = 0, bool exp = 0);

// Крестовина. Параметры: color + параметры виджета
Widget& Dpad(Pos* pos = nullptr);
Widget& Dpad_(AnyText name, Pos* pos = nullptr);

// Холст
// Холст, рисование. Ширина, длина. Только параметры виджета
Widget& BeginCanvas(uint16_t width = 400, uint16_t height = 300, Canvas* cv = nullptr, Pos* pos = nullptr);
Widget& BeginCanvas_(AnyText name, uint16_t width = 400, uint16_t height = 300, Canvas* cv = nullptr, Pos* pos = nullptr);

// Холст. Ширина, длина. Только параметры виджета
Widget& Canvas(uint16_t width = 400, uint16_t height = 300, Canvas* cv = nullptr, Pos* pos = nullptr);
Widget& Canvas_(AnyText name, uint16_t width = 400, uint16_t height = 300, gh::Canvas* cv = nullptr, Pos* pos = nullptr, bool begin = false);

// завершить холст
void EndCanvas();

// =================== ВЫВОД ====================
// Заголовок. Параметры: value (текст), icon, color, align, fontSize + size виджета
Widget& Title(AnyValue text);
Widget& Title_(AnyText name, AnyValue text);
Widget& Title_(AnyText name, Pairs* pairs);

// Надпись. Параметры: value (текст), icon, color, align, fontSize + параметры виджета
Widget& Label(AnyValue text);
Widget& Label_(AnyText name, AnyValue text);
Widget& Label_(AnyText name, Pairs* pairs);

// Окно с текстом. Параметры: value (текст), rows + параметры виджета
Widget& Text(AnyValue text);
Widget& Text_(AnyText name, AnyValue text);
Widget& Text_(AnyText name, Pairs* pairs);

// Окно с текстом. Параметры: value (путь), rows + параметры виджета
Widget& TextFile(AnyValue text);
Widget& TextFile_(AnyText name, AnyValue text);
Widget& TextFile_(AnyText name, Pairs* pairs);

// Дисплей. Параметры: value (текст), color, fontSize, rows + параметры виджета
Widget& Display(AnyValue text);
Widget& Display_(AnyText name, AnyValue text);
Widget& Display_(AnyText name, Pairs* pairs);

// Картинка. Параметры: value (путь) + параметры виджета
Widget& Image(AnyText text);
Widget& Image_(AnyText name, AnyText text);
Widget& Image_(AnyText name, Pairs* pairs);

// Лог. value(текст), rows + параметры виджета
Widget& Log(gh::Log* ptr);
Widget& Log_(AnyText name, gh::Log* ptr);

// Светодиод. Параметры: value (состояние 1/0), color + параметры виджета
Widget& LED(AnyPtr ptr);
Widget& LED_(AnyText name, AnyPtr ptr);

// Светодиод-иконка. Параметры: value (состояние 1/0), icon, fontSize, color + параметры виджета
Widget& Icon(AnyPtr ptr);
Widget& Icon_(AnyText name, AnyPtr ptr);

// Индикаторная шкала. Параметры: value (значение), range, unit, color + параметры виджета
Widget& Gauge(AnyPtr ptr);
Widget& Gauge_(AnyText name, AnyPtr ptr);

// Индикаторная шкала круглая. Параметры: value (значение), range, unit, color + параметры виджета
Widget& GaugeRound(AnyPtr ptr);
Widget& GaugeRound_(AnyText name, AnyPtr ptr);

// Индикаторная шкала линейная. Параметры: value (значение), icon, range, unit, color + параметры виджета
Widget& GaugeLinear(AnyPtr ptr);
Widget& GaugeLinear_(AnyText name, AnyPtr ptr);

// Таблица. Параметры: value (текст или путь) + параметры виджета
// text: таблица в формате CSV - разделитель столбцов ; разделитель строк \n
// width: ширина, список чисел в процентах (например "30;30;50")
// align: выравнивание, список из left | center | right (например "left;right")
Widget& Table(AnyText text, AnyText width, AnyText align);
Widget& Table_(AnyText name, AnyText text, AnyText width, AnyText align);
Параметры виджетов
// ===================== BLOCK =====================
// Ширина (относительно) и высота (px) виджета
Widget& size(uint16_t width, uint16_t height = 0);

// Заголовок виджета
Widget& label(AnyText str);

// Убрать заголовок виджета
Widget& noLabel(bool nolabel = true);

// Дополнительный заголовок виджета справа
Widget& suffix(AnyText str);

// Убрать задний фон виджета
Widget& noTab(bool notab = true);

// Сделать виджет квадратным
Widget& square(bool square = true);

// Отключить виджет
Widget& disabled(bool disable = true);

// Подсказка виджета. Пустая строка - убрать подсказку
Widget& hint(AnyText str);

// ===================== CUSTOM =====================
// int/string/bool поле
Widget& param(AnyText key, AnyValue val);

// float поле
Widget& param(AnyText key, double val, uint8_t dec);

// ===================== VALUE =====================
// привязать переменную как значение
Widget& valueVar(AnyPtr data);

// int/string/bool значение
Widget& value(AnyValue val);

// float значение
Widget& value(double val, uint8_t dec);

// ===================== TEXT =====================
// текст
Widget& text(AnyText str);

// иконка (glyph или unicode) https://fontawesome.com/v5/search?o=r&m=free&s=solid
Widget& icon(AnyText str);

// максимальная длина текста
Widget& maxLen(uint16_t len);

// ===================== MISC =====================
// количество строк поля текста
Widget& rows(uint16_t rows);

// regex для Input и Pass
Widget& regex(AnyText str);

// выравнивание текста для label/title
Widget& align(gh::Align align);

// минимум, максимум и шаг изменения значения (float)
Widget& range(double min, double max, double step, uint8_t dec = 2);

// минимум, максимум и шаг изменения значения (целые числа)
template <typename T>
Widget& range(T min, T max, T step);

// единицы измерения
Widget& unit(AnyText str);

// размер шрифта/кнопки
Widget& fontSize(uint16_t size);

// цвет uint32_t 24 бит
Widget& color(uint32_t color);

// цвет gh::Colors
Widget& color(gh::Colors col);

// Действие (обновить файл, вызвать Confirm/Prompt)
Widget& action(bool act = 1);

// ===================== ACTION =====================
// Проверка на клик по виджету
bool click();

// ===================== ATTACH =====================
// Подключить функцию вида void f()
Widget& attach(void (*cb)());

// Подключить функцию вида void f(gh::Build& build)
Widget& attach(void (*cb)(gh::Build& build));

// Подключить функцию вида void f(gh::Builder& build)
Widget& attach(void (*cb)(gh::Builder& build), gh::Builder& b);

// Подключить gh::Flag* флаг
Widget& attach(gh::Flag* flag);

// Подключить bool* флаг
Widget& attach(bool* flag);
Прочие методы
// обновить панель управления (по действию с виджета)
void refresh();

// был ли запрос на обновление панели управления
bool isRefresh();

// включить/выключить вывод виджетов (только для запроса виджетов)
bool show(bool en = true);

// было изменено значение виджета (сигнал на сохранение)
bool changed();

// номер текущего пункта меню
uint8_t menu();

// добавить виджеты из JSON строки
void addJSON(AnyText text);

// добавить виджеты из JSON строки PROGMEM
void addJSON_P(PGM_P text);

// добавить виджеты из JSON из файла
void addJSON_File(AnyText path);

Canvas

Константы
BUTT,
ROUND,
SQUARE,
PROJECT,
BEVEL,
MITER,
START,
END,
CENTER,
LEFT,
RIGHT,
ALPHABETIC,
TOP,
HANGING,
MIDDLE,
IDEOGRAPHIC,
BOTTOM,
SRC_OVER,
SRC_ATOP,
SRC_IN,
SRC_OUT,
DST_OVER,
DST_ATOP,
DST_IN,
DST_OUT,
LIGHTER,
COPY,
XOR,
TXT_TOP,
TXT_BOTTOM,
TXT_CENTER,
TXT_BASELINE,
CORNER,
CORNERS,
RADIUS,
Класс
// подключить внешний буфер
void setBuffer(ghc::Packet* pp);

// добавить строку кода на js
Canvas& custom(AnyText text);

// =====================================================
// =============== PROCESSING-LIKE API =================
// =====================================================

// =================== BACKGROUND ======================
// очистить полотно
Canvas& clear();

// залить полотно установленным в fill() цветом
Canvas& background();

// залить полотно указанным цветом (цвет, прозрачность)
Canvas& background(uint32_t hex, uint8_t a = 255);

// ======================== FILL =======================
// выбрать цвет заливки (цвет, прозрачность)
Canvas& fill(uint32_t hex, uint8_t a = 255);

// отключить заливку
Canvas& noFill();

// ===================== STROKE ====================
// выбрать цвет обводки (цвет, прозрачность)
Canvas& stroke(uint32_t hex, uint8_t a = 255);

// отключить обводку
Canvas& noStroke();

// толщина обводки, px
Canvas& strokeWeight(int v);

// соединение линий: CV::MITER (умолч), CV::BEVEL, CV::ROUND
Canvas& strokeJoin(CV v);

// края линий: CV::PROJECT (умолч), CV::ROUND, CV::SQUARE
Canvas& strokeCap(CV v);

// ===================== PRIMITIVES ====================
// окружность (x, y, радиус), px
Canvas& circle(int x, int y, int r);

// линия (координаты начала и конца)
Canvas& line(int x1, int y1, int x2, int y2);

// точка
Canvas& point(int x, int y);

// четырёхугольник (координаты углов)
Canvas& quadrangle(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

// треугольник (координаты углов)
Canvas& triangle(int x1, int y1, int x2, int y2, int x3, int y3);

// прямоугольник
Canvas& rect(int x, int y, int w, int h, int tl = -1, int tr = -1, int br = 0, int bl = 0);

// квадрат
Canvas& square(int x, int y, int w);

// режим окружности: CV::CENTER (умолч), CV::CORNER
Canvas& ellipseMode(CV mode);

// режим прямоугольника: CV::CORNER (умолч), CV::CORNERS, CV::CENTER, CV::RADIUS
Canvas& rectMode(CV mode);

// ======================= TEXT ========================
// шрифт
Canvas& textFont(const char* name);

// размер шрифта, px
Canvas& textSize(int size);

// вывести текст, опционально макс длина
Canvas& text(String text, int x, int y, int w = 0);

// выравнивание текста
// CV::LEFT, CV::CENTER, CV::RIGHT
// TXT_TOP, TXT_BOTTOM, TXT_CENTER, TXT_BASELINE
Canvas& textAlign(CV h, CV v);

// сохранить конфигурацию полотна
Canvas& push();

// восстановить конфигурацию полотна
Canvas& pop();

// ======================================================
// ================== HTML CANVAS API ===================
// ======================================================

// цвет заполнения
Canvas& fillStyle(uint32_t hex, uint8_t a = 255);

// цвет обводки
Canvas& strokeStyle(uint32_t hex, uint8_t a = 255);

// цвет тени
Canvas& shadowColor(uint32_t hex, uint8_t a = 255);

// размытость тени, px
Canvas& shadowBlur(int v);

// отступ тени, px
Canvas& shadowOffsetX(int v);

// отступ тени, px
Canvas& shadowOffsetY(int v);

// края линий: CV::BUTT (умолч), CV::ROUND, CV::SQUARE
// https://www.w3schools.com/tags/canvas_linecap.asp
Canvas& lineCap(CV v);

// соединение линий: CV::MITER (умолч), CV::BEVEL, CV::ROUND
// https://www.w3schools.com/tags/canvas_linejoin.asp
Canvas& lineJoin(CV v);

// ширина линий, px
Canvas& lineWidth(int v);

// длина соединения CV::MITER, px
// https://www.w3schools.com/tags/canvas_miterlimit.asp
Canvas& miterLimit(int v);

// шрифт: "30px Arial"
// https://www.w3schools.com/tags/canvas_font.asp
Canvas& font(AnyText v);

// выравнивание текста: CV::START (умолч), CV::END, CV::CENTER, CV::LEFT, CV::RIGHT
// https://www.w3schools.com/tags/canvas_textalign.asp
Canvas& textAlign(CV v);

// позиция текста: CV::ALPHABETIC (умолч), CV::TOP, CV::HANGING, CV::MIDDLE, CV::IDEOGRAPHIC, CV::BOTTOM
// https://www.w3schools.com/tags/canvas_textbaseline.asp
Canvas& textBaseline(CV v);

// прозрачность рисовки, 0.0-1.0
Canvas& globalAlpha(float v);

// тип наложения графики: CV::SRC_OVER (умолч), CV::SRC_ATOP, CV::SRC_IN, CV::SRC_OUT, CV::DST_OVER, CV::DST_ATOP, CV::DST_IN, CV::DST_OUT, CV::LIGHTER, CV::COPY, CV::XOR
// https://www.w3schools.com/tags/canvas_globalcompositeoperation.asp
Canvas& globalCompositeOperation(CV v);

// прямоугольник
Canvas& drawRect(int x, int y, int w, int h);

// скруглённый прямоугольник
Canvas& roundRect(int x, int y, int w, int h, int tl = 0, int tr = -1, int br = -1, int bl = -1);

// закрашенный прямоугольник
Canvas& fillRect(int x, int y, int w, int h);

// обведённый прямоугольник
Canvas& strokeRect(int x, int y, int w, int h);

// очистить область
Canvas& clearRect(int x, int y, int w, int h);

// залить
Canvas& fill();

// обвести
Canvas& stroke();

// начать путь
Canvas& beginPath();

// переместить курсор
Canvas& moveTo(int x, int y);

// завершить путь (провести линию на начало)
Canvas& closePath();

// нарисовать линию от курсора
Canvas& lineTo(int x, int y);

// ограничить область рисования
// https://www.w3schools.com/tags/canvas_clip.asp
Canvas& clip();

// провести кривую
// https://www.w3schools.com/tags/canvas_quadraticcurveto.asp
Canvas& quadraticCurveTo(int cpx, int cpy, int x, int y);

// провести кривую Безье
// https://www.w3schools.com/tags/canvas_beziercurveto.asp
Canvas& bezierCurveTo(int cp1x, int cp1y, int cp2x, int cp2y, int x, int y);

// провести дугу (радианы)
// https://www.w3schools.com/tags/canvas_arc.asp
Canvas& arc(int x, int y, int r, float sa = 0, float ea = TWO_PI, bool ccw = 0);

// скруглить
// https://www.w3schools.com/tags/canvas_arcto.asp
Canvas& arcTo(int x1, int y1, int x2, int y2, int r);

// масштабировать область рисования
// https://www.w3schools.com/tags/canvas_scale.asp
Canvas& scale(int sw, int sh);

// вращать область рисования (в радианах)
// https://www.w3schools.com/tags/canvas_rotate.asp
Canvas& rotate(float v);

// перемещать область рисования
// https://www.w3schools.com/tags/canvas_translate.asp
Canvas& translate(int x, int y);

// вывести закрашенный текст, опционально макс. длина
Canvas& fillText(AnyText text, int x, int y, int w = 0);

// вывести обведённый текст, опционально макс. длина
Canvas& strokeText(AnyText text, int x, int y, int w = 0);

// вывести картинку
// https://www.w3schools.com/tags/canvas_drawimage.asp
Canvas& drawImage(AnyText img, int x, int y);
Canvas& drawImage(AnyText img, int x, int y, int w);
Canvas& drawImage(AnyText img, int x, int y, int w, int h);
Canvas& drawImage(AnyText img, int sx, int sy, int sw, int sh, int x, int y, int w, int h);

// сохранить конфигурацию полотна
Canvas& save();

// восстановить конфигурацию полотна
Canvas& restore();
Обновление
gh::CanvasUpdate(AnyText name, GyverHub* hub, Client* client = nullptr);

// отправить
void send();

Типы данных

gh::Align
Left
Center
Right
gh::Action
UI
Read
Set
Get
None
gh::Reboot
None
Button
Ota
OtaUrl
gh::Connection
Serial
Bluetooth
WS
MQTT
HTTP
Telegram
System
gh::CMD
UI
Ping
Unfocus
Info
Files
Format
Reboot
FetchNext
Data
Set
Get
Read
CLI
Delete
Rename
Create
FsAbort
Fetch
Upload
UploadChunk
Ota
OtaChunk
OtaUrl
Unix
Search
Discover
Unknown
gh::Colors
Red = 0xcb2839,
Orange = 0xd55f30,
Yellow = 0xd69d27,
Green = 0x37A93C,
Mint = 0x25b18f,
Aqua = 0x2ba1cd,
Blue = 0x297bcd,
Violet = 0x825ae7,
Pink = 0xc8589a,
Default = 0xffffffff,
gh::Module
ModUI
ModInfo
ModSet
ModRead
ModGet
ModData
ModReboot
ModFiles
ModFormat
ModDelete
ModRename
ModCreate
ModFetch
ModUpload
ModOta
ModOtaUrl

Классы

gh::Button
// состояние кнопки изменилось
bool changed();

// состояние кнопки (1 нажата, 0 отпущена)
bool state();

// клик по кнопке
bool clicked();
gh::Color
uint8_t r = 0, g = 0, b = 0;

Color(uint8_t gray);
Color(Colors color);
Color(uint32_t hex, bool f);
Color(uint8_t v1, uint8_t v2, uint8_t v3, bool hsv = 0);

// установить RGB цвет
void setRGB(uint8_t nr, uint8_t ng, uint8_t nb);

// установить серый цвет 0.. 255
void setGray(uint8_t gray);

// установить цвет 24-бит RGB
void setHEX(uint32_t hex);

// установить цвет 16-бит RGB
void set565(uint16_t col);

// установить цвет HSV
void setHSV(uint8_t h, uint8_t s, uint8_t v);

// установить цвет по радуге (0.. 255)
void setHue(uint8_t color);

// получить 24-бит RGB цвет
uint32_t getHEX();

// получить 16-бит RGB цвет
uint16_t get565();
gh::CSVFile
// создать таблицу (путь, столбцов, строк)
CSVFile(const char* path, uint8_t cols, uint16_t rows = 0);

// добавить int/string/bool
CSVFile& add(AnyValue value);

// добавить float
CSVFile& add(double value, uint8_t dec);

// завершить строку
void endRow(bool close = true);

// получить значение ячейки (столбец, строка)
String get(uint8_t col, uint16_t row);

// очистить таблицу
void clear();

// пересчитать количество строк (после ручного изменения)
void update();
gh::CSV
// создать таблицу (столбцов, строк)
CSV(uint8_t cols, uint16_t rows = 0);

// зарезервировать строку
void reserve(uint32_t res);

// добавить int/string/bool
CSV& add(AnyValue value);

// добавить float
CSV& add(double value, uint8_t dec);

// завершить строку
void endRow();

// получить значение ячейки (столбец, строка)
String get(uint8_t col, uint16_t row);

// очистить таблицу
void clear();

// пересчитать количество строк (после ручного изменения)
void update();
gh::Flag
bool changed();
gh::Flags
Flags();
Flags(uint16_t nflags);

void clear(uint8_t idx);
void set(uint8_t idx);
void write(uint8_t idx, uint8_t val);
uint8_t get(uint8_t idx);
String toString();
gh::Log
// начать и указать размер буфера
void begin(int n = 64);

// остановить
void end();

// прочитать в строку
void read(String* s, bool esc = false);

// прочитать строкой
String read();

// очистить
void clear();

// есть данные
bool available();

// запущен
bool state();

// длина
int length();
gh::Pos
bool changed();

// расстояние до точки
uint16_t dist(int16_t x1, int16_t y1);

// точка лежит внутри прямоугольника
bool inRect(int16_t rx, int16_t ry, uint16_t w, uint16_t h);

// точка лежит внутри окружности
bool inCircle(int16_t cx, int16_t cy, uint16_t r);

// координата x
int16_t x = 0;

// координата y
int16_t y = 0;
gh::Timer
// указать время. Таймер сам запустится в режиме интервала!
Timer(uint32_t ms, uint32_t seconds = 0, uint32_t minutes = 0, uint32_t hours = 0, uint32_t days = 0);

// =========== MANUAL ===========
// установить период
void setTime(uint32_t ms, uint32_t seconds = 0, uint32_t minutes = 0, uint32_t hours = 0, uint32_t days = 0);

// получить период
uint32_t getTime();

// запустить в режиме интервала (передать true для режима таймаута)
void start(bool timeout = false);

// запустить в режиме таймаута
void startTimeout();

// запустить в режиме интервала
void startInterval();

// перезапустить в текущем режиме
void restart();

// остановить
void stop();

// состояние (запущен?)
bool state();

// подключить функцию-обработчик вида void f()
void attach(TimerCallback callback);

// отключить функцию-обработчик
void detach();

// тикер, вызывать в loop. Вернёт true, если сработал
bool tick();

Системные классы

gh::Bridge
Bridge(void* hub, Connection conn, ghc::ParseHook parse);

// настроить
void config(void* hub, Connection conn, ghc::ParseHook parse);

// парсить url=data или url + data отдельно
void parse(AnyText url, AnyText data);

virtual void begin(){};
virtual void end(){};
virtual void tick(){};
virtual void send(BridgeData& data){};

Connection connection();    // тип подключения
void enable();              // включить
void disable();             // выключить
bool state();               // статус включен или выключен
void setFocus();            // установить focus
void clearFocus();          // снять focus
bool getFocus();            // получить focus
gh::Build
const Action action;    // тип билда
Client& client;         // клиент
const AnyText name;       // имя компонента
const AnyText value;      // значение компонента
bool isSet();           // билд-действие
bool isUI();            // билд-запрос виджетов
Color valueColor();     // получить значение как Color
Flags valueFlags();     // получить значение как Flags
Pos valuePos();         // получить значение как Pos
gh::Client
// тип подключения
Connection connection();

// id клиента
AnyText id;
gh::FS
File openRead(String path);
File openAdd(String path);
File openWrite(String path);
bool begin();
void end();
bool mounted();
void format();
bool remove(String path, bool remdir = true);
bool rename(String from, String to);
bool exists(String path);
uint64_t freeSpace();
uint64_t totalSpace();
uint64_t usedSpace();
void mkdir(String path);
void rmdir(String path);
void listDir(String& str, String path, char div);
void showFiles(String& answ, String path, uint8_t levels = 0, uint32_t* count = nullptr);
ghc::Modules
uint16_t mods = 0;

void set(uint16_t nmods);
void clear(uint16_t nmods);

void setAll();
void clearAll();
bool read(gh::Module m);
bool read(uint16_t m);
gh::Request
Client& client; // клиент
const CMD cmd;  // событие
AnyText name;    // имя
AnyText value;   // значение
gh::Fetcher
// отправить файл по пути
void fetchFile(const char* path);

// отправить файл
template <typename T>
void fetchFile(T& file);

// отправить сырые данные
void fetchBytes(uint8_t* bytes, uint32_t len);

// отправить сырые данные из PGM
void fetchBytes_P(const uint8_t* bytes, uint32_t len);

// true - начало скачивания
bool start;

// путь к скачиваемому файлу
AnyText path;
gh::Info
// добавить int/string/bool поле в info
void add(AnyText label, AnyValue val);

// добавить float поле в info
void add(AnyText label, double val, uint8_t dec);

const Client& client;
Type type;

// Info::Type
// Version
// Network
// Memory
// System
gh::Update
Update(GyverHub* hub, Client* client = nullptr);

// начать обновление по имени виджета (или список) + имя функции
Widget& update(AnyText name, AnyText func);

// отправить пакет
void send();

// текущий виджет для установки значений
ghc::Widget widget;

Функции

Read
// получить текстовое значение типа CMD для вывода в порт
FSTR gh::readCMD(CMD cmd);

// получить текстовое значение типа Connection для вывода в порт
FSTR gh::readConnection(Connection connection);

// получить текстовое значение типа Action для вывода в порт
FSTR gh::readAction(Action action);

// получить текстовое значение типа Reboot для вывода в порт
FSTR gh::readReboot(Reboot reason);
Position
// расстояние между двумя точками
uint16_t gh::dist(int16_t x0, int16_t y0, int16_t x1, int16_t y1);

// точка лежит внутри прямоугольника (координаты угла и размеры)
bool gh::inRect(int16_t x, int16_t y, int16_t rx, int16_t ry, uint16_t w, uint16_t h);

// точка лежит внутри окружности (координаты центра и радиус)
bool gh::inCircle(int16_t x, int16_t y, int16_t cx, int16_t cy, uint16_t r);