# 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.ttk import Frame from ..utils.common import PNames from ..utils.datacenter import data_center from ..utils.layoutmanager import fill_parent, frame_style, padding from .components import ( ThermalFrame, FanFrame, PowerMonitorFrame, ) class ThermalPowerMonitor(Frame): def __init__(self, master=None, **kwargs): super().__init__(master, **kwargs) self.create_widgets() self.attach_observers() self.manage_layout() fill_parent(self) def create_widgets(self): self.thermal_f = ThermalFrame(self, **frame_style) self.fan_names = PNames.FAN_NAMES self.fan_nums = len(self.fan_names) self.fan_fs = [None] * self.fan_nums for i in range(self.fan_nums): self.fan_fs[i] = FanFrame(self, fan_id=i + 1, **frame_style) self.power_monitor_f = PowerMonitorFrame(self, **frame_style) def attach_observers(self): # these frames need to know power data once updated, # so they are treated as observers of the data center data_center.attach(self.thermal_f) for i in range(self.fan_nums): data_center.attach(self.fan_fs[i]) data_center.attach(self.power_monitor_f) def manage_layout(self): heading_row = 1 # if a frame has heading, it will occupy 1 row tab_cols = 8 fan_cols_each = 0 if self.fan_nums > 0: fan_cols_each = tab_cols // self.fan_nums # Predefine how many rows are there in each frame sensor_rows = heading_row + data_center.sensor_nums fan_rows = 2 power_rows = heading_row + data_center.rail_nums next_starting_row = 0 self.thermal_f.grid(row=next_starting_row, column=0, rowspan=sensor_rows, columnspan=tab_cols, sticky="WENS", **padding) next_starting_row += sensor_rows for i in range(self.fan_nums): self.fan_fs[i].grid(row=next_starting_row, column=(i % self.fan_nums * fan_cols_each), rowspan=fan_rows, columnspan=fan_cols_each, sticky="WENS", **padding) next_starting_row += fan_rows self.power_monitor_f.grid(row=next_starting_row, column=0, rowspan=power_rows, columnspan=tab_cols, sticky="WENS", **padding)