Skip to content

Commit c5625b3

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 c5625b3

File tree

20 files changed

+59
-85
lines changed

20 files changed

+59
-85
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 & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -45,27 +45,23 @@ impl UartConsole {
4545
}
4646

4747
// 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>
48+
pub fn interact<T>(&mut self, device: &T, quiet: bool) -> Result<ExitStatus>
4949
where
5050
T: ConsoleDevice + ?Sized,
5151
{
52-
crate::util::runtime::block_on(self.interact_async(device, stdout))
52+
crate::util::runtime::block_on(self.interact_async(device, quiet))
5353
}
5454

5555
// Runs an interactive console until CTRL_C is received. Uses `mio` library to simultaneously
5656
// 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>
57+
pub async fn interact_async<T>(&mut self, device: &T, quiet: bool) -> Result<ExitStatus>
6258
where
6359
T: ConsoleDevice + ?Sized,
6460
{
6561
let timeout = self.timeout;
6662
let rx = async {
6763
loop {
68-
self.uart_read(device, &mut stdout).await?;
64+
self.uart_read(device, quiet).await?;
6965
if self
7066
.exit_success
7167
.as_ref()
@@ -115,35 +111,35 @@ impl UartConsole {
115111
}
116112

117113
// 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<()>
114+
async fn uart_read<T>(&mut self, device: &T, quiet: bool) -> Result<()>
119115
where
120116
T: ConsoleDevice + ?Sized,
121117
{
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 {
118+
let mut ch = 0;
119+
120+
// Read one byte at a time to avoid the risk of consuming output past a match.
121+
let len =
122+
std::future::poll_fn(|cx| device.poll_read(cx, std::slice::from_mut(&mut ch))).await?;
123+
124+
if len == 0 {
125+
return Ok(());
126+
}
127+
128+
if !quiet {
129+
let mut stdout = std::io::stdout().lock();
130+
132131
if self.timestamp && self.newline {
133132
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;
133+
stdout.write_fmt(format_args!("[{} console]", t))?;
138134
}
139-
self.newline = buf[i] == b'\n';
140-
stdout
141-
.as_mut()
142-
.map_or(Ok(()), |out| out.write_all(&buf[i..i + 1]))?;
135+
self.newline = ch == b'\n';
136+
137+
stdout.write_all(std::slice::from_ref(&ch))?;
138+
stdout.flush()?;
143139
}
144-
stdout.as_mut().map_or(Ok(()), |out| out.flush())?;
140+
145141
if self.uses_regex() {
146-
self.append_buffer(&buf[..len]);
142+
self.append_buffer(std::slice::from_ref(&ch));
147143
}
148144
Ok(())
149145
}
@@ -170,8 +166,7 @@ impl UartConsole {
170166
T: ConsoleDevice + ?Sized,
171167
{
172168
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))?;
169+
let result = console.interact(device, false)?;
175170
println!();
176171
match result {
177172
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)