feat: added average and hottest CPU and GPU sensors (calculated) to the sensors list (#826)

This commit is contained in:
Serhiy Mytrovtsiy
2022-02-10 17:23:18 +01:00
parent 20b14068d5
commit d5d9d5404c
2 changed files with 97 additions and 43 deletions

View File

@@ -85,9 +85,21 @@ internal class SensorsReader: Reader<[Sensor_p]> {
self.list += self.initHIDSensors()
}
#endif
self.list += self.initCalculatedSensors()
}
public override func read() {
for (i, s) in self.list.enumerated() {
if s.group == .hid || s.isComputed {
continue
}
self.list[i].value = SMC.shared.getValue(self.list[i].key) ?? 0
}
var cpuSensors = self.list.filter({ $0.group == .CPU && $0.type == .temperature && $0.average }).map{ $0.value }
var gpuSensors = self.list.filter({ $0.group == .GPU && $0.type == .temperature && $0.average }).map{ $0.value }
#if arch(arm64)
if self.HIDState {
for typ in SensorsReader.HIDtypes {
@@ -103,30 +115,10 @@ internal class SensorsReader: Reader<[Sensor_p]> {
}
}
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 }
cpuSensors = list.filter({ $0.key.hasPrefix("pACC MTR Temp") || $0.key.hasPrefix("eACC MTR Temp") }).map{ $0.value }
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 !socSensors.isEmpty {
if let idx = self.list.firstIndex(where: { $0.key == "Average SOC" }) {
self.list[idx].value = socSensors.reduce(0, +) / Double(socSensors.count)
@@ -140,11 +132,25 @@ internal class SensorsReader: Reader<[Sensor_p]> {
}
#endif
for (i, s) in self.list.enumerated() {
if s.group == .hid {
continue
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
}
}
self.list[i].value = SMC.shared.getValue(self.list[i].key) ?? 0
}
self.callback(self.list)
@@ -316,6 +322,40 @@ internal class SensorsReader: Reader<[Sensor_p]> {
}).sorted { $0.key.lowercased() < $1.key.lowercased() }
}
private func initCalculatedSensors() -> [Sensor] {
var list: [Sensor] = []
let cpuSensors = self.list.filter({ $0.group == .CPU && $0.type == .temperature && $0.average }).map{ $0.value }
let gpuSensors = self.list.filter({ $0.group == .GPU && $0.type == .temperature && $0.average }).map{ $0.value }
if !cpuSensors.isEmpty {
let value = cpuSensors.reduce(0, +) / Double(cpuSensors.count)
list.append(Sensor(key: "Average CPU", name: "Average CPU", value: value, group: .hid, type: .temperature))
if let max = cpuSensors.max() {
list.append(Sensor(key: "Hottest CPU", name: "Hottest CPU", value: max, group: .hid, type: .temperature))
}
}
if !gpuSensors.isEmpty {
let value = gpuSensors.reduce(0, +) / Double(gpuSensors.count)
list.append(Sensor(key: "Average GPU", name: "Average GPU", value: value, group: .hid, type: .temperature))
if let max = gpuSensors.max() {
list.append(Sensor(key: "Hottest GPU", name: "Hottest GPU", value: max, group: .hid, type: .temperature))
}
}
return list.filter({ (s: Sensor_p) -> Bool in
switch s.type {
case .temperature:
return s.value < 110 && s.value >= 0
case .voltage:
return s.value < 300 && s.value >= 0
case .current:
return s.value < 100 && s.value >= 0
default: return true
}
}).sorted { $0.key.lowercased() < $1.key.lowercased() }
}
public func HIDCallback() {
if self.HIDState {
self.list += self.initHIDSensors()

View File

@@ -36,6 +36,8 @@ internal protocol Sensor_p {
var group: SensorGroup { get }
var type: SensorType { get }
var isIntelOnly: Bool { get }
var isComputed: Bool { get }
var average: Bool { get }
var unit: String { get }
var formattedValue: String { get }
@@ -51,6 +53,8 @@ internal struct Sensor: Sensor_p {
var group: SensorGroup
var type: SensorType
var isIntelOnly: Bool = false
var isComputed: Bool = false
var average: Bool = false
var unit: String {
get {
@@ -115,7 +119,15 @@ internal struct Sensor: Sensor_p {
}
func copy() -> Sensor {
return Sensor(key: self.key, name: self.name, group: self.group, type: self.type)
return Sensor(
key: self.key,
name: self.name,
group: self.group,
type: self.type,
isIntelOnly: self.isIntelOnly,
isComputed: self.isComputed,
average: self.average
)
}
}
@@ -131,6 +143,8 @@ internal struct Fan: Sensor_p {
var group: SensorGroup = .sensor
var type: SensorType = .fan
var isIntelOnly: Bool = false
var isComputed: Bool = false
var average: Bool = false
var unit: String = "RPM"
var formattedValue: String {
@@ -165,8 +179,8 @@ let SensorsList: [Sensor] = [
Sensor(key: "TC0P", name: "CPU proximity", group: .CPU, type: .temperature),
Sensor(key: "TCAD", name: "CPU package", group: .CPU, type: .temperature),
Sensor(key: "TC%c", name: "CPU core %", group: .CPU, type: .temperature),
Sensor(key: "TC%C", name: "CPU core %", group: .CPU, type: .temperature),
Sensor(key: "TC%c", name: "CPU core %", group: .CPU, type: .temperature, average: true),
Sensor(key: "TC%C", name: "CPU core %", group: .CPU, type: .temperature, average: true),
Sensor(key: "TCGC", name: "GPU Intel Graphics", group: .GPU, type: .temperature),
Sensor(key: "TG0D", name: "GPU diode", group: .GPU, type: .temperature),
@@ -189,21 +203,21 @@ let SensorsList: [Sensor] = [
Sensor(key: "TN0P", name: "Northbridge proximity", group: .system, type: .temperature),
// Apple Silicon
Sensor(key: "Tp09", name: "CPU efficient core 1", group: .CPU, type: .temperature),
Sensor(key: "Tp0T", name: "CPU efficient core 2", group: .CPU, type: .temperature),
Sensor(key: "Tp01", name: "CPU performance core 1", group: .CPU, type: .temperature),
Sensor(key: "Tp05", name: "CPU performance core 2", group: .CPU, type: .temperature),
Sensor(key: "Tp0D", name: "CPU performance core 3", group: .CPU, type: .temperature),
Sensor(key: "Tp0H", name: "CPU performance core 4", group: .CPU, type: .temperature),
Sensor(key: "Tp0L", name: "CPU performance core 5", group: .CPU, type: .temperature),
Sensor(key: "Tp0P", name: "CPU performance core 6", group: .CPU, type: .temperature),
Sensor(key: "Tp0X", name: "CPU performance core 7", group: .CPU, type: .temperature),
Sensor(key: "Tp0b", name: "CPU performance core 8", group: .CPU, type: .temperature),
Sensor(key: "Tp09", name: "CPU efficient core 1", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0T", name: "CPU efficient core 2", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp01", name: "CPU performance core 1", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp05", name: "CPU performance core 2", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0D", name: "CPU performance core 3", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0H", name: "CPU performance core 4", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0L", name: "CPU performance core 5", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0P", name: "CPU performance core 6", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0X", name: "CPU performance core 7", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tp0b", name: "CPU performance core 8", group: .CPU, type: .temperature, average: true),
Sensor(key: "Tg05", name: "GPU 1", group: .GPU, type: .temperature),
Sensor(key: "Tg0D", name: "GPU 2", group: .GPU, type: .temperature),
Sensor(key: "Tg0L", name: "GPU 3", group: .GPU, type: .temperature),
Sensor(key: "Tg0T", name: "GPU 4", group: .GPU, type: .temperature),
Sensor(key: "Tg05", name: "GPU 1", group: .GPU, type: .temperature, average: true),
Sensor(key: "Tg0D", name: "GPU 2", group: .GPU, type: .temperature, average: true),
Sensor(key: "Tg0L", name: "GPU 3", group: .GPU, type: .temperature, average: true),
Sensor(key: "Tg0T", name: "GPU 4", group: .GPU, type: .temperature, average: true),
Sensor(key: "TaLP", name: "Airflow left", group: .sensor, type: .temperature),
Sensor(key: "TaRF", name: "Airflow right", group: .sensor, type: .temperature),