Модуль display.h
Работа с графическим дисплеем
Контроллер имеет виртуальный монохромный графический дисплей с разрешением 128x64 пикселей. Начало координат находится в нижнем левом углу дисплея. Дисплей может использоваться как средство визуализации в пользовательских алгоритмах.
Модуль 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>
void main(void) {
clear();
rect(0, 0, 40, 40, ON);
update();
}
dot
Функция void dot(int x, int y, int mode) рисует один пиксель с координатами (x, y).
Параметр mode определяет состояние пикселя и может принимать следующие значения:
ON— закрасить пиксельOFF— очистить пиксельINVERT— инвертировать состояние пикселя
// Рисуем кривую изменения значения с датчика температуры
#include <stdint.h>
#include <dev.h>
#include <display.h>
void main(void) {
clear();
for (int x = 0; x < WIDTH; x++) {
int y = convInt((int)aiVal(0), 150, 350, 0, HEIGHT);
dot(x, y, ON);
update();
sleep(500);
}
}
// Рисуем "белый шум"
#include <stdint.h>
#include <dev.h>
#include <display.h>
#include <tools.h>
void main(void) {
clear();
while (1) {
int x = random(0, WIDTH-1);
int y = random(0, HEIGHT-1);
dot(x, y, INVERT);
update();
sleep(1);
}
}
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>
void main(void) {
clear();
for (int i = 0; i < 50; i++) {
int x = random(0, WIDTH-1);
int y = random(0, HEIGHT-1);
int w = random(-WIDTH, WIDTH);
int h = random(-HEIGHT, HEIGHT);
line(x, y, w, h, ON);
update();
}
}
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();
}
void main(void) {
run(step, 100);
}
image
Функция void image(int x, int y, int h, const char *bytes, int len) рисует битовое изображение (bitmap), где:
x,y— координаты изображения (нижний левый угол).h— высота изображения в пикселях.data— битовое изображение.
Битовое изображение представляет собой массив байт, в котором каждый байт определяет отображение столбца из 8 пикселей.
Например, байт 0xff закрасит все 8 пикселей, 0x01 — только первый (нижний) пиксель в столбце.
Ширина изображения определяется автоматически: w = len(data) // ((h + 7) // 8).
Например, если высота изображения не превышает 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
};
void main(void) {
clear();
image(60, 28, 8, data, sizeof(data));
update();
}
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 пикселей в высоту. Шрифт поддерживает кириллицу. Ограничение на длину строки — 128 байт, русские буквы занимают по 2 байта.
#include <display.h>
void main(void) {
clear();
text(WIDTH / 2, HEIGHT / 2 - 4, "Привет, мир!", CENTER);
update();
}
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>
void main(void) {
clear();
rectFull(10, 10, 50, 30, ON);
update();
}