Bugfix: 'b' was being sent on first transmission instead of 99.
Implemented sending PSX-EXE header.
This commit is contained in:
parent
5ce9fef2f5
commit
e53f5e6ac9
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue