Rename crate to escpos-vfd and add tokio support

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.
This commit is contained in:
Кобелев Андрей Андреевич
2026-08-16 11:24:20 +05:00
parent efc53e6ef5
commit 244d907cc2
25 changed files with 3823 additions and 782 deletions
+49
View File
@@ -0,0 +1,49 @@
//! Синхронный старт с полностью ручными 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(())
}