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.
35 lines
1.8 KiB
Rust
35 lines
1.8 KiB
Rust
//! Асинхронный worker на Tokio с bounded queue и явным shutdown.
|
||
|
||
mod common;
|
||
|
||
use escpos_vfd::tokio::AsyncVfdWorker;
|
||
use std::error::Error;
|
||
use std::time::Duration;
|
||
|
||
#[tokio::main(flavor = "current_thread")]
|
||
async fn main() -> Result<(), Box<dyn Error>> {
|
||
// В Cargo.toml у примера указан `required-features = ["tokio"]`. Поэтому sync-only
|
||
// пользователи не подтягивают async-зависимости, а сам файл остаётся обычным
|
||
// понятным Tokio-примером без cfg-обёрток.
|
||
let config = common::ExampleArgs::from_env()?.config;
|
||
|
||
// Async worker открывает serial-порт через `tokio-serial` и запускает одну task,
|
||
// которая последовательно пишет команды в устройство.
|
||
let worker = AsyncVfdWorker::start(config).await?;
|
||
let display = worker.handle();
|
||
|
||
// Каждый await завершается после записи команды worker-ом или возвращает ошибку I/O.
|
||
// Если очередь заполнена, `send` внутри handle даст backpressure через `.await`.
|
||
display.clear().await?;
|
||
display.set_brightness(2).await?;
|
||
display.print_line_diff(1, "Tokio worker").await?;
|
||
display.print_line_diff(2, "bounded queue").await?;
|
||
|
||
// Держим текст на физическом дисплее пару секунд, затем делаем graceful shutdown:
|
||
// ранее принятые команды завершатся, task остановится, serial transport вернётся.
|
||
tokio::time::sleep(Duration::from_secs(2)).await;
|
||
worker.shutdown().await?;
|
||
|
||
Ok(())
|
||
}
|