Rename crate to escpos-vfd and add tokio support

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.
This commit is contained in:
Кобелев Андрей Андреевич
2026-08-16 11:24:20 +05:00
parent efc53e6ef5
commit 244d907cc2
25 changed files with 3823 additions and 782 deletions
+25 -17
View File
@@ -2,39 +2,47 @@
mod common;
use anyhow::Result;
use std::error::Error;
use std::time::Duration;
use m::worker::VfdWorker;
use escpos_vfd::VfdWorker;
fn main() -> Result<()> {
// args:
// 1) port (default: /dev/cu.usbmodem101)
// 2) width (default: 20)
// 3) cps (chars per second, default: 8)
// 4) end_pause_ms (default: 1500)
// 5) brightness 1..4 (default: 2)
let mut args = common::ExampleArgs::from_env();
fn main() -> Result<(), Box<dyn Error>> {
// Аргументы:
// 1) port - serial-порт дисплея;
// 2) width - ширина строки, по ней worker строит кадры marquee;
// 3) cps - скорость в символах в секунду;
// 4) end_pause_ms - пауза после полного прохода текста;
// 5) brightness - яркость из диапазона пресета 1..=4.
let mut args = common::ExampleArgs::from_env()?;
let cps: u32 = args.parse_or(8);
let end_pause_ms: u64 = args.parse_or(1500);
let brightness: u8 = args.parse_or(2);
// Marquee живёт внутри worker-потока: основной поток может спать, а worker будет
// просыпаться по собственному таймеру и отправлять следующий кадр.
let worker = VfdWorker::start(args.config)?;
let vfd = worker.handle();
vfd.clear();
vfd.set_brightness(brightness);
vfd.clear()?;
vfd.set_brightness(brightness)?;
let text = String::from(
"Однозначно, базовые сценарии поведения пользователей призывают нас к новым свершениям, которые, в свою очередь, должны быть объявлены нарушающими общечеловеческие нормы этики и морали. С другой стороны, понимание сути ресурсосберегающих технологий не даёт нам иного выбора, кроме определения экономической целесообразности принимаемых решений. Задача организации, в особенности же укрепление и развитие внутренней структуры обеспечивает актуальность соответствующих условий активизации. Предварительные выводы неутешительны: укрепление и развитие внутренней структуры однозначно фиксирует необходимость укрепления моральных ценностей. Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: повышение уровня гражданского сознания представляет собой интересный эксперимент проверки поэтапного и последовательного развития общества.",
);
// “рыба” + бесконечный цикл
vfd.set_marquee_text(text);
vfd.start_marquee(2, cps, Duration::from_millis(end_pause_ms));
// можно подсветить вторую строку статикой
let _ = vfd.print_line_diff(1, "Бегущая строка");
// Длинный текст сначала сохраняется в состоянии worker-а. `start_marquee` выбирает
// строку, скорость и паузу; сама анимация дальше идёт без ручного цикла кадров.
vfd.set_marquee_text(text)?;
vfd.start_marquee(2, cps, Duration::from_millis(end_pause_ms))?;
// Первая строка остаётся статикой. Вторую строку теперь лучше не обновлять обычными
// командами, пока на ней активна marquee.
vfd.print_line_diff(1, "Бегущая строка")?;
loop {
// Держим процесс живым. Если `main` завершится, `worker` попадёт в Drop и
// остановит фоновую анимацию.
common::sleep_ms(3_600_000);
}
}