use anyhow::Result; use std::time::Duration; use m::vfd::VfdConfig; use m::worker::VfdWorker; fn main() -> Result<()> { // args: // 1) port (default: /dev/cu.usbmodem101) // 2) width (default: 20) // 3) delay_ms (default: 80) let port_name = std::env::args() .nth(1) .unwrap_or("/dev/cu.usbmodem101".into()); let width: usize = std::env::args() .nth(2) .as_deref() .unwrap_or("20") .parse() .unwrap_or(20); let delay_ms: u64 = std::env::args() .nth(3) .as_deref() .unwrap_or("80") .parse() .unwrap_or(80); let cfg = VfdConfig::new(port_name).with_width(width); let worker = VfdWorker::start(cfg)?; let vfd = worker.handle(); vfd.clear(); // Статика let _ = vfd.print_line_diff(1, "print_at demo"); let _ = vfd.print_line_diff(2, "--------------------"); // будет обрезано по width // “курсор” бегает по 2-й строке let y = 2u8; let mut x: u8 = 1; let mut dir: i8 = 1; // чтобы не оставлять хвост — помним прошлую позицию и стираем её пробелом let mut prev_x: u8 = x; loop { // стереть прошлую позицию let _ = vfd.print_at(prev_x, y, " "); // нарисовать новую let _ = vfd.print_at(x, y, "█"); // можно заменить на "*" если надо prev_x = x; // шаг if dir > 0 { if (x as usize) >= width { dir = -1; } else { x += 1; } } else { if x <= 1 { dir = 1; } else { x -= 1; } } std::thread::sleep(Duration::from_millis(delay_ms)); } }