escpos_vfd/lib.rs
1#![warn(missing_docs)]
2//! ESC/POS-совместимая библиотека управления VFD-дисплеями покупателя.
3//!
4//! Библиотека отделяет настройки serial-порта от геометрии и протокола дисплея:
5//! используйте готовый [`Preset`] для уже проверенного 20x2 CP866 устройства или
6//! соберите [`VfdConfig`] вручную через [`SerialSettings`] и [`DisplaySettings`].
7//!
8//! Sync API представлен низкоуровневым [`Vfd`] и фоновым [`VfdWorker`].
9//! Низкоуровневый драйвер пишет в транспорт сразу в вызывающем потоке, а worker
10//! владеет транспортом в отдельном потоке и подтверждает команды после выполнения
11//! записи. С feature `tokio` доступен модуль [`tokio`] с настоящим `AsyncWrite`,
12//! bounded queue и async-подтверждениями после фактической записи в транспорт.
13//!
14//! Все публичные координаты задаются от единицы: первая колонка - `x = 1`, первая
15//! строка - `line = 1` или `y = 1`. Размеры дисплея валидируются в диапазоне
16//! `1..=255`, потому что ESC/POS-команды позиционирования передают координаты одним
17//! байтом. Ошибки не скрываются: конфигурация, координаты, яркость, serial I/O и
18//! состояние worker возвращаются разными вариантами [`VfdError`].
19//!
20//! Основной путь для старого 20x2 CP866 дисплея:
21//!
22//! ```no_run
23//! use escpos_vfd::{Preset, Vfd, VfdConfig};
24//!
25//! # fn main() -> escpos_vfd::Result<()> {
26//! let cfg = VfdConfig::preset("/dev/cu.usbmodem101", Preset::Epson20x2Cp866)?;
27//! let mut vfd = Vfd::open(cfg)?;
28//! vfd.print_line(1, "Привет")?;
29//! # Ok(())
30//! # }
31//! ```
32
33/// Кодирование Epson/ESC/POS-команд.
34pub mod codec;
35/// Конфигурация serial-порта и дисплея.
36pub mod config;
37/// Типизированные ошибки библиотеки.
38pub mod error;
39/// Низкоуровневое соединение с serial-портом или произвольным транспортом.
40pub mod vfd;
41/// Фоновый поток и потокобезопасный sync-интерфейс.
42pub mod worker;
43
44/// Tokio API поверх настоящего `AsyncWrite`.
45#[cfg(feature = "tokio")]
46pub mod tokio;
47
48pub use codec::{fit_to_width, sanitize_for_cp866, sanitize_text};
49pub use config::{
50 DisplaySettings, MAX_MARQUEE_CHARS, MAX_MARQUEE_CPS, MAX_QUEUED_RAW_BYTES, Preset,
51 SerialSettings, TextEncoding, VfdConfig,
52};
53pub use error::{ConfigError, Result, VfdError};
54pub use vfd::Vfd;
55pub use worker::{VfdHandle, VfdWorker};