Контроллер имеет виртуальный монохромный графический дисплей с разрешением 128x64 пикселей. Начало координат находится в нижнем левом углу дисплея. Дисплей может использоваться как средство визуализации в пользовательских алгоритмах.

Для рисования используйте координаты экрана: x=0..127, y=0..63. w/h у line задают смещение до конца линии, у rect/rectFull — размеры области. Нулевые и отрицательные размеры прямоугольника не являются нормальным способом рисования. Функции void не возвращают коды ошибок.

Модуль display.h предоставляет функции для управления дисплеем, рисования графических примитивов и вывода текстовой информации на дисплей.

  #define WIDTH   (128) // Ширина дисплея в пикселях
#define HEIGHT  (64)  // Высота дисплея в пикселях
#define OFF     (0)   // Режим: очистить пиксель
#define ON      (1)   // Режим: закрасить пиксель
#define INVERT  (2)   // Режим: инвертировать пиксель
#define LEFT    (0)   // Выравнивание текста: слева
#define RIGHT   (1)   // Выравнивание текста: справа
#define CENTER  (2)   // Выравнивание текста: по центру

// Очистить текущий графический буфер
void clear(void);
// Отобразить изменения
void update(void);
// Нарисовать пиксель
void dot(int x, int y, int mode);
// Нарисовать линию
void line(int x, int y, int w, int h, int mode);
// Нарисовать прямоугольник
void rect(int x, int y, int w, int h, int mode);
// Нарисовать закрашенный прямоугольник
void rectFull(int x, int y, int w, int h, int mode);
// Нарисовать окружность
void circle(int x, int y, int r, int mode);
// Вывести текст
void text(int x, int y, char *s, int align);
// Вывести изображение
void image(int x, int y, int h, const char *bytes, int len);
  

clear

Функция clear() очищает текущий графический буфер.

update

Функция update() копирует содержимое текущего графического буфера в результирующий.

Контроллер имеет два идентичных графических буфера:

  • Результирующий буфер: хранит итоговое изображение дисплея, которое отображается в веб-интерфейсе.
  • Текущий буфер: с которым работают все функции рисования графических примитивов.

Алгоритм рисования на виртуальном дисплее предполагает:

  1. Очистку графического буфера с помощью clear()
  2. Рисование графических элементов
  3. Обновление результирующего буфера с помощью update()
  #include <display.h>

int main(void) {
    clear();
    rect(0, 0, 40, 40, ON);
    update();
    return 0;
}
  

dot

Функция void dot(int x, int y, int mode) рисует один пиксель с координатами (x, y). Параметр mode определяет состояние пикселя и может принимать следующие значения:

  • ON — закрасить пиксель
  • OFF — очистить пиксель
  • INVERT — инвертировать состояние пикселя
  // Рисуем кривую изменения температуры от 15 до 35 градусов Цельсия.
#include <stdint.h>
#include <math.h>
#include <dev.h>
#include <display.h>
#include <tools.h>

int main(void) {
    if (countSet(devAi, 1) < 0) {return 1;}
    if (aiConf(0, "Temperature", "rr", 1) < 0) {return 1;}
    clear();
    for (int x = 0; x < WIDTH; x++) {
        float temperature;
        if (aiGet(0, &temperature) < 0) {return 1;}
        if (isfinite(temperature)) {
            int y = (int)convFloat(temperature, 15.0f, 35.0f, 0.0f, HEIGHT - 1);
            dot(x, y, ON);
        }
        update();
        sleep(500);
    }
    return 0;
}
  
  // Рисуем "белый шум"
#include <stdint.h>
#include <dev.h>
#include <display.h>
#include <tools.h>

int main(void) {
    clear();
    while (1) {
        int x = random(0, WIDTH);
        int y = random(0, HEIGHT);
        dot(x, y, INVERT);
        update();
        sleep(1);
    }
    return 0;
}
  
Виртуальный дисплей Виртуальный дисплей

line

Функция void line(int x, int y, int w, int h, int mode) рисует линию, проходящую через две точки с координатами (x, y) и (x + w, y + h).

  #include <stdint.h>
#include <dev.h>
#include <display.h>
#include <tools.h>

int main(void) {
    clear();
    for (int i = 0; i < 50; i++) {
        int x = random(0, WIDTH);
        int y = random(0, HEIGHT);
        int w = (int)random(0, 2 * WIDTH) - WIDTH;
        int h = (int)random(0, 2 * HEIGHT) - HEIGHT;
        line(x, y, w, h, ON);
        update();
    }
    return 0;
}
  
