From e53f5e6ac95b647467002122f5ff43db791199d6 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Thu, 10 Jan 2019 01:18:12 +0100 Subject: Bugfix: 'b' was being sent on first transmission instead of 99. Implemented sending PSX-EXE header. --- src/app.rs | 3 +-- src/transfer.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/app.rs b/src/app.rs index 2686ec1..1b14410 100644 --- a/src/app.rs +++ b/src/app.rs @@ -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 { 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())) + } + } + } } -- cgit v1.2.3