//! Демонстрирует фоновую бегущую строку с регулируемой скоростью и паузой в конце. mod common; use std::error::Error; use std::time::Duration; use escpos_vfd::VfdWorker; fn main() -> Result<(), Box> { // Аргументы: // 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); } }