//! Синхронный старт с полностью ручными 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> { // Ручной пример показывает, что библиотека не держит глобальных `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(()) }