From 4e0853f81708dad75c4fc259dd9b318bf0a46bd3 Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Date: Sun, 6 Jan 2019 22:10:49 +0100 Subject: Some more work and format changes. --- src/transfer.rs | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'src/transfer.rs') 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 + } + } + } } -- cgit v1.2.3