summaryrefslogtreecommitdiff
path: root/src/transfer.rs
diff options
context:
space:
mode:
authorXavier Del Campo <xavi92psx@gmail.com>2019-01-06 22:10:49 +0100
committerXavier Del Campo <xavi92psx@gmail.com>2019-01-06 22:10:49 +0100
commit4e0853f81708dad75c4fc259dd9b318bf0a46bd3 (patch)
treed61d758891c06d7647a05cbc1bd8a5e7c10192bd /src/transfer.rs
parent42f2476aeebc5eb5a9366a6a366c9678eba6eb1b (diff)
downloadrspsxserial-4e0853f81708dad75c4fc259dd9b318bf0a46bd3.tar.gz
Some more work and format changes.
Diffstat (limited to 'src/transfer.rs')
-rw-r--r--src/transfer.rs46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/transfer.rs b/src/transfer.rs
index 617eb62..31594dd 100644
--- a/src/transfer.rs
+++ b/src/transfer.rs
@@ -1,16 +1,52 @@
-const initial_transmission : u8 = 'b' as u8;
-
+#[derive(Copy, Clone)]
pub enum TransferState {
FirstContact,
WaitAck,
+ SendHeader,
Finished
}
use serial;
-use serial::SystemPort;
pub fn first_contact(port : &mut serial::SystemPort) -> TransferState {
+ const INITIAL_TRANSMISSION: u8 = 'b' as u8;
+ use std::io::Write;
+
+ match (*port).write(&vec![INITIAL_TRANSMISSION]) {
+ Err(_) => TransferState::FirstContact,
+ Ok(b) => {
+ if b == 1 {
+ TransferState::WaitAck
+ }
+ else
+ {
+ TransferState::FirstContact
+ }
+ }
+ }
+}
+
+pub fn wait_ack(port : &mut serial::SystemPort, prev_state: TransferState) -> TransferState {
+
+ // For some reason, this trait has to be imported,
+ // but shouldn't serial::SerialPort be already doing this?
+ use std::io::Read;
+
+ let mut buffer : [u8; 1] = [0];
- *port.write(&initial_transmission);
- TransferState::WaitAck
+ match (*port).read(&mut buffer) {
+ Err(_) => TransferState::WaitAck,
+ Ok(b) => {
+ if b == 1 {
+ match prev_state {
+ TransferState::FirstContact => TransferState::SendHeader,
+ _ => TransferState::Finished
+ }
+ }
+ else
+ {
+ TransferState::WaitAck
+ }
+ }
+ }
}