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

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

Начало координат находится в нижнем левом углу дисплея.

Функции

clear

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

update

Функция update([doClear: bool = True]) копирует содержимое текущего графического буфера в результирующий. Если параметр doClear установлен в True (по умолчанию), текущий буфер очищается после копирования. Если doClear=False, буфер очищаться не будет.

  from display import clear, update

update()  # Копирует и очищает буфер
# равносильно
update(False)
clear()
  

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

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

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

  1. Очистку графического буфера с помощью clear()
  2. Рисование графических элементов
  3. Обновление результирующего буфера с помощью update()
  from display import clear, rect, update

clear()
rect(0, 0, 40, 40)
update()
  

dot

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

  • ON — закрасить пиксель
  • OFF — очистить пиксель
  • INVERT — инвертировать состояние пикселя
  # Рисуем кривую изменения значения с датчика температуры
from dev import Ai, conv
from display import dot, clear, update, WIDTH, HEIGHT
from time import sleep

temp = Ai(0).conf(type='ntc')
clear()
for x in range(WIDTH):
    y = int(conv(temp.val(), 15, 35, 0, HEIGHT))
    dot(x, y)
    update(False)
    sleep(0.5)
  
  # Рисуем "белый шум"
from display import dot, clear, update, WIDTH, HEIGHT, INVERT
from random import randint

clear()
while True:
    x = randint(0, WIDTH - 1)
    y = randint(0, HEIGHT - 1)
    dot(x, y, INVERT)
    update(False)
  
Виртуальный дисплей Виртуальный дисплей

line

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

  from display import line, clear, update, WIDTH, HEIGHT
from random import randint

clear()
for _ in range(50):
    x = randint(0, WIDTH)
    y = randint(0, HEIGHT)
    w = randint(-WIDTH, WIDTH)
    h = randint(-HEIGHT, HEIGHT)
    line(x, y, w, h)
    update(False)
  
Виртуальный дисплей Виртуальный дисплей

lines

Функция lines(start: tuple, *increments: tuple) рисует набор линий, в котором конец каждой линии соединен с началом следующей.

  • start — координаты начала первой линии (x, y).
  • *increments — последовательность приращений (w1, h1), (w2, h2), ..., определяющих направление и длину каждой линии относительно предыдущей точки.

Пример использования:

  # Рисуем параллелепипед
from dev import run
from display import clear, lines, update

def parallelepiped(x, y, w, h, d):
    lines((x, y), (w, 0), (d, h), (-w, 0), (-d, -h))

clear()
parallelepiped(0, 0, 40, 40, 10)
update()
  
Виртуальный дисплей Виртуальный дисплей

circle

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

  # Анимация с окружностями
from dev import run
from display import clear, circle, update, WIDTH, HEIGHT

def step(c):
    for i in range(12):
        circle(WIDTH // 2, HEIGHT // 2, i * 6 + int(c % 6))
    update()

run(step, 0.25)
  
Виртуальный дисплей Виртуальный дисплей

image

Функция image(x: int, y: int, h: int, data: bytes | array('b')) рисует битовое изображение (bitmap), где:

  • x, y — координаты изображения (нижний левый угол).
  • h — высота изображения в пикселях.
  • data — битовое изображение, тип данных bytes или array('b').

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

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

  from display import clear, image, update

# Пример битового изображения: простой смайлик 8x8 пикселей
smiley_data = bytes([
    0x3C,  # 00111100
    0x42,  # 01000010
    0xA5,  # 10100101
    0x81,  # 10000001
    0xA5,  # 10100101
    0x99,  # 10011001
    0x42,  # 01000010
    0x3C   # 00111100
])

clear()
image(60, 28, 8, smiley_data)
update()
  
Виртуальный дисплей Виртуальный дисплей

text

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

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

Текст выводится с помощью системного шрифта, каждый символ которого имеет размер 5 пикселей в ширину и 8 пикселей в высоту. Шрифт поддерживает кириллицу. Ограничение на длину строки — 128 байт, русские буквы занимают по 2 байта.

  from display import clear, text, update, CENTER, WIDTH, HEIGHT

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

rect

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

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

rectfull

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

  from display import clear, rectfull, update

clear()
rectfull(10, 10, 50, 30)
update()
  
Виртуальный дисплей Виртуальный дисплей

invert

Функция invert(x: int, y: int, w: int, h: int) осуществляет инвертирование прямоугольной области, где:

  • x, y — координаты начала области.
  • w, h — ширина и высота области.

При инвертировании закрашенные пиксели становятся незакрашенными и наоборот.

  from display import clear, invert, update

clear()
invert(10, 10, 30, 30)
invert(20, 20, 30, 30)
update()
  
Виртуальный дисплей Виртуальный дисплей

Константы

WIDTH

Ширина дисплея. WIDTH == 128

HEIGHT

Высота дисплея. HEIGHT == 64

LEFT

Выравнивание текста по левому краю. LEFT == 0

CENTER

Выравнивание текста по центру. CENTER == 1

Выравнивание текста по правому краю. RIGHT == 2

ON

Режим закрашивания пикселя. ON == 0

OFF

Режим очистки пикселя. OFF == 1

INVERT

Режим инвертирования пикселя. INVERT == 2