Skip to content

Commit be87b50

Browse files
committed
Introduce Interface struct
1 parent fa4f269 commit be87b50

File tree

8 files changed

+88
-38
lines changed

8 files changed

+88
-38
lines changed

cargo-espflash/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ fn flash(
241241
if opts.flash_opts.monitor {
242242
let pid = flasher.get_usb_pid()?;
243243
monitor(
244-
flasher.into_serial(),
244+
flasher.into_interface(),
245245
Some(&elf_data),
246246
pid,
247247
opts.connect_opts.monitor_speed.unwrap_or(115200),

espflash/src/cli/mod.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::{
2323
elf::{ElfFirmwareImage, FlashFrequency, FlashMode},
2424
error::{Error, NoOtadataError},
2525
flasher::FlashSize,
26+
interface::Interface,
2627
partition_table, Chip, Flasher, ImageFormatId, InvalidPartitionTable, MissingPartitionTable,
2728
PartitionTable,
2829
};
@@ -147,8 +148,12 @@ pub fn connect(opts: &ConnectOpts, config: &Config) -> Result<Flasher> {
147148
_ => unreachable!(),
148149
};
149150

151+
let interface = Interface {
152+
serial_port: serial,
153+
};
154+
150155
Ok(Flasher::connect(
151-
serial,
156+
interface,
152157
port_info,
153158
opts.speed,
154159
opts.use_stub,
@@ -167,7 +172,7 @@ pub fn serial_monitor(opts: ConnectOpts, config: Config) -> Result<()> {
167172
let pid = flasher.get_usb_pid()?;
168173

169174
monitor(
170-
flasher.into_serial(),
175+
flasher.into_interface(),
171176
None,
172177
pid,
173178
opts.monitor_speed.unwrap_or(115200),

espflash/src/cli/monitor.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use std::{
2-
io::{stdout, ErrorKind, Read, Write},
2+
io::{stdout, ErrorKind},
33
time::Duration,
44
};
55

@@ -9,9 +9,8 @@ use crossterm::{
99
};
1010
use espmonitor::{handle_serial, load_bin_context, SerialState};
1111
use miette::{IntoDiagnostic, Result};
12-
use serialport::SerialPort;
1312

14-
use crate::connection::reset_after_flash;
13+
use crate::{connection::reset_after_flash, interface::Interface};
1514

1615
/// Converts key events from crossterm into appropriate character/escape
1716
/// sequences which are then sent over the serial connection.
@@ -84,7 +83,7 @@ impl Drop for RawModeGuard {
8483
}
8584

8685
pub fn monitor(
87-
mut serial: Box<dyn SerialPort>,
86+
mut serial: Interface,
8887
elf: Option<&[u8]>,
8988
pid: u16,
9089
baud: u32,
@@ -96,8 +95,10 @@ pub fn monitor(
9695

9796
// Explicitly set the baud rate when starting the serial monitor, to allow using
9897
// different rates for flashing.
99-
serial.set_baud_rate(baud)?;
100-
serial.set_timeout(Duration::from_millis(5))?;
98+
serial.serial_port_mut().set_baud_rate(baud)?;
99+
serial
100+
.serial_port_mut()
101+
.set_timeout(Duration::from_millis(5))?;
101102

102103
let _raw_mode = RawModeGuard::new();
103104

@@ -109,12 +110,12 @@ pub fn monitor(
109110
serial_state = SerialState::new(symbols);
110111
} else {
111112
serial_state = SerialState::new(None);
112-
reset_after_flash(&mut *serial, pid)?;
113+
reset_after_flash(&mut serial, pid)?;
113114
}
114115

115116
let mut buff = [0; 1024];
116117
loop {
117-
let read_count = match serial.read(&mut buff) {
118+
let read_count = match serial.serial_port_mut().read(&mut buff) {
118119
Ok(count) => Ok(count),
119120
Err(e) if e.kind() == ErrorKind::TimedOut => Ok(0),
120121
Err(e) if e.kind() == ErrorKind::Interrupted => continue,
@@ -131,16 +132,16 @@ pub fn monitor(
131132
match key.code {
132133
KeyCode::Char('c') => break,
133134
KeyCode::Char('r') => {
134-
reset_after_flash(&mut *serial, pid)?;
135+
reset_after_flash(&mut serial, pid)?;
135136
continue;
136137
}
137138
_ => {}
138139
}
139140
}
140141

141142
if let Some(bytes) = handle_key_event(key) {
142-
serial.write_all(&bytes)?;
143-
serial.flush()?;
143+
serial.serial_port_mut().write_all(&bytes)?;
144+
serial.serial_port_mut().flush()?;
144145
}
145146
}
146147
}

espflash/src/connection.rs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
use std::{
2-
io::{BufWriter, Write},
2+
io::{BufWriter, Read},
33
thread::sleep,
44
time::Duration,
55
};
66

77
use binread::{io::Cursor, BinRead, BinReaderExt};
88
use bytemuck::{Pod, Zeroable};
9-
use serialport::{SerialPort, UsbPortInfo};
9+
use serialport::UsbPortInfo;
1010
use slip_codec::SlipDecoder;
1111

1212
use crate::{
1313
command::{Command, CommandType},
1414
encoder::SlipEncoder,
1515
error::{ConnectionError, Error, ResultExt, RomError, RomErrorKind},
16+
interface::Interface,
1617
};
1718

1819
const DEFAULT_CONNECT_ATTEMPTS: usize = 7;
@@ -29,7 +30,7 @@ pub struct CommandResponse {
2930
}
3031

3132
pub struct Connection {
32-
serial: Box<dyn SerialPort>,
33+
serial: Interface,
3334
port_info: UsbPortInfo,
3435
decoder: SlipDecoder,
3536
}
@@ -44,7 +45,7 @@ struct WriteRegParams {
4445
}
4546

4647
impl Connection {
47-
pub fn new(serial: Box<dyn SerialPort>, port_info: UsbPortInfo) -> Self {
48+
pub fn new(serial: Interface, port_info: UsbPortInfo) -> Self {
4849
Connection {
4950
serial,
5051
port_info,
@@ -119,7 +120,7 @@ impl Connection {
119120

120121
pub fn reset(&mut self) -> Result<(), Error> {
121122
let pid = self.port_info.pid;
122-
Ok(reset_after_flash(&mut *self.serial, pid)?)
123+
Ok(reset_after_flash(&mut self.serial, pid)?)
123124
}
124125

125126
pub fn reset_to_flash(&mut self, extra_delay: bool) -> Result<(), Error> {
@@ -161,29 +162,36 @@ impl Connection {
161162
}
162163

163164
pub fn set_timeout(&mut self, timeout: Duration) -> Result<(), Error> {
164-
self.serial.set_timeout(timeout)?;
165+
self.serial.serial_port_mut().set_timeout(timeout)?;
165166
Ok(())
166167
}
167168

168169
pub fn set_baud(&mut self, speed: u32) -> Result<(), Error> {
169-
self.serial.set_baud_rate(speed)?;
170+
self.serial.serial_port_mut().set_baud_rate(speed)?;
170171

171172
Ok(())
172173
}
173174

174175
pub fn get_baud(&self) -> Result<u32, Error> {
175-
Ok(self.serial.baud_rate()?)
176+
Ok(self.serial.serial_port().baud_rate()?)
176177
}
177178

178179
pub fn with_timeout<T, F: FnMut(&mut Connection) -> Result<T, Error>>(
179180
&mut self,
180181
timeout: Duration,
181182
mut f: F,
182183
) -> Result<T, Error> {
183-
let old_timeout = self.serial.timeout();
184-
self.serial.set_timeout(timeout)?;
184+
let old_timeout = {
185+
let serial = self.serial.serial_port_mut();
186+
let old_timeout = serial.timeout();
187+
serial.set_timeout(timeout)?;
188+
old_timeout
189+
};
190+
185191
let result = f(self);
186-
self.serial.set_timeout(old_timeout)?;
192+
193+
self.serial.serial_port_mut().set_timeout(old_timeout)?;
194+
187195
result
188196
}
189197

@@ -199,8 +207,10 @@ impl Connection {
199207
}
200208

201209
pub fn write_command(&mut self, command: Command) -> Result<(), Error> {
202-
self.serial.clear(serialport::ClearBuffer::Input)?;
203-
let mut writer = BufWriter::new(&mut self.serial);
210+
let serial = self.serial.serial_port_mut();
211+
212+
serial.clear(serialport::ClearBuffer::Input)?;
213+
let mut writer = BufWriter::new(serial);
204214
let mut encoder = SlipEncoder::new(&mut writer)?;
205215
command.write(&mut encoder)?;
206216
encoder.finish()?;
@@ -253,19 +263,20 @@ impl Connection {
253263
pub(crate) fn read(&mut self, len: usize) -> Result<Option<Vec<u8>>, Error> {
254264
let mut tmp = Vec::with_capacity(1024);
255265
loop {
256-
self.decoder.decode(&mut self.serial, &mut tmp)?;
266+
self.decoder
267+
.decode(self.serial.serial_port_mut() as &mut dyn Read, &mut tmp)?;
257268
if tmp.len() >= len {
258269
return Ok(Some(tmp));
259270
}
260271
}
261272
}
262273

263274
pub fn flush(&mut self) -> Result<(), Error> {
264-
self.serial.flush()?;
275+
self.serial.serial_port_mut().flush()?;
265276
Ok(())
266277
}
267278

268-
pub fn into_serial(self) -> Box<dyn SerialPort> {
279+
pub fn into_interface(self) -> Interface {
269280
self.serial
270281
}
271282

@@ -274,7 +285,7 @@ impl Connection {
274285
}
275286
}
276287

277-
pub fn reset_after_flash(serial: &mut dyn SerialPort, pid: u16) -> Result<(), serialport::Error> {
288+
pub fn reset_after_flash(serial: &mut Interface, pid: u16) -> Result<(), serialport::Error> {
278289
sleep(Duration::from_millis(100));
279290

280291
if pid == USB_SERIAL_JTAG_PID {

espflash/src/flasher.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{borrow::Cow, str::FromStr, thread::sleep};
22

33
use bytemuck::{Pod, Zeroable, __core::time::Duration};
44
use log::debug;
5-
use serialport::{SerialPort, UsbPortInfo};
5+
use serialport::UsbPortInfo;
66
use strum_macros::{Display, EnumVariantNames};
77

88
use crate::{
@@ -12,6 +12,7 @@ use crate::{
1212
elf::{ElfFirmwareImage, FirmwareImage, FlashFrequency, FlashMode, RomSegment},
1313
error::{ConnectionError, FlashDetectError, ResultExt},
1414
image_format::ImageFormatId,
15+
interface::Interface,
1516
stubs::FlashStub,
1617
Error, PartitionTable,
1718
};
@@ -202,7 +203,7 @@ pub struct Flasher {
202203

203204
impl Flasher {
204205
pub fn connect(
205-
serial: Box<dyn SerialPort>,
206+
serial: Interface,
206207
port_info: UsbPortInfo,
207208
speed: Option<u32>,
208209
use_stub: bool,
@@ -634,10 +635,6 @@ impl Flasher {
634635
Ok(())
635636
}
636637

637-
pub fn into_serial(self) -> Box<dyn SerialPort> {
638-
self.connection.into_serial()
639-
}
640-
641638
pub fn get_usb_pid(&self) -> Result<u16, Error> {
642639
self.connection.get_usb_pid()
643640
}
@@ -653,6 +650,10 @@ impl Flasher {
653650
self.connection.flush()?;
654651
Ok(())
655652
}
653+
654+
pub fn into_interface(self) -> Interface {
655+
self.connection.into_interface()
656+
}
656657
}
657658

658659
pub(crate) fn get_erase_size(offset: usize, size: usize) -> usize {

espflash/src/interface.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use serialport::SerialPort;
2+
3+
/// Wrapper around SerialPort where platform-specific modifications can be implemented.
4+
pub struct Interface {
5+
pub serial_port: Box<dyn SerialPort>,
6+
}
7+
8+
impl Interface {
9+
pub fn write_data_terminal_ready(&mut self, pin_state: bool) -> serialport::Result<()> {
10+
self.serial_port.write_data_terminal_ready(pin_state)
11+
}
12+
13+
pub fn write_request_to_send(&mut self, pin_state: bool) -> serialport::Result<()> {
14+
self.serial_port.write_request_to_send(pin_state)
15+
}
16+
17+
pub fn into_serial(self) -> Box<dyn SerialPort> {
18+
self.serial_port
19+
}
20+
21+
pub fn serial_port(&self) -> &dyn SerialPort {
22+
self.serial_port.as_ref()
23+
}
24+
25+
pub fn serial_port_mut(&mut self) -> &mut dyn SerialPort {
26+
self.serial_port.as_mut()
27+
}
28+
}

espflash/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#![feature(trait_upcasting)]
2+
#![allow(incomplete_features)] // trait_upcasting
3+
14
pub use chip::Chip;
25
pub use cli::config::Config;
36
pub use elf::{FlashFrequency, FlashMode};
@@ -15,6 +18,7 @@ pub mod error;
1518
pub mod flash_target;
1619
pub mod flasher;
1720
pub mod image_format;
21+
pub mod interface;
1822
pub mod partition_table;
1923

2024
#[doc(hidden)]

espflash/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ fn flash(opts: Opts, config: Config) -> Result<()> {
179179
let pid = flasher.get_usb_pid()?;
180180

181181
monitor(
182-
flasher.into_serial(),
182+
flasher.into_interface(),
183183
Some(&elf_data),
184184
pid,
185185
opts.connect_opts.monitor_speed.unwrap_or(115200),

0 commit comments

Comments
 (0)