Skip to content

Commit 2180a2d

Browse files
committed
[opentitanlib] change parameter on UartConsole to boolean quiet flag
We always use `stdout` if it's not `None`, so just use a boolean quiet flag instead. Signed-off-by: Gary Guo <[email protected]>
1 parent a2d03c3 commit 2180a2d

File tree

20 files changed

+59
-88
lines changed

20 files changed

+59
-88
lines changed

sw/host/opentitanlib/src/test_utils/rpc.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crc::{CRC_32_ISO_HDLC, Crc};
66
use regex::Regex;
77
use serde::Serialize;
88
use serde::de::DeserializeOwned;
9-
use std::io::Write;
109
use std::time::Duration;
1110

1211
use crate::io::console::{ConsoleDevice, ConsoleError};
@@ -70,14 +69,7 @@ where
7069
Some(Regex::new(r"RESP_OK:(.*) CRC:([0-9]+)\n")?),
7170
Some(Regex::new(r"RESP_ERR:(.*) CRC:([0-9]+)\n")?),
7271
);
73-
let mut stdout = std::io::stdout();
74-
let out = if !quiet {
75-
let w: &mut dyn Write = &mut stdout;
76-
Some(w)
77-
} else {
78-
None
79-
};
80-
let result = console.interact(device, out)?;
72+
let result = console.interact(device, quiet)?;
8173
println!();
8274
match result {
8375
ExitStatus::ExitSuccess => {

sw/host/opentitanlib/src/uart/console.rs

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ pub struct UartConsole {
1616
exit_failure: Option<Regex>,
1717
pub timestamp: bool,
1818
buffer: String,
19-
newline: bool,
2019
}
2120

2221
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
@@ -40,32 +39,27 @@ impl UartConsole {
4039
exit_failure,
4140
timestamp: true,
4241
buffer: String::new(),
43-
newline: true,
4442
}
4543
}
4644

4745
// Runs an interactive console until CTRL_C is received.
48-
pub fn interact<T>(&mut self, device: &T, stdout: Option<&mut dyn Write>) -> Result<ExitStatus>
46+
pub fn interact<T>(&mut self, device: &T, quiet: bool) -> Result<ExitStatus>
4947
where
5048
T: ConsoleDevice + ?Sized,
5149
{
52-
crate::util::runtime::block_on(self.interact_async(device, stdout))
50+
crate::util::runtime::block_on(self.interact_async(device, quiet))
5351
}
5452

5553
// Runs an interactive console until CTRL_C is received. Uses `mio` library to simultaneously
5654
// wait for data from UART or from stdin, without need for timeouts and repeated calls.
57-
pub async fn interact_async<T>(
58-
&mut self,
59-
device: &T,
60-
mut stdout: Option<&mut dyn Write>,
61-
) -> Result<ExitStatus>
55+
pub async fn interact_async<T>(&mut self, device: &T, quiet: bool) -> Result<ExitStatus>
6256
where
6357
T: ConsoleDevice + ?Sized,
6458
{
6559
let timeout = self.timeout;
6660
let rx = async {
6761
loop {
68-
self.uart_read(device, &mut stdout).await?;
62+
self.uart_read(device, quiet).await?;
6963
if self
7064
.exit_success
7165
.as_ref()
@@ -115,35 +109,34 @@ impl UartConsole {
115109
}
116110

117111
// Read from the console device and process the data read.
118-
async fn uart_read<T>(&mut self, device: &T, stdout: &mut Option<&mut dyn Write>) -> Result<()>
112+
async fn uart_read<T>(&mut self, device: &T, quiet: bool) -> Result<()>
119113
where
120114
T: ConsoleDevice + ?Sized,
121115
{
122-
let mut buf = [0u8; 1024];
123-
let effective_buf = if self.uses_regex() {
124-
// Read one byte at a time when matching, to avoid the risk of consuming output past a
125-
// match.
126-
&mut buf[..1]
127-
} else {
128-
&mut buf
129-
};
130-
let len = std::future::poll_fn(|cx| device.poll_read(cx, effective_buf)).await?;
131-
for i in 0..len {
132-
if self.timestamp && self.newline {
116+
let mut ch = 0;
117+
118+
// Read one byte at a time to avoid the risk of consuming output past a match.
119+
let len =
120+
std::future::poll_fn(|cx| device.poll_read(cx, std::slice::from_mut(&mut ch))).await?;
121+
122+
if len == 0 {
123+
return Ok(());
124+
}
125+
126+
if !quiet {
127+
let mut stdout = std::io::stdout().lock();
128+
stdout.write_all(std::slice::from_ref(&ch))?;
129+
130+
if self.timestamp && ch == b'\n' {
133131
let t = humantime::format_rfc3339_millis(SystemTime::now());
134-
stdout.as_mut().map_or(Ok(()), |out| {
135-
out.write_fmt(format_args!("[{} console]", t))
136-
})?;
137-
self.newline = false;
132+
stdout.write_fmt(format_args!("[{} console]", t))?;
138133
}
139-
self.newline = buf[i] == b'\n';
140-
stdout
141-
.as_mut()
142-
.map_or(Ok(()), |out| out.write_all(&buf[i..i + 1]))?;
134+
135+
stdout.flush()?;
143136
}
144-
stdout.as_mut().map_or(Ok(()), |out| out.flush())?;
137+
145138
if self.uses_regex() {
146-
self.append_buffer(&buf[..len]);
139+
self.append_buffer(std::slice::from_ref(&ch));
147140
}
148141
Ok(())
149142
}
@@ -170,8 +163,7 @@ impl UartConsole {
170163
T: ConsoleDevice + ?Sized,
171164
{
172165
let mut console = UartConsole::new(Some(timeout), Some(Regex::new(rx)?), None);
173-
let mut stdout = std::io::stdout();
174-
let result = console.interact(device, Some(&mut stdout))?;
166+
let result = console.interact(device, false)?;
175167
println!();
176168
match result {
177169
ExitStatus::ExitSuccess => {

sw/host/opentitanlib/src/util/rom_detect.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl RomDetect {
3030

3131
pub fn detect(&mut self, uart: &dyn Uart) -> Result<bool> {
3232
let t0 = Instant::now();
33-
let rc = self.console.interact(uart, None)?;
33+
let rc = self.console.interact(uart, true)?;
3434
let t1 = Instant::now();
3535
log::debug!("detect exit={:?}, duration={:?}", rc, t1 - t0);
3636
if let Some(cap) = self.console.captures(ExitStatus::ExitSuccess) {

sw/host/opentitantool/src/command/console.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,7 @@ impl CommandDispatch for Console {
169169
}
170170
};
171171

172-
let rx = async {
173-
console
174-
.interact_async(&uart_rx, Some(&mut std::io::stdout()))
175-
.await
176-
};
172+
let rx = async { console.interact_async(&uart_rx, false).await };
177173

178174
Result::<_>::Ok(tokio::select! {
179175
v = tx => Err(v?),

sw/host/tests/chip/jtag/src/openocd_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn test_openocd(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
4242
const CONSOLE_TIMEOUT: Duration = Duration::from_secs(5);
4343

4444
let mut console = UartConsole::new(Some(CONSOLE_TIMEOUT), Some(Regex::new(r"PASS!")?), None);
45-
let result = console.interact(&*uart, Some(&mut std::io::stdout()))?;
45+
let result = console.interact(&*uart, false)?;
4646
log::info!("result: {:?}", result);
4747

4848
//

sw/host/tests/chip/jtag/src/sram_load.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ fn test_sram_load(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
5454
)?),
5555
None,
5656
);
57-
let result = console.interact(&*uart, Some(&mut std::io::stdout()))?;
57+
let result = console.interact(&*uart, false)?;
5858
log::info!("result: {:?}", result);
5959
jtag.halt()?;
6060
jtag.disconnect()?;

sw/host/tests/chip/power_virus/src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ fn power_virus_systemtest(opts: &Opts, transport: &TransportWrapper) -> Result<(
3131
Some(Regex::new(r"PASS.*\n")?),
3232
Some(Regex::new(r"(FAIL|FAULT).*\n")?),
3333
);
34-
let mut stdout = std::io::stdout();
35-
let result = console.interact(&*uart, Some(&mut stdout))?;
34+
let result = console.interact(&*uart, false)?;
3635
match result {
3736
ExitStatus::Timeout => Err(anyhow!("Console timeout exceeded")),
3837
ExitStatus::ExitSuccess => {

sw/host/tests/chip/rv_core_ibex_epmp/src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ fn ibex_epmp_test(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
6969
Some(Regex::new(r"(FAIL|FAULT).*\n")?),
7070
);
7171

72-
let mut stdout = std::io::stdout();
73-
let result = console.interact(&*uart, Some(&mut stdout))?;
72+
let result = console.interact(&*uart, false)?;
7473
match result {
7574
ExitStatus::Timeout => Err(anyhow!("Console timeout exceeded")),
7675
ExitStatus::ExitSuccess => {

sw/host/tests/chip/spi_device/src/spi_device_flash_smoketest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ fn main() -> Result<()> {
9393
);
9494

9595
// Now watch the console for the exit conditions.
96-
let result = console.interact(&*uart, Some(&mut std::io::stdout()))?;
96+
let result = console.interact(&*uart, false)?;
9797
if result != ExitStatus::ExitSuccess {
9898
bail!("FAIL: {:?}", result);
9999
};

sw/host/tests/chip/spi_device/src/spi_device_sleep_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ fn main() -> Result<()> {
104104
);
105105

106106
// Now watch the console for the exit conditions.
107-
let result = console.interact(&*uart, Some(&mut std::io::stdout()))?;
107+
let result = console.interact(&*uart, false)?;
108108
if result != ExitStatus::ExitSuccess {
109109
bail!("FAIL: {:?}", result);
110110
};

0 commit comments

Comments
 (0)