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() print()
if enable_tui: if enable_tui:
tui_record(packet_filter, vcd_sink, enable_verbose_trace) tui_record(signals, packet_filter, vcd_sink, enable_verbose_trace)
else: else:
record(packet_filter, vcd_sink, enable_verbose_trace) 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, total=self.maximum)
self.progress.update(self.progress_task, completed=value, visible=True) 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: try:
from rich.console import Console from rich.console import Console
from rich.text import Text 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.progress import Progress, TextColumn, BarColumn, TaskProgressColumn, MofNCompleteColumn
from rich.live import Live from rich.live import Live
from rich.align import Align from rich.align import Align
from rich.table import Table
except: except:
print("error: TUI mode requires the rich package") print("error: TUI mode requires the rich package")
exit() 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}")) noise_buffer = NoiseLineBuffer(lambda text: console.print(f"[blue]{text}"))
trace_text = Text("") trace_text = Text("")
# set up progress bars
progress_colums = [ progress_colums = [
TextColumn("[progress.description]{task.description}"), TextColumn("[progress.description]{task.description}"),
BarColumn(bar_width=80, complete_style="gold3", finished_style="red"), 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) render_time_tm = TotalMaximumProgressUpdater(diag_progress, render_time)
comp_time_tm = TotalMaximumProgressUpdater(diag_progress, comp_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: 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.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)) 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 bstr in sys.stdin.buffer:
for b in bstr: for b in bstr:
packet_filter.process(b) packet_filter.process(b)
live_status.update(diag_progress) live_status.update(generate_table(diag_progress, signal_values))
except KeyboardInterrupt: except KeyboardInterrupt:
diag_progress.stop() diag_progress.stop()