From b2286aecf5b88756a63923c02e91c5508e9e234a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Wed, 29 Dec 2021 11:31:54 +0100 Subject: [PATCH 1/3] Buffer partially read responses --- espflash/src/connection.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/espflash/src/connection.rs b/espflash/src/connection.rs index 81d00f28..4ca02100 100644 --- a/espflash/src/connection.rs +++ b/espflash/src/connection.rs @@ -1,4 +1,5 @@ use std::{ + collections::VecDeque, io::{BufWriter, Write}, thread::sleep, time::Duration, @@ -28,6 +29,7 @@ pub struct CommandResponse { pub struct Connection { serial: Box, decoder: SlipDecoder, + buffer: VecDeque, } #[derive(Zeroable, Pod, Copy, Clone, Debug)] @@ -44,6 +46,7 @@ impl Connection { Connection { serial, decoder: SlipDecoder::new(), + buffer: VecDeque::with_capacity(128), } } @@ -105,11 +108,18 @@ impl Connection { } pub fn read_response(&mut self) -> Result, Error> { - let response = self.read()?; - if response.len() < 10 { + const RESPONSE_LEN: usize = std::mem::size_of::(); + + let mut response = self.read()?; + self.buffer.extend(&response); + if self.buffer.len() < RESPONSE_LEN { return Ok(None); } + // reuse response alloc + response.clear(); + response.extend(self.buffer.drain(0..RESPONSE_LEN)); + let mut cursor = Cursor::new(response); let header = cursor.read_le()?; From 43aec09d467a0b447c5c9cf3e9f303222014acd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Wed, 29 Dec 2021 11:41:05 +0100 Subject: [PATCH 2/3] Buffer in the read method --- espflash/src/connection.rs | 39 +++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/espflash/src/connection.rs b/espflash/src/connection.rs index 4ca02100..6b937ce3 100644 --- a/espflash/src/connection.rs +++ b/espflash/src/connection.rs @@ -108,25 +108,19 @@ impl Connection { } pub fn read_response(&mut self) -> Result, Error> { - const RESPONSE_LEN: usize = std::mem::size_of::(); - - let mut response = self.read()?; - self.buffer.extend(&response); - if self.buffer.len() < RESPONSE_LEN { - return Ok(None); + match self.read(10)? { + None => return Ok(None), + Some(response) => { + let mut cursor = Cursor::new(response); + let header = cursor.read_le()?; + Ok(Some(header)) + } } - - // reuse response alloc - response.clear(); - response.extend(self.buffer.drain(0..RESPONSE_LEN)); - - let mut cursor = Cursor::new(response); - let header = cursor.read_le()?; - - Ok(Some(header)) } pub fn write_command(&mut self, command: Command) -> Result<(), Error> { + self.buffer.clear(); + self.serial.clear(serialport::ClearBuffer::Input)?; let mut writer = BufWriter::new(&mut self.serial); let mut encoder = SlipEncoder::new(&mut writer)?; command.write(&mut encoder)?; @@ -177,13 +171,24 @@ impl Connection { Ok(()) } - fn read(&mut self) -> Result, Error> { + fn read(&mut self, len: usize) -> Result>, Error> { let mut output = Vec::with_capacity(1024); self.decoder.decode(&mut self.serial, &mut output)?; - Ok(output) + + self.buffer.extend(&output); + if self.buffer.len() < len { + return Ok(None); + } + + // reuse allocation + output.clear(); + output.extend(self.buffer.drain(..)); + + Ok(Some(output)) } pub fn flush(&mut self) -> Result<(), Error> { + self.buffer.clear(); self.serial.flush()?; Ok(()) } From b51d8a73ebbf3ca4b0a5a01975afa13cd1814a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Buga?= Date: Mon, 17 Jan 2022 17:36:21 +0100 Subject: [PATCH 3/3] Pacify clippy --- espflash/src/connection.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/espflash/src/connection.rs b/espflash/src/connection.rs index 6b937ce3..c6b52bc6 100644 --- a/espflash/src/connection.rs +++ b/espflash/src/connection.rs @@ -109,7 +109,7 @@ impl Connection { pub fn read_response(&mut self) -> Result, Error> { match self.read(10)? { - None => return Ok(None), + None => Ok(None), Some(response) => { let mut cursor = Cursor::new(response); let header = cursor.read_le()?;