1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//! 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-команд.
/// Конфигурация serial-порта и дисплея.
/// Типизированные ошибки библиотеки.
/// Низкоуровневое соединение с serial-портом или произвольным транспортом.
/// Фоновый поток и потокобезопасный sync-интерфейс.
/// Tokio API поверх настоящего `AsyncWrite`.
pub use ;
pub use ;
pub use ;
pub use Vfd;
pub use ;