summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.vscode/tasks.json14
-rw-r--r--src/app.rs3
-rw-r--r--src/transfer.rs62
3 files changed, 70 insertions, 9 deletions
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..984b32c
--- /dev/null
+++ b/.vscode/tasks.json
@@ -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"
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/app.rs b/src/app.rs
index 2686ec1..1b14410 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -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
};
}
diff --git a/src/transfer.rs b/src/transfer.rs
index 11946f1..7b6c6ce 100644
--- a/src/transfer.rs
+++ b/src/transfer.rs
@@ -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()))
+ }
+ }
+ }
}