Контроллер имеет виртуальный монохромный графический дисплей с разрешением 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() копирует содержимое текущего графического буфера в результирующий.

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

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

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

  1. Очистку графического буфера с помощью clear()
  2. Рисование графических элементов
  3. Обновление результирующего буфера с помощью 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();
}
  
Виртуальный дисплей Виртуальный дисплей