61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
//! Демонстрирует позиционирование символа и его движение по второй строке дисплея.
|
|
|
|
mod common;
|
|
|
|
use anyhow::Result;
|
|
|
|
use m::worker::VfdWorker;
|
|
|
|
fn main() -> Result<()> {
|
|
// args:
|
|
// 1) port (default: /dev/cu.usbmodem101)
|
|
// 2) width (default: 20)
|
|
// 3) delay_ms (default: 80)
|
|
let mut args = common::ExampleArgs::from_env();
|
|
let delay_ms: u64 = args.parse_or(80);
|
|
let width = args.width;
|
|
let worker = VfdWorker::start(args.config)?;
|
|
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;
|
|
}
|
|
}
|
|
|
|
common::sleep_ms(delay_ms);
|
|
}
|
|
}
|