diff --git a/Modules/Sensors/main.swift b/Modules/Sensors/main.swift index e2d33cbe..ab8c7aa1 100644 --- a/Modules/Sensors/main.swift +++ b/Modules/Sensors/main.swift @@ -30,12 +30,15 @@ public class Sensors: Module { self.popupView.setup(self.sensorsReader.list) self.settingsView.callback = { [unowned self] in - self.checkIfNoSensorsEnabled() self.sensorsReader.read() } self.settingsView.setInterval = { [unowned self] value in self.sensorsReader.setInterval(value) } + self.settingsView.HIDcallback = { [unowned self] in + self.sensorsReader.HIDCallback() + self.popupView.setup(self.sensorsReader.list) + } self.sensorsReader.callbackHandler = { [unowned self] value in self.usageCallback(value) diff --git a/Modules/Sensors/readers.swift b/Modules/Sensors/readers.swift index 7236927a..26e5a465 100644 --- a/Modules/Sensors/readers.swift +++ b/Modules/Sensors/readers.swift @@ -16,11 +16,18 @@ internal class SensorsReader: Reader<[Sensor_p]> { internal var list: [Sensor_p] = [] static let HIDtypes: [SensorType] = [.temperature, .voltage] + private var HIDState: Bool { + get { + return Store.shared.bool(key: "Sensors_hid", defaultValue: false) + } + } + init() { super.init() var available: [String] = SMC.shared.getAllKeys() var list: [Sensor] = [] + let sensorsList = SensorsList if let count = SMC.shared.getValue("FNum") { debug("Found \(Int(count)) fans", log: self.log) @@ -45,14 +52,14 @@ internal class SensorsReader: Reader<[Sensor_p]> { } }) - SensorsList.forEach { (s: Sensor) in + sensorsList.forEach { (s: Sensor) in if let idx = available.firstIndex(where: { $0 == s.key }) { list.append(s) available.remove(at: idx) } } - SensorsList.filter{ $0.key.contains("%") }.forEach { (s: Sensor) in + sensorsList.filter{ $0.key.contains("%") }.forEach { (s: Sensor) in var index = 1 for i in 0..<10 { let key = s.key.replacingOccurrences(of: "%", with: "\(i)") @@ -76,63 +83,67 @@ internal class SensorsReader: Reader<[Sensor_p]> { } self.list += list.filter({ (s: Sensor) -> Bool in - if s.type == .temperature && s.value > 110 { + if s.type == .temperature && (s.value == 0 || s.value > 110) { return false } return true }) #if arch(arm64) - self.list += self.initHIDSensors() + if self.HIDState { + self.list += self.initHIDSensors() + } #endif } public override func read() { #if arch(arm64) - for typ in SensorsReader.HIDtypes { - let (page, usage, type) = self.m1Preset(type: typ) - AppleSiliconSensors(page, usage, type).forEach { (key, value) in - guard let key = key as? String, let value = value as? Double, value < 300 && value >= 0 else { - return - } - - if let idx = self.list.firstIndex(where: { $0.group == .hid && $0.key == key }) { - self.list[idx].value = value + if self.HIDState { + for typ in SensorsReader.HIDtypes { + let (page, usage, type) = self.m1Preset(type: typ) + AppleSiliconSensors(page, usage, type).forEach { (key, value) in + guard let key = key as? String, let value = value as? Double, value < 300 && value >= 0 else { + return + } + + if let idx = self.list.firstIndex(where: { $0.group == .hid && $0.key == key }) { + self.list[idx].value = value + } } } - } - - let cpuSensors = list.filter({ $0.key.hasPrefix("pACC MTR Temp") || $0.key.hasPrefix("eACC MTR Temp") }).map{ $0.value } - let gpuSensors = list.filter({ $0.key.hasPrefix("GPU MTR Temp") }).map{ $0.value } - let socSensors = list.filter({ $0.key.hasPrefix("SOC MTR Temp") }).map{ $0.value } - - if !cpuSensors.isEmpty { - if let idx = self.list.firstIndex(where: { $0.key == "Average CPU" }) { - self.list[idx].value = cpuSensors.reduce(0, +) / Double(cpuSensors.count) - } - if let max = cpuSensors.max() { - if let idx = self.list.firstIndex(where: { $0.key == "Hottest CPU" }) { - self.list[idx].value = max + + let cpuSensors = list.filter({ $0.key.hasPrefix("pACC MTR Temp") || $0.key.hasPrefix("eACC MTR Temp") }).map{ $0.value } + let gpuSensors = list.filter({ $0.key.hasPrefix("GPU MTR Temp") }).map{ $0.value } + let socSensors = list.filter({ $0.key.hasPrefix("SOC MTR Temp") }).map{ $0.value } + + if !cpuSensors.isEmpty { + if let idx = self.list.firstIndex(where: { $0.key == "Average CPU" }) { + self.list[idx].value = cpuSensors.reduce(0, +) / Double(cpuSensors.count) + } + if let max = cpuSensors.max() { + if let idx = self.list.firstIndex(where: { $0.key == "Hottest CPU" }) { + self.list[idx].value = max + } } } - } - if !gpuSensors.isEmpty { - if let idx = self.list.firstIndex(where: { $0.key == "Average GPU" }) { - self.list[idx].value = gpuSensors.reduce(0, +) / Double(gpuSensors.count) - } - if let max = gpuSensors.max() { - if let idx = self.list.firstIndex(where: { $0.key == "Hottest GPU" }) { - self.list[idx].value = max + if !gpuSensors.isEmpty { + if let idx = self.list.firstIndex(where: { $0.key == "Average GPU" }) { + self.list[idx].value = gpuSensors.reduce(0, +) / Double(gpuSensors.count) + } + if let max = gpuSensors.max() { + if let idx = self.list.firstIndex(where: { $0.key == "Hottest GPU" }) { + self.list[idx].value = max + } } } - } - if !socSensors.isEmpty { - if let idx = self.list.firstIndex(where: { $0.key == "Average SOC" }) { - self.list[idx].value = socSensors.reduce(0, +) / Double(socSensors.count) - } - if let max = socSensors.max() { - if let idx = self.list.firstIndex(where: { $0.key == "Hottest SOC" }) { - self.list[idx].value = max + if !socSensors.isEmpty { + if let idx = self.list.firstIndex(where: { $0.key == "Average SOC" }) { + self.list[idx].value = socSensors.reduce(0, +) / Double(socSensors.count) + } + if let max = socSensors.max() { + if let idx = self.list.firstIndex(where: { $0.key == "Hottest SOC" }) { + self.list[idx].value = max + } } } } @@ -214,7 +225,7 @@ internal class SensorsReader: Reader<[Sensor_p]> { } var name: String = key - AppleSiliconSensorsList.forEach { (s: Sensor) in + HIDSensorsList.forEach { (s: Sensor) in if s.key.contains("%") { var index = 1 for i in 0..<64 { @@ -276,4 +287,12 @@ internal class SensorsReader: Reader<[Sensor_p]> { } }).sorted { $0.key.lowercased() < $1.key.lowercased() } } + + public func HIDCallback() { + if self.HIDState { + self.list += self.initHIDSensors() + } else { + self.list = self.list.filter({ $0.group != .hid }) + } + } } diff --git a/Modules/Sensors/settings.swift b/Modules/Sensors/settings.swift index 12ac2ba6..ff421bb9 100644 --- a/Modules/Sensors/settings.swift +++ b/Modules/Sensors/settings.swift @@ -14,11 +14,14 @@ import Kit internal class Settings: NSStackView, Settings_v { private var updateIntervalValue: Int = 3 + private var hidState: Bool = false + private var fanSpeedState: Bool = false private let title: String private var button: NSPopUpButton? private let list: [Sensor_p] public var callback: (() -> Void) = {} + public var HIDcallback: (() -> Void) = {} public var setInterval: ((_ value: Int) -> Void) = {_ in } public init(_ title: String, list: [Sensor_p]) { @@ -40,6 +43,8 @@ internal class Settings: NSStackView, Settings_v { self.spacing = Constants.Settings.margin self.updateIntervalValue = Store.shared.int(key: "\(self.title)_updateInterval", defaultValue: self.updateIntervalValue) + self.hidState = Store.shared.bool(key: "\(self.title)_hid", defaultValue: self.hidState) + self.fanSpeedState = Store.shared.bool(key: "\(self.title)_speed", defaultValue: self.fanSpeedState) } required init?(coder: NSCoder) { @@ -66,6 +71,18 @@ internal class Settings: NSStackView, Settings_v { selected: "\(self.updateIntervalValue) sec" )) + self.addArrangedSubview(toggleSettingRow( + title: localizedString("Save the fan speed"), + action: #selector(toggleSpeedState), + state: self.fanSpeedState + )) + + self.addArrangedSubview(toggleSettingRow( + title: localizedString("HID sensors"), + action: #selector(toggleHID), + state: self.hidState + )) + types.forEach { (typ: SensorType) in let header = NSStackView() header.heightAnchor.constraint(equalToConstant: Constants.Settings.row).isActive = true @@ -137,4 +154,30 @@ internal class Settings: NSStackView, Settings_v { self.setInterval(value) } } + + @objc private func toggleSpeedState(_ sender: NSControl) { + var state: NSControl.StateValue? = nil + if #available(OSX 10.15, *) { + state = sender is NSSwitch ? (sender as! NSSwitch).state: nil + } else { + state = sender is NSButton ? (sender as! NSButton).state: nil + } + + self.fanSpeedState = state! == .on ? true : false + Store.shared.set(key: "\(self.title)_speed", value: self.fanSpeedState) + self.callback() + } + + @objc func toggleHID(_ sender: NSControl) { + var state: NSControl.StateValue? = nil + if #available(OSX 10.15, *) { + state = sender is NSSwitch ? (sender as! NSSwitch).state: nil + } else { + state = sender is NSButton ? (sender as! NSButton).state: nil + } + + self.hidState = state! == .on ? true : false + Store.shared.set(key: "\(self.title)_hid", value: self.hidState) + self.HIDcallback() + } }