should fix wrong packet size issues

This commit is contained in:
Alex Janka 2022-09-17 10:36:19 +10:00
parent f47b37ac92
commit 599df22d8b

View file

@ -2,6 +2,7 @@ use fh5_common::{Filename, Telemetry};
use std::fs::OpenOptions; use std::fs::OpenOptions;
use std::io::Write; use std::io::Write;
use std::mem::size_of;
use std::net::UdpSocket; use std::net::UdpSocket;
#[cfg(target_family = "unix")] #[cfg(target_family = "unix")]
use std::os::unix::fs::OpenOptionsExt; use std::os::unix::fs::OpenOptionsExt;
@ -43,7 +44,7 @@ struct NextFile {
name: Filename, name: Filename,
} }
fn listen(socket: &net::UdpSocket, mut buffer: &mut [u8]) -> usize { fn listen(socket: &net::UdpSocket, mut buffer: &mut [u8], last_size: &mut usize) -> usize {
let number_of_bytes = match socket.recv_from(&mut buffer) { let number_of_bytes = match socket.recv_from(&mut buffer) {
Ok((num, _)) => num, Ok((num, _)) => num,
// skip packets if they're too big // skip packets if they're too big
@ -52,6 +53,7 @@ fn listen(socket: &net::UdpSocket, mut buffer: &mut [u8]) -> usize {
0 0
} }
}; };
*last_size = number_of_bytes;
number_of_bytes number_of_bytes
} }
@ -61,18 +63,18 @@ fn main() {
verbose_print!( verbose_print!(
args, args,
"{}: Starting server", "{}: Starting server",
&Local::now().format("%H:%M:%S").to_string() &Local::now().format("%A %e %B - %H:%M:%S").to_string()
); );
if args.folder != "" { if args.folder != "" {
println!("Saving logs to {}", args.folder); println!(" Saving logs to {}", args.folder);
} else { } else {
println!("No folder specified - saving to current directory"); println!(" No folder specified - saving to current directory");
} }
let folder_path = Path::new(&args.folder); let folder_path = Path::new(&args.folder);
fs::create_dir_all(folder_path).expect("couldnt create log directory!"); fs::create_dir_all(folder_path).expect("couldnt create log directory!");
let socket = UdpSocket::bind(ip).expect("couldnt bind"); let socket = UdpSocket::bind(ip).expect("couldnt bind");
println!("Listening on port {}", args.port); println!(" Listening on port {}", args.port);
let mut buf = [0; 2048]; let mut buf = [0; 2048];
// let mut writer = csv::Writer::from_writer(tempfile().expect("couldnt open tempfile")); // let mut writer = csv::Writer::from_writer(tempfile().expect("couldnt open tempfile"));
@ -80,7 +82,11 @@ fn main() {
next: None, next: None,
position: 0, position: 0,
}; };
'listener: while listen(&socket, &mut buf) != 0 { let mut last_size = 0;
'listener: while listen(&socket, &mut buf, &mut last_size) != 0 {
if last_size != size_of::<Telemetry>() {
continue 'listener;
}
let deserialised: Telemetry = bincode::deserialize(&buf).expect("error parsing packet"); let deserialised: Telemetry = bincode::deserialize(&buf).expect("error parsing packet");
if deserialised.is_race_on == 0 { if deserialised.is_race_on == 0 {
continue 'listener; continue 'listener;
@ -88,7 +94,6 @@ fn main() {
if status.position != deserialised.race_position { if status.position != deserialised.race_position {
status.position = deserialised.race_position; status.position = deserialised.race_position;
verbose_print!(args, "now position {}", status.position);
} }
// status.next. // status.next.
if deserialised.race_position == 0 { if deserialised.race_position == 0 {
@ -96,7 +101,7 @@ fn main() {
verbose_print!( verbose_print!(
args, args,
"{}: no longer in race", "{}: no longer in race",
&Local::now().format("%H:%M:%S").to_string() &Local::now().format("%A %e %B - %H:%M:%S").to_string()
); );
finish_race(&args, next); finish_race(&args, next);
None None
@ -110,9 +115,8 @@ fn main() {
if deserialised.race_position > 0 { if deserialised.race_position > 0 {
verbose_print!( verbose_print!(
args, args,
"{}: entering race\ncar class: {}", "{}: entering race",
&Local::now().format("%H:%M:%S").to_string(), &Local::now().format("%A %e %B - %H:%M:%S").to_string()
deserialised.car_performance_index
); );
let mut new_next = begin_race(&deserialised); let mut new_next = begin_race(&deserialised);
continue_race(&deserialised, &mut new_next.writer); continue_race(&deserialised, &mut new_next.writer);
@ -138,11 +142,17 @@ fn finish_race(args: &Args, next: NextFile) {
} }
// open file for this race // open file for this race
let filename = format!("{}/{}.csv", args.folder, next.name.get_string()); let filename = format!("{}/{}.csv", args.folder, next.name.get_string());
verbose_print!(args, "Opening file {}", filename); verbose_print!(args, " Opening file {}", filename);
let mut filewriter = options.open(filename).expect("failed to open file"); match options.open(filename) {
Ok(mut filewriter) => {
let a = next.writer.into_inner().unwrap(); let a = next.writer.into_inner().unwrap();
filewriter.write_all(&a).unwrap(); filewriter.write_all(&a).unwrap();
filewriter.flush().expect("could not flush file"); filewriter.flush().expect("could not flush file");
}
Err(e) => {
println!(" Error opening file: {}", e);
}
}
} }
fn continue_race(deserialised: &Telemetry, writer: &mut csv::Writer<Vec<u8>>) { fn continue_race(deserialised: &Telemetry, writer: &mut csv::Writer<Vec<u8>>) {