Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 112ca3e276 | |||
| 0f45cbf272 | |||
| 89129fc6e5 | |||
| c05e8da224 | |||
| ce4b1ec24c | |||
| aedd54b6a9 | |||
| 3cf0709dd8 | |||
| 2226ebbe69 |
Vendored
+9
-1
@@ -4,9 +4,17 @@
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: LiquidCTL",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/main.pyw",
|
||||
"console": "integratedTerminal",
|
||||
"justMyCode": true
|
||||
},
|
||||
{
|
||||
"name": "Python: Current File",
|
||||
"type": "python",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"console": "integratedTerminal",
|
||||
|
||||
Binary file not shown.
@@ -1,12 +1,13 @@
|
||||
from interfaces.liquidctl_helper_interface import LiquidCTL_Helper_Interface
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
class LiquidCTL_Helper():
|
||||
device_name = None
|
||||
class LiquidCTL_Helper(LiquidCTL_Helper_Interface):
|
||||
device_name = str()
|
||||
device_temp = 0
|
||||
device_fanSpeed = 0
|
||||
device_pumpSpeed = 0
|
||||
device_fwVers = None
|
||||
device_fwVers = str()
|
||||
|
||||
devices = None
|
||||
|
||||
@@ -29,4 +30,4 @@ class LiquidCTL_Helper():
|
||||
|
||||
|
||||
def SetFanSpeed(self, speed):
|
||||
NotImplemented
|
||||
NotImplemented
|
||||
@@ -1,11 +1,12 @@
|
||||
from liquidctl import find_liquidctl_devices, cli
|
||||
from interfaces.liquidctl_helper_interface import LiquidCTL_Helper_Interface
|
||||
from liquidctl import find_liquidctl_devices, cli # type: ignore
|
||||
|
||||
class LiquidCTL_Helper():
|
||||
device_name = None
|
||||
class LiquidCTL_Helper(LiquidCTL_Helper_Interface):
|
||||
device_name = str()
|
||||
device_temp = 0
|
||||
device_fanSpeed = 0
|
||||
device_pumpSpeed = 0
|
||||
device_fwVers = None
|
||||
device_fwVers = str()
|
||||
|
||||
devices = find_liquidctl_devices()
|
||||
try:
|
||||
@@ -0,0 +1,28 @@
|
||||
from interfaces.vitals_helper_interface import VitalsHelperInterface
|
||||
from enum import Enum
|
||||
import psutil
|
||||
|
||||
|
||||
class VitalsHelperLinux(VitalsHelperInterface):
|
||||
class HWSensor(Enum):
|
||||
lin_cpu_amd = ("k10temp", "Tctl")
|
||||
lin_gpu_amd = ("amdgpu", "edge")
|
||||
lin_mobo_asus = ("asus_wmi_sensors", "Motherboard Temperature")
|
||||
|
||||
def get_temps(self, _hw_sensor: HWSensor):
|
||||
temps = psutil.sensors_temperatures()
|
||||
|
||||
if _hw_sensor.value[0] in temps:
|
||||
for entry in temps[_hw_sensor.value[0]]:
|
||||
if entry.label == _hw_sensor.value[1]:
|
||||
return round(entry.current, 2)
|
||||
|
||||
class VitalsHelperWindows(VitalsHelperInterface):
|
||||
def __init__(self):
|
||||
print(f"{self.__class__.__name__} is not Implemented")
|
||||
|
||||
class HWSensor(Enum):
|
||||
pass
|
||||
|
||||
def get_temps(self, _hw_sensor: HWSensor):
|
||||
return 0
|
||||
@@ -0,0 +1,48 @@
|
||||
from abc import ABC, abstractmethod, abstractproperty
|
||||
|
||||
class LiquidCTL_Helper_Interface(ABC):
|
||||
@property
|
||||
@abstractmethod
|
||||
def device_name(self) -> str:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def device_temp(self) -> float:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def device_fanSpeed(self) -> float:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def device_pumpSpeed(self) -> float:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def device_fwVers(self) -> str:
|
||||
pass
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def devices(self) -> None:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def ForceInit(self) -> None:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def TestConnectionState(self) -> None:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def Update(self) -> None:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def SetFanSpeed(self, speed) -> None:
|
||||
pass
|
||||
@@ -0,0 +1,8 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class VitalsHelperInterface(ABC):
|
||||
@abstractmethod
|
||||
def get_temps(self, HWSensor):
|
||||
""" Return Temperatures """
|
||||
pass
|
||||
@@ -16,15 +16,15 @@ import common
|
||||
from MessageHandler import MessageHandler
|
||||
## Platform Imports #########################################
|
||||
import globals
|
||||
from styles import Labels
|
||||
if globals.os == "Windows":
|
||||
from LiquidCTL_Helper_Windows import LiquidCTL_Helper
|
||||
from styles import Labels_Windows as Labels
|
||||
import win32mica
|
||||
import darkdetect
|
||||
from helpers.liquidctl_helper_windows import LiquidCTL_Helper
|
||||
from helpers.vitals_helper import VitalsHelperWindows as VitalsHelper
|
||||
import win32mica # type: ignore
|
||||
import darkdetect # type: ignore
|
||||
elif globals.os == "Linux":
|
||||
from LiquidCTL_Helper_Linux import LiquidCTL_Helper
|
||||
from styles import Labels_Linux as Labels
|
||||
from pathlib import Path
|
||||
from helpers.liquidctl_helper_linux import LiquidCTL_Helper
|
||||
from helpers.vitals_helper import VitalsHelperLinux as VitalsHelper
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
@@ -32,14 +32,22 @@ class MainWindow(QMainWindow):
|
||||
|
||||
def __init__(self, lctl):
|
||||
super(MainWindow, self).__init__()
|
||||
self.setWindowTitle("LiquidGUI (v.1.2.0.0)")
|
||||
self.setFixedSize(450, 500)
|
||||
self.setWindowTitle("LiquidGUI (v.1.3.0.0) DEV")
|
||||
self.setFixedSize(450, 700)
|
||||
|
||||
self.lctl = lctl
|
||||
self._lctl = lctl
|
||||
self.__vitals_helper = VitalsHelper()
|
||||
|
||||
# Widgets ##########################################
|
||||
self.lbl_device_name = Labels.MainLabel()
|
||||
|
||||
self.lbl_cpu_temp = Labels.SubLabel(value="💻 CPU Temp:")
|
||||
self.min_max_cur_cpu_temp = common.MinMaxCurrent()
|
||||
self.prg_cpu_temp = QProgressBar(textVisible=False,
|
||||
minimum=0,
|
||||
maximum=105)
|
||||
self.lbl_value_prg_cpu_temp = Labels.SubLabelValue()
|
||||
|
||||
self.lbl_temp = Labels.SubLabel(value="💧 Liquid Temperature:")
|
||||
self.min_max_cur_temp = common.MinMaxCurrent()
|
||||
self.prg_temp = QProgressBar(textVisible=False,
|
||||
@@ -60,6 +68,7 @@ class MainWindow(QMainWindow):
|
||||
minimum=1900,
|
||||
maximum=2700)
|
||||
self.lbl_value_prg_pumpspeed = Labels.SubLabelValue()
|
||||
|
||||
self.btn_reset_min_max = QPushButton("Reset Min/Max")
|
||||
self.btn_reset_min_max.clicked.connect(self.on_reset_min_max)
|
||||
|
||||
@@ -69,6 +78,9 @@ class MainWindow(QMainWindow):
|
||||
widget = QWidget(self)
|
||||
layout = QVBoxLayout(widget)
|
||||
layout.addWidget(self.lbl_device_name)
|
||||
layout.addWidget(self.lbl_cpu_temp)
|
||||
layout.addWidget(self.prg_cpu_temp)
|
||||
layout.addWidget(self.lbl_value_prg_cpu_temp)
|
||||
layout.addWidget(self.lbl_temp)
|
||||
layout.addWidget(self.prg_temp)
|
||||
layout.addWidget(self.lbl_value_prg_temp)
|
||||
@@ -87,12 +99,12 @@ class MainWindow(QMainWindow):
|
||||
self.setCentralWidget(widget)
|
||||
self.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
# Threading #######################################
|
||||
# Threading #######################################################################
|
||||
self.thread_manager = QThreadPool()
|
||||
|
||||
self.timer = QTimer()
|
||||
self.timer.setInterval(1000)
|
||||
self.timer.timeout.connect(lambda: self.thread_manager.start(self.lctl.Update))
|
||||
self.timer.timeout.connect(lambda: self.thread_manager.start(self._lctl.Update))
|
||||
self.timer.timeout.connect(self.update_widgets)
|
||||
self.timer.start()
|
||||
|
||||
@@ -102,25 +114,52 @@ class MainWindow(QMainWindow):
|
||||
self.min_max_cur_temp = common.MinMaxCurrent()
|
||||
self.min_max_cur_fanspeed = common.MinMaxCurrent()
|
||||
self.min_max_cur_pumpspeed = common.MinMaxCurrent()
|
||||
self.min_max_cur_cpu_temp = common.MinMaxCurrent()
|
||||
self.timer.start()
|
||||
|
||||
def update_widgets(self):
|
||||
""" Update widgets using LiquidCTL library."""
|
||||
self.lbl_device_name.setText(self.lctl.device_name)
|
||||
self.prg_temp.setValue(self.lctl.device_temp)
|
||||
|
||||
# Platform Specific Widgets #######################################################
|
||||
if globals.os == "Windows":
|
||||
self.__vitals_helper()
|
||||
elif globals.os == "Linux":
|
||||
self.lbl_value_prg_cpu_temp.setText(
|
||||
self.min_max_cur_cpu_temp.builder(
|
||||
self.__vitals_helper.get_temps(
|
||||
self.__vitals_helper.HWSensor.lin_cpu_amd), "°C"))
|
||||
|
||||
self.prg_cpu_temp.setValue(
|
||||
self.__vitals_helper.get_temps(
|
||||
self.__vitals_helper.HWSensor.lin_cpu_amd))
|
||||
|
||||
# Cross Platform Widgets ##########################################################
|
||||
self.lbl_device_name.setText(
|
||||
self._lctl.device_name)
|
||||
|
||||
self.prg_temp.setValue(
|
||||
self._lctl.device_temp)
|
||||
|
||||
self.lbl_value_prg_temp.setText(
|
||||
self.min_max_cur_temp.builder(
|
||||
self.lctl.device_temp, "°C"))
|
||||
self.prg_fanspeed.setValue(self.lctl.device_fanSpeed)
|
||||
self._lctl.device_temp, "°C"))
|
||||
|
||||
self.prg_fanspeed.setValue(
|
||||
self._lctl.device_fanSpeed)
|
||||
|
||||
self.lbl_value_prg_fanspeed.setText(
|
||||
self.min_max_cur_fanspeed.builder(
|
||||
self.lctl.device_fanSpeed, " rpm"))
|
||||
self.prg_pumpspeed.setValue(self.lctl.device_pumpSpeed)
|
||||
self._lctl.device_fanSpeed, " rpm"))
|
||||
|
||||
self.prg_pumpspeed.setValue(
|
||||
self._lctl.device_pumpSpeed)
|
||||
|
||||
self.lbl_value_prg_pumpspeed.setText(
|
||||
self.min_max_cur_pumpspeed.builder(
|
||||
self.lctl.device_pumpSpeed, " rpm"))
|
||||
if self.lctl.device_fwVers is not None:
|
||||
self.lbl_fwvers.setText(f"Firmware: v{self.lctl.device_fwVers}")
|
||||
self._lctl.device_pumpSpeed, " rpm"))
|
||||
|
||||
if len(self._lctl.device_fwVers) > 0:
|
||||
self.lbl_fwvers.setText(f"Firmware: v{self._lctl.device_fwVers}")
|
||||
|
||||
|
||||
def main():
|
||||
@@ -133,9 +172,9 @@ def main():
|
||||
icon = QIcon(":/icons/LiquidGUI.ico")
|
||||
|
||||
if darkdetect.isDark():
|
||||
win32mica.ApplyMica(window.winId(), win32mica.MICAMODE.DARK)
|
||||
win32mica.ApplyMica(window.winId(), win32mica.MicaTheme.DARK)
|
||||
elif darkdetect.isLight():
|
||||
win32mica.ApplyMica(window.winId(), win32mica.MICAMODE.LIGHT)
|
||||
win32mica.ApplyMica(window.winId(), win32mica.MicaTheme.LIGHT)
|
||||
|
||||
elif globals.os == "Linux":
|
||||
app.setDesktopFileName("LiquidGUI")
|
||||
@@ -144,7 +183,7 @@ def main():
|
||||
app.setWindowIcon(icon)
|
||||
|
||||
# Show error and quit app if no devices are found
|
||||
if window.lctl.TestConnectionState():
|
||||
if window._lctl.TestConnectionState():
|
||||
MessageHandler().ShowNoDevicesFoundError()
|
||||
sys.exit(1)
|
||||
else:
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
from PySide6.QtWidgets import QLabel
|
||||
from PySide6.QtGui import QFont
|
||||
from PySide6.QtCore import Qt
|
||||
import globals
|
||||
|
||||
def _set_os_family_font(ClassName: str):
|
||||
_font = None
|
||||
|
||||
if globals.os == "Linux":
|
||||
if ClassName == MainLabel.__name__ or SubLabel.__name__:
|
||||
_font = "Noto Sans"
|
||||
elif ClassName == SubLabelValue.__name__:
|
||||
_font = "Noto Sans Mono"
|
||||
elif globals.os == "Windows":
|
||||
if ClassName == MainLabel.__name__ or SubLabel.__name__:
|
||||
_font = "Calibri"
|
||||
elif ClassName == SubLabelValue.__name__:
|
||||
_font = "Cascadia Code"
|
||||
|
||||
return _font
|
||||
|
||||
|
||||
class MainLabel(QLabel):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.setFont(QFont(_set_os_family_font(__class__.__name__),
|
||||
16,
|
||||
weight=QFont.Weight.ExtraBold))
|
||||
|
||||
class SubLabel(QLabel):
|
||||
""" Formatting for sub-labels. """
|
||||
|
||||
def __init__(self, value):
|
||||
super().__init__()
|
||||
self.setFont(QFont(_set_os_family_font(__class__.__name__),
|
||||
12,
|
||||
weight=QFont.Weight.Thin))
|
||||
self.setText(value)
|
||||
|
||||
class SubLabelValue(QLabel):
|
||||
""" Formatting for values. """
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setAlignment(Qt.AlignmentFlag.AlignRight)
|
||||
self.setFont(QFont(_set_os_family_font(__class__.__name__), 8))
|
||||
@@ -1,27 +0,0 @@
|
||||
from PySide6.QtWidgets import QLabel
|
||||
from PySide6.QtGui import QFont
|
||||
from PySide6.QtCore import Qt
|
||||
|
||||
class MainLabel(QLabel):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.setFont(QFont("Noto Sans",
|
||||
16,
|
||||
weight=QFont.Weight.ExtraBold))
|
||||
class SubLabel(QLabel):
|
||||
""" Formatting for sub-labels. """
|
||||
|
||||
def __init__(self, value):
|
||||
super().__init__()
|
||||
self.setFont(QFont("Noto Sans", 12, weight=QFont.Weight.Thin))
|
||||
self.setText(value)
|
||||
class SubLabelValue(QLabel):
|
||||
""" Formatting for values. """
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setAlignment(Qt.AlignmentFlag.AlignRight)
|
||||
self.setFont(QFont("Noto Sans Mono", 8))
|
||||
|
||||
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
from PySide6.QtWidgets import QLabel
|
||||
from PySide6.QtGui import QFont
|
||||
from PySide6.QtCore import Qt
|
||||
|
||||
class MainLabel(QLabel):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self.setFont(QFont("Calibri",
|
||||
14.5,
|
||||
weight=QFont.Weight.ExtraBold))
|
||||
class SubLabel(QLabel):
|
||||
""" Formatting for sub-labels. """
|
||||
|
||||
def __init__(self, value):
|
||||
super().__init__()
|
||||
self.setFont(QFont("Calibri", 12, weight=QFont.Weight.Thin))
|
||||
self.setText(value)
|
||||
class SubLabelValue(QLabel):
|
||||
""" Formatting for values. """
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setAlignment(Qt.AlignmentFlag.AlignRight)
|
||||
self.setFont(QFont("Cascadia Code", 8))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user