Виртуальный дисплей Виртуальный дисплей

circle

Функция void circle(int x, int y, int r, int mode) рисует окружность с центром (x, y) и радиусом r.

  // Анимация с окружностями
#include <dev.h>
#include <display.h>


int step(uint32_t c) {
    clear();
    for (int i = 0; i < 12; i++){
        int r = i * 6 + (c % 6);
        circle(WIDTH / 2, HEIGHT / 2, r, ON);
    }
    update();
    return 0;
}

int main(void) {
    run(step, 100);
    return 0;
}
  
Виртуальный дисплей Виртуальный дисплей

icon

  void icon(int x, int y, int code, int font);
  

Рисует символ/иконку из выбранного шрифта: 1 — Arial28x19, 2 — Arial14x9, 3 — Icons11x11, 4 — Icons11x15, 5 — Icons15x15, 6 — Icons15x6; другое значение выбирает системный шрифт. code — индекс символа, допустимый в выбранном шрифте. Это не строка UTF-8 и не произвольный Unicode code point.

image

Функция void image(int x, int y, int h, const char *bytes, int len) рисует битовое изображение (bitmap), где:

  • x, y — координаты изображения (нижний левый угол).
  • h — высота изображения в пикселях.
  • bytes — указатель на доступный массив байт; len — число байт массива.

Битовое изображение представляет собой массив байт, в котором каждый байт определяет отображение столбца из 8 пикселей. Например, байт 0xff закрасит все 8 пикселей, 0x01 — только первый (нижний) пиксель в столбце.

Ширина изображения определяется автоматически: w = len / ((h + 7) / 8). Допустима высота h от 1 до 64, длина len > 0, ширина от 1 до 255. len должна делиться на (h+7)/8 без остатка. NULL, нулевая высота, неполный столбец и слишком большая ширина отклоняются до рисования. Функция void: сообщение об ошибке попадает в консоль и журнал, отдельного кода возврата нет. Координаты должны помещаться в int16_t. Данные идут по столбцам; внутри столбца младший бит соответствует нижнему пикселю, затем следующие байты продолжают тот же столбец вверх.

Например, если высота изображения не превышает 8 пикселей, его ширина равна числу байт битового изображения; если 8 < h <= 16, то w = len(data) / 2.

  #include <stdint.h>
#include <display.h>

uint8_t data[] = {
    0x3C,  // 00111100
    0x42,  // 01000010
    0xA5,  // 10100101
    0x81,  // 10000001
    0xA5,  // 10100101
    0x99,  // 10011001
    0x42,  // 01000010
    0x3C   // 00111100
};

int main(void) {
    clear();
    image(60, 28, 8, (const char *)data, sizeof(data));
    update();
    return 0;
}
  
Виртуальный дисплей Виртуальный дисплей

text

Функция void text(int x, int y, char *s, int align) выводит строку текста на дисплей.

  • x, y — координаты начала текста при align == LEFT, середины при align == CENTER или конца при align == RIGHT.
  • s — строка текста.
  • align — выравнивание текста относительно координат (x, y). Возможные значения: LEFT (по умолчанию), CENTER, RIGHT.

Текст выводится с помощью системного шрифта, каждый символ которого имеет размер 5 пикселей в ширину и 8 пикселей в высоту. Шрифт поддерживает кириллицу. Входная строка — UTF-8 с завершающим нулём. После преобразования используется внутренний буфер 128 байт; длинный текст может усекаться. Поддерживается перевод строки с шагом 9 пикселей вниз. Длина UTF-8 в байтах и число символов шрифта не совпадают.

  #include <display.h>

int main(void) {
    clear();
    text(WIDTH / 2, HEIGHT / 2 - 4, "Привет, мир!", CENTER);
    update();
    return 0;
}
  
Виртуальный дисплей Виртуальный дисплей

rect

Функция void rect(int x, int y, int w, int h, int mode) рисует прямоугольник, где:

  • x, y — координаты начала прямоугольника.
  • w, h — ширина и высота прямоугольника.

rectFull

Функция void rectFull(int x, int y, int w, int h, int mode) рисует закрашенный прямоугольник с заданными координатами и размерами.

  #include <display.h>

int main(void) {
    clear();
    rectFull(10, 10, 50, 30, ON);
    update();
    return 0;
}
  
Виртуальный дисплей Виртуальный дисплей