# SPDX-FileCopyrightText: Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: LicenseRef-NvidiaProprietary # # NVIDIA CORPORATION, its affiliates and licensors retain all intellectual # property and proprietary rights in and to this material, related # documentation and any modifications thereto. Any use, reproduction, # disclosure or distribution of this material and related documentation # without an express license agreement from NVIDIA CORPORATION or # its affiliates is strictly prohibited. from tkinter import StringVar from tkinter.ttk import Label, LabelFrame from ...utils.common import PAttrs, PNames, err_symbol from ...utils.layoutmanager import fill_parent, grid_span, padding from ...utils.subjectobserver import Observer class PowerMonitorFrame(LabelFrame, Observer): def __init__(self, master=None, **kwargs): super().__init__(master, text="Power Monitor", **kwargs) self.create_widgets() self.manage_layout() fill_parent(self) def create_widgets(self): self.rail_names = PNames.RAIL_NAMES self.rail_nums = len(self.rail_names) self.rail_l = [None] * self.rail_nums self.warn_cur_l = [None] * self.rail_nums self.crit_cur_l = [None] * self.rail_nums self.volt_l = [None] * self.rail_nums self.cur_l = [None] * self.rail_nums self.power_l = [None] * self.rail_nums self.warn_cur_v = [None] * self.rail_nums self.crit_cur_v = [None] * self.rail_nums self.volt_v = [None] * self.rail_nums self.cur_v = [None] * self.rail_nums self.power_v = [None] * self.rail_nums self.name_hl = Label(self, text="Name") self.warn_cur_hl = Label(self, text="Warn Current") self.crit_cur_hl = Label(self, text="Crit Current") self.cur_hl = Label(self, text="Current Reading") self.power_hl = Label(self, text="Power Reading") self.volt_hl = Label(self, text="Voltage Reading") for i in range(self.rail_nums): self.warn_cur_v[i] = StringVar() self.crit_cur_v[i] = StringVar() self.volt_v[i] = StringVar() self.cur_v[i] = StringVar() self.power_v[i] = StringVar() self.rail_l[i] = Label(self, text=self.rail_names[i]) self.warn_cur_l[i] = Label(self, textvariable=self.warn_cur_v[i]) self.crit_cur_l[i] = Label(self, textvariable=self.crit_cur_v[i]) self.volt_l[i] = Label(self, textvariable=self.volt_v[i]) self.cur_l[i] = Label(self, textvariable=self.cur_v[i]) self.power_l[i] = Label(self, textvariable=self.power_v[i]) def manage_layout(self): self.name_hl.grid(row=0, column=0, **grid_span, **padding) self.warn_cur_hl.grid(row=0, column=1, **grid_span, **padding) self.crit_cur_hl.grid(row=0, column=2, **grid_span, **padding) self.volt_hl.grid(row=0, column=3, **grid_span, **padding) self.cur_hl.grid(row=0, column=4, **grid_span, **padding) self.power_hl.grid(row=0, column=5, **grid_span, **padding) for i in range(self.rail_nums): self.rail_l[i].grid(row=1 + i, column=0, **grid_span, **padding) self.warn_cur_l[i].grid(row=1 + i, column=1, **grid_span, **padding) self.crit_cur_l[i].grid(row=1 + i, column=2, **grid_span, **padding) self.volt_l[i].grid(row=1 + i, column=3, **grid_span, **padding) self.cur_l[i].grid(row=1 + i, column=4, **grid_span, **padding) self.power_l[i].grid(row=1 + i, column=5, **grid_span, **padding) def update_data(self, data): for i in range(self.rail_nums): rail_name = self.rail_names[i] warn_cur = data[(rail_name, PAttrs.WARN_CURRENT)] crit_cur = data[(rail_name, PAttrs.CRIT_CURRENT)] in_vol = data[(rail_name, PAttrs.IN_VOLTAGE)] in_cur = data[(rail_name, PAttrs.IN_CURRENT)] in_power = data[(rail_name, PAttrs.IN_POWER)] oc_warn_msg = "" if err_symbol not in (in_cur, crit_cur): if in_cur >= crit_cur: oc_warn_msg = " (Over Current!)" warn_cur_postfix = " mA" if err_symbol != warn_cur else "" crit_cur_postfix = " mA" if err_symbol != crit_cur else "" volt_postfix = " mV" if err_symbol != in_vol else "" cur_postfix = " mA" if err_symbol != in_cur else "" power_postfix = " mW" if err_symbol != in_power else "" self.warn_cur_v[i].set(f"{warn_cur}{warn_cur_postfix}") self.crit_cur_v[i].set(f"{crit_cur}{crit_cur_postfix}") self.volt_v[i].set(f"{in_vol}{volt_postfix}") self.cur_v[i].set(f"{in_cur}{cur_postfix}{oc_warn_msg}") self.power_v[i].set(f"{in_power}{power_postfix}")