diff options
| author | Xavier Del Campo <xavi92psx@gmail.com> | 2019-01-06 22:10:49 +0100 |
|---|---|---|
| committer | Xavier Del Campo <xavi92psx@gmail.com> | 2019-01-06 22:10:49 +0100 |
| commit | 4e0853f81708dad75c4fc259dd9b318bf0a46bd3 (patch) | |
| tree | d61d758891c06d7647a05cbc1bd8a5e7c10192bd /src/transfer.rs | |
| parent | 42f2476aeebc5eb5a9366a6a366c9678eba6eb1b (diff) | |
| download | rspsxserial-4e0853f81708dad75c4fc259dd9b318bf0a46bd3.tar.gz | |
Some more work and format changes.
Diffstat (limited to 'src/transfer.rs')
| -rw-r--r-- | src/transfer.rs | 46 |
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 + } + } + } } |
