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:
+25
-17
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user