summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2019-01-08 01:09:26 +0100
committerXaviDCR92 <xavi.dcr@gmail.com>2019-01-08 01:09:26 +0100
commit5ce9fef2f59b2cad13a8460784f056db890700de (patch)
tree2477e0104899f1c90f265077b7470bc9ef5ecfcd /src
parent4e0853f81708dad75c4fc259dd9b318bf0a46bd3 (diff)
downloadrspsxserial-5ce9fef2f59b2cad13a8460784f056db890700de.tar.gz
ACK from the device is received.
Fixed serial configuration as "no parity". Added command-line argument "--cdimg-folder", used to retrieve data.
Diffstat (limited to 'src')
-rw-r--r--src/app.rs13
-rw-r--r--src/cmdline.rs13
-rw-r--r--src/main.rs26
-rw-r--r--src/transfer.rs38
4 files changed, 56 insertions, 34 deletions
diff --git a/src/app.rs b/src/app.rs
index e0aa3f1..2686ec1 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -27,7 +27,10 @@ pub fn app(arg_hash: HashMap<String, String>) -> Result<()> {
// but don't process it yet.
let baud_rate = arg_hash.get(&String::from(cmdline::BAUDRATE_ARG));
- serial_comm(addr, port_name, baud_rate)?;
+ // Extract folder where CD-ROM file system is mounted.
+ let folder = arg_hash.get(&String::from(cmdline::CDIMG_FOLDER)).expect("Invalid given folder");
+
+ serial_comm(addr, port_name, baud_rate, folder)?;
Ok(())
}
@@ -57,7 +60,7 @@ fn setup_tcp(tcp_addr : &String) -> Result<()> {
Ok(())
}
-fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<&String>) -> Result<()> {
+fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<&String>, folder : &String) -> Result<()> {
use transfer;
use transfer::TransferState;
@@ -74,7 +77,9 @@ fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<&
prev_state = state;
state
},
- _ => TransferState::Finished
+ TransferState::SendHeader => transfer::send_header(&mut port, folder),
+ _ => TransferState::Finished,
+ TransferState::Finished => break,
};
}
@@ -122,7 +127,7 @@ fn serial_init(addr : Option<&String>, port_name : &String, baud_rate : Option<&
serial::PortSettings {
baud_rate: baud,
char_size: serial::Bits8,
- parity: serial::ParityOdd,
+ parity: serial::ParityNone,
stop_bits: serial::Stop1,
flow_control: serial::FlowNone
};
diff --git a/src/cmdline.rs b/src/cmdline.rs
index d4828b2..3483855 100644
--- a/src/cmdline.rs
+++ b/src/cmdline.rs
@@ -25,7 +25,11 @@ pub const BAUDRATE_ARG : &'static str = "--baud-rate";
/// against a GUI front-end.
pub const TCP_ARG : &'static str = "--tcp";
-const CMD_LINE_ARGS : [CmdLineArg; 4] =
+/// This parameter defines what folder should
+/// be looked up in order to set up a working environment
+pub const CDIMG_FOLDER : &'static str = "--cdimg-folder";
+
+const CMD_LINE_ARGS : [CmdLineArg; 5] =
[
CmdLineArg {
arg_str : PORT_NAME_ARG,
@@ -54,6 +58,13 @@ const CMD_LINE_ARGS : [CmdLineArg; 4] =
is_required : false,
explanation : "Sets a TCP connection against a compatible \
front-end application"
+ },
+
+ CmdLineArg {
+ arg_str : CDIMG_FOLDER,
+ param_str : Some("[FOLDER]"),
+ is_required : true,
+ explanation : "Sets working directory"
}
];
diff --git a/src/main.rs b/src/main.rs
index 8afc13e..c7602c6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,4 +1,6 @@
extern crate serial;
+extern crate regex;
+#[macro_use] extern crate lazy_static;
mod cmdline;
mod app;
mod transfer;
@@ -16,27 +18,3 @@ fn main() {
}
}
}
-
-//~ /** let mut port = serial::open(&arg).unwrap();
- //~ interact(&mut port).unwrap();*/
-
-//~ /// This function reconfigures a serial port with default parameters
-//~ fn interact<T: SerialPort>(port: &mut T) -> io::Result<()> {
- //~ port.reconfigure(&|settings| {
- //~ settings.set_baud_rate(serial::Baud9600)?;
- //~ settings.set_char_size(serial::Bits8);
- //~ settings.set_parity(serial::ParityNone);
- //~ settings.set_stop_bits(serial::Stop1);
- //~ settings.set_flow_control(serial::FlowNone);
- //~ Ok(())
- //~ })?;
-
- //~ port.set_timeout(Duration::from_millis(1000))?;
-
- //~ let buf: Vec<u8> = (0..255).collect();
-
- //~ port.write(&buf[..])?;
- //~ //port.read(&mut buf[..])?;
-
- //~ Ok(())
-//~ }
diff --git a/src/transfer.rs b/src/transfer.rs
index 31594dd..11946f1 100644
--- a/src/transfer.rs
+++ b/src/transfer.rs
@@ -16,6 +16,7 @@ pub fn first_contact(port : &mut serial::SystemPort) -> TransferState {
Err(_) => TransferState::FirstContact,
Ok(b) => {
if b == 1 {
+ println!("Written 1 byte: {}", INITIAL_TRANSMISSION);
TransferState::WaitAck
}
else
@@ -34,19 +35,46 @@ pub fn wait_ack(port : &mut serial::SystemPort, prev_state: TransferState) -> Tr
let mut buffer : [u8; 1] = [0];
+ use serial::SerialPort;
+
+ (*port).set_timeout(std::time::Duration::from_secs(2)).expect("Could not adjust timeout");
+
match (*port).read(&mut buffer) {
- Err(_) => TransferState::WaitAck,
+ Err(_) => {
+ prev_state
+ },
Ok(b) => {
if b == 1 {
- match prev_state {
- TransferState::FirstContact => TransferState::SendHeader,
- _ => TransferState::Finished
+ if buffer[0] == 'b' as u8 {
+ println!("Received ACK");
+ match prev_state {
+ TransferState::FirstContact => TransferState::SendHeader,
+ _ => TransferState::Finished
+ }
+ }
+ else
+ {
+ prev_state
}
}
else
{
- TransferState::WaitAck
+ prev_state
}
}
}
}
+
+pub fn send_header(port : &mut serial::SystemPort, folder : &String) -> TransferState {
+ use std::fs;
+ use regex::Regex;
+
+ let data_buffer = fs::read_to_string(format!("{}/{}", folder, "SYSTEM.CNF")).unwrap();
+ lazy_static! {
+ static ref RX: Regex = Regex::new(r"BOOT\s*=\s*cdrom:\(.+\.EXE);1").unwrap();
+ }
+
+ println!("{:?}", RX.captures(&data_buffer).unwrap());
+
+ TransferState::SendHeader
+}