summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2019-01-13 23:34:04 +0100
committerXaviDCR92 <xavi.dcr@gmail.com>2019-01-13 23:34:04 +0100
commit4d0f0e6021778b2917960bef978fe69c0fe1b327 (patch)
tree330235536c985c870c64eb9f4c0bc42bf7af6c6d
parent35e37535556d7d2cce3bb04a9f6bff810ebefccc (diff)
Incoming file requests are now processed. Only sending file data TODO.
-rw-r--r--rspsxserial.code-workspace8
-rw-r--r--src/app.rs4
-rw-r--r--src/transfer.rs78
3 files changed, 84 insertions, 6 deletions
diff --git a/rspsxserial.code-workspace b/rspsxserial.code-workspace
new file mode 100644
index 0000000..876a149
--- /dev/null
+++ b/rspsxserial.code-workspace
@@ -0,0 +1,8 @@
+{
+ "folders": [
+ {
+ "path": "."
+ }
+ ],
+ "settings": {}
+} \ No newline at end of file
diff --git a/src/app.rs b/src/app.rs
index a0df9e7..4447df2 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -69,7 +69,7 @@ fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<&
let mut state = TransferState::FirstContact;
let mut prev_state = state;
let mut sent_bytes = 0 as usize;
-
+ let mut requested_file = String::new();
let exe_data = transfer::get_exe_data(&folder).unwrap();
loop {
@@ -84,6 +84,8 @@ fn serial_comm(addr : Option<&String>, port_name : &String, baud_rate : Option<&
TransferState::SendExeSize => transfer::send_exe_size(&mut port, &exe_data),
TransferState::CleaningRAM => transfer::wait_ack_default(&mut port, prev_state),
TransferState::SendExeData => transfer::send_exe_data(&mut port, &mut sent_bytes, &exe_data),
+ TransferState::WaitFileRequest => transfer::wait_file_request(&mut port, &mut requested_file),
+ TransferState::SendFile => transfer::send_file(&mut port, &mut sent_bytes, &requested_file),
TransferState::Finished => break
};
}
diff --git a/src/transfer.rs b/src/transfer.rs
index ba1501c..36cd23f 100644
--- a/src/transfer.rs
+++ b/src/transfer.rs
@@ -6,6 +6,8 @@ pub enum TransferState {
SendExeSize,
CleaningRAM,
SendExeData,
+ WaitFileRequest,
+ SendFile,
Finished
}
@@ -50,7 +52,10 @@ pub fn wait_ack_default(port : &mut serial::SystemPort, prev_state: TransferStat
Ok(1) => {
if *(buffer.get(0).unwrap()) == 'b' as u8 {
match prev_state {
- TransferState::FirstContact => TransferState::SendHeader,
+ TransferState::FirstContact => {
+ println!("Got response from the device");
+ TransferState::SendHeader
+ },
TransferState::SendHeader => TransferState::SendExeSize,
TransferState::SendExeSize => TransferState::CleaningRAM,
TransferState::CleaningRAM => TransferState::SendExeData,
@@ -103,9 +108,9 @@ pub fn send_exe_size(port: &mut serial::SystemPort, exe_data: &Vec<u8>) -> Trans
use std::io::Write;
let exe_size_vec : [u8; 4] = [(exe_size & 0xFF) as u8,
- ((exe_size & 0xFF00) >> 8) as u8,
- ((exe_size & 0xFF0000) >> 16) as u8,
- ((exe_size & 0xFF000000) >> 24) as u8];
+ ((exe_size & 0xFF00) >> 8) as u8,
+ ((exe_size & 0xFF0000) >> 16) as u8,
+ ((exe_size & 0xFF000000) >> 24) as u8];
(*port).write(&exe_size_vec).expect("Could not write EXE size into the device");
TransferState::WaitAck
@@ -130,6 +135,10 @@ pub fn send_exe_data(port: &mut serial::SystemPort, sent_bytes: &mut usize, exe_
(*port).write(&chunk).expect("Could not write EXE header into the device");
*sent_bytes += PACKET_SIZE;
+
+ if *sent_bytes % 32 == 0 {
+ print!("\rSent {:?}/{:?} bytes...", *sent_bytes, exe_size - EXE_DATA_OFFSET);
+ }
}
}
@@ -137,10 +146,69 @@ pub fn send_exe_data(port: &mut serial::SystemPort, sent_bytes: &mut usize, exe_
}
else
{
- TransferState::Finished
+ println!("Finished");
+
+ // Reset number of sent bytes.
+ *sent_bytes = 0;
+ TransferState::WaitFileRequest
+ }
+}
+
+/// This function waits for a file read request from the device and
+/// constructs a valid file name for it. If no valid data is provided,
+/// this state is re-entered cyclically.
+pub fn wait_file_request(port : &mut serial::SystemPort, requested_file : &mut String) -> TransferState {
+ // For some reason, this trait has to be imported,
+ // but shouldn't serial::SerialPort be already doing this?
+ use std::io::Read;
+
+ use serial::SerialPort;
+
+ const TIMEOUT_SECONDS : u64 = 5;
+
+ let mut buffer : [u8; 128] = [0; 128];
+
+ (*port).set_timeout(std::time::Duration::from_secs(TIMEOUT_SECONDS)).expect("Could not adjust timeout");
+
+ match (*port).read(&mut buffer) {
+ Err(_) | Ok(0) => {
+ println!("No information has been received yet");
+ TransferState::WaitFileRequest
+ },
+ Ok(_) => get_file_name(&buffer.to_vec(), requested_file)
+ }
+}
+
+fn get_file_name(buffer : &Vec<u8>, requested_file: &mut String) -> TransferState {
+ // No valid header byte has been found yet.
+ match buffer.iter().position(|&c| c == '#' as u8) {
+ None => TransferState::WaitFileRequest,
+ Some(pos) => {
+ let final_pos : usize =
+ match buffer.iter().position(|&c| c == '@' as u8) {
+ None => buffer.len() - 1,
+ Some(l) => l
+ };
+ requested_file.clone_from(&String::from_utf8(buffer[pos + 1..final_pos].to_vec()).unwrap());
+
+ println!("Requested file: {}", requested_file);
+
+ if requested_file.ends_with(";1") {
+ TransferState::SendFile
+ }
+ else
+ {
+ TransferState::WaitFileRequest
+ }
+ }
}
}
+pub fn send_file(port : &mut serial::SystemPort, sent_bytes: &mut usize, requested_file: &String) -> TransferState {
+ println!("Requested file: {}", requested_file);
+ TransferState::Finished
+}
+
pub fn get_exe_data(folder: &String) -> Option<Vec<u8>> {
match get_exe_name(folder) {
None => None,