diff options
Diffstat (limited to 'racer-tracer/src')
| -rw-r--r-- | racer-tracer/src/error.rs | 26 | ||||
| -rw-r--r-- | racer-tracer/src/main.rs | 78 |
2 files changed, 104 insertions, 0 deletions
diff --git a/racer-tracer/src/error.rs b/racer-tracer/src/error.rs new file mode 100644 index 0000000..f581b08 --- /dev/null +++ b/racer-tracer/src/error.rs @@ -0,0 +1,26 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum TracerError { + #[error("Unknown error: {message}")] + Unknown { message: String, exit_code: i32 }, + + #[error("Failed to create window: {0}")] + FailedToCreateWindow(String), + + #[error("Failed to update window: {0}")] + FailedToUpdateWindow(String), +} + +impl From<TracerError> for i32 { + fn from(tracer_error: TracerError) -> Self { + match tracer_error { + TracerError::Unknown { + message: _, + exit_code, + } => exit_code, + TracerError::FailedToCreateWindow(_) => 2, + TracerError::FailedToUpdateWindow(_) => 3, + } + } +} diff --git a/racer-tracer/src/main.rs b/racer-tracer/src/main.rs new file mode 100644 index 0000000..959ea0a --- /dev/null +++ b/racer-tracer/src/main.rs @@ -0,0 +1,78 @@ +#[macro_use] +mod error; + +use minifb::{Key, Window, WindowOptions}; + +fn hsv_to_rgb(H: f64, S: f64, V: f64) -> u32 { + let s: f64 = S / 100.0; + let v: f64 = V / 100.0; + let C: f64 = s * v; + let mut A: f64 = H / 60.0; + A %= 2.0f64; + let X: f64 = C * (1f64 - (A - 1f64).abs()); + let m: f64 = v - C; + + let mut r: f64; + let mut g: f64; + let mut b: f64; + if H >= 0.0 && H < 60.0 { + r = C; + g = X; + b = 0.0; + } else if H >= 60.0 && H < 120.0 { + r = X; + g = C; + b = 0.0; + } else if H >= 120.0 && H < 180.0 { + r = 0.0; + g = C; + b = X; + } else if H >= 180.0 && H < 240.0 { + r = 0.0; + g = X; + b = C; + } else if H >= 240.0 && H < 300.0 { + r = X; + g = 0.0; + b = C; + } else { + r = C; + g = 0.0; + b = X; + } + + let red: u32 = ((r + m) * 255.0) as u32; + let green: u32 = ((g + m) * 255.0) as u32; + let blue: u32 = ((b + m) * 255.0) as u32; + ((red as u32) << 16) | ((green as u32) << 8) | blue as u32 +} + +async fn run(width: usize, height: usize) -> Result<(), error::TracerError> { + let mut screen_buffer: Vec<u32> = vec![0; width * height]; + let mut window = Window::new("racer-tracer", width, height, WindowOptions::default()) + .expect("Unable to create window"); + window.limit_update_rate(Some(std::time::Duration::from_micros(16600))); + + let mut count = 1; + while window.is_open() && !window.is_key_down(Key::Escape) { + count = (count + 1) % 360; + let color = hsv_to_rgb(count as f64, 100.0, 100.0); + for i in screen_buffer.iter_mut() { + *i = color; + } + + window + .update_with_buffer(&screen_buffer, width, height) + .map_err(|e| error::TracerError::FailedToUpdateWindow(e.to_string()))?; + } + + Ok(()) +} + +#[tokio::main] +async fn main() { + if let Err(e) = run(640, 480).await { + eprintln!("{}", e); + std::process::exit(e.into()) + } +} |
