diff --git a/st_record.py b/st_record.py index 53d39b2..157fc2c 100644 --- a/st_record.py +++ b/st_record.py @@ -538,7 +538,7 @@ def main(): print() if enable_tui: - tui_record(packet_filter, vcd_sink, enable_verbose_trace) + tui_record(signals, packet_filter, vcd_sink, enable_verbose_trace) else: record(packet_filter, vcd_sink, enable_verbose_trace) @@ -606,7 +606,7 @@ class TotalMaximumProgressUpdater: self.progress.update(self.progress_task, total=self.maximum) self.progress.update(self.progress_task, completed=value, visible=True) -def tui_record(packet_filter, vcd_sink, enable_verbose_trace): +def tui_record(signals, packet_filter, vcd_sink, enable_verbose_trace): try: from rich.console import Console from rich.text import Text @@ -614,6 +614,7 @@ def tui_record(packet_filter, vcd_sink, enable_verbose_trace): from rich.progress import Progress, TextColumn, BarColumn, TaskProgressColumn, MofNCompleteColumn from rich.live import Live from rich.align import Align + from rich.table import Table except: print("error: TUI mode requires the rich package") exit() @@ -626,6 +627,7 @@ def tui_record(packet_filter, vcd_sink, enable_verbose_trace): noise_buffer = NoiseLineBuffer(lambda text: console.print(f"[blue]{text}")) trace_text = Text("") + # set up progress bars progress_colums = [ TextColumn("[progress.description]{task.description}"), BarColumn(bar_width=80, complete_style="gold3", finished_style="red"), @@ -646,6 +648,31 @@ def tui_record(packet_filter, vcd_sink, enable_verbose_trace): render_time_tm = TotalMaximumProgressUpdater(diag_progress, render_time) comp_time_tm = TotalMaximumProgressUpdater(diag_progress, comp_time) + # set up table layout and signal view + signal_values = {name.split(":")[0]:None for name in signals} + + + def on_any_value(time,signal,value,sub): + signal_values[signal].plain(value) + + vcd_sink.onanyvalue(on_any_value) + + def generate_table(diag_progress, signal_values): + grid = Table.grid(expand=True) + grid.add_column(justify="left") + grid.add_column(justify="left") + grid.add_column(justify="left") + grid.add_row(None) # this empty row is there to not leave behind a render on interrupt + + for sig in signals: + name, sigtype = sig.split(":") + value = signal_values[name] + text = Text("X" if value is None else value, style="red" if value is None else "green") + grid.add_row(sigtype, name, text) + + grid.add_row("Diagnostics", diag_progress) + return grid + with Live(console=console, transient=True) as live_status: vcd_sink.onvalue("ST.BufferHealth", lambda _,value,sub: diag_progress.update(buffer_health, completed=value, visible=True)) vcd_sink.onvalue("ST.BufferItems", lambda _,value,sub: buffer_items_tm.update(value)) @@ -660,7 +687,7 @@ def tui_record(packet_filter, vcd_sink, enable_verbose_trace): for bstr in sys.stdin.buffer: for b in bstr: packet_filter.process(b) - live_status.update(diag_progress) + live_status.update(generate_table(diag_progress, signal_values)) except KeyboardInterrupt: diag_progress.stop()