diff --git a/README.md b/README.md index e1287b5..634bc11 100644 --- a/README.md +++ b/README.md @@ -14,14 +14,18 @@ Open-source alternative to AWCC* OS: Windows 10/11. -Supported Dell G15 models: 5511, 5515, 5520, 5525, 5530. +Supported models +- Dell G15: 5511, 5515, 5520, 5525, 5530. +- Dell Alienware m16 R1 -May also work on other Dell G15 notebooks. +May also work on other Dell G15 / Alienware laptops. Please report if it worked / didn't work for you. Your feedback is highly appreciated. _Big thanks to @T7imal, @cemkaya-mpi, @THSLP13 for testing and debugging._ +_Thanks to @Dtwpurple, @WinterholdPrime for the compatibility reports._ + ## What it can do - ✔️ Switch thermal mode between G-mode, Balanced and Custom diff --git a/installer-inno-config.iss b/installer-inno-config.iss index df0529f..e83839c 100644 --- a/installer-inno-config.iss +++ b/installer-inno-config.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "Thermal Control Center" -#define MyAppVersion "1.5.3" +#define MyAppVersion "1.5.4" #define MyAppPublisher "AlexIII" #define MyAppURL "https://github.com/AlexIII/tcc-g15" #define MyAppExeName "tcc-g15.exe" diff --git a/src/Backend/AWCCThermal.py b/src/Backend/AWCCThermal.py index 07ce95c..aac0ded 100644 --- a/src/Backend/AWCCThermal.py +++ b/src/Backend/AWCCThermal.py @@ -19,7 +19,7 @@ class AWCCThermal: def __init__(self, awcc: Optional[AWCCWmiWrapper] = None) -> None: if awcc is None: try: - awccClass = wmi.WMI(namespace="root\WMI").AWCCWmiMethodFunction + awccClass = wmi.WMI(namespace="root\\WMI").AWCCWmiMethodFunction except Exception as ex: print(ex) raise NoAWCCWMIClass() diff --git a/src/GUI/AppGUI.py b/src/GUI/AppGUI.py index d116022..d390421 100644 --- a/src/GUI/AppGUI.py +++ b/src/GUI/AppGUI.py @@ -81,6 +81,7 @@ class SettingsKey(Enum): CPUThresholdTemp = "app/fan/cpu/threshold_temp" GPUFanSpeed = "app/fan/gpu/speed" GPUThresholdTemp = "app/fan/gpu/threshold_temp" + FailSafeIsOnFlag = "app/failsafe_is_on_flag" MinimizeOnCloseFlag = "app/minimize_on_close_flag" def errorExit(message: str, message2: Optional[str] = None) -> None: @@ -96,7 +97,7 @@ class TCC_GUI(QtWidgets.QWidget): FAILSAFE_TRIGGER_DELAY_SEC = 8 FAILSAFE_RESET_AFTER_TEMP_IS_OK_FOR_SEC = 60 APP_NAME = "Thermal Control Center for Dell G15" - APP_VERSION = "1.5.3" + APP_VERSION = "1.5.4" APP_DESCRIPTION = "This app is an open-source replacement for Alienware Control Center " APP_URL = "github.com/AlexIII/tcc-g15" @@ -109,6 +110,7 @@ class TCC_GUI(QtWidgets.QWidget): _failsafeTempIsHighStartTs: Optional[int] = None # Time when the temp first registered to be high (without going lower than the threshold) _failsafeTrippedPrevModeStr: Optional[str] = None # Mode (Custom, Balanced) before fail-safe tripped, as a string _failsafeOn = True + _prevSavedSettingsValues: list = [] def __init__(self, awcc: AWCCThermal): super().__init__() @@ -211,18 +213,19 @@ def onLimitCPUChange(): # Fail-safe checkbox - _failsafeCB = QtWidgets.QCheckBox("Fail-safe") - _failsafeCB.setToolTip(f"Switch to G-mode (fans on max) when GPU temp reaches {self.FAILSAFE_GPU_TEMP}°C or CPU reaches {self.FAILSAFE_CPU_TEMP}°C") + self._failsafeCB = QtWidgets.QCheckBox("Fail-safe") + self._failsafeCB.setToolTip(f"Switch to G-mode (fans on max) when GPU temp reaches {self.FAILSAFE_GPU_TEMP}°C or CPU reaches {self.FAILSAFE_CPU_TEMP}°C") def onFailsafeCB(): - self._failsafeOn = _failsafeCB.isChecked() + self._failsafeOn = self._failsafeCB.isChecked() self._failsafeTempIsHighTs = 0 self._failsafeTrippedPrevModeStr = None + self._failsafeTempIsHighStartTs = None updFailsafeIndicator() - _failsafeCB.toggled.connect(onFailsafeCB) - _failsafeCB.setChecked(True) + self._failsafeCB.toggled.connect(onFailsafeCB) + self._failsafeCB.setChecked(self._failsafeOn) failsafeBox = QtWidgets.QHBoxLayout() - failsafeBox.addWidget(_failsafeCB) + failsafeBox.addWidget(self._failsafeCB) failsafeBox.addWidget(self._limitTempGPU) failsafeBox.addWidget(self._limitTempCPU) failsafeBox.addWidget(failsafeIndicator) @@ -248,6 +251,8 @@ def updateFanSpeed(): return setFanSpeed('GPU', self._thermalGPU.getSpeedSlider()) setFanSpeed('CPU', self._thermalCPU.getSpeedSlider()) + self._thermalGPU.speedSliderChanged(updateFanSpeed) + self._thermalCPU.speedSliderChanged(updateFanSpeed) def onModeChange(val: str): self._thermalGPU.setSpeedDisabled(val != ThermalMode.Custom.value) @@ -311,14 +316,14 @@ def updateAppState(): trayIcon.update((gpuTemp, cpuTemp)) tray.setIcon(trayIcon) + # Periodically save app settings + self._saveAppSettings() + + self._loadAppSettings() + self._updateGaugesTask = QPeriodic(self, self.TEMP_UPD_PERIOD_MS, updateAppState) updateAppState() self._updateGaugesTask.start() - - self._thermalGPU.speedSliderChanged(updateFanSpeed) - self._thermalCPU.speedSliderChanged(updateFanSpeed) - - self._loadAppSettings() def closeEvent(self, event): minimizeOnClose = self.settings.value(SettingsKey.MinimizeOnCloseFlag.value) @@ -339,7 +344,6 @@ def closeEvent(self, event): # onExit() connected to systray_Exit def onExit(self): print("exit") - self._saveAppSettings() # Set mode to Balanced before exit self._updateGaugesTask.stop() prevMode = self._modeSwitch.getChecked() @@ -349,11 +353,24 @@ def onExit(self): sys.exit(1) def _saveAppSettings(self): + curValues = [ + self._modeSwitch.getChecked(), + self._thermalCPU.getSpeedSlider(), + self._thermalGPU.getSpeedSlider(), + self.FAILSAFE_CPU_TEMP, + self.FAILSAFE_GPU_TEMP, + self._failsafeOn + ] + if curValues == self._prevSavedSettingsValues: + return + self._prevSavedSettingsValues = curValues + self.settings.setValue(SettingsKey.Mode.value, self._modeSwitch.getChecked()) self.settings.setValue(SettingsKey.CPUFanSpeed.value, self._thermalCPU.getSpeedSlider()) self.settings.setValue(SettingsKey.GPUFanSpeed.value, self._thermalGPU.getSpeedSlider()) self.settings.setValue(SettingsKey.CPUThresholdTemp.value, self.FAILSAFE_CPU_TEMP) self.settings.setValue(SettingsKey.GPUThresholdTemp.value, self.FAILSAFE_GPU_TEMP) + self.settings.setValue(SettingsKey.FailSafeIsOnFlag.value, self._failsafeOn) def _loadAppSettings(self): savedMode = self.settings.value(SettingsKey.Mode.value) @@ -366,6 +383,8 @@ def _loadAppSettings(self): if savedTemp is not None: self._limitTempCPU.setCurrentText(str(savedTemp)) savedTemp = self.settings.value(SettingsKey.GPUThresholdTemp.value) if savedTemp is not None: self._limitTempGPU.setCurrentText(str(savedTemp)) + savedFailsafe = self.settings.value(SettingsKey.FailSafeIsOnFlag.value) + if savedFailsafe is not None: self._failsafeCB.setChecked(not (savedFailsafe == 'False')) def clearAppSettings(self): (isYes, _) = confirm("Reset to Default", "Do you want to reset all settings to default?", ("Reset", "Cancel"))