add screenshotting

This commit is contained in:
2026-01-29 14:09:47 -07:00
parent db7a2bc36b
commit 9288c2b28d
5 changed files with 281 additions and 8 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/target /target
data.csv

201
Cargo.lock generated
View File

@@ -20,6 +20,15 @@ dependencies = [
"zerocopy", "zerocopy",
] ]
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.4.0" version = "1.4.0"
@@ -38,6 +47,12 @@ version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "bumpalo"
version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.18.0" version = "1.18.0"
@@ -50,12 +65,35 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "cc"
version = "1.2.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583"
dependencies = [
"find-msvc-tools",
"shlex",
]
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chrono"
version = "0.4.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
dependencies = [
"iana-time-zone",
"js-sys",
"num-traits",
"wasm-bindgen",
"windows-link",
]
[[package]] [[package]]
name = "color_quant" name = "color_quant"
version = "1.1.0" version = "1.1.0"
@@ -86,6 +124,12 @@ dependencies = [
"simd-adler32", "simd-adler32",
] ]
[[package]]
name = "find-msvc-tools"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.34" version = "1.0.34"
@@ -121,6 +165,30 @@ dependencies = [
"ahash", "ahash",
] ]
[[package]]
name = "iana-time-zone"
version = "0.1.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"log",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "image" name = "image"
version = "0.24.9" version = "0.24.9"
@@ -144,6 +212,16 @@ dependencies = [
"mach2", "mach2",
] ]
[[package]]
name = "js-sys"
version = "0.3.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.159" version = "0.2.159"
@@ -170,6 +248,12 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "log"
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]] [[package]]
name = "mach2" name = "mach2"
version = "0.4.2" version = "0.4.2"
@@ -313,6 +397,7 @@ dependencies = [
name = "quad" name = "quad"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"chrono",
"macroquad", "macroquad",
"serialport", "serialport",
] ]
@@ -332,6 +417,12 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.2.0" version = "1.2.0"
@@ -356,6 +447,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]] [[package]]
name = "simd-adler32" name = "simd-adler32"
version = "0.3.7" version = "0.3.7"
@@ -429,6 +526,51 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wasm-bindgen"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
dependencies = [
"unicode-ident",
]
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.3.9" version = "0.3.9"
@@ -451,6 +593,65 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-core"
version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
dependencies = [
"windows-implement",
"windows-interface",
"windows-link",
"windows-result",
"windows-strings",
]
[[package]]
name = "windows-implement"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-interface"
version = "0.59.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-result"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-strings"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
dependencies = [
"windows-link",
]
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.7.35" version = "0.7.35"

View File

@@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
chrono = "0.4.43"
macroquad = "0.4.13" macroquad = "0.4.13"
serialport = "4.5.1" serialport = "4.5.1"

View File

@@ -1,13 +1,16 @@
#![feature(random)] #![feature(random)]
use core::f32; use core::f32;
use std::{ use std::{
fs::read_dir, fs::{read_dir, OpenOptions},
io::Write,
path::PathBuf, path::PathBuf,
process::{Command, Stdio},
sync::mpsc::{self, Receiver, Sender}, sync::mpsc::{self, Receiver, Sender},
thread::{self, JoinHandle}, thread::{self, JoinHandle},
time::Duration, time::{Duration, SystemTime},
}; };
use chrono::{Datelike, Local, Timelike};
use macroquad::prelude::*; use macroquad::prelude::*;
const THICKNESS: f32 = 2.0; const THICKNESS: f32 = 2.0;
@@ -19,10 +22,15 @@ static mut PORT: Option<String> = None;
struct Point { struct Point {
x: f32, x: f32,
y: f32, y: f32,
time_since_last: f32,
} }
impl Point { impl Point {
fn new(x: f32, y: f32) -> Self { fn new(x: f32, y: f32, delta: f32) -> Self {
Self { x, y } Self {
x,
y,
time_since_last: delta,
}
} }
} }
@@ -103,7 +111,7 @@ impl<'a> Graph<'a> {
Self { Self {
font, font,
// start all the dots off screen // start all the dots off screen
points: [Point::new(-1., -1.); TAIL_LEN], points: [Point::new(-1., -1., 0.); TAIL_LEN],
head: 0, head: 0,
axises, axises,
x_origin: x_offset, x_origin: x_offset,
@@ -176,6 +184,7 @@ impl<'a> Graph<'a> {
self.push(Point::new( self.push(Point::new(
self.head_tracker, self.head_tracker,
self.y_origin - y_displacement, self.y_origin - y_displacement,
delta_time,
)); ));
} }
Axis::Two => { Axis::Two => {
@@ -183,6 +192,7 @@ impl<'a> Graph<'a> {
self.push(Point::new( self.push(Point::new(
self.x_origin + x_displacement, self.x_origin + x_displacement,
self.y_origin - y_displacement, self.y_origin - y_displacement,
delta_time,
)) ))
} }
} }
@@ -339,12 +349,55 @@ async fn main() {
graph.draw(); graph.draw();
if is_key_pressed(KeyCode::F3) {
show_debug = !show_debug;
}
if is_key_pressed(KeyCode::F1) { if is_key_pressed(KeyCode::F1) {
pause = !pause; pause = !pause;
} }
if is_key_pressed(KeyCode::F2) {
// Dump data to csv
if let Ok(mut file) = OpenOptions::new()
.write(true)
.append(false)
.truncate(true)
.create(true)
.open("data.csv")
{
let mut x = 0.;
for p in &graph.points {
x += p.time_since_last;
let _ = file.write_all(format!("{x},{}\n", p.y).as_bytes());
}
let _ = file.flush();
let now = Local::now();
let date_string = format!(
"{}-{}-{}-{}-{}-{}-{}",
now.year(),
now.month(),
now.day(),
now.hour(),
now.minute(),
now.second(),
now.timestamp_subsec_millis()
);
if let Ok(out_file) = OpenOptions::new()
.write(true)
.append(false)
.truncate(true)
.create(true)
.open(format!("dump-{date_string}.png"))
{
let _ = Command::new("gnuplot")
.stdin(file)
.arg("template.gnuplot")
.stdout(out_file)
.spawn();
}
}
}
if is_key_pressed(KeyCode::F3) {
show_debug = !show_debug;
}
let (_, my) = mouse_wheel(); let (_, my) = mouse_wheel();
graph.px_per_s += 10. * my; graph.px_per_s += 10. * my;

17
template.gnuplot Normal file
View File

@@ -0,0 +1,17 @@
datafile = 'data.csv'
set datafile separator ','
set title 'Data Dump'
set key autotitle columnhead
set xlabel "Time (ms)"
set ylabel "Value"
set style line 1 linewidth 2 linecolor 1 pointtype 7 pointsize 1.5
set autoscale
set grid
set term png size 1280, 720
plot datafile using 1:2 with linespoints linestyle 1
# plot datafile using 1:2 with linespoints linestyle 1, datafile using 1:3, etc...
replot