diff options
| author | XaviDCR92 <xavi.dcr@gmail.com> | 2019-01-08 01:09:26 +0100 |
|---|---|---|
| committer | XaviDCR92 <xavi.dcr@gmail.com> | 2019-01-08 01:09:26 +0100 |
| commit | 5ce9fef2f59b2cad13a8460784f056db890700de (patch) | |
| tree | 2477e0104899f1c90f265077b7470bc9ef5ecfcd | |
| parent | 4e0853f81708dad75c4fc259dd9b318bf0a46bd3 (diff) | |
ACK from the device is received.
Fixed serial configuration as "no parity".
Added command-line argument "--cdimg-folder", used to retrieve data.
| -rw-r--r-- | .vscode/launch.json | 27 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/app.rs | 13 | ||||
| -rw-r--r-- | src/cmdline.rs | 13 | ||||
| -rw-r--r-- | src/main.rs | 26 | ||||
| -rw-r--r-- | src/transfer.rs | 38 |
6 files changed, 85 insertions, 34 deletions
diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..3a76327 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,27 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/target/debug/rspsxserial", + "args": ["--port-name", "/dev/ttyUSB0", "--cdimg-folder", "~/Airport/cdimg"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +}
\ No newline at end of file @@ -5,3 +5,5 @@ authors = ["Xavier Del Campo <xavi92psx@gmail.com>"] [dependencies] serial = "0.4.0" +regex = "1" +lazy_static = "1.2.0" @@ -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 +} |
