add 'graphs', adjust labels for brevity
This commit is contained in:
parent
9af60178dc
commit
8ee1e5f2b4
2 changed files with 46 additions and 3 deletions
|
@ -16,6 +16,14 @@ GPUStatsWidget {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tab_graphs {
|
||||||
|
layout: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph_section {
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
Container {
|
Container {
|
||||||
height: 1fr;
|
height: 1fr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,11 +22,13 @@ from rich.text import Text
|
||||||
from textual import work
|
from textual import work
|
||||||
from textual.binding import Binding
|
from textual.binding import Binding
|
||||||
from textual.app import App, ComposeResult
|
from textual.app import App, ComposeResult
|
||||||
from textual.containers import Container
|
from textual.containers import Container, Vertical
|
||||||
from textual.widgets import (
|
from textual.widgets import (
|
||||||
DataTable,
|
DataTable,
|
||||||
Footer,
|
Footer,
|
||||||
Header,
|
Header,
|
||||||
|
Label,
|
||||||
|
ProgressBar,
|
||||||
Static,
|
Static,
|
||||||
TabbedContent,
|
TabbedContent,
|
||||||
TabPane,
|
TabPane,
|
||||||
|
@ -107,6 +109,19 @@ class GPUStatsWidget(Static):
|
||||||
timer_stats = None
|
timer_stats = None
|
||||||
# mark the table as needing initialization (with rows)
|
# mark the table as needing initialization (with rows)
|
||||||
table_needs_init = True
|
table_needs_init = True
|
||||||
|
card_bars = []
|
||||||
|
for card in AMDGPU_CARDS:
|
||||||
|
card_bars.append((card,
|
||||||
|
ProgressBar(total=100.0,
|
||||||
|
show_eta=False,
|
||||||
|
id='bar_' + card + '_util'),
|
||||||
|
ProgressBar(total=100.0,
|
||||||
|
show_eta=False,
|
||||||
|
id='bar_' + card + '_poweravg'),
|
||||||
|
ProgressBar(total=100.0,
|
||||||
|
show_eta=False,
|
||||||
|
id='bar_' + card + '_powercap'))
|
||||||
|
)
|
||||||
|
|
||||||
def __init__(self, *args, cards=None, **kwargs):
|
def __init__(self, *args, cards=None, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
@ -129,8 +144,8 @@ class GPUStatsWidget(Static):
|
||||||
columns = list(self.get_column_data_mapping(None).keys())
|
columns = list(self.get_column_data_mapping(None).keys())
|
||||||
for column in columns:
|
for column in columns:
|
||||||
if column in ['Limit', 'Default', 'Capability']:
|
if column in ['Limit', 'Default', 'Capability']:
|
||||||
label = '[italic]' + column
|
self.stats_table.add_column(label='[italic]' + column,
|
||||||
self.stats_table.add_column(label=label, key=column)
|
key=column)
|
||||||
else:
|
else:
|
||||||
self.stats_table.add_column(label=column, key=column)
|
self.stats_table.add_column(label=column, key=column)
|
||||||
# self.update_log(f' - "{column}"')
|
# self.update_log(f' - "{column}"')
|
||||||
|
@ -146,6 +161,17 @@ class GPUStatsWidget(Static):
|
||||||
with self.tabbed_container:
|
with self.tabbed_container:
|
||||||
with TabPane("Stats", id="tab_stats"):
|
with TabPane("Stats", id="tab_stats"):
|
||||||
yield self.stats_table
|
yield self.stats_table
|
||||||
|
with TabPane("Graphs", id="tab_graphs", classes="tab_graphs"):
|
||||||
|
for card, util_bar, power_bar_avg, power_bar_cap in self.card_bars:
|
||||||
|
yield Vertical(
|
||||||
|
Label(f'[bold]{card}'),
|
||||||
|
Label('Core:'),
|
||||||
|
util_bar,
|
||||||
|
Label('Power [italic](limit)[/i]:'),
|
||||||
|
power_bar_avg,
|
||||||
|
Label('Power [italic](capability)[/i]:'),
|
||||||
|
power_bar_cap,
|
||||||
|
classes='graph_section')
|
||||||
with TabPane("Logs", id="tab_logs"):
|
with TabPane("Logs", id="tab_logs"):
|
||||||
yield self.text_log
|
yield self.text_log
|
||||||
|
|
||||||
|
@ -158,6 +184,12 @@ class GPUStatsWidget(Static):
|
||||||
'''Function to fetch stats / update the table for each AMD GPU found'''
|
'''Function to fetch stats / update the table for each AMD GPU found'''
|
||||||
for card in self.cards:
|
for card in self.cards:
|
||||||
self.data = self.get_column_data_mapping(card)
|
self.data = self.get_column_data_mapping(card)
|
||||||
|
# Update usage bars
|
||||||
|
self.query_one(f'#bar_{card}_util').update(total=100, progress=float(self.data['Utilization'].replace('%', '')))
|
||||||
|
self.query_one(f'#bar_{card}_poweravg').update(total=float(self.data['Limit'].replace('W', '')),
|
||||||
|
progress=float(self.data['Power'].replace('W', '')))
|
||||||
|
self.query_one(f'#bar_{card}_powercap').update(total=float(self.data['Capability'].replace('W', '')),
|
||||||
|
progress=float(self.data['Power'].replace('W', '')))
|
||||||
# handle the table data appopriately
|
# handle the table data appopriately
|
||||||
# if needs populated anew or updated
|
# if needs populated anew or updated
|
||||||
if self.table_needs_init:
|
if self.table_needs_init:
|
||||||
|
@ -254,7 +286,10 @@ class app(App): # pylint: disable=invalid-name
|
||||||
|
|
||||||
def action_custom_tab(self) -> None:
|
def action_custom_tab(self) -> None:
|
||||||
"""Toggle between the 'Stats' and 'Logs' tabs"""
|
"""Toggle between the 'Stats' and 'Logs' tabs"""
|
||||||
|
# walk/cycle the tabs
|
||||||
if self.stats_widget.tabbed_container.active == "tab_stats":
|
if self.stats_widget.tabbed_container.active == "tab_stats":
|
||||||
|
new_tab = 'tab_graphs'
|
||||||
|
elif self.stats_widget.tabbed_container.active == "tab_graphs":
|
||||||
new_tab = 'tab_logs'
|
new_tab = 'tab_logs'
|
||||||
else:
|
else:
|
||||||
new_tab = 'tab_stats'
|
new_tab = 'tab_stats'
|
||||||
|
|
Reference in a new issue