escpos-vfd 0.2.0

ESC/POS-compatible VFD customer display driver with sync and optional Tokio APIs
Documentation
#![warn(missing_docs)]
//! ESC/POS-совместимая библиотека управления VFD-дисплеями покупателя.
//!
//! Библиотека отделяет настройки serial-порта от геометрии и протокола дисплея:
//! используйте готовый [`Preset`] для уже проверенного 20x2 CP866 устройства или
//! соберите [`VfdConfig`] вручную через [`SerialSettings`] и [`DisplaySettings`].
//!
//! Sync API представлен низкоуровневым [`Vfd`] и фоновым [`VfdWorker`].
//! Низкоуровневый драйвер пишет в транспорт сразу в вызывающем потоке, а worker
//! владеет транспортом в отдельном потоке и подтверждает команды после выполнения
//! записи. С feature `tokio` доступен модуль [`tokio`] с настоящим `AsyncWrite`,
//! bounded queue и async-подтверждениями после фактической записи в транспорт.
//!
//! Все публичные координаты задаются от единицы: первая колонка - `x = 1`, первая
//! строка - `line = 1` или `y = 1`. Размеры дисплея валидируются в диапазоне
//! `1..=255`, потому что ESC/POS-команды позиционирования передают координаты одним
//! байтом. Ошибки не скрываются: конфигурация, координаты, яркость, serial I/O и
//! состояние worker возвращаются разными вариантами [`VfdError`].
//!
//! Основной путь для старого 20x2 CP866 дисплея:
//!
//! ```no_run
//! use escpos_vfd::{Preset, Vfd, VfdConfig};
//!
//! # fn main() -> escpos_vfd::Result<()> {
//! let cfg = VfdConfig::preset("/dev/cu.usbmodem101", Preset::Epson20x2Cp866)?;
//! let mut vfd = Vfd::open(cfg)?;
//! vfd.print_line(1, "Привет")?;
//! # Ok(())
//! # }
//! ```

/// Кодирование Epson/ESC/POS-команд.
pub mod codec;
/// Конфигурация serial-порта и дисплея.
pub mod config;
/// Типизированные ошибки библиотеки.
pub mod error;
/// Низкоуровневое соединение с serial-портом или произвольным транспортом.
pub mod vfd;
/// Фоновый поток и потокобезопасный sync-интерфейс.
pub mod worker;

/// Tokio API поверх настоящего `AsyncWrite`.
#[cfg(feature = "tokio")]
pub mod tokio;

pub use codec::{fit_to_width, sanitize_for_cp866, sanitize_text};
pub use config::{DisplaySettings, Preset, SerialSettings, TextEncoding, VfdConfig};
pub use error::{ConfigError, Result, VfdError};
pub use vfd::Vfd;
pub use worker::{VfdHandle, VfdWorker};