From 13ae060847be2b3a2ed3e98ba8cf7a4d280407c5 Mon Sep 17 00:00:00 2001 From: Robert Hedman <robert.hedman@mac.com> Date: Tue, 28 Nov 2017 17:59:01 +0100 Subject: [PATCH] sync --- src/main.rs | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index f5ed26d..24ab9da 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,20 +21,24 @@ use serial::prelude::*; const LIDAR_ADDRESS: &str = "127.0.0.1:8080"; const COUNTER_SERIAL_PORT: &str = "/dev/cu.usbmodem1422"; +const LIDAR_BUF_SIZE: usize = 4096; -// should the map matrix be two dim array of const size, vecs of dynamic, or what? -const ROWS: usize = 50; -const COLS: usize = 100; +// each pixel represents 1dm*1dm, so 100*100mm. +const ROWS: usize = 1000; +const COLS: usize = 1000; +#![feature(box_syntax)] fn main() { + let mut map= box ([[0u32; ROWS]; COLS]); + //let mut vecMap = vec![vec![0; ROWS]; COLS]; - let mut map = [[0u32; ROWS]; COLS]; - map[0][0] = 3; + //let mut map = [[0u32; ROWS]; COLS]; + //map[0][0] = 3; - println!("{}, {}", map[0][0], map[0][1]); + //println!("{}, {}", map[0][0], map[0][1]); // dummy thread for replacing lidar let server = thread::spawn(|| { @@ -66,7 +70,7 @@ fn main() { println!("Server got: {:?}", String::from_utf8_lossy(&message[0..message_len])); //let written_size = stream.write(&[69 as u8, 96 as u8]); let written_size = stream.write_all(b"\x02This is a bunch of lidar data...\x03"); - println!("server wrote {:?} to stream.", written_size); + println!("server wrote to stream."); // reset everything for next message. recording = false; @@ -90,7 +94,7 @@ fn main() { let (request_location_tx, request_location_rx): (mpsc::Sender<bool>, mpsc::Receiver<bool>) = mpsc::channel(); - let (send_location_tx, send_location_rx): (mpsc::Sender<(i32, i32)>, mpsc::Receiver<(i32, i32)>) = mpsc::channel(); + let (send_location_tx, send_location_rx): (mpsc::Sender<(i32, i32, f32)>, mpsc::Receiver<(i32, i32, f32)>) = mpsc::channel(); // location tracker @@ -102,13 +106,15 @@ fn main() { interact(&mut port).unwrap(); - let mut pos: (i32, i32) = (0,0); + let mut pos: (i32, i32, f32) = (COLS as i32/2,ROWS as i32/2, 0.0); + println!("location initial position: {:?}", pos); loop { // get encoder data from arduino and update local variables match port.read_exact(&mut serial_buf){ Ok(_) => { pos.0 += freq_to_distance( ( ((serial_buf[0] as u32) << 24) + ((serial_buf[1] as u32) << 16) + ((serial_buf[2] as u32) << 8) + (serial_buf[3] as u32) ) as i32); pos.1 += freq_to_distance( ( ((serial_buf[4] as u32) << 24) + ((serial_buf[5] as u32) << 16) + ((serial_buf[6] as u32) << 8) + (serial_buf[7] as u32) ) as i32); + pos.2 = dist_to_angle(&pos); print!("L: {}, ", pos.0); println!("R: {}", pos.1); }, @@ -125,7 +131,7 @@ fn main() { println!("tracker got stop signal."); break; }; - send_location_tx.send(pos).unwrap(); + send_location_tx.send((pos)).unwrap(); //pos.0 += 1; }, Err(_) => { @@ -145,17 +151,19 @@ fn main() { let mapper = thread::spawn(move || { println!("mapper started."); // create empty map - let mut pos: (i32, i32); //= (0,0); + + let mut pos: (i32, i32, f32); //= (0,0); // set up connection to lidar let mut stream = TcpStream::connect(&LIDAR_ADDRESS).unwrap(); - let mut lidar_buf: [u8; 4096] = [0u8; 4096]; - let mut message_len = 0; + let mut lidar_buf: [u8; LIDAR_BUF_SIZE] = [0u8; LIDAR_BUF_SIZE]; + let mut message_len: usize = 0; let mut recording = false; // main loop for this thread loop { // request position data + println!("Mapper requesting pos data."); request_location_tx.send(true).unwrap(); pos = send_location_rx.recv().unwrap(); if pos.0 % 1000 == 0 { @@ -165,6 +173,7 @@ fn main() { // request lidar data //thread::sleep(time::Duration::new(3,0)); + println!("mapper requesting lidar scan."); let _ = stream.write_all(b"\x02sRN LMDscandata\x03"); // tell lidar to send one measurment for r in stream.try_clone().expect("stream clone failed").bytes() { // iterate over answer match r { @@ -183,9 +192,12 @@ fn main() { //let written_size = stream.write(&[69 as u8, 96 as u8]); //println!("server wrote {:?} to stream.", written_size); + // update map using lidar data + update_map_with_lidar(lidar_buf, message_len, &mut map); + // reset everything for next message. recording = false; - message_len = 0; + let message_len: usize = 0; break; } else if recording { @@ -250,4 +262,10 @@ fn interact<T: SerialPort>(port: &mut T) -> io::Result<()> { fn freq_to_distance(freq: i32) -> i32 { freq/10 +} +fn dist_to_angle(pos: &(i32,i32,f32)) -> f32 { + 0.0 +} +fn update_map_with_lidar(lidar_data: [u8; LIDAR_BUF_SIZE], message_len: usize, map: &mut [[u32; ROWS]; COLS]) { + map[0][0] += 1; } \ No newline at end of file -- GitLab