diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.rs | 3 | ||||
| -rw-r--r-- | src/transfer.rs | 62 |
2 files changed, 56 insertions, 9 deletions
@@ -78,8 +78,7 @@ fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<& state }, TransferState::SendHeader => transfer::send_header(&mut port, folder), - _ => TransferState::Finished, - TransferState::Finished => break, + TransferState::Finished => break }; } diff --git a/src/transfer.rs b/src/transfer.rs index 11946f1..7b6c6ce 100644 --- a/src/transfer.rs +++ b/src/transfer.rs @@ -9,7 +9,7 @@ pub enum TransferState { use serial; pub fn first_contact(port : &mut serial::SystemPort) -> TransferState { - const INITIAL_TRANSMISSION: u8 = 'b' as u8; + const INITIAL_TRANSMISSION: u8 = 99u8; use std::io::Write; match (*port).write(&vec![INITIAL_TRANSMISSION]) { @@ -48,7 +48,10 @@ pub fn wait_ack(port : &mut serial::SystemPort, prev_state: TransferState) -> Tr if buffer[0] == 'b' as u8 { println!("Received ACK"); match prev_state { - TransferState::FirstContact => TransferState::SendHeader, + TransferState::FirstContact => { + println!("Now send header"); + TransferState::SendHeader + }, _ => TransferState::Finished } } @@ -66,15 +69,60 @@ pub fn wait_ack(port : &mut serial::SystemPort, prev_state: TransferState) -> Tr } pub fn send_header(port : &mut serial::SystemPort, folder : &String) -> TransferState { + match get_exe_name(folder) { + None => TransferState::Finished, + Some(exe_name) => { + let exe_path = format!("{}/{}", folder, exe_name); + + use std::fs; + + match fs::read(&exe_path) { + Err(e) => { + println!("{:?}. File path: {}", e, exe_path); + TransferState::Finished + }, + Ok(data) => { + use std::io::Write; + + const HEADER_SIZE : usize = 32 as usize; + let mut header = data.clone(); + + header.truncate(HEADER_SIZE); + + (*port).write(&header).expect("Could not write EXE header into the device"); + + TransferState::WaitAck + } + } + } + } +} + +fn get_exe_name(folder : &String) -> Option<String> { use std::fs; use regex::Regex; - let data_buffer = fs::read_to_string(format!("{}/{}", folder, "SYSTEM.CNF")).unwrap(); + let path = format!("{}/{}", folder, "SYSTEM.CNF"); + + let data_buffer = fs::read_to_string(&path).unwrap(); + lazy_static! { - static ref RX: Regex = Regex::new(r"BOOT\s*=\s*cdrom:\(.+\.EXE);1").unwrap(); + static ref RX: Regex = Regex::new(r"BOOT\s*=\s*cdrom:\\([aA-zZ0-9]{1,8}\.[aA-zZ0-9]{1,3}).+").expect("Could not compile regex"); } - println!("{:?}", RX.captures(&data_buffer).unwrap()); - - TransferState::SendHeader + match RX.captures(&data_buffer) { + None => { + println!("Could not find executable name on {}", &path); + None + }, + Some(s) => { + match s.get(1) { + None => { + println!("Internal error"); + None + }, + Some(s_) => Some(String::from(s_.as_str())) + } + } + } } |
