From 9288c2b28d316bf65da69b07e6197c645bd3e2b9 Mon Sep 17 00:00:00 2001 From: Rushmore75 Date: Thu, 29 Jan 2026 14:09:47 -0700 Subject: [PATCH] add screenshotting --- .gitignore | 1 + Cargo.lock | 201 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 69 ++++++++++++++-- template.gnuplot | 17 ++++ 5 files changed, 281 insertions(+), 8 deletions(-) create mode 100644 template.gnuplot diff --git a/.gitignore b/.gitignore index ea8c4bf..923b103 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +data.csv diff --git a/Cargo.lock b/Cargo.lock index f1d0703..c499470 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,15 @@ dependencies = [ "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]] name = "autocfg" version = "1.4.0" @@ -38,6 +47,12 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + [[package]] name = "bytemuck" version = "1.18.0" @@ -50,12 +65,35 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "color_quant" version = "1.1.0" @@ -86,6 +124,12 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" + [[package]] name = "flate2" version = "1.0.34" @@ -121,6 +165,30 @@ dependencies = [ "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]] name = "image" version = "0.24.9" @@ -144,6 +212,16 @@ dependencies = [ "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]] name = "libc" version = "0.2.159" @@ -170,6 +248,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + [[package]] name = "mach2" version = "0.4.2" @@ -313,6 +397,7 @@ dependencies = [ name = "quad" version = "0.1.0" dependencies = [ + "chrono", "macroquad", "serialport", ] @@ -332,6 +417,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "scopeguard" version = "1.2.0" @@ -356,6 +447,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simd-adler32" version = "0.3.7" @@ -429,6 +526,51 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "winapi" version = "0.3.9" @@ -451,6 +593,65 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" 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]] name = "zerocopy" version = "0.7.35" diff --git a/Cargo.toml b/Cargo.toml index 93af9a7..876f9a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +chrono = "0.4.43" macroquad = "0.4.13" serialport = "4.5.1" diff --git a/src/main.rs b/src/main.rs index 59282b4..e480155 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,16 @@ #![feature(random)] use core::f32; use std::{ - fs::read_dir, + fs::{read_dir, OpenOptions}, + io::Write, path::PathBuf, + process::{Command, Stdio}, sync::mpsc::{self, Receiver, Sender}, thread::{self, JoinHandle}, - time::Duration, + time::{Duration, SystemTime}, }; +use chrono::{Datelike, Local, Timelike}; use macroquad::prelude::*; const THICKNESS: f32 = 2.0; @@ -19,10 +22,15 @@ static mut PORT: Option = None; struct Point { x: f32, y: f32, + time_since_last: f32, } impl Point { - fn new(x: f32, y: f32) -> Self { - Self { x, y } + fn new(x: f32, y: f32, delta: f32) -> Self { + Self { + x, + y, + time_since_last: delta, + } } } @@ -103,7 +111,7 @@ impl<'a> Graph<'a> { Self { font, // start all the dots off screen - points: [Point::new(-1., -1.); TAIL_LEN], + points: [Point::new(-1., -1., 0.); TAIL_LEN], head: 0, axises, x_origin: x_offset, @@ -176,6 +184,7 @@ impl<'a> Graph<'a> { self.push(Point::new( self.head_tracker, self.y_origin - y_displacement, + delta_time, )); } Axis::Two => { @@ -183,6 +192,7 @@ impl<'a> Graph<'a> { self.push(Point::new( self.x_origin + x_displacement, self.y_origin - y_displacement, + delta_time, )) } } @@ -339,12 +349,55 @@ async fn main() { graph.draw(); - if is_key_pressed(KeyCode::F3) { - show_debug = !show_debug; - } if is_key_pressed(KeyCode::F1) { 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(); graph.px_per_s += 10. * my; diff --git a/template.gnuplot b/template.gnuplot new file mode 100644 index 0000000..095e605 --- /dev/null +++ b/template.gnuplot @@ -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