Skip to content

Commit fd205c7

Browse files
authored
Buffer reads (#117)
* Buffer partially read responses * Buffer in the read method * Pacify clippy
1 parent 2dc334f commit fd205c7

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

espflash/src/connection.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{
2+
collections::VecDeque,
23
io::{BufWriter, Write},
34
thread::sleep,
45
time::Duration,
@@ -28,6 +29,7 @@ pub struct CommandResponse {
2829
pub struct Connection {
2930
serial: Box<dyn SerialPort>,
3031
decoder: SlipDecoder,
32+
buffer: VecDeque<u8>,
3133
}
3234

3335
#[derive(Zeroable, Pod, Copy, Clone, Debug)]
@@ -44,6 +46,7 @@ impl Connection {
4446
Connection {
4547
serial,
4648
decoder: SlipDecoder::new(),
49+
buffer: VecDeque::with_capacity(128),
4750
}
4851
}
4952

@@ -105,18 +108,19 @@ impl Connection {
105108
}
106109

107110
pub fn read_response(&mut self) -> Result<Option<CommandResponse>, Error> {
108-
let response = self.read()?;
109-
if response.len() < 10 {
110-
return Ok(None);
111+
match self.read(10)? {
112+
None => Ok(None),
113+
Some(response) => {
114+
let mut cursor = Cursor::new(response);
115+
let header = cursor.read_le()?;
116+
Ok(Some(header))
117+
}
111118
}
112-
113-
let mut cursor = Cursor::new(response);
114-
let header = cursor.read_le()?;
115-
116-
Ok(Some(header))
117119
}
118120

119121
pub fn write_command(&mut self, command: Command) -> Result<(), Error> {
122+
self.buffer.clear();
123+
self.serial.clear(serialport::ClearBuffer::Input)?;
120124
let mut writer = BufWriter::new(&mut self.serial);
121125
let mut encoder = SlipEncoder::new(&mut writer)?;
122126
command.write(&mut encoder)?;
@@ -167,13 +171,24 @@ impl Connection {
167171
Ok(())
168172
}
169173

170-
fn read(&mut self) -> Result<Vec<u8>, Error> {
174+
fn read(&mut self, len: usize) -> Result<Option<Vec<u8>>, Error> {
171175
let mut output = Vec::with_capacity(1024);
172176
self.decoder.decode(&mut self.serial, &mut output)?;
173-
Ok(output)
177+
178+
self.buffer.extend(&output);
179+
if self.buffer.len() < len {
180+
return Ok(None);
181+
}
182+
183+
// reuse allocation
184+
output.clear();
185+
output.extend(self.buffer.drain(..));
186+
187+
Ok(Some(output))
174188
}
175189

176190
pub fn flush(&mut self) -> Result<(), Error> {
191+
self.buffer.clear();
177192
self.serial.flush()?;
178193
Ok(())
179194
}

0 commit comments

Comments
 (0)