From a1eed373b07d54c534310a5a4cd69d77d3a54350 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Tue, 15 Jan 2019 00:21:22 +0100 Subject: requested_file is now also modified by send_file(). Packets smaller than 8 bytes are now also sent. --- src/app.rs | 48 +++++++++++++++++++++--------------------------- src/transfer.rs | 55 +++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 56 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/app.rs b/src/app.rs index 3cea4ce..dfaf668 100644 --- a/src/app.rs +++ b/src/app.rs @@ -94,7 +94,7 @@ fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<& TransferState::SendFile => transfer::send_file(&mut port, &folder, &mut sent_bytes, - &requested_file, + &mut requested_file, &mut file_data, &mut file_size), TransferState::Finished => break @@ -127,31 +127,25 @@ fn serial_init(addr : Option<&String>, port_name : &String, baud_rate : Option<& } }; - // This variable will be bound to a SystemPort - // instance if everything could be configured successfully. - let mut port_unwrapped; - match port { - Err(_) => { - return Err(Error::new(ErrorKind::NotFound, "Could not open serial device")); - }, - - Ok(p) => { - port_unwrapped = p; - } - }; - - let settings = - serial::PortSettings { - baud_rate: baud, - char_size: serial::Bits8, - parity: serial::ParityNone, - stop_bits: serial::Stop1, - flow_control: serial::FlowNone - }; - - port_unwrapped.configure(&settings)?; - - // Return SystemPort instance if successful. - Ok(port_unwrapped) + Err(_) => { + Err(Error::new(ErrorKind::NotFound, "Could not open serial device")) + }, + + Ok(mut p) => { + let settings = + serial::PortSettings { + baud_rate: baud, + char_size: serial::Bits8, + parity: serial::ParityNone, + stop_bits: serial::Stop1, + flow_control: serial::FlowNone + }; + + p.configure(&settings)?; + + // Return SystemPort instance if successful. + Ok(p) + } + } } diff --git a/src/transfer.rs b/src/transfer.rs index c441fd0..aaa5dc8 100644 --- a/src/transfer.rs +++ b/src/transfer.rs @@ -181,34 +181,48 @@ pub fn wait_file_request(port : &mut serial::SystemPort, requested_file : &mut S } fn get_file_name(buffer : &Vec, requested_file: &mut String) -> TransferState { - // No valid header byte has been found yet. - match buffer.iter().position(|&c| c == '#' as u8) { - None => TransferState::WaitFileRequest, - Some(pos) => { - let final_pos : usize = - match buffer.iter().position(|&c| c == '@' as u8) { - None => buffer.len() - 1, - Some(l) => l - }; - requested_file.clone_from(&String::from_utf8(buffer[pos + 1..final_pos].to_vec()).unwrap()); - - println!("Requested file: {}", requested_file); - - if requested_file.ends_with(";1") { - TransferState::SendFile + if requested_file.is_empty() { + // No valid header byte has been found yet. + match buffer.iter().position(|&c| c == '#' as u8) { + Some(pos) => { + let final_pos : usize = + match buffer.iter().position(|&c| c == '@' as u8) { + None => { + println!("Terminator character could not be found"); + buffer.len() - 1 + }, + Some(l) => l + }; + requested_file.clone_from(&String::from_utf8(buffer[pos + 1..final_pos].to_vec()).unwrap()); } - else - { - TransferState::WaitFileRequest + None => {}, + } + } + else + { + // No valid header byte has been found yet. + match buffer.iter().position(|&c| c == '@' as u8) { + Some(pos) => { + requested_file.push_str(&String::from_utf8(buffer[0..pos].to_vec()).unwrap()); } + None => {}, } } + + if requested_file.ends_with(";1") { + println!("Requested file: {}", requested_file); + TransferState::SendFile + } + else + { + TransferState::WaitFileRequest + } } pub fn send_file(port : &mut serial::SystemPort, folder: &String, sent_bytes: &mut usize, - requested_file: &String, + requested_file: &mut String, file_data : &mut Vec, file_size : &mut Option) -> TransferState { use std::fs; @@ -295,12 +309,13 @@ pub fn send_file(port : &mut serial::SystemPort, } else { - println!("{} has been completely sent.", requested_file); + println!("\r{} has been completely sent.", requested_file); // Reset information. *sent_bytes = 0; *file_size = None; file_data.clear(); + requested_file.clear(); TransferState::WaitFileRequest } -- cgit v1.2.3