Draw time of day in the mazes.

This commit is contained in:
Juergen Stuber 2018-12-02 15:57:24 +01:00
parent 4c5d693dfd
commit c4d45a9016
3 changed files with 47 additions and 22 deletions

View File

@ -6,3 +6,4 @@ edition = "2018"
[dependencies] [dependencies]
rand = "0.6.0" rand = "0.6.0"
chrono = "0.4.6"

View File

@ -4,6 +4,9 @@ use std::io::Write;
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
use chrono::Local;
use chrono::Timelike;
use rand::thread_rng; use rand::thread_rng;
use rand::Rng; use rand::Rng;
@ -179,6 +182,11 @@ impl Board {
self.draw_horizontal_segment(pos + v2d(1, delta), hsize); 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 { struct Move {
@ -215,31 +223,35 @@ fn main() -> std::io::Result<()> {
let t_frame = 0.040; // s let t_frame = 0.040; // s
let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); 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); let board_size = v2d(x_size as i32, y_size as i32);
// round down to odd size for maze // round down to odd size for maze
let maze_size = v2d( let maze_size = v2d(
(board_size.x - 1) / 2 * 2 + 1, (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 board = Board(Vec::new());
let mut open = Vec::new(); let mut open = Vec::new();
let mut last_drawn_minute = 99;
loop { loop {
if open.is_empty() { if open.is_empty() {
if t_wait > 0.0 { // get time
t_wait -= t_frame; let dt = Local::now();
} else { let h = dt.hour();
t_wait = 60.0; // s let m = dt.minute();
if m != last_drawn_minute {
last_drawn_minute = m;
board = Board::new(board_size, maze_size); board = Board::new(board_size, maze_size);
// draw stuff in prios // draw time in prios
let segment_size = v2d(11, 5); let segment_size = v2d(11, 5);
board.draw_7_segments(p2d(6, 8), segment_size, 0x06); board.draw_digit(p2d(6, 8), segment_size, (h / 10) as u8);
board.draw_7_segments(p2d(24, 8), segment_size, 0x4f); board.draw_digit(p2d(24, 8), segment_size, (h % 10) as u8);
board.draw_7_segments(p2d(42, 8), segment_size, 0x4f); board.draw_digit(p2d(42, 8), segment_size, (m / 10) as u8);
board.draw_7_segments(p2d(60, 8), segment_size, 0x07); board.draw_digit(p2d(60, 8), segment_size, (m % 10) as u8);
// start building walls from the border // start building walls from the border
for x in (2..(maze_size.x - 2)).step_by(2) { for x in (2..(maze_size.x - 2)).step_by(2) {

View File

@ -4,6 +4,9 @@ use std::io::Write;
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
use chrono::Local;
use chrono::Timelike;
use rand::thread_rng; use rand::thread_rng;
use rand::Rng; use rand::Rng;
@ -181,6 +184,11 @@ impl Board {
self.draw_horizontal_segment(pos + v2d(1, delta), hsize); 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 { struct Move {
@ -217,33 +225,37 @@ fn main() -> std::io::Result<()> {
let t_frame = 0.040; // s let t_frame = 0.040; // s
let delay = Duration::new(0, (1_000_000_000.0 * t_frame) as u32); 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); let board_size = v2d(x_size as i32, y_size as i32);
// round down to odd size for maze // round down to odd size for maze
let maze_size = v2d( let maze_size = v2d(
(board_size.x - 1) / 2 * 2 + 1, (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 // 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 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 board = Board(Vec::new());
let mut open = Vec::new(); let mut open = Vec::new();
let mut last_drawn_minute = 99;
loop { loop {
if open.is_empty() { if open.is_empty() {
if t_wait > 0.0 { // get time
t_wait -= t_frame; let dt = Local::now();
} else { let h = dt.hour();
t_wait = 60.0; // s let m = dt.minute();
if m != last_drawn_minute {
last_drawn_minute = m;
board = Board::new(board_size, maze_size); board = Board::new(board_size, maze_size);
// draw stuff in prios // draw time in prios
let segment_size = v2d(11, 5); let segment_size = v2d(11, 5);
board.draw_7_segments(p2d(6, 8), segment_size, 0x06); board.draw_digit(p2d(6, 8), segment_size, (h / 10) as u8);
board.draw_7_segments(p2d(24, 8), segment_size, 0x4f); board.draw_digit(p2d(24, 8), segment_size, (h % 10) as u8);
board.draw_7_segments(p2d(42, 8), segment_size, 0x4f); board.draw_digit(p2d(42, 8), segment_size, (m / 10) as u8);
board.draw_7_segments(p2d(60, 8), segment_size, 0x07); board.draw_digit(p2d(60, 8), segment_size, (m % 10) as u8);
// start in the middle // start in the middle
board.set(maze_mid, Square::Corridor); board.set(maze_mid, Square::Corridor);