//! Асинхронный 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> { // В 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(()) }