escpos-vfd 0.3.0

ESC/POS-compatible VFD customer display driver with sync and optional Tokio APIs
Documentation
//! Демонстрирует позиционирование символа и его движение по второй строке дисплея.

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);
    }
}