Bugfix: 'b' was being sent on first transmission instead of 99.

Implemented sending PSX-EXE header.
This commit is contained in:
XaviDCR92 2019-01-10 01:18:12 +01:00
parent 5ce9fef2f5
commit e53f5e6ac9
3 changed files with 70 additions and 9 deletions

14
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,14 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"type": "cargo",
"task": "",
"problemMatcher": [
"$rustc"
]
}
]
}

View File

@ -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
};
}

View File

@ -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()))
}
}
}
}