//! Демонстрирует позиционирование символа и его движение по второй строке дисплея. mod common; use std::error::Error; use escpos_vfd::VfdWorker; fn main() -> Result<(), Box> { // Аргументы: // 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); } }