WIP Signal TUI view

This commit is contained in:
Dominic Höglinger 2025-05-17 16:08:39 +02:00
parent 90787ec97e
commit c670df3ce0

View File

@ -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()