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.
65 lines
2.4 KiB
Rust
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);
|
|
}
|
|
}
|