Модуль display.h
Работа с графическим дисплеем
Контроллер имеет виртуальный монохромный графический дисплей с разрешением 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() копирует содержимое текущего графического буфера в результирующий.
Контроллер имеет два идентичных графических буфера:
- Результирующий буфер: хранит итоговое изображение дисплея, которое отображается в веб-интерфейсе.
- Текущий буфер: с которым работают все функции рисования графических примитивов.
Алгоритм рисования на виртуальном дисплее предполагает:
- Очистку графического буфера с помощью
clear() - Рисование графических элементов
- Обновление результирующего буфера с помощью
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;
}
