Files
vfd/examples/position.rs
T
Кобелев Андрей Андреевич 244d907cc2 Rename crate to escpos-vfd and add tokio support
Rename crate to escpos-vfd and add tokio support

Introduce a configurable crate-ready API with presets, typed errors,
optional Tokio async support, and expanded documentation.
2026-08-16 11:24:20 +05:00

65 lines
2.4 KiB
Rust

//! Демонстрирует позиционирование символа и его движение по второй строке дисплея.
mod common;
use std::error::Error;
use escpos_vfd::VfdWorker;
fn main() -> Result<(), Box<dyn Error>> {
// Аргументы:
// 1) port - serial-порт дисплея;
// 2) width - ширина строки, по ней ограничиваем движение курсора;
// 3) delay_ms - скорость движения символа.
let mut args = common::ExampleArgs::from_env()?;
let delay_ms: u64 = args.parse_or(80);
let columns = args.columns;
// Worker сериализует `print_at`: сначала стираем старую позицию, затем рисуем новую.
let worker = VfdWorker::start(args.config)?;
let vfd = worker.handle();
vfd.clear()?;
// Статичную шапку пишем через diff-метод. Вторая строка ниже станет рабочей областью.
vfd.print_line_diff(1, "print_at demo")?;
// Строка автоматически обрежется по настроенной ширине дисплея.
vfd.print_line_diff(2, "--------------------")?;
// "Курсор" бегает по 2-й строке. Координаты в API начинаются с 1, не с 0.
let y = 2u8;
let mut x: u8 = 1;
let mut dir: i8 = 1;
// Чтобы не оставлять хвост, помним прошлую позицию и стираем её пробелом.
let mut prev_x: u8 = x;
loop {
// Стереть прошлую позицию.
vfd.print_at(prev_x, y, " ")?;
// Нарисовать новую. Если дисплей плохо показывает этот символ в выбранной
// таблице, замените его на ASCII "*".
vfd.print_at(x, y, "█")?;
prev_x = x;
// Шаг вправо/влево с отражением от границ настроенной ширины.
if dir > 0 {
if (x as usize) >= columns {
dir = -1;
} else {
x += 1;
}
} else {
if x <= 1 {
dir = 1;
} else {
x -= 1;
}
}
common::sleep_ms(delay_ms);
}
}