escpos-vfd 0.3.0

ESC/POS-compatible VFD customer display driver with sync and optional Tokio APIs
Documentation
//! Синхронный старт с полностью ручными serial/display настройками.

use escpos_vfd::{DisplaySettings, SerialSettings, TextEncoding, Vfd, VfdConfig};
use serialport::{DataBits, FlowControl, Parity, StopBits};
use std::error::Error;
use std::time::Duration;

fn main() -> Result<(), Box<dyn Error>> {
    // Ручной пример показывает, что библиотека не держит глобальных `FIXED_BAUD` или
    // `TABLE_CYR`: каждый параметр задаёт приложение.
    let port_name = std::env::args()
        .nth(1)
        .unwrap_or_else(|| "/dev/cu.usbmodem101".to_string());

    // Все serial-параметры задаются явно, без скрытого FIXED_BAUD.
    let mut serial = SerialSettings::new(port_name, 9_600);
    serial.data_bits = DataBits::Eight;
    serial.parity = Parity::None;
    serial.stop_bits = StopBits::One;
    serial.flow_control = FlowControl::None;
    serial.timeout = Duration::from_millis(100);

    // `encoding` кодирует Rust-строку в байты, а `code_table` отвечает только за
    // аппаратную команду `ESC t n`. Эти настройки часто должны совпадать по смыслу,
    // но это два разных слоя протокола.
    let mut display = DisplaySettings::new(20, 2, TextEncoding::Cp866);

    // Если дисплей уже настроен DIP-переключателями или использует другой протокол
    // выбора таблицы, оставьте `None`, и библиотека не отправит `ESC t`.
    display.code_table = Some(6);
    display.reset_on_open = true;
    display.brightness = Some(1..=4);
    display.brightness_settle = Duration::from_millis(2);

    // `VfdConfig::new` валидирует геометрию, baud rate и queue capacity до открытия
    // serial-порта, поэтому ошибки настроек видны сразу.
    let config = VfdConfig::new(serial, display)?;
    let mut display = Vfd::open(config)?;

    // Для обычного текста используйте типизированные методы; `write_raw` нужен
    // только для команд, которых пока нет в публичном API.
    display.clear()?;
    display.print_line(1, "Ручной режим")?;

    // Координаты в библиотеке 1-based: первая колонка - x=1, первая строка - y=1.
    display.print_at(1, 2, "20x2, CP866")?;

    Ok(())
}