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.
49 lines
3.8 KiB
Rust
49 lines
3.8 KiB
Rust
//! Демонстрирует фоновую бегущую строку с регулируемой скоростью и паузой в конце.
|
||
|
||
mod common;
|
||
|
||
use std::error::Error;
|
||
use std::time::Duration;
|
||
|
||
use escpos_vfd::VfdWorker;
|
||
|
||
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)?;
|
||
|
||
let text = String::from(
|
||
"Однозначно, базовые сценарии поведения пользователей призывают нас к новым свершениям, которые, в свою очередь, должны быть объявлены нарушающими общечеловеческие нормы этики и морали. С другой стороны, понимание сути ресурсосберегающих технологий не даёт нам иного выбора, кроме определения экономической целесообразности принимаемых решений. Задача организации, в особенности же укрепление и развитие внутренней структуры обеспечивает актуальность соответствующих условий активизации. Предварительные выводы неутешительны: укрепление и развитие внутренней структуры однозначно фиксирует необходимость укрепления моральных ценностей. Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: повышение уровня гражданского сознания представляет собой интересный эксперимент проверки поэтапного и последовательного развития общества.",
|
||
);
|
||
|
||
// Длинный текст сначала сохраняется в состоянии 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);
|
||
}
|
||
}
|