From c4d45a90169ef20283c4379b9332c42face16395 Mon Sep 17 00:00:00 2001 From: Juergen Stuber Date: Sun, 2 Dec 2018 15:57:24 +0100 Subject: [PATCH] Draw time of day in the mazes. --- Cargo.toml | 1 + src/bin/dualmaze/main.rs | 34 +++++++++++++++++++++++----------- src/bin/maze/main.rs | 34 +++++++++++++++++++++++----------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 66d07b9..d1ac1c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2018" [dependencies] rand = "0.6.0" +chrono = "0.4.6" diff --git a/src/bin/dualmaze/main.rs b/src/bin/dualmaze/main.rs index 499cb19..fc696cd 100644 --- a/src/bin/dualmaze/main.rs +++ b/src/bin/dualmaze/main.rs @@ -4,6 +4,9 @@ use std::io::Write; use std::thread::sleep; use std::time::Duration; +use chrono::Local; +use chrono::Timelike; + use rand::thread_rng; use rand::Rng; @@ -179,6 +182,11 @@ impl Board { self.draw_horizontal_segment(pos + v2d(1, delta), hsize); } } + fn draw_digit(&mut self, pos: Point2d, size: Vec2d, digit: u8) { + let segment_table = vec![0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f]; + let segments = segment_table[digit as usize]; + self.draw_7_segments(pos, size, segments); + } } struct Move { @@ -215,31 +223,35 @@ fn main() -> std::io::Result<()> { let t_frame = 0.040; // s let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); - let mut t_wait = 0.0; // s let board_size = v2d(x_size as i32, y_size as i32); // round down to odd size for maze let maze_size = v2d( (board_size.x - 1) / 2 * 2 + 1, - (board_size.y - 1) / 2 * 2 + 1 + (board_size.y - 1) / 2 * 2 + 1, ); let mut board = Board(Vec::new()); let mut open = Vec::new(); + let mut last_drawn_minute = 99; loop { if open.is_empty() { - if t_wait > 0.0 { - t_wait -= t_frame; - } else { - t_wait = 60.0; // s + // get time + let dt = Local::now(); + let h = dt.hour(); + let m = dt.minute(); + + if m != last_drawn_minute { + last_drawn_minute = m; + board = Board::new(board_size, maze_size); - // draw stuff in prios + // draw time in prios let segment_size = v2d(11, 5); - board.draw_7_segments(p2d(6, 8), segment_size, 0x06); - board.draw_7_segments(p2d(24, 8), segment_size, 0x4f); - board.draw_7_segments(p2d(42, 8), segment_size, 0x4f); - board.draw_7_segments(p2d(60, 8), segment_size, 0x07); + board.draw_digit(p2d(6, 8), segment_size, (h / 10) as u8); + board.draw_digit(p2d(24, 8), segment_size, (h % 10) as u8); + board.draw_digit(p2d(42, 8), segment_size, (m / 10) as u8); + board.draw_digit(p2d(60, 8), segment_size, (m % 10) as u8); // start building walls from the border for x in (2..(maze_size.x - 2)).step_by(2) { diff --git a/src/bin/maze/main.rs b/src/bin/maze/main.rs index a4a631a..e33a6ca 100644 --- a/src/bin/maze/main.rs +++ b/src/bin/maze/main.rs @@ -4,6 +4,9 @@ use std::io::Write; use std::thread::sleep; use std::time::Duration; +use chrono::Local; +use chrono::Timelike; + use rand::thread_rng; use rand::Rng; @@ -181,6 +184,11 @@ impl Board { self.draw_horizontal_segment(pos + v2d(1, delta), hsize); } } + fn draw_digit(&mut self, pos: Point2d, size: Vec2d, digit: u8) { + let segment_table = vec![0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f]; + let segments = segment_table[digit as usize]; + self.draw_7_segments(pos, size, segments); + } } struct Move { @@ -217,33 +225,37 @@ fn main() -> std::io::Result<()> { let t_frame = 0.040; // s let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); - let mut t_wait = 0.0; // s let board_size = v2d(x_size as i32, y_size as i32); // round down to odd size for maze let maze_size = v2d( (board_size.x - 1) / 2 * 2 + 1, - (board_size.y - 1) / 2 * 2 + 1 + (board_size.y - 1) / 2 * 2 + 1, ); // pick odd position at or near the middle let maze_mid = p2d((maze_size.x - 1) / 4 * 2 + 1, (maze_size.y - 1) / 4 * 2 + 1); let mut board = Board(Vec::new()); let mut open = Vec::new(); + let mut last_drawn_minute = 99; loop { if open.is_empty() { - if t_wait > 0.0 { - t_wait -= t_frame; - } else { - t_wait = 60.0; // s + // get time + let dt = Local::now(); + let h = dt.hour(); + let m = dt.minute(); + + if m != last_drawn_minute { + last_drawn_minute = m; + board = Board::new(board_size, maze_size); - // draw stuff in prios + // draw time in prios let segment_size = v2d(11, 5); - board.draw_7_segments(p2d(6, 8), segment_size, 0x06); - board.draw_7_segments(p2d(24, 8), segment_size, 0x4f); - board.draw_7_segments(p2d(42, 8), segment_size, 0x4f); - board.draw_7_segments(p2d(60, 8), segment_size, 0x07); + board.draw_digit(p2d(6, 8), segment_size, (h / 10) as u8); + board.draw_digit(p2d(24, 8), segment_size, (h % 10) as u8); + board.draw_digit(p2d(42, 8), segment_size, (m / 10) as u8); + board.draw_digit(p2d(60, 8), segment_size, (m % 10) as u8); // start in the middle board.set(maze_mid, Square::Corridor);