diff --git a/src/main.rs b/src/main.rs index cc5686a44289e2940a8668e61f8d9c42636043e2..077f1b5b7c2dc385db4595feb6510cd01024c780 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ mod ffi; +use std::io; use std::io::{Read, Write}; -use std::time::Duration; -use std::{io, thread}; +use std::time::Instant; use ffi::MavlinkPayloadFlightTM; use serialport::SerialPort; @@ -52,27 +52,56 @@ fn main() { // read from buffer and print to stdout let mut buffer = [0u8; 1000]; + let mut buffered_string = String::new(); + let mut start: Option<Instant> = None; + let mut times = Vec::new(); + let mut i = 0; loop { match port.read(&mut buffer) { Ok(t) => { // encode the buffer into a string let input = String::from_utf8_lossy(&buffer[..t]); // if we got the signal to start sending data, send it - if input.contains("[WAITING]") { + buffered_string.push_str(&input); + if buffered_string.contains("[WAITING]") { + buffered_string.clear(); if let Some(packet) = iter.next() { + if let Some(t) = start { + times.push(t.elapsed().as_millis()); + } + start = Some(Instant::now()); write_port.write_packet(packet); + i += 1; + } else { + break; } } - // std::io::stdout().write_all(&input.as_bytes()).unwrap(); - for line in input.lines() { - if !line.contains("[WAITING]") { - println!("{}", line); - } + std::io::stdout().write_all(input.as_bytes()).unwrap(); + + if i == 580 { + break; } + // for line in input.lines() { + // if !line.contains("[WAITING]") { + // println!("{}", line); + // } + // } } Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (), Err(e) => eprintln!("{:?}", e), } - thread::sleep(Duration::from_millis(100)); } + + // print stats (mean, median, std, etc) + let mean = times.iter().sum::<u128>() as f64 / times.len() as f64; + let median = times[times.len() / 2] as f64; + let std = times + .iter() + .map(|&x| (x as f64 - mean).powi(2)) + .sum::<f64>() + .sqrt() + / times.len() as f64; + println!("Mean: {}ms", mean); + println!("Median: {}ms", median); + println!("Std: {}ms", std); }