poc client, refactor embedded
This commit is contained in:
1146
client/Cargo.lock
generated
Normal file
1146
client/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
8
client/Cargo.toml
Normal file
8
client/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "client"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
image = "0.25.5"
|
||||
serialport = "4.7.0"
|
88
client/src/main.rs
Normal file
88
client/src/main.rs
Normal file
@ -0,0 +1,88 @@
|
||||
use image::ImageReader;
|
||||
use std::env;
|
||||
use std::fs::{self, DirEntry};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
|
||||
#[repr(u8)]
|
||||
#[derive(Eq, PartialEq, Debug)]
|
||||
enum Command {
|
||||
Info = 0,
|
||||
Frame = 1,
|
||||
Brightness = 2,
|
||||
Invalid = 255,
|
||||
}
|
||||
|
||||
fn find_images(path: PathBuf) -> Vec<DirEntry> {
|
||||
let mut res = Vec::new();
|
||||
for f in path.read_dir().unwrap() {
|
||||
if let Ok(entry) = f {
|
||||
if entry.file_name().as_encoded_bytes().ends_with(b".png") {
|
||||
res.push(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut args = env::args();
|
||||
|
||||
let mut port = serialport::new(args.nth(1).unwrap(), 1_000_000)
|
||||
.open()
|
||||
.unwrap();
|
||||
let frames = find_images("frames/".into());
|
||||
let src_fps = 50;
|
||||
|
||||
port.write(&[Command::Info as u8, 0, 0]).unwrap();
|
||||
port.set_timeout(Duration::from_secs(1)).unwrap();
|
||||
|
||||
let (width, height, tgt_fps, mut cur_frame) = {
|
||||
let mut info = [0u8; 14];
|
||||
port.read_exact(&mut info).unwrap();
|
||||
let width = u16::from_be_bytes(info[0..2].try_into().unwrap());
|
||||
let height = u16::from_be_bytes(info[2..4].try_into().unwrap());
|
||||
let tgt_fps = u16::from_be_bytes(info[4..6].try_into().unwrap());
|
||||
let cur_frame = u64::from_be_bytes(info[6..14].try_into().unwrap());
|
||||
(width, height, tgt_fps, cur_frame)
|
||||
};
|
||||
|
||||
let src_frametime = 1. / src_fps as f64;
|
||||
let dst_frametime = 1. / tgt_fps as f64;
|
||||
let frames_per_frame = (tgt_fps / src_fps) as u64;
|
||||
|
||||
let frame_pkt_size = width * height + 8;
|
||||
|
||||
let bright = 0;
|
||||
port.write(&[Command::Brightness as u8]).unwrap();
|
||||
port.write(&1u16.to_be_bytes()).unwrap();
|
||||
port.write(&[bright]).unwrap();
|
||||
{
|
||||
let mut buf = [0u8; 1];
|
||||
port.read_exact(&mut buf).unwrap();
|
||||
}
|
||||
|
||||
loop {
|
||||
for frame in &frames {
|
||||
let next_frame = cur_frame + frames_per_frame;
|
||||
let img = ImageReader::open(frame.path()).unwrap().decode().unwrap();
|
||||
let gs = img.as_luma8().unwrap();
|
||||
println!(
|
||||
"writing frame bytes {} for display at {}, cur_frame: {}",
|
||||
gs.len(),
|
||||
next_frame, cur_frame
|
||||
);
|
||||
port.write(&[Command::Frame as u8]).unwrap();
|
||||
port.write(&frame_pkt_size.to_be_bytes()).unwrap();
|
||||
port.write(&next_frame.to_be_bytes()).unwrap();
|
||||
port.write(&gs).unwrap();
|
||||
cur_frame = {
|
||||
let mut buf = [0; 8];
|
||||
port.read_exact(&mut buf).unwrap();
|
||||
u64::from_be_bytes(buf)
|
||||
};
|
||||
sleep(Duration::from_secs_f64(src_frametime));
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